251 lines
6.5 KiB
Plaintext
251 lines
6.5 KiB
Plaintext
--- 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;
|