jam@elrond.CalComp.COM (Julie A. Melbin) (04/14/88)
This is going to be hard to explain, but here goes.... I took bounce.c which was posted to the group a while back and hacked it up to bounce the windows around the screen sort-of like the OLD video game 'pong'. Anyway, the idea is that all windows should bounce around the screen forever. So, when I start the 5 xclocks like: uwm& (to place the windows randomly on the screen) xclock -update 1& (five times) and then start xpong: xpong& the windows bounce around the screen. Fine. But, after a bit, the images of the clocks become damaged - for instance, multiple second hands appear on some clocks, while other fail to refresh after another window has bounced over top and then moved off. The source for xpong follows; question - is this code doing something wrong? or is there something wrong with my server (Sun 360 with patches 1-10 installed)? Does uwm have anything to do with this - I have to admit that as I write this, I never checked it without uwm. If that's my problem, sorry - but if so, why? Anyway, thanks anyone who even bothers to see if their server has the problem, let along who fixes it ! :) Thanks! ...{harvard, decvax}!elrond!jam or jam@elrond.CalComp.COM (603) 885-8139 #### cut here ##### /* compile : cc -o xpong xpong.c -lX11 /* X11 Bounce, by Steven Grady * (hacked by jam) */ #include <stdio.h> #include <X11/Xlib.h> #include <signal.h> struct window { Window win; XWindowAttributes winf; int xdir, ydir; }*windows, *savedwins; Display *dpy; int totwin; int gravity = 10; int bottom, side; int bye(); main(argc, argv) int argc; char **argv; { int i; struct window *wind; dpy = XOpenDisplay(argv[1]); if (argv[2] && argc >= 3) gravity = atoi(argv[2]); totwin = get_windows(); signal(SIGINT, bye); while (1) { for (i = 0; i < totwin; i++) { wind = &windows[i]; calc_windows(wind); disp_windows(wind); } XFlush(dpy); sleep(1); /* give other windows a chance to update */ } } calc_windows(win) struct window *win; { if (win->winf.y + win->winf.height >= (bottom - gravity) || hits_others(win)) win->ydir = win->ydir * -1; else if (win->winf.y <= 3 || hits_others(win)) win->ydir = win->ydir * -1; win->winf.y += gravity * win->ydir; if (win->winf.x + win->winf.width >= side || hits_others(win)) win->xdir = -1; else if (win->winf.x <= 3 || hits_others(win)) win->xdir = 1; win->winf.x += win->xdir * gravity; } int get_windows() { int n, i, j; Window *children, par, root; XWindowAttributes winf; int p = 1, q = -1; XQueryTree(dpy, DefaultRootWindow(dpy), &root, &par, &children, &n); /* Malloc() never fails. Heh heh.. */ windows = (struct window *)malloc(n * sizeof(*windows)); savedwins = (struct window *)malloc(n * sizeof(*savedwins)); for (i = 0, j = 0; i < n; i++) { XGetWindowAttributes(dpy, children[i], &winf); if (winf.map_state == IsViewable) { windows[j].winf = winf; windows[j].win = children[i]; windows[j].xdir = (j % 2 ? p : q); windows[j].ydir = (j % 2 ? p : q); p *= -1; q *= -1; savedwins[j] = windows[j]; j++; } } /* Give allowance for a reasonable border */ bottom = DisplayHeight(dpy, DefaultScreen(dpy)) - 3; side = DisplayWidth(dpy, DefaultScreen(dpy)) - 3; return(j); } disp_windows(win) struct window *win; { XMoveWindow(dpy, win->win, win->winf.x, win->winf.y); XMapWindow(dpy, win->win); XFlush(dpy); } bye() { fix(); exit(0); } fix() { int i; struct window sw; for (i = 0; i < totwin; i++) { sw = savedwins[i]; XMoveWindow(dpy, sw.win, sw.winf.x, sw.winf.y); XMapWindow(dpy, sw.win); XFlush(dpy); } } hits_others(w, d) /* someday */ struct window *w; int d; { return (0); }