|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T w
Length: 4803 (0x12c3) Types: TextFile Names: »winx.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/others/quipu/photo/winx.c«
/* winx.c - xwindow version of display code */ #ifndef lint static char *rcsid = "$Header: /f/osi/others/quipu/photo/RCS/winx.c,v 7.0 89/11/23 22:01:50 mrose Rel $"; #endif /* * $Header: /f/osi/others/quipu/photo/RCS/winx.c,v 7.0 89/11/23 22:01:50 mrose Rel $ * * * $Log: winx.c,v $ * Revision 7.0 89/11/23 22:01:50 mrose * Release 6.0 * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ #include <stdio.h> #include "quipu/photo.h" #include <X11/Xlib.h> #include <X11/Xatom.h> #include <X11/Xutil.h> /* It appears that window manager writers have problems */ #ifndef NEVER_USE_WM #define WM_DISAPPEARED_BUG /* wm screw up & loses the window ! */ #define WM_WINGE_BUG /* When wm screws up, it also winges */ #endif NEVER_USE_WM #ifndef NEVER_USE_TWM #define TWM_RESIZE_BUG /* twm looses the resize if done too early. */ #endif NEVER_USE_TWM extern GC XCreateGC(); Pixmap pixmap; Display *dpy; Screen *scr; Window win; int winX, winY, winW, winH; XSetWindowAttributes xswa; GC gc; extern int NUMLINES,PIC_LINESIZE; extern unsigned position; unsigned long XorVal; int buttons_down = 0; int ignore_action = 0; static int passno = 1; static int x, y, maxx; extern int two_passes; photo_start (name) char * name; { x = y = 0; if (passno == 1) maxx = 0, two_passes = 1; return 0; } photo_end (name) char * name; { /* Decoding has finished - display the photo */ char buff[128]; if (passno == 1) { passno = 2; x = maxx, y--; /* Initialise a window to recieve a photo of 'name' */ if (!(dpy= XOpenDisplay((char *) 0))) { (void) printf ("Cannot open X display"); return (-1); } scr = DefaultScreenOfDisplay(dpy); winW = x; winH = y; winX = WidthOfScreen(scr) - winW; winY = HeightOfScreen(scr) - winH; /*NB: to get button release you have to ask for button press as well*/ xswa.event_mask = ExposureMask | ButtonReleaseMask | ButtonPressMask; xswa.background_pixel = BlackPixelOfScreen(scr); xswa.backing_store = WhenMapped; win = XCreateWindow(dpy, RootWindowOfScreen(scr), winX, winY, winW, winH, 0, DefaultDepthOfScreen(scr), InputOutput, DefaultVisualOfScreen(scr), CWEventMask | CWBackPixel | CWBackingStore, &xswa); pixmap = XCreatePixmap(dpy, win, winW,winH, DefaultDepthOfScreen(scr)); if (!pixmap) { (void) fprintf (stderr,"PHOTO: Pixmap failed"); return (-1); } /* Set up a graphics context: */ gc = XCreateGC(dpy, pixmap, 0, NULL); /* Clear pixmap */ XSetForeground(dpy, gc, BlackPixelOfScreen(scr)); XFillRectangle(dpy, pixmap, gc, 0, 0, winW,winH); XSetForeground(dpy, gc, WhitePixelOfScreen(scr)); XSetBackground(dpy, gc, BlackPixelOfScreen(scr)); XorVal = WhitePixelOfScreen(scr) ^ BlackPixelOfScreen(scr); return (0); } if (strcmp (name, "unknown") == 0) name = NULL; if (name == NULL) { (void) printf ("(See X window, pid %d)", getpid()); (void) fflush (stdout); } (void) close (1); (void) sprintf(buff, name ? "%s" : "%s (%d)", name ? name : "Photo", getpid()); XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, PropModeReplace, buff, strlen(buff)); XMapWindow(dpy, win); XSetForeground(dpy, gc, XorVal); for (;;) { XEvent xev; XNextEvent(dpy, &xev); switch (xev.type) { case ButtonPress: if (buttons_down++) { if (!ignore_action++) { XSetFunction(dpy, gc, GXcopy); XCopyArea(dpy, pixmap, win, gc, 0, 0, PIC_LINESIZE, NUMLINES, 0, 0); } } else { XSetFunction(dpy, gc, GXxor); XFillRectangle(dpy, win, gc, 0, 0, PIC_LINESIZE, NUMLINES); } continue; case ButtonRelease: if (!buttons_down) buttons_down++; if (--buttons_down) continue; if (!ignore_action) break; ignore_action = 0; continue; case Expose: XSetFunction(dpy, gc, GXcopy); XCopyArea(dpy, pixmap, win, gc, xev.xexpose.x, xev.xexpose.y, xev.xexpose.width, xev.xexpose.height, xev.xexpose.x, xev.xexpose.y); default: continue; } break; } return 0; } photo_black (length) int length; { if (passno == 1) { x += length; return 0; } /* draw a black line of 'length' pixels */ return 0; } photo_white (length) int length; { if (passno == 1) { x += length; return 0; } /* draw a white line of 'length' pixels */ XDrawLine (dpy,pixmap,gc,position,NUMLINES,length+position-1,NUMLINES); return 0; } photo_line_end (line) bit_string * line; { /* the end of a line has been reached */ /* A bit string is stored in line->dbuf_top */ if (passno == 1 && x > maxx) maxx = x; x = 0, y++; return 0; }