v12i052: xroach, Patch1, Part01/01

JT Anderson jta at prodnet.la.locus.com
Sat Apr 6 11:47:06 AEST 1991


Submitted-by: JT Anderson <jta at prodnet.la.locus.com>
Posting-number: Volume 12, Issue 52
Archive-name: xroach/patch1
Patch-To: xroach: Volume 12, Issue 51

-------
Patch-To: xroach: Volume 12, Issue 51
# This is a shar archive.  Extract with sh, not csh.
# The rest of this file will extract:
# README squish.xbm xroach.patch1
# ----------------< cut here >---------------------- 
echo extracting - README
sed 's/^X//' > README << '~FUNKY STUFF~'
XThis patch to xroach adds two new options and support for virtual root
Xwindow managers, such as tvtwm.  It also fixes a couple of potential 
Xmemory faults.
X
XThe new options are -squish to enable squishing roaches with the mouse
Xand -rgc to set the color of the roach guts that splash out.  Yellowgreen
Xis recommended.
X
XTo apply the patches, unpack this file in your xroach directory using sh
Xthen incant:
X
X    patch -p0 <xroach.patch1
~FUNKY STUFF~
echo extracting - squish.xbm
sed 's/^X//' > squish.xbm << '~FUNKY STUFF~'
X#define squish_width 48
X#define squish_height 48
X#define squish_x_hot -1
X#define squish_y_hot -1
Xstatic char squish_bits[] = {
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x20, 0x00,
X   0x00, 0x00, 0x18, 0x08, 0x02, 0x00, 0x00, 0x40, 0x41, 0x52, 0x28, 0x00,
X   0x00, 0x80, 0x81, 0x1c, 0x13, 0x00, 0x00, 0x00, 0x12, 0x69, 0x00, 0x00,
X   0x00, 0x30, 0x88, 0x40, 0x09, 0x00, 0x00, 0x40, 0x40, 0x00, 0x04, 0x00,
X   0x00, 0x90, 0x06, 0x01, 0x30, 0x00, 0x00, 0x98, 0x80, 0x02, 0x10, 0x00,
X   0x80, 0x20, 0x00, 0x80, 0x44, 0x00, 0x00, 0x0c, 0x82, 0xb0, 0x00, 0x00,
X   0x80, 0x22, 0x20, 0x10, 0x44, 0x00, 0x00, 0x04, 0x1e, 0xa1, 0x00, 0x00,
X   0x00, 0x04, 0x02, 0xa6, 0x18, 0x06, 0x00, 0x80, 0x00, 0x80, 0x8b, 0x00,
X   0x00, 0x88, 0x0e, 0x02, 0x01, 0x00, 0x40, 0x04, 0x05, 0x62, 0x50, 0x04,
X   0x40, 0x00, 0x01, 0x50, 0x09, 0x00, 0x00, 0x28, 0x12, 0x13, 0x88, 0x04,
X   0x40, 0xc1, 0x30, 0x40, 0x02, 0x00, 0x60, 0x02, 0x03, 0x50, 0xc1, 0x01,
X   0x00, 0x42, 0x16, 0x94, 0x80, 0x06, 0x00, 0x00, 0x40, 0x10, 0x40, 0x00,
X   0x00, 0x94, 0x10, 0xe4, 0x34, 0x02, 0x00, 0x80, 0x1c, 0x84, 0x89, 0x00,
X   0x00, 0x11, 0x00, 0x00, 0x20, 0x02, 0x00, 0x30, 0x10, 0x80, 0x54, 0x00,
X   0x00, 0x20, 0x91, 0xa5, 0xc4, 0x00, 0x00, 0x22, 0x20, 0x28, 0x92, 0x00,
X   0x00, 0x52, 0x08, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x90, 0x02, 0x2c, 0x00,
X   0x00, 0x10, 0x01, 0x49, 0x00, 0x00, 0x00, 0x40, 0x04, 0x12, 0x0e, 0x00,
X   0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x05, 0x40, 0x01, 0x00,
X   0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
~FUNKY STUFF~
echo extracting - xroach.patch1
sed 's/^X//' > xroach.patch1 << '~FUNKY STUFF~'
X*** patchlevel.h	Tue Apr 02 11:59:19 1991
X--- ../xroach/patchlevel.h	Tue Apr 02 11:57:25 1991
X***************
X*** 1 ****
X! #define PATCHLEVEL 0
X--- 1,4 ----
X! 
X! /* @(#)patchlevel.h	1.2 4/2/91 11:57:18 */
X! 
X! #define PATCHLEVEL 1
X*** roachmap.h	Tue Apr 02 11:59:19 1991
X--- ../xroach/roachmap.h	Tue Apr 02 11:55:42 1991
X***************
X*** 1,3 ****
X--- 1,6 ----
X+ 
X+ /* @(#)roachmap.h	1.3 4/2/91 11:55:35 */
X+ 
X  #include "roach000.xbm"
X  #include "roach015.xbm"
X  #include "roach030.xbm"
X***************
X*** 22,27 ****
X--- 25,32 ----
X  #include "roach315.xbm"
X  #include "roach330.xbm"
X  #include "roach345.xbm"
X+ 
X+ #include "squish.xbm"
X  
X  #define ROACH_HEADINGS	24	/* number of orientations */
X  #define ROACH_ANGLE	15	/* angle between orientations */
X*** xroach.c	Tue Apr 02 11:59:18 1991
X--- ../xroach/xroach.c	Tue Apr 02 11:53:42 1991
X***************
X*** 12,21 ****
X--- 12,31 ----
X        cc -o xroach roach.c -lX11 [-lsocketorwhatever] [-lm] [-l...]
X  
X      Dedicated to Greg McFarlane.   (gregm at otc.otca.oz.au)
X+     
X+     Squish option contributed by Rick Petkiewizc (rick at locus.com)
X+     
X+     Virtual root code adapted from patch sent by Colin Rafferty who
X+     borrowed it from Tom LaStrange.  Several other folks sent similar
X+     fixes.
X  */
X+ 
X+ /* @(#)xroach.c	1.5 4/2/91 11:53:31 */
X+ 
X  #include <X11/Xlib.h>
X  #include <X11/Xutil.h>
X  #include <X11/Xos.h>
X+ #include <X11/Xatom.h>
X  
X  #include <stdio.h>
X  #include <math.h>
X***************
X*** 49,54 ****
X--- 59,65 ----
X  unsigned int display_width, display_height;
X  int center_x, center_y;
X  GC gc;
X+ GC gutsGC;
X  char *display_name = NULL;
X  Pixel black, white;
X  
X***************
X*** 55,60 ****
X--- 66,74 ----
X  int done = 0;
X  int eventBlock = 0;
X  int errorVal = 0;
X+ Bool squishRoach = False;
X+ Pixmap squishMap;
X+ Bool squishWinUp = False;
X  
X  typedef struct Roach {
X      RoachMap *rp;
X***************
X*** 84,89 ****
X--- 98,104 ----
X  int CalcRootVisible();
X  int MarkHiddenRoaches();
X  Pixel AllocNamedColor();
X+ Window FindRootWindow();
X  
X  void
X  main(ac, av)
X***************
X*** 98,105 ****
X--- 113,123 ----
X      float angle;
X      XEvent ev;
X      char *roachColor = "black";
X+     char *gutsColor = NULL;
X      int nVis;
X      int needCalc;
X+     Window squishWin;
X+     XSetWindowAttributes xswa;
X      
X      /*
X         Process command line options.
X***************
X*** 118,123 ****
X--- 136,147 ----
X  	else if (strcmp(arg, "-roaches") == 0) {
X  	    maxRoaches = strtol(av[++ax], (char **)NULL, 0);
X  	}
X+ 	else if (strcmp(arg, "-squish") == 0) {
X+ 	    squishRoach = True;
X+ 	}
X+ 	else if (strcmp(arg, "-rgc") == 0) {
X+ 	    gutsColor = av[++ax];
X+ 	}
X  	else {
X  	    Usage();
X  	}
X***************
X*** 142,148 ****
X      }
X  
X      screen = DefaultScreen(display);
X!     rootWin = RootWindow(display, screen);
X      black = BlackPixel(display, screen);
X      white = WhitePixel(display, screen);
X  
X--- 166,172 ----
X      }
X  
X      screen = DefaultScreen(display);
X!     rootWin = FindRootWindow();
X      black = BlackPixel(display, screen);
X      white = WhitePixel(display, screen);
X  
X***************
X*** 164,179 ****
X--- 188,229 ----
X  	rp->cosine = cos(angle);
X      }
X  
X+     /*
X+       Create the squished pixmap
X+     */
X+     if (squishRoach) {
X+     	squishMap = XCreateBitmapFromData(display, rootWin,
X+ 		squish_bits, squish_width, squish_height);
X+     }
X+ 
X      roaches = (Roach *)malloc(sizeof(Roach) * maxRoaches);
X  
X      gc = XCreateGC(display, rootWin, 0L, &xgcv);
X      XSetForeground(display, gc, AllocNamedColor(roachColor, black));
X      XSetFillStyle(display, gc, FillStippled);
X+ 
X+     if (squishRoach && gutsColor != NULL) {
X+         gutsGC = XCreateGC(display, rootWin, 0L, &xgcv);
X+         XSetForeground(display, gutsGC, AllocNamedColor(gutsColor, black));
X+         XSetFillStyle(display, gutsGC, FillStippled);
X+     }
X+     else
X+ 	gutsGC = gc;
X      
X      while (curRoaches < maxRoaches)
X  	AddRoach();
X      
X      XSelectInput(display, rootWin, ExposureMask | SubstructureNotifyMask);
X+ 
X+     if (squishRoach) {
X+ 	xswa.event_mask = ButtonPressMask;
X+ 	xswa.override_redirect = True;
X+ 	squishWin = XCreateWindow(display, rootWin, 0, 0,
X+ 			display_width, display_height, 0,
X+ 			CopyFromParent, InputOnly, CopyFromParent,
X+ 			CWOverrideRedirect | CWEventMask, &xswa);
X+ 	XLowerWindow(display, squishWin);
X+     }
X      
X      needCalc = 1;
X      while (!done) {
X***************
X*** 184,195 ****
X  	    if (needCalc) {
X  		needCalc = CalcRootVisible();
X  	    }
X! 	    nVis = MarkHiddenRoaches();
X  	    if (nVis) {
X  		ev.type = SCAMPER_EVENT;
X  	    }
X  	    else {
X! 		DrawRoaches();
X  		eventBlock = 1;
X  		XNextEvent(display, &ev);
X  		eventBlock = 0;
X--- 234,257 ----
X  	    if (needCalc) {
X  		needCalc = CalcRootVisible();
X  	    }
X! 	    if (needCalc)
X! 		nVis = 0;
X! 	    else
X! 	    	nVis = MarkHiddenRoaches();
X  	    if (nVis) {
X  		ev.type = SCAMPER_EVENT;
X+ 		if (!squishWinUp && squishRoach) {
X+ 		    XMapWindow(display, squishWin);
X+ 		    squishWinUp = True;
X+ 		}
X  	    }
X  	    else {
X! 		if (squishWinUp && squishRoach) {
X! 		    XUnmapWindow(display, squishWin);
X! 		    squishWinUp = False;
X! 		}
X! 		if (needCalc == 0)
X! 		    DrawRoaches();
X  		eventBlock = 1;
X  		XNextEvent(display, &ev);
X  		eventBlock = 0;
X***************
X*** 207,218 ****
X  		XSync(display, False);
X  		break;
X  		
X- 	    case Expose:
X- 	    case MapNotify:
X  	    case UnmapNotify:
X  	    case ConfigureNotify:
X  		needCalc = 1;
X  		break;
X  		
X  	}
X      }
X--- 269,288 ----
X  		XSync(display, False);
X  		break;
X  		
X  	    case UnmapNotify:
X+ 		if (ev.xunmap.window != squishWin)
X+ 		    needCalc = 1;
X+ 		break;
X+ 
X+ 	    case MapNotify:
X+ 	    case Expose:
X  	    case ConfigureNotify:
X  		needCalc = 1;
X  		break;
X+ 	
X+ 	    case ButtonPress:
X+ 		checkSquish(&ev);
X+ 		break;
X  		
X  	}
X      }
X***************
X*** 233,238 ****
X--- 303,310 ----
X      USEPRT("       -rc      roachcolor\n");
X      USEPRT("       -roaches numroaches\n");
X      USEPRT("       -speed   roachspeed\n");
X+     USEPRT("       -squish\n");
X+     USEPRT("       -rgc     roachgutscolor\n");
X      
X      exit(1);
X  }
X***************
X*** 256,261 ****
X--- 328,391 ----
X  }
X  
X  /*
X+    Find the root or virtual root window.
X+ */
X+ Window
X+ FindRootWindow()
X+ {
X+     Window rootWin;
X+     Window realRoot;
X+     Atom swmVroot;
X+     Window rootReturn, parentReturn, *children;
X+     unsigned int numChildren;
X+     int cx;
X+     Atom actualType;
X+     Atom actualFormat;
X+     unsigned long nItems;
X+     unsigned long bytesAfter;
X+     Window *newRoot;
X+     
X+     /*
X+        Get real root window.
X+     */
X+     realRoot = rootWin = RootWindow(display, screen);
X+     
X+     /*
X+        Get atom for virtual root property.  If the atom doesn't
X+        exist, we can assume the corresponding property does not
X+        exist. 
X+     */
X+     swmVroot = XInternAtom(display, "__SWM_VROOT", True);
X+     
X+     if (swmVroot == None)
X+ 	return rootWin;
X+     
X+     /*
X+        Run children of root, looking for a virtual root.
X+     */
X+     XQueryTree(display, rootWin, &rootReturn, &parentReturn, 
X+ 		    &children, &numChildren);
X+     for (cx=0; cx<numChildren; cx++) {
X+ 	newRoot = NULL;
X+ 	nItems = 0;
X+ 	if (XGetWindowProperty(display, children[cx], swmVroot, 0L, 1L, False,
X+ 	    XA_WINDOW, &actualType, &actualFormat, &nItems,
X+ 	    &bytesAfter, &newRoot) == Success && actualFormat != None) {
X+ 		if (nItems >= 1) {
X+ 		    rootWin = *newRoot;
X+ 		}
X+ 		if (newRoot) {
X+ 		    XFree(newRoot);
X+ 		}
X+ 	}
X+ 	if (rootWin != realRoot) break;
X+     }
X+     XFree(children);
X+     
X+     return rootWin;
X+ }
X+ 
X+ /*
X     Generate random integer between 0 and maxVal-1.
X  */
X  int
X***************
X*** 404,410 ****
X      for (rx=0; rx<curRoaches; rx++) {
X  	roach = &roaches[rx];
X  	
X! 	if (roach->intX >= 0) {
X  	    XClearArea(display, rootWin, roach->intX, roach->intY,
X  		roach->rp->width, roach->rp->height, False);
X  	}
X--- 534,540 ----
X      for (rx=0; rx<curRoaches; rx++) {
X  	roach = &roaches[rx];
X  	
X! 	if (roach->intX >= 0 && roach->rp != NULL) {
X  	    XClearArea(display, rootWin, roach->intX, roach->intY,
X  		roach->rp->width, roach->rp->height, False);
X  	}
X***************
X*** 505,515 ****
X      */
X      covered = XCreateRegion();
X      for (wx=0; wx<nChildren; wx++) {
X! 	if (XEventsQueued(display, QueuedAlready)) return 1;
X  	errorVal = 0;
X  	XGetWindowAttributes(display, children[wx], &wa);
X  	if (errorVal) continue;
X! 	if (wa.map_state == IsViewable) {
X  	    XGetGeometry(display, children[wx], &dummy, &winX, &winY,
X  		&winWidth, &winHeight, &borderWidth, &depth);
X  	    if (errorVal) continue;
X--- 635,648 ----
X      */
X      covered = XCreateRegion();
X      for (wx=0; wx<nChildren; wx++) {
X! 	if (XEventsQueued(display, QueuedAlready)) {
X! 	    XDestroyRegion(covered);
X! 	    return 1;
X! 	}
X  	errorVal = 0;
X  	XGetWindowAttributes(display, children[wx], &wa);
X  	if (errorVal) continue;
X! 	if (wa.class == InputOutput && wa.map_state == IsViewable) {
X  	    XGetGeometry(display, children[wx], &dummy, &winX, &winY,
X  		&winWidth, &winHeight, &borderWidth, &depth);
X  	    if (errorVal) continue;
X***************
X*** 606,609 ****
X--- 739,783 ----
X  	}
X  
X  	return pix;
X+ }
X+ 
X+ /*
X+  *	squishCheck - Check to see if we have to squish any roaches.
X+  */
X+ checkSquish(buttonEvent)
X+ XButtonEvent *buttonEvent;
X+ {
X+     int x, y;
X+     int i;
X+     int rx;
X+     Roach *r;
X+ /* */
X+     x = buttonEvent->x;
X+     y = buttonEvent->y;
X+ 
X+     for (rx=0; rx<curRoaches; rx++) {
X+ 	r = &roaches[rx];
X+ 	if (r->rp == NULL) continue;
X+ 
X+ 	if (x > r->intX &&
X+ 	    x < (r->intX + r->rp->width) &&
X+ 	    y > r->intY &&
X+ 	    y < (r->intY + r->rp->height)) {
X+ 	    XSetStipple(display, gutsGC, squishMap);
X+ 	    XSetTSOrigin(display, gutsGC, r->intX, r->intY);
X+ 	    XFillRectangle(display, rootWin, gutsGC,
X+ 		r->intX, r->intY, squish_width, squish_height);
X+ 
X+ 	    /*
X+ 	     * Delete the roach
X+ 	     */
X+ 	    for (i = rx; i < curRoaches - 1; i++)
X+ 	        roaches[i] = roaches[i + 1];
X+ 	
X+ 	    curRoaches--;
X+ 	    rx--;
X+ 	}
X+     }
X+ 
X+     return;
X  }
X*** xroach.man	Tue Apr 02 12:26:11 1991
X--- ../xroach/xroach.man	Tue Apr 02 12:46:43 1991
X***************
X*** 9,15 ****
X  displays disgusting cockroaches on your root window. These creapy crawlies
X  scamper
X  around until they find a window to hide under. Whenever you move or iconify
X! a window, the exposed beetles again scamper for cover.
X  .SH OPTIONS
X  .TP 8
X  .B \-display \fIdisplay_name\fB
X--- 9,15 ----
X  displays disgusting cockroaches on your root window. These creapy crawlies
X  scamper
X  around until they find a window to hide under. Whenever you move or iconify
X! a window, the exposed orthopteras again scamper for cover.
X  .SH OPTIONS
X  .TP 8
X  .B \-display \fIdisplay_name\fB
X***************
X*** 26,31 ****
X--- 26,38 ----
X  .TP 8
X  .B \-roaches \fInum_roaches\fB
X  This is the number of the little critters. Default is 10.
X+ .TP 8
X+ .B \-squish
X+ Enables roach squishing.  Point and shoot with any mouse button.
X+ .TP 8
X+ .B \-rgc \fIroach_gut_color\fB
X+ Sets color of the guts that spill out of squished roaches.  We recommend
X+ yellowgreen.
X  .SH BUGS
X  As given by the -roaches option. Default is 10.
X  .SH COPYRIGHT
~FUNKY STUFF~

--
Dan Heller
------------------------------------------------
O'Reilly && Associates		 Z-Code Software
Senior Writer			       President



More information about the Comp.sources.x mailing list