1: /* 2: * This neat little program, another in a continuing series of eye (and 3: * screen) grabbers, will cause a disease to strike a random window on your 4: * screen.... Need I say more?? 5: */ 6: 7: 8: #include <stdio.h> 9: #include <X/Xlib.h> 10: #include "twiddle.h" 11: #define TRUE 1 12: #define FALSE 0 13: #include <strings.h> 14: 15: typedef struct 16: { 17: int x,y; 18: int falling; 19: } BadBit; 20: 21: BadBit disease[100000]; 22: 23: int NoRotted; 24: 25: Window Victim; 26: WindowInfo Info; 27: 28: caddr_t *bitmap; 29: 30: Display *dpy; 31: 32: main(argc,argv) 33: int argc; 34: char **argv; 35: { 36: 37: Window foo, *targets; 38: int ntargets; 39: char display[256]; 40: int i; 41: char *strind; 42: 43: display[0] = '\0'; 44: 45: for (i=0; i < argc; i++) { 46: strind = index (argv[i], ':'); 47: if(strind != NULL) { 48: strncpy(display, argv[i], sizeof(display)); 49: continue; 50: } 51: } 52: 53: srandom (getpid()); 54: dpy = XOpenDisplay(display); 55: 56: XQueryTree(RootWindow, &foo, &ntargets, &targets); 57: 58: do 59: { 60: Victim = targets[rnd(ntargets)]; 61: XQueryWindow(Victim, &Info); 62: } 63: while (Info.mapped != IsMapped && Info.type != IsOpaque); 64: 65: printf("Info:\nWindow:%d X:%d Y:%d\n", Victim, Info.x, Info.y); 66: 67: NoRotted = 0; /* Not for long.. */ 68: 69: GrabBitmap(); 70: while(1) 71: { 72: /* GrabBitmap(); */ 73: RotMoreBits(); 74: MoveBits(); 75: XFlush(); 76: } 77: } 78: 79: GrabBitmap() 80: { 81: XQueryWindow(Victim, &Info); 82: bitmap = (caddr_t *)calloc( XYPixmapSize(Info.width, Info.height, dpy -> dplanes) ,1 ); 83: XPixmapGetXY(Victim, 0, 0, Info.width, Info.height, bitmap); 84: } 85: 86: RotABit(x,y) 87: register int x,y; 88: { 89: register BadBit *p=disease; 90: register int i; 91: 92: for(i=NoRotted; i; i--,p++) 93: if (p->x==x && p->y==y) return; 94: disease[NoRotted].x=x; 95: disease[NoRotted].y=y; 96: disease[NoRotted].falling = FALSE; 97: ++NoRotted; 98: } 99: RotMoreBits() 100: { 101: register int i, x, y, bxsz; 102: bxsz = (Info.width+15) & ~0xf ; 103: 104: for (i=100; i; --i) 105: { 106: x=rnd(Info.width); 107: y=rnd(Info.height); 108: 109: if (!fetch (bitmap, (x + y*bxsz))) { RotABit(x,y);} 110: } 111: } 112: 113: MoveBits() 114: { 115: register int i, bxsz; 116: register BadBit *p; 117: 118: bxsz = (Info.width+15) & ~0xf; 119: 120: for (i=NoRotted, p=disease; i; --i, ++p) 121: { 122: if (p->falling) 123: { 124: if (!fetch(bitmap, p->x + (p->y*bxsz)) && 125: fetch(bitmap, p->x + (p->y+1) * bxsz)) 126: { 127: set(bitmap, p->x + p->y*bxsz); 128: SetBit(p->x, p->y); 129: (p->y)+=1; 130: reset(bitmap, p->x + p->y*bxsz); 131: ClearBit(p->x, p->y); 132: } 133: else {p->falling = FALSE; RotABit(p->x, p->y+1);} 134: } 135: else 136: { 137: if (fetch(bitmap, p->x + (p -> y+1) *bxsz)) 138: p->falling = TRUE; 139: } 140: } 141: } 142: SetBit(x,y) 143: int x,y; 144: { 145: XTileSet(Victim, x, y, 1, 1, WhitePixmap); 146: } 147: 148: ClearBit(x,y) 149: int x,y; 150: { 151: XTileSet(Victim, x, y, 1, 1, BlackPixmap); 152: } 153: 154: SplatBitmap() 155: { 156: Pixmap map; 157: 158: map = XStorePixmapXY(Info.width, Info.height, bitmap); 159: XPixmapPut(Victim, 0, 0, 0, 0, 160: Info.width, Info.height, 161: map, GXcopy, dpy -> dplanes); 162: XFlush(); 163: XFreePixmap(map); 164: } 165: 166: rnd(n) 167: int n; 168: 169: { 170: long random(); 171: 172: return (random() % n); 173: }