File xroach.dif of Package xroach
--- Imakefile
+++ Imakefile
@@ -1,6 +1,6 @@
SYS_LIBRARIES = -lm
LOCAL_LIBRARIES = $(XLIB)
-SRCS = xroach.c
-OBJS = xroach.o
+SRCS = xroach.c toon_root.c
+OBJS = xroach.o toon_root.o
ComplexProgramTarget(xroach)
--- xroach.c
+++ xroach.c
@@ -55,7 +55,7 @@
Display *display;
int screen;
-Window rootWin;
+Window rootWin, clientparent;
unsigned int display_width, display_height;
int center_x, center_y;
GC gc;
@@ -82,10 +82,15 @@
int steps;
} Roach;
+int minx = 10000;
+int miny = 10000;
+int maxx = 0;
+int maxy = 0;
+
Roach *roaches;
int maxRoaches = 10;
int curRoaches = 0;
-float roachSpeed = 20.0;
+float roachSpeed = 1.0;
Region rootVisible = NULL;
@@ -100,7 +105,7 @@
Pixel AllocNamedColor();
Window FindRootWindow();
-void
+int
main(ac, av)
int ac;
char *av[];
@@ -118,6 +123,8 @@
int needCalc;
Window squishWin;
XSetWindowAttributes xswa;
+ unsigned int toon_expose = 0;
+ unsigned int redrawIcons = 0;
/*
Process command line options.
@@ -166,7 +173,7 @@
}
screen = DefaultScreen(display);
- rootWin = FindRootWindow();
+ rootWin = ToonGetRootWindow(display, screen, &clientparent);
black = BlackPixel(display, screen);
white = WhitePixel(display, screen);
@@ -213,7 +220,19 @@
while (curRoaches < maxRoaches)
AddRoach();
- XSelectInput(display, rootWin, ExposureMask | SubstructureNotifyMask);
+ if (rootWin != RootWindow(display, screen)) {
+ if (rootWin == clientparent) {
+ XSelectInput(display, rootWin, ExposureMask | SubstructureNotifyMask
+ | StructureNotifyMask);
+ }
+ else {
+ XSelectInput(display, rootWin, ExposureMask | StructureNotifyMask);
+ XSelectInput(display, clientparent, ExposureMask | SubstructureNotifyMask);
+ }
+ }
+ else {
+ XSelectInput(display, clientparent, ExposureMask | SubstructureNotifyMask);
+ }
if (squishRoach) {
xswa.event_mask = ButtonPressMask;
@@ -225,6 +244,16 @@
XLowerWindow(display, squishWin);
}
+/* Will we redraw icons? */
+
+ {
+ XWindowAttributes attributes;
+
+ XGetWindowAttributes(display, rootWin, &attributes);
+ if (attributes.all_event_masks & ExposureMask)
+ toon_expose = 1;
+ }
+
needCalc = 1;
while (!done) {
if (XPending(display)) {
@@ -244,6 +273,7 @@
XMapWindow(display, squishWin);
squishWinUp = True;
}
+ redrawIcons=1;
}
else {
if (squishWinUp && squishRoach) {
@@ -252,6 +282,26 @@
}
if (needCalc == 0)
DrawRoaches();
+ if (toon_expose && redrawIcons
+ && maxx > minx && maxy > miny) {
+ XExposeEvent event;
+
+ event.type = Expose;
+ event.send_event = True;
+ event.display = display;
+ event.window = rootWin;
+ event.x = minx;
+ event.y = miny;
+ event.width = maxx-minx + 1;
+ event.height = maxy-miny + 1;
+ XSendEvent(display, rootWin, True, Expose,
+ (XEvent *) &event);
+ minx = 10000;
+ maxx = 0;
+ miny = 10000;
+ maxy = 0;
+ redrawIcons = 0;
+ }
eventBlock = 1;
XNextEvent(display, &ev);
eventBlock = 0;
@@ -502,6 +552,14 @@
roach->x = newX;
roach->y = newY;
+ if (newX < minx)
+ minx = newX;
+ if (newX+roach->rp->width > maxx)
+ maxx = newX+roach->rp->width;
+ if (newY < miny)
+ miny = newY;
+ if (newY+roach->rp->height > maxy)
+ maxy = newY+roach->rp->height;
if (roach->steps-- <= 0) {
TurnRoach(roach);
@@ -608,10 +666,11 @@
XWindowAttributes wa;
int wx;
XRectangle rect;
- int winX, winY;
+ int winX, winY, x, y, toon_display_width, toon_display_height, x_offset=0, y_offset=0;
unsigned int winHeight, winWidth;
unsigned int borderWidth;
unsigned int depth;
+ unsigned int width, height;
/*
If we don't grab the server, the XGetWindowAttribute or XGetGeometry
@@ -624,10 +683,19 @@
XSetErrorHandler(RoachErrors);
#endif
+ /* Check to see if rootWin has moved with respect to clientparent */
+ XGetWindowAttributes(display, rootWin, &wa);
+ toon_display_width = wa.width;
+ toon_display_height = wa.height;
+ if (rootWin != clientparent) {
+ x_offset = wa.x;
+ y_offset = wa.y;
+ }
+
/*
Get children of root.
*/
- XQueryTree(display, rootWin, &dummy, &dummy, &children, &nChildren);
+ XQueryTree(display, clientparent, &dummy, &dummy, &children, &nChildren);
/*
For each mapped child, add the window rectangle to the covered
@@ -643,6 +711,19 @@
XGetWindowAttributes(display, children[wx], &wa);
if (errorVal) continue;
if (wa.class == InputOutput && wa.map_state == IsViewable) {
+
+ x = wa.x - x_offset;
+ y = wa.y - y_offset;
+ width = wa.width + 2*wa.border_width;
+ height = wa.height + 2*wa.border_width;
+
+ /* Entirely offscreen? */
+ if (x >= toon_display_width) continue;
+ if (y >= toon_display_height) continue;
+ if ((y + height) <= 0) continue;
+ if ((x + width) <= 0) continue;
+ if ((y <= 0) && ((y + height) >= toon_display_height) && (x <= 0) && ((x + width) >= toon_display_width)) continue;
+
XGetGeometry(display, children[wx], &dummy, &winX, &winY,
&winWidth, &winHeight, &borderWidth, &depth);
if (errorVal) continue;
--- xroach.man
+++ xroach.man
@@ -20,8 +20,8 @@
Use the given string as the color for the bugs instead of the default "black".
.TP 8
.B \-speed \fIroach_speed\fB
-Use the given speed for the insects instead of the default 20.0. For example,
-in winter the speed should be set to 5.0. In summer, 30.0 might be about
+Use the given speed for the insects instead of the default 1.0. For example,
+in winter the speed should be set to 0.1. In summer, 2.0 might be about
right.
.TP 8
.B \-roaches \fInum_roaches\fB
--- xroach.c.orig 2005-04-07 18:48:09.000000000 +0200
+++ ./xroach.c 2005-04-07 18:49:04.887000769 +0200
@@ -104,6 +104,8 @@ int CalcRootVisible();
int MarkHiddenRoaches();
Pixel AllocNamedColor();
Window FindRootWindow();
+void checkSquish(XButtonEvent *buttonEvent);
+
int
main(ac, av)
@@ -121,7 +123,7 @@ char *av[];
char *gutsColor = NULL;
int nVis;
int needCalc;
- Window squishWin;
+ Window squishWin = 0;
XSetWindowAttributes xswa;
unsigned int toon_expose = 0;
unsigned int redrawIcons = 0;
@@ -827,7 +829,7 @@ Pixel dfltPix;
/*
* squishCheck - Check to see if we have to squish any roaches.
*/
-checkSquish(buttonEvent)
+void checkSquish(buttonEvent)
XButtonEvent *buttonEvent;
{
int x, y;