diff options
Diffstat (limited to 'games/x11/xroach/xroach.c')
-rw-r--r-- | games/x11/xroach/xroach.c | 602 |
1 files changed, 0 insertions, 602 deletions
diff --git a/games/x11/xroach/xroach.c b/games/x11/xroach/xroach.c deleted file mode 100644 index 971e90f..0000000 --- a/games/x11/xroach/xroach.c +++ /dev/null @@ -1,602 +0,0 @@ -/* - Xroach - A game of skill. Try to find the roaches under your windows. - - Copyright 1991 by J.T. Anderson - - jta@locus.com - - This program may be freely distributed provided that all - copyright notices are retained. - - To build: - cc -o xroach roach.c -lX11 [-lsocketorwhatever] [-lm] [-l...] - - Dedicated to Greg McFarlane. (gregm@otc.otca.oz.au) -*/ -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/Xos.h> - -#include <stdio.h> -#include <math.h> -#include <signal.h> -#include <stdlib.h> - -char Copyright[] = "Xroach\nCopyright 1991 J.T. Anderson"; - -#include "roachmap.h" - -typedef unsigned long Pixel; -typedef int ErrorHandler(); - -#define SCAMPER_EVENT (LASTEvent + 1) - -#if !defined(GRAB_SERVER) -#define GRAB_SERVER 0 -#endif - -Display *display; -int screen; -Window rootWin; -unsigned int display_width, display_height; -int center_x, center_y; -GC gc; -char *display_name = NULL; -Pixel black, white; - -int done = 0; -int eventBlock = 0; -int errorVal = 0; - -typedef struct Roach { - RoachMap *rp; - int index; - float x; - float y; - int intX; - int intY; - int hidden; - int turnLeft; - int steps; -} Roach; - -Roach *roaches; -int maxRoaches = 10; -int curRoaches = 0; -float roachSpeed = 20.0; - -Region rootVisible = NULL; - -void Usage(); -void SigHandler(); -void AddRoach(); -void MoveRoach(); -void DrawRoaches(); -void CoverRoot(); -int CalcRootVisible(); -int MarkHiddenRoaches(); -Pixel AllocNamedColor(); - -void -main(ac, av) -int ac; -char *av[]; -{ - XGCValues xgcv; - int ax; - char *arg; - RoachMap *rp; - int rx; - float angle; - XEvent ev; - char *roachColor = "black"; - int nVis; - int needCalc; - - /* - Process command line options. - */ - for (ax=1; ax<ac; ax++) { - arg = av[ax]; - if (strcmp(arg, "-display") == 0) { - display_name = av[++ax]; - } - else if (strcmp(arg, "-rc") == 0) { - roachColor = av[++ax]; - } - else if (strcmp(arg, "-speed") == 0) { - roachSpeed = atof(av[++ax]); - } - else if (strcmp(arg, "-roaches") == 0) { - maxRoaches = strtol(av[++ax], (char **)NULL, 0); - } - else { - Usage(); - } - } - - srand((int)time((long *)NULL)); - - /* - Catch some signals so we can erase any visible roaches. - */ - signal(SIGKILL, SigHandler); - signal(SIGINT, SigHandler); - signal(SIGTERM, SigHandler); - signal(SIGHUP, SigHandler); - - display = XOpenDisplay(display_name); - if (display == NULL) { - if (display_name == NULL) display_name = getenv("DISPLAY"); - (void) fprintf(stderr, "%s: cannot connect to X server %s\n", av[0], - display_name ? display_name : "(default)"); - exit(1); - } - - screen = DefaultScreen(display); - rootWin = RootWindow(display, screen); - black = BlackPixel(display, screen); - white = WhitePixel(display, screen); - - display_width = DisplayWidth(display, screen); - display_height = DisplayHeight(display, screen); - center_x = display_width / 2; - center_y = display_height / 2; - - /* - Create roach pixmaps at several orientations. - */ - for (ax=0; ax<360; ax+=ROACH_ANGLE) { - rx = ax / ROACH_ANGLE; - angle = rx * 0.261799387799; - rp = &roachPix[rx]; - rp->pixmap = XCreateBitmapFromData(display, rootWin, - rp->roachBits, rp->width, rp->height); - rp->sine = sin(angle); - rp->cosine = cos(angle); - } - - roaches = (Roach *)malloc(sizeof(Roach) * maxRoaches); - - gc = XCreateGC(display, rootWin, 0L, &xgcv); - XSetForeground(display, gc, AllocNamedColor(roachColor, black)); - XSetFillStyle(display, gc, FillStippled); - - while (curRoaches < maxRoaches) - AddRoach(); - - XSelectInput(display, rootWin, ExposureMask | SubstructureNotifyMask); - - needCalc = 1; - while (!done) { - if (XPending(display)) { - XNextEvent(display, &ev); - } - else { - if (needCalc) { - needCalc = CalcRootVisible(); - } - nVis = MarkHiddenRoaches(); - if (nVis) { - ev.type = SCAMPER_EVENT; - } - else { - DrawRoaches(); - eventBlock = 1; - XNextEvent(display, &ev); - eventBlock = 0; - } - } - - switch (ev.type) { - - case SCAMPER_EVENT: - for (rx=0; rx<curRoaches; rx++) { - if (!roaches[rx].hidden) - MoveRoach(rx); - } - DrawRoaches(); - XSync(display, False); - break; - - case Expose: - case MapNotify: - case UnmapNotify: - case ConfigureNotify: - needCalc = 1; - break; - - } - } - - CoverRoot(); - - XCloseDisplay(display); -} - -#define USEPRT(msg) fprintf(stderr, msg) - -void -Usage() -{ - USEPRT("Usage: xroach [options]\n\n"); - USEPRT("Options:\n"); - USEPRT(" -display displayname\n"); - USEPRT(" -rc roachcolor\n"); - USEPRT(" -roaches numroaches\n"); - USEPRT(" -speed roachspeed\n"); - - exit(1); -} - -void -SigHandler() -{ - - /* - If we are blocked, no roaches are visible and we can just bail - out. If we are not blocked, then let the main procedure clean - up the root window. - */ - if (eventBlock) { - XCloseDisplay(display); - exit(0); - } - else { - done = 1; - } -} - -/* - Generate random integer between 0 and maxVal-1. -*/ -int -RandInt(maxVal) -int maxVal; -{ - return rand() % maxVal; -} - -/* - Check for roach completely in specified rectangle. -*/ -int -RoachInRect(roach, rx, ry, x, y, width, height) -Roach *roach; -int rx; -int ry; -int x; -int y; -unsigned int width; -unsigned int height; -{ - if (rx < x) return 0; - if ((rx + roach->rp->width) > (x + width)) return 0; - if (ry < y) return 0; - if ((ry + roach->rp->height) > (y + height)) return 0; - - return 1; -} - -/* - Check for roach overlapping specified rectangle. -*/ -int -RoachOverRect(roach, rx, ry, x, y, width, height) -Roach *roach; -int rx; -int ry; -int x; -int y; -unsigned int width; -unsigned int height; -{ - if (rx >= (x + width)) return 0; - if ((rx + roach->rp->width) <= x) return 0; - if (ry >= (y + height)) return 0; - if ((ry + roach->rp->height) <= y) return 0; - - return 1; -} - -/* - Give birth to a roach. -*/ -void -AddRoach() -{ - Roach *r; - - if (curRoaches < maxRoaches) { - r = &roaches[curRoaches++]; - r->index = RandInt(ROACH_HEADINGS); - r->rp = &roachPix[r->index]; - r->x = RandInt(display_width - r->rp->width); - r->y = RandInt(display_height - r->rp->height); - r->intX = -1; - r->intY = -1; - r->hidden = 0; - r->steps = RandInt(200); - r->turnLeft = RandInt(100) >= 50; - } -} - -/* - Turn a roach. -*/ -void -TurnRoach(roach) -Roach *roach; -{ - if (roach->index != (roach->rp - roachPix)) return; - - if (roach->turnLeft) { - roach->index += (RandInt(30) / 10) + 1; - if (roach->index >= ROACH_HEADINGS) - roach->index -= ROACH_HEADINGS; - } - else { - roach->index -= (RandInt(30) / 10) + 1; - if (roach->index < 0) - roach->index += ROACH_HEADINGS; - } -} - -/* - Move a roach. -*/ -void -MoveRoach(rx) -int rx; -{ - Roach *roach; - Roach *r2; - float newX; - float newY; - int ii; - - roach = &roaches[rx]; - newX = roach->x + (roachSpeed * roach->rp->cosine); - newY = roach->y - (roachSpeed * roach->rp->sine); - - if (RoachInRect(roach, (int)newX, (int)newY, - 0, 0, display_width, display_height)) { - - roach->x = newX; - roach->y = newY; - - if (roach->steps-- <= 0) { - TurnRoach(roach); - roach->steps = RandInt(200); - } - - for (ii=rx+1; ii<curRoaches; ii++) { - r2 = &roaches[ii]; - if (RoachOverRect(roach, (int)newX, (int)newY, - r2->intX, r2->intY, r2->rp->width, r2->rp->height)) { - - TurnRoach(roach); - } - } - } - else { - TurnRoach(roach); - } -} - -/* - Draw all roaches. -*/ -void -DrawRoaches() -{ - Roach *roach; - int rx; - - for (rx=0; rx<curRoaches; rx++) { - roach = &roaches[rx]; - - if (roach->intX >= 0) { - XClearArea(display, rootWin, roach->intX, roach->intY, - roach->rp->width, roach->rp->height, False); - } - } - - for (rx=0; rx<curRoaches; rx++) { - roach = &roaches[rx]; - - if (!roach->hidden) { - roach->intX = roach->x; - roach->intY = roach->y; - roach->rp = &roachPix[roach->index]; - - XSetStipple(display, gc, roach->rp->pixmap); - XSetTSOrigin(display, gc, roach->intX, roach->intY); - XFillRectangle(display, rootWin, gc, - roach->intX, roach->intY, roach->rp->width, roach->rp->height); - } - else { - roach->intX = -1; - } - } -} - -/* - Cover root window to erase roaches. -*/ -void -CoverRoot() -{ - XSetWindowAttributes xswa; - long wamask; - Window roachWin; - - xswa.background_pixmap = ParentRelative; - xswa.override_redirect = True; - wamask = CWBackPixmap | CWOverrideRedirect; - roachWin = XCreateWindow(display, rootWin, 0, 0, - display_width, display_height, 0, CopyFromParent, - InputOutput, CopyFromParent, wamask, &xswa); - XLowerWindow(display, roachWin); - XMapWindow(display, roachWin); - XFlush(display); -} - -#if !GRAB_SERVER - -int -RoachErrors(dpy, err) -Display *dpy; -XErrorEvent *err; -{ - errorVal = err->error_code; - - return 0; -} - -#endif /* GRAB_SERVER */ - -/* - Calculate Visible region of root window. -*/ -int -CalcRootVisible() -{ - Region covered; - Region visible; - Window *children; - int nChildren; - Window dummy; - XWindowAttributes wa; - int wx; - XRectangle rect; - int winX, winY; - unsigned int winHeight, winWidth; - unsigned int borderWidth; - unsigned int depth; - - /* - If we don't grab the server, the XGetWindowAttribute or XGetGeometry - calls can abort us. On the other hand, the server grabs can make for - some annoying delays. - */ -#if GRAB_SERVER - XGrabServer(display); -#else - XSetErrorHandler(RoachErrors); -#endif - - /* - Get children of root. - */ - XQueryTree(display, rootWin, &dummy, &dummy, &children, &nChildren); - - /* - For each mapped child, add the window rectangle to the covered - region. - */ - covered = XCreateRegion(); - for (wx=0; wx<nChildren; wx++) { - if (XEventsQueued(display, QueuedAlready)) return 1; - errorVal = 0; - XGetWindowAttributes(display, children[wx], &wa); - if (errorVal) continue; - if (wa.map_state == IsViewable) { - XGetGeometry(display, children[wx], &dummy, &winX, &winY, - &winWidth, &winHeight, &borderWidth, &depth); - if (errorVal) continue; - rect.x = winX; - rect.y = winY; - rect.width = winWidth + (borderWidth * 2); - rect.height = winHeight + (borderWidth * 2); - XUnionRectWithRegion(&rect, covered, covered); - } - } - XFree((char *)children); - -#if GRAB_SERVER - XUngrabServer(display); -#else - XSetErrorHandler((ErrorHandler *)NULL); -#endif - - /* - Subtract the covered region from the root window region. - */ - visible = XCreateRegion(); - rect.x = 0; - rect.y = 0; - rect.width = display_width; - rect.height = display_height; - XUnionRectWithRegion(&rect, visible, visible); - XSubtractRegion(visible, covered, visible); - XDestroyRegion(covered); - - /* - Save visible region globally. - */ - if (rootVisible) - XDestroyRegion(rootVisible); - rootVisible = visible; - - - /* - Mark all roaches visible. - */ - for (wx=0; wx<curRoaches; wx++) - roaches[wx].hidden = 0; - - return 0; -} - -/* - Mark hidden roaches. -*/ -int -MarkHiddenRoaches() -{ - int rx; - Roach *r; - int nVisible; - - nVisible = 0; - for (rx=0; rx<curRoaches; rx++) { - r = &roaches[rx]; - - if (!r->hidden) { - if (r->intX > 0 && XRectInRegion(rootVisible, r->intX, r->intY, - r->rp->width, r->rp->height) == RectangleOut) { - r->hidden = 1; - } - else { - nVisible++; - } - } - } - - return nVisible; -} - -/* - Allocate a color by name. -*/ -Pixel -AllocNamedColor(colorName, dfltPix) -char *colorName; -Pixel dfltPix; -{ - Pixel pix; - XColor scrncolor; - XColor exactcolor; - - if (XAllocNamedColor(display, DefaultColormap(display, screen), - colorName, &scrncolor, &exactcolor)) { - pix = scrncolor.pixel; - } - else { - pix = dfltPix; - } - - return pix; -} - |