diff --git a/srcpkgs/xzoom/files/COPYING b/srcpkgs/xzoom/files/COPYING new file mode 100644 index 00000000000..e91d76c820b --- /dev/null +++ b/srcpkgs/xzoom/files/COPYING @@ -0,0 +1,11 @@ +This program is distributed with no warranty. + +Source files for this program may be distributed freely. +Modifications to this file are okay as long as: + a. This copyright notice and comment are preserved and + left at the top of the file. + b. The man page is fixed to reflect the change. + c. The author of this change adds his name and change + description to the list of changes below. +Executable files may be distributed with sources, or with +exact location where the source code can be obtained. diff --git a/srcpkgs/xzoom/patches/xzoom_0.3-23.patch b/srcpkgs/xzoom/patches/xzoom_0.3-23.patch new file mode 100644 index 00000000000..90b6c162ac8 --- /dev/null +++ b/srcpkgs/xzoom/patches/xzoom_0.3-23.patch @@ -0,0 +1,647 @@ +--- xzoom-0.3.orig/Imakefile ++++ xzoom-0.3/Imakefile +@@ -15,11 +15,11 @@ + + DEFINES = -DFRAME -DXSHM + +-LOCAL_LIBRARIES = -lXext -lX11 ++LOCAL_LIBRARIES = -lXext -lX11 -lXt + + NAME = xzoom + +-BINDIR = /usr/local/bin +-MANPATH = /usr/local/man ++BINDIR = /usr/bin ++MANPATH = /usr/share/man + + SimpleProgramTarget($(NAME)) +--- xzoom-0.3.orig/scale.h ++++ xzoom-0.3/scale.h +@@ -0,0 +1,102 @@ ++/* scale image from SRC to DST - parameterized by type T */ ++ ++/* get pixel address of point (x,y) in image t */ ++#define getP(t,x,y) \ ++ (T *) (&ximage[t]->data[(ximage[t]->xoffset+(x))*sizeof(T) + \ ++ (y)*ximage[t]->bytes_per_line]) ++ ++{ ++ int i, j, k; ++ ++ /* copy scaled lines from SRC to DST */ ++ j = flipxy ? width[SRC] - 1 : height[SRC] - 1; ++ do { ++ T *p1; ++ T *p2; ++ int p2step; ++ T *p1_save; ++ ++ /* p1 point to begining of scanline j*magy in DST */ ++ p1 = getP(DST,0,j*magy); ++ p1_save = p1; ++ /* p2 point to begining of scanline j in SRC */ ++ /* if flipy then line height[SRC]-1-j */ ++ p2 = getP(SRC,0,flipy ? (height[SRC]-1-j) : j); ++ ++ if (flipxy) ++ { ++ p2 = getP(SRC,flipy ? j : (width[SRC]-1-j),0); ++ p2step = ximage[SRC]->bytes_per_line / sizeof(T); ++ ++ if (flipx) ++ { ++ p2 += p2step * (height[SRC]-1); ++ p2step = -p2step; ++ } ++ ++ i = height[SRC]; ++ do { ++ T c = *p2; p2 += p2step; ++ k = magx; do *p1++ = c; while (--k > 0); ++ } while (--i > 0); ++ } ++ else if (flipx) ++ { ++ p2 += width[SRC]; ++ i = width[SRC]; ++ do { ++ T c = *--p2; ++ k = magx; do *p1++ = c; while (--k > 0); ++ } while (--i > 0); ++ } ++ else ++ { ++ i = width[SRC]; ++ do { ++ T c = *p2++; ++ k = magx; do *p1++ = c; while (--k > 0); ++ } while (--i > 0); ++ } ++ ++ /* draw vertical grid */ ++ if (gridy && magx >= 2) ++ { ++ p1 = p1_save - 1; ++ i = magx; ++ k = flipxy ? height[SRC] : width[SRC]; ++ do { ++ p1 += i; ++ *p1 ^= ~((T)0); ++ } while (--k > 0); ++ } ++ ++ /* duplicate that line as needed */ ++ if (magy > 1) ++ { ++ /* p1 point to begining of scanline j*magy in DST */ ++ p1 = p1_save; ++ /* p2 points to begining of next line */ ++ p2 = p1; ++ p2step = ximage[DST]->bytes_per_line / sizeof(T); ++ ++ i = width[DST] * sizeof(T); ++ k = magy - 1; ++ do { ++ p2 += p2step; ++ memcpy(p2, p1, i); ++ } while (--k > 0); ++ ++ /* draw horizontal grid */ ++ if (gridx && magy >= 2) ++ { ++ k = width[DST]; ++ do { ++ *p2++ ^= ~((T)0); ++ } while (--k > 0); ++ } ++ } ++ } while (--j >= 0); ++} ++ ++#undef getP ++ +--- xzoom-0.3.orig/xzoom.c ++++ xzoom-0.3/xzoom.c +@@ -12,13 +12,22 @@ + exact location where the source code can be obtained. + + Changelist: +-Author Description +------- ----------- +-Itai Nahshon Version 0.1, Nov. 21 1995 +-Itai Nahshon Version 0.2, Apr. 17 1996 +- include +- Use memmove() instead of memcopy() +- Optional macro to replace call to usleep(). ++Author Description ++------ ----------- ++Itai Nahshon Version 0.1, Nov. 21 1995 ++Itai Nahshon Version 0.2, Apr. 17 1996 ++ include ++ Use memmove() instead of memcopy() ++ Optional macro to replace call to usleep(). ++Markus F.X.J. Oberhumer Version 0.4, Feb. 18 1998 ++ split into 2 files (scale.h) ++ added support for 15, 16, 24 and 32 bpp displays ++ added a grid (press key 'g') ++ optimized scaling routines ++ use memcpy() instead of memmove() ;-) ++ some other minor changes/fixes ++tony mancill 2002/02/13 ++ hacked in support for WM_DELETE_WINDOW + */ + + #include +@@ -48,6 +57,9 @@ + Display *dpy; + Screen *scr; + Window win; ++Atom wm_delete_window; ++Atom wm_protocols; ++Status status; + + GC gc; + #ifdef FRAME +@@ -87,8 +99,12 @@ + int xzoom_flag = False; /* next mag change only to magx */ + int yzoom_flag = False; /* next mag change only to magy */ + ++int gridx = False; ++int gridy = False; ++ + int width[2] = { 0, WIDTH }; + int height[2] = { 0, HEIGHT }; ++unsigned depth = 0; + + #ifdef XSHM + XShmSegmentInfo shminfo[2]; /* Segment info. */ +@@ -106,6 +122,7 @@ + void + timeout_func(int signum) { + set_title = True; ++ signum = signum; /* UNUSED */ + } + + #ifdef FRAME +@@ -116,9 +133,6 @@ + void + allocate_images(void) { + int i; +-#ifndef XSHM +- char *data; +-#endif + + for(i = 0; i < 2; i++) { + +@@ -137,7 +151,7 @@ + shminfo[i].shmid = shmget(IPC_PRIVATE, + (unsigned int)(ximage[i]->bytes_per_line * ximage[i]->height), + IPC_CREAT | 0777); +- ++ + if(shminfo[i].shmid < 0) { + perror("shmget"); + exit(-1); +@@ -163,20 +177,21 @@ + + shmctl(shminfo[i].shmid, IPC_RMID, 0); + #else +- data = malloc(width[i] * height[i]); ++ char *data; ++ data = malloc(BitmapUnit(dpy) / 8 * width[i] * height[i]); + + ximage[i] = XCreateImage(dpy, + DefaultVisualOfScreen(scr), + DefaultDepthOfScreen(scr), + ZPixmap, 0, data, +- width[i], height[i], 8, width[i]); ++ width[i], height[i], 32, 0); + + if(ximage[i] == NULL) { + perror("XCreateImage"); + exit(-1); + } + +-#endif XSHM ++#endif /* XSHM */ + } + created_images = True; + } +@@ -185,6 +200,9 @@ + destroy_images(void) { + int i; + ++ if (!created_images) ++ return; ++ + for(i = 0; i < 2; i++) { + #ifdef XSHM + XShmDetach(dpy, &shminfo[i]); /* ask X11 to detach shared segment */ +@@ -195,6 +213,8 @@ + ximage[i]->data = NULL; /* remove refrence to that address */ + XDestroyImage(ximage[i]); /* and destroy image */ + } ++ ++ created_images = False; + } + + void +@@ -230,8 +250,7 @@ + void + resize(int new_width, int new_height) { + +- if(created_images) +- destroy_images(); /* we can get rid of these */ ++ destroy_images(); /* we can get rid of these */ + + /* find new dimensions for source */ + +@@ -244,9 +263,13 @@ + height[SRC] = (new_height+magy-1) / magy; + } + ++ if(width[SRC] < 1) ++ width[SRC] = 1; + if(width[SRC] > WidthOfScreen(scr)) + width[SRC] = WidthOfScreen(scr); + ++ if(height[SRC] < 1) ++ height[SRC] = 1; + if(height[SRC] > HeightOfScreen(scr)) + height[SRC] = HeightOfScreen(scr); + +@@ -270,12 +293,34 @@ + height[DST] = new_height; + } + ++ ++void scale8(void) ++{ ++#define T unsigned char ++#include "scale.h" ++#undef T ++} ++ ++ ++void scale16(void) ++{ ++#define T unsigned short ++#include "scale.h" ++#undef T ++} ++ ++ ++void scale32(void) ++{ ++#define T unsigned int ++#include "scale.h" ++#undef T ++} ++ ++ + int + main(int argc, char **argv) { + XSetWindowAttributes xswa; +- int i, j, k; +- char c; +- char *p1, *p2; + XEvent event; + int buttonpressed = False; + int unmapped = True; +@@ -286,8 +331,9 @@ + int source_geom_mask = NoValue, + dest_geom_mask = NoValue, + copy_from_src_mask; +- int xpos = 0, ypos = 0; ++ int xpos = 0, ypos = 0; + ++ atexit(destroy_images); + progname = strrchr(argv[0], '/'); + if(progname) + ++progname; +@@ -312,7 +358,7 @@ + + if(magx <= 0) + Usage(); +- ++ + + magy = argc > 1 ? atoi(argv[1]) : -1; + +@@ -340,7 +386,7 @@ + flipxy = True; + continue; + } +- ++ + if(!strcmp(argv[0], "-source")) { + ++argv; --argc; + +@@ -438,23 +484,24 @@ + + scr = DefaultScreenOfDisplay(dpy); + +- if(DefaultDepthOfScreen(scr) != 8) { +- fprintf(stderr, "%s: can work only with 8 bits/pixel\n", progname); ++ depth = DefaultDepthOfScreen(scr); ++ if (depth < 8) { ++ fprintf(stderr, "%s: need at least 8 bits/pixel\n", progname); + exit(1); + } + + if(source_geom_mask & XNegative) + xgrab += WidthOfScreen(scr); +- ++ + if(source_geom_mask & YNegative) + ygrab += HeightOfScreen(scr); + + if(dest_geom_mask & XNegative) + xpos += WidthOfScreen(scr); +- ++ + if(source_geom_mask & YNegative) + ypos += HeightOfScreen(scr); +- ++ + /* printf("=%dx%d+%d+%d\n", width[DST], height[DST], xpos, ypos); */ + + xswa.event_mask = ButtonPressMask|ButtonReleaseMask|ButtonMotionMask; +@@ -463,24 +510,33 @@ + xswa.background_pixel = BlackPixelOfScreen(scr); + + win = XCreateWindow(dpy, RootWindowOfScreen(scr), +- xpos, ypos, width[DST], height[DST], 0, ++ xpos, ypos, width[DST], height[DST], 0, + DefaultDepthOfScreen(scr), InputOutput, + DefaultVisualOfScreen(scr), + CWEventMask | CWBackPixel, &xswa); + +- XChangeProperty(dpy, win, XA_WM_ICON_NAME, XA_STRING, 8, ++ XChangeProperty(dpy, win, XA_WM_ICON_NAME, XA_STRING, 8, + PropModeReplace, + (unsigned char *)progname, strlen(progname)); + + /* +- XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, ++ XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, + PropModeReplace, + (unsigned char *)progname, strlen(progname)); + */ + ++ ++ /*** 20020213 ++ code added by to handle ++ window manager "close" event ++ ***/ ++ wm_delete_window = XInternAtom (dpy, "WM_DELETE_WINDOW", False); ++ wm_protocols = XInternAtom(dpy, "WM_PROTOCOLS", False); ++ status = XSetWMProtocols(dpy, win, &wm_delete_window, 1); ++ + set_title = True; + +- XMapWindow(dpy, win); ++ status = XMapWindow(dpy, win); + + gcv.plane_mask = AllPlanes; + gcv.subwindow_mode = IncludeInferiors; +@@ -512,7 +568,7 @@ + { + static char bitmap_data[] = { 0 }; + static XColor col = { 0 }; +- Pixmap curs = XCreatePixmapFromBitmapData(dpy, ++ Pixmap curs = XCreatePixmapFromBitmapData(dpy, + RootWindowOfScreen(scr), bitmap_data, 1, 1, 0, 0, 1); + + when_button = XCreatePixmapCursor(dpy, curs, curs, &col, &col, 0, 0); +@@ -526,11 +582,22 @@ + + for(;;) { + ++ /***** ++ old event loop updated to support WM messages + while(unmapped? + (XWindowEvent(dpy, win, (long)-1, &event), 1): + XCheckWindowEvent(dpy, win, (long)-1, &event)) { +- ++ ******/ ++ ++ while(XPending(dpy)) { ++ XNextEvent(dpy, &event); + switch(event.type) { ++ case ClientMessage: ++ if ((event.xclient.message_type == wm_protocols) && ++ (event.xclient.data.l[0] == wm_delete_window)) { ++ exit(0); ++ } ++ break; + case ConfigureNotify: + if(event.xconfigure.width != width[DST] || + event.xconfigure.height != height[DST]) { +@@ -567,6 +634,7 @@ + + case '+': + case '=': ++ case XK_KP_Add: + if(!yzoom_flag) ++magx; + if(!xzoom_flag) ++magy; + xzoom_flag = yzoom_flag = False; +@@ -575,6 +643,7 @@ + break; + + case '-': ++ case XK_KP_Subtract: + if(!yzoom_flag) --magx; + if(!xzoom_flag) --magy; + xzoom_flag = yzoom_flag = False; +@@ -585,6 +654,7 @@ + break; + + case XK_Left: ++ case XK_KP_Left: + if(flipxy) + if(flipx) + ygrab += scroll; +@@ -598,6 +668,7 @@ + break; + + case XK_Right: ++ case XK_KP_Right: + if(flipxy) + if(flipx) + ygrab -= scroll; +@@ -611,6 +682,7 @@ + break; + + case XK_Up: ++ case XK_KP_Up: + if(flipxy) + if(flipy) + xgrab -= scroll; +@@ -624,6 +696,7 @@ + break; + + case XK_Down: ++ case XK_KP_Down: + if(flipxy) + if(flipy) + xgrab += scroll; +@@ -666,12 +739,17 @@ + xzoom_flag = False; + break; + ++ case 'g': ++ gridx = !gridx; ++ gridy = !gridy; ++ break; ++ + case 'd': + if(++delay_index >= NDELAYS) + delay_index = 0; + delay = delays[delay_index]; + sprintf(title, "delay = %d ms", delay/1000); +- XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, ++ XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, + PropModeReplace, + (unsigned char *)title, strlen(title)); + signal(SIGALRM, timeout_func); +@@ -717,6 +795,7 @@ + #endif + } + break; ++ + } + + /* trying XShmGetImage when part of the rect is +@@ -736,6 +815,7 @@ + + if(ygrab > HeightOfScreen(scr)-height[SRC]) + ygrab = HeightOfScreen(scr)-height[SRC]; ++ + } + + #ifdef XSHM +@@ -753,63 +833,12 @@ + } + #endif + +- /* copy scaled lines from src to dst */ +- for(j = flipxy?width[SRC]:height[SRC]; --j >= 0; ) { +- /* p1 point to begining of scanline j*magy in DST */ +- p1 = &ximage[DST]->data[ximage[DST]->xoffset + +- j*magy*ximage[DST]->bytes_per_line ]; +- /* p2 point to begining of scanline j in SRC */ +- /* if flipy then line height[SRC]-1-j */ +- p2 = &ximage[SRC]->data[ximage[SRC]->xoffset + +- (flipy?(height[SRC]-1-j):j)*ximage[SRC]->bytes_per_line ]; +- +- if(flipxy) { +- int p2step = ximage[SRC]->bytes_per_line; +- p2 = &ximage[SRC]->data[ximage[SRC]->xoffset + (flipy?j:(width[SRC]-1-j))]; +- +- if(flipx) { +- p2 += p2step * (height[SRC]-1); +- p2step = -p2step; +- } +- +- for(i = height[SRC]; --i >= 0;) { +- c = *p1++ = *p2; +- p2 += p2step; +- for(k = magx; --k > 0; ) +- *p1++ = c; +- } +- } +- else if(flipx) { +- p2 += width[SRC]; +- for(i = width[SRC]; --i >= 0;) { +- c = *p1++ = *--p2; +- for(k = magx; --k > 0; ) +- *p1++ = c; +- } +- } +- else { +- for(i = width[SRC]; --i >= 0;) { +- c = *p1++ = *p2++; +- for(k = magx; --k > 0; ) +- *p1++ = c; +- } +- } +- +- /* p1 point to begining of scanline j*magy in DST */ +- p1 = &ximage[DST]->data[ximage[DST]->xoffset + +- j*magy*ximage[DST]->bytes_per_line ]; +- /* p2 points to begining of next line */ +- p2 = p1 + ximage[DST]->bytes_per_line; +- /* duplicate that line as needed */ +- for(k = magy; --k > 0; ) { +-#ifdef BCOPY +- bcopy(p1, p2, width[DST]); +-#else +- memmove(p2, p1, width[DST]); +-#endif +- p2 += ximage[DST]->bytes_per_line; +- } +- } ++ if (depth == 8) ++ scale8(); ++ else if (depth <= 8*sizeof(short)) ++ scale16(); ++ else if (depth <= 8*sizeof(int)) ++ scale32(); + + #ifdef XSHM + XShmPutImage(dpy, win, gc, ximage[DST], 0, 0, 0, 0, width[DST], height[DST], False); +@@ -825,7 +854,7 @@ + flipx?"-":"", magx, + flipxy?" <=>":";", + flipy?"-":"", magy); +- XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, ++ XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, + PropModeReplace, + (unsigned char *)title, strlen(title)); + set_title = False; +--- xzoom-0.3.orig/xzoom.man ++++ xzoom-0.3/xzoom.man +@@ -1,9 +1,9 @@ + .\" xzoom.man + .\" Copyright Itai Nahshon + .\" +-.TH XZOOM 1X ++.TH XZOOM 1x + .SH NAME +-xzoom \- ++xzoom \- magnify part of the screen, with fast updates + .SH SYNOPSIS + .B xzoom + [ \-display \fIdisplayname\fP ] [ \-mag \fImag\fP [ \fImag\fP ] ] +@@ -18,7 +18,7 @@ + .TP 5 + .B \-mag \fImag\fP [ \fImag\fP ] + What magnification to use. If two number arguments are supplied the +-first is used for X magniications and the second is used for Y magnification. ++first is used for X magnifications and the second is used for Y magnification. + Magnification should be greater than 0. + .TP 5 + .B \-x +@@ -85,6 +85,9 @@ + sets the delay between frame updates. + Built-in delays are 200, 100, 50, 10 and 0 ms. + .TP 5 ++.B g ++toggle grid on and off. ++.TP 5 + .B Mouse buttons + To set the location of the magnified are click the left mouse + button inside xzoom's window and then move it (keep the button +@@ -147,11 +150,6 @@ + display is not on the local host. + .LP 5 + \(dg +-The Ximage data is accessed directly, in a way which may +-not be portable. Xzoom will not run with display depth other +-than 8 bits per pixel. +-.LP 5 +-\(dg + Xzoom is given with no warranty. It was tested only under + Linux with Xfree86 release 3.1.2 (X11R6). + .LP 5 diff --git a/srcpkgs/xzoom/template b/srcpkgs/xzoom/template new file mode 100644 index 00000000000..ea5accf37d7 --- /dev/null +++ b/srcpkgs/xzoom/template @@ -0,0 +1,24 @@ +# Template file for 'xzoom' +pkgname=xzoom +version=0.3 +revision=1 +hostmakedepends="imake" +makedepends="libXt-devel libXext-devel" +short_desc="Magnify part of X display, with real-time updates" +maintainer="Daniel Santana " +license="Custom" +homepage="http://sunsite.unc.edu/pub/linux/libs/X/" +distfiles="http://webdiis.unizar.es/pub/unix/X11/${pkgname}-${version}.tgz" +checksum=b26bfd692d3e1d30e8d524d4018fc3f0fe847983a2778a4a2496784bfc2df44b +patch_args="-Np1" + +do_build() { + CC=cc xmkmf + sed -i "s@-O2@$CFLAGS@" ./Makefile + make CC=$CC CDEBUGFLAGS="${CFLAGS}" EXTRA_LDOPTIONS="${LDFLAGS}" +} + +do_install() { + make MANSUFFIX=1 DESTDIR=${DESTDIR} install install.man + vlicense ${FILESDIR}/COPYING +}