|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 3034 (0xbda) Types: TextFile Names: »bounce.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─⟦this⟧ »./X.V10R4/hacks/misc/bounce.c«
#include <stdio.h> #include <X/Xlib.h> #include <signal.h> #include <math.h> #define MAXWIN 24 /* Bounce, by Steven Grady */ #define abs(x) ((x) > 0 ? x : (-x)) struct window { Window win; WindowInfo winf; float v; } windows[MAXWIN], savedwins[MAXWIN]; int totwin; float elast = 0.5, el, gravity = 2.0; int bottom; int beep; int dontfix = 0; int bye(); main(argc, argv) int argc; char **argv; { int e, i; struct window *wind; int c; extern int optind; extern char *optarg; int errflg = 0; while ((c = getopt(argc, argv, "sbg:e:")) != EOF) switch (c) { case 'b': beep++; break; case 'g': gravity = (float) atoi(optarg)/ 10.0; if (gravity < 0.0) { fprintf(stderr, "Try to control yourself, please. \n"); exit(1); } break; case 'e': elast = (float) atoi(optarg)/ 10.0; break; case 's': dontfix++; break; case '?': errflg++; break; } if (errflg) { fprintf(stderr, "usage: %s [-b] [-g gravity] [-e elasticity]", argv[0]); fprintf(stderr, " [-s] [display]\n"); fprintf(stderr, "\t-b: turn on beep -s: don't restore "); fprintf(stderr, "screen\n\tdefault g=20"); fprintf(stderr, "\tdefault e=5\n"); exit(1); } XOpenDisplay((optind < argc) ? argv[optind] : (char *) NULL); totwin = get_windows(); signal(SIGINT, bye); for (i = 0; i < totwin; i++) { wind = &windows[i]; el = elast * 1.2; /* Make up for some of the rounding */ do { calc_windows(wind); disp_windows(wind); XSync(0); } while (!stopped(wind)); } fix(); exit(); /* if (!dontfix) { printf("Waiting for an interrupt..\n"); pause(); /* Never returns -- bye() does an exit() } */ } stopped(w) struct window *w; { if (abs(w->v) < (float) gravity) { return((int) abs(bottom - (w->winf.y + w->winf.height)) < 10); } else return(0); } calc_windows(win) struct window *win; { int new_y; float new_v; new_y = win->winf.y + win->v; new_v = win->v + gravity; if (new_y+win->winf.height > bottom) { new_y = 2*bottom-(new_y+2*win->winf.height); if (beep) { XFeep((int) log((double) (win->v*win->v * sqrt((float) win->winf.height) / 30)) - 6); } new_v = -new_v*el; el *= 0.8; } win->winf.y = new_y; win->v = new_v; } int get_windows() { int n, i, j; Window *children, par; WindowInfo winf; XQueryTree(RootWindow, &par, &n, &children); for (i = 0, j = 0; i < n; i++) { XQueryWindow(children[i], &winf); if (winf.mapped == IsMapped) { windows[j].winf = winf; windows[j].win = children[i]; windows[j].v = 0; savedwins[j] = windows[j]; j++; } } bottom = DisplayHeight() - 3; /*Give allowance for a reasonable borde*/ return(j); } disp_windows(win) struct window *win; { int i; XMoveWindow(win->win, win->winf.x, win->winf.y); XMapWindow(win->win); XFlush(); } bye() { if (!dontfix) { fix(); } exit(0); } fix() { int i; struct window sw; for (i = 0; i < totwin; i++) { sw = savedwins[i]; XMoveWindow(sw.win, sw.winf.x, sw.winf.y); XMapWindow(sw.win); XFlush(); } }