Annotation of 43BSDTahoe/new/X/hacks/misc/bounce.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <X/Xlib.h>
                      3: #include <signal.h>
                      4: #include <math.h>
                      5: 
                      6: #define MAXWIN 24
                      7: 
                      8: /* Bounce, by Steven Grady */
                      9: 
                     10: #define abs(x) ((x) > 0 ? x : (-x))
                     11: struct window {
                     12:        Window win;
                     13:        WindowInfo winf;
                     14:        float v;
                     15: } windows[MAXWIN], savedwins[MAXWIN];
                     16: 
                     17: int totwin;
                     18: float elast = 0.5, el, gravity = 2.0;
                     19: int bottom;
                     20: int beep;
                     21: int dontfix = 0;
                     22: 
                     23: int bye();
                     24: 
                     25: main(argc, argv)
                     26: int argc;
                     27: char **argv;
                     28: {
                     29:        int e, i;
                     30:        struct window *wind;
                     31:        int c;
                     32:        extern int optind;
                     33:        extern char *optarg;
                     34:        int errflg = 0;
                     35: 
                     36:        
                     37:        while ((c = getopt(argc, argv, "sbg:e:")) != EOF)
                     38:                switch (c) {
                     39:                case 'b':
                     40:                        beep++;
                     41:                        break;
                     42:                case 'g':
                     43:                        gravity = (float) atoi(optarg)/ 10.0;
                     44:                        if (gravity < 0.0) {
                     45:                                fprintf(stderr,
                     46:                                        "Try to control yourself, please. \n");
                     47:                                exit(1);
                     48:                        }
                     49:                        break;
                     50:                case 'e':
                     51:                        elast = (float) atoi(optarg)/ 10.0;
                     52:                        break;
                     53:                case 's':
                     54:                        dontfix++;
                     55:                        break;
                     56:                case '?':
                     57:                        errflg++;
                     58:                        break;
                     59:                }
                     60:        if (errflg) {
                     61:                fprintf(stderr, "usage: %s [-b] [-g gravity] [-e elasticity]",
                     62:                                argv[0]);
                     63:                fprintf(stderr, " [-s] [display]\n");
                     64:                fprintf(stderr, "\t-b: turn on beep   -s: don't restore ");
                     65:                fprintf(stderr, "screen\n\tdefault g=20");
                     66:                fprintf(stderr, "\tdefault e=5\n");
                     67:                exit(1);
                     68:        }
                     69: 
                     70:        XOpenDisplay((optind < argc) ? argv[optind] : (char *) NULL);
                     71:                
                     72:        totwin = get_windows();
                     73:        signal(SIGINT, bye);
                     74:        for (i = 0; i < totwin; i++) {
                     75:                wind = &windows[i];
                     76:                el = elast * 1.2; /* Make up for some of the rounding */
                     77:                do {
                     78:                        calc_windows(wind);
                     79:                        disp_windows(wind);
                     80:                        XSync(0);
                     81:                } while (!stopped(wind));
                     82:        }
                     83:        fix();
                     84:        exit();
                     85: /*
                     86:        if (!dontfix) {
                     87:                printf("Waiting for an interrupt..\n");
                     88:                pause();
                     89:                /* Never returns -- bye() does an exit() 
                     90:        }
                     91: */
                     92: }
                     93: 
                     94: stopped(w)
                     95: struct window *w;
                     96: {
                     97: 
                     98:        if (abs(w->v) < (float) gravity) {
                     99:                return((int) abs(bottom - (w->winf.y + w->winf.height))
                    100:                                < 10);
                    101:        } else
                    102:                return(0);
                    103: }
                    104: 
                    105: calc_windows(win)
                    106: struct window *win;
                    107: {
                    108:        int new_y;
                    109:        float new_v;
                    110: 
                    111:        new_y = win->winf.y + win->v;
                    112:        new_v = win->v + gravity;
                    113:        if (new_y+win->winf.height > bottom) {
                    114:                new_y = 2*bottom-(new_y+2*win->winf.height);
                    115:                if (beep) {
                    116:                        XFeep((int) log((double) (win->v*win->v *
                    117:                                sqrt((float) win->winf.height) / 30)) - 6);
                    118:                }
                    119:                new_v = -new_v*el;
                    120:                el *= 0.8;
                    121:        }
                    122:        win->winf.y = new_y;
                    123:        win->v = new_v;
                    124: }
                    125: 
                    126: int
                    127: get_windows()
                    128: {
                    129:        int n, i, j;
                    130:        Window *children, par;
                    131:        WindowInfo winf;
                    132: 
                    133:        XQueryTree(RootWindow, &par, &n, &children);
                    134:        for (i = 0, j = 0; i < n; i++) {
                    135:                XQueryWindow(children[i], &winf);
                    136:                if (winf.mapped == IsMapped) {
                    137:                        windows[j].winf = winf;
                    138:                        windows[j].win = children[i];
                    139:                        windows[j].v = 0;
                    140:                        savedwins[j] = windows[j];
                    141:                        j++;
                    142:                }
                    143:        }
                    144:        bottom = DisplayHeight() - 3; /*Give allowance for a reasonable borde*/
                    145:        return(j);
                    146: }
                    147: 
                    148: disp_windows(win)
                    149: struct window *win;
                    150: {
                    151:        int i;
                    152: 
                    153:        XMoveWindow(win->win, win->winf.x, win->winf.y);
                    154:        XMapWindow(win->win);
                    155:        XFlush();
                    156: }
                    157: 
                    158: bye()
                    159: {
                    160:        if (!dontfix) {
                    161:                fix();
                    162:        }
                    163:        exit(0);
                    164: }
                    165: 
                    166: fix()
                    167: {
                    168:        int i;
                    169:        struct window sw;
                    170: 
                    171:        for (i = 0; i < totwin; i++) {
                    172:                sw = savedwins[i];
                    173:                XMoveWindow(sw.win, sw.winf.x, sw.winf.y);
                    174:                XMapWindow(sw.win);
                    175:                XFlush();
                    176:        }
                    177: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.