X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fbsod.c;h=bbbc2ca29b011d4ac3b1fb2b22d88822b6e9d8c7;hb=a719ec12b8b2563112366a8ac3196816fd64d2c7;hp=a3b0a9cc5b18a9237dd3dcd19c3f1a32698ea346;hpb=ce3185de9d9705e259f2b60dd4b5509007fa17d4;p=xscreensaver diff --git a/hacks/bsod.c b/hacks/bsod.c index a3b0a9cc..bbbc2ca2 100644 --- a/hacks/bsod.c +++ b/hacks/bsod.c @@ -13,7 +13,6 @@ * this version written by jwz, 4-Jun-98. * * TODO: - * - Should have a "macsbug" mode. * - Should simulate a Unix kernel panic and reboot. * - Making various boot noises would be fun, too. * - Maybe scatter some random bits across the screen, @@ -158,22 +157,36 @@ double_pixmap(Display *dpy, GC gc, Visual *visual, int depth, Pixmap pixmap, static Bool bsod_sleep(Display *dpy, int seconds) { - XEvent event; int q = seconds * 4; - int mask = KeyPressMask|ButtonPressMask; + int quantum = 250000; + + if (seconds == -1) + q = 1, quantum = 100000; + do { XSync(dpy, False); - if (XCheckMaskEvent(dpy, mask, &event)) - { - while (XCheckMaskEvent(dpy, mask, &event)) - ; - return True; - } + while (XPending (dpy)) + { + XEvent event; + XNextEvent (dpy, &event); + if (event.xany.type == ButtonPress) + return True; + if (event.xany.type == KeyPress) + { + KeySym keysym; + char c = 0; + XLookupString (&event.xkey, &c, 1, &keysym, 0); + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + return True; + } + screenhack_handle_event (dpy, &event); + } + if (q > 0) { q--; - usleep(250000); + usleep(quantum); } } while (q > 0); @@ -182,7 +195,7 @@ bsod_sleep(Display *dpy, int seconds) } -static void +static Bool windows (Display *dpy, Window window, int delay, Bool w95p) { XGCValues gcv; @@ -250,6 +263,9 @@ windows (Display *dpy, Window window, int delay, Bool w95p) "contact your system administrator or technical support group." ); + if (!get_boolean_resource((w95p? "doWindows" : "doNT"), "DoWindows")) + return False; + XGetWindowAttributes (dpy, window, &xgwa); fontname = get_string_resource ((xgwa.height > 600 @@ -294,12 +310,13 @@ windows (Display *dpy, Window window, int delay, Bool w95p) bsod_sleep(dpy, delay); XClearWindow(dpy, window); XFreeFont(dpy, font); + return True; } /* SCO OpenServer 5 panic, by Tom Kelly */ -static void -openserver (Display *dpy, Window window, int delay) +static Bool +sco (Display *dpy, Window window, int delay) { XGCValues gcv; XWindowAttributes xgwa; @@ -307,10 +324,11 @@ openserver (Display *dpy, Window window, int delay) const char *def_font = "fixed"; XFontStruct *font; GC gc; + int lines_1 = 0, lines_2 = 0, lines_3 = 0, lines_4 = 0; + const char *s; - const char *openserver_panic = - ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "Unexpected trap in kernel mode:\n" + const char *sco_panic_1 = + ("Unexpected trap in kernel mode:\n" "\n" "cr0 0x80010013 cr2 0x00000014 cr3 0x00000000 tlb 0x00000000\n" "ss 0x00071054 uesp 0x00012055 efl 0x00080888 ipl 0x00000005\n" @@ -321,22 +339,35 @@ openserver (Display *dpy, Window window, int delay) "\n" "PANIC: k_trap - kernel mode trap type 0x0000000E\n" "Trying to dump 5023 pages to dumpdev hd (1/41), 63 pages per '.'\n" - "...............................................................................\n" - "5023 pages dumped\n" + ); + const char *sco_panic_2 = + ("...............................................................................\n" + ); + const char *sco_panic_3 = + ("5023 pages dumped\n" "\n" "\n" - "** Safe to Power Off **\n" + ); + const char *sco_panic_4 = + ("** Safe to Power Off **\n" " - or -\n" "** Press Any Key to Reboot **\n" ); + if (!get_boolean_resource("doSCO", "DoSCO")) + return False; + + for (s = sco_panic_1; *s; s++) if (*s == '\n') lines_1++; + for (s = sco_panic_2; *s; s++) if (*s == '\n') lines_2++; + for (s = sco_panic_3; *s; s++) if (*s == '\n') lines_3++; + for (s = sco_panic_4; *s; s++) if (*s == '\n') lines_4++; XGetWindowAttributes (dpy, window, &xgwa); fontname = get_string_resource ((xgwa.height > 600 - ? "openserver.font2" - : "openserver.font"), - "OpenServer.Font"); + ? "sco.font2" + : "sco.font"), + "SCO.Font"); if (!fontname || !*fontname) fontname = (char *)def_font; font = XLoadQueryFont (dpy, fontname); if (!font) font = XLoadQueryFont (dpy, def_font); @@ -345,11 +376,11 @@ openserver (Display *dpy, Window window, int delay) free (fontname); gcv.font = font->fid; - gcv.foreground = get_pixel_resource(("openserver.foreground"), - "OpenServer.Foreground", + gcv.foreground = get_pixel_resource(("sco.foreground"), + "SCO.Foreground", dpy, xgwa.colormap); - gcv.background = get_pixel_resource(("openserver.background"), - "OpenServer.Background", + gcv.background = get_pixel_resource(("sco.background"), + "SCO.Background", dpy, xgwa.colormap); XSetWindowBackground(dpy, window, gcv.background); XClearWindow(dpy, window); @@ -357,18 +388,53 @@ openserver (Display *dpy, Window window, int delay) gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv); draw_string(dpy, window, gc, &gcv, font, - 0, 0, xgwa.width, xgwa.height, openserver_panic, 0); - XFreeGC(dpy, gc); + 10, xgwa.height - ((lines_1 + lines_2 + lines_3 + lines_4 + 1) * + (font->ascent + font->descent + 1)), + 10, 10, + sco_panic_1, 0); + XSync(dpy, False); + for (s = sco_panic_2; *s; s++) + { + char *ss = strdup(sco_panic_2); + ss[s - sco_panic_2] = 0; + draw_string(dpy, window, gc, &gcv, font, + 10, xgwa.height - ((lines_2 + lines_3 + lines_4 + 1) * + (font->ascent + font->descent + 1)), + 10, 10, + ss, 0); + XSync(dpy, False); + free(ss); + if (bsod_sleep (dpy, -1)) + goto DONE; + } + + draw_string(dpy, window, gc, &gcv, font, + 10, xgwa.height - ((lines_3 + lines_4 + 1) * + (font->ascent + font->descent + 1)), + 10, 10, + sco_panic_3, 0); XSync(dpy, False); + if (bsod_sleep(dpy, 1)) + goto DONE; + draw_string(dpy, window, gc, &gcv, font, + 10, xgwa.height - ((lines_4 + 1) * + (font->ascent + font->descent + 1)), + 10, 10, + sco_panic_4, 0); + XSync(dpy, False); + bsod_sleep(dpy, delay); + DONE: XClearWindow(dpy, window); + XFreeGC(dpy, gc); XFreeFont(dpy, font); + return True; } /* Linux (sparc) panic, by Tom Kelly */ -static void +static Bool sparc_linux (Display *dpy, Window window, int delay) { XGCValues gcv; @@ -377,6 +443,8 @@ sparc_linux (Display *dpy, Window window, int delay) const char *def_font = "fixed"; XFontStruct *font; GC gc; + int lines = 1; + const char *s; const char *linux_panic = ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" @@ -397,10 +465,13 @@ sparc_linux (Display *dpy, Window window, int delay) "l4: 0000ffff l5: f0131550 l6: f012c000 l7: f0130400\n" "i0: f1b13fb0 i1: 00000001 i2: 00000002 i3: 0007c000\n" "i4: f01457c0 i5: 00000004 i6: f1b13f70 i7: f0015360\n" - "Instruction DUMP:" - + "Instruction DUMP:\n" ); + if (!get_boolean_resource("doSparcLinux", "DoSparcLinux")) + return False; + + for (s = linux_panic; *s; s++) if (*s == '\n') lines++; XGetWindowAttributes (dpy, window, &xgwa); @@ -428,15 +499,18 @@ sparc_linux (Display *dpy, Window window, int delay) gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv); draw_string(dpy, window, gc, &gcv, font, - 0, 0, xgwa.width, xgwa.height, linux_panic, 0); + 10, xgwa.height - (lines * (font->ascent + font->descent + 1)), + 10, 10, + linux_panic, 0); XFreeGC(dpy, gc); XSync(dpy, False); bsod_sleep(dpy, delay); XClearWindow(dpy, window); XFreeFont(dpy, font); + return True; } -static void +static Bool amiga (Display *dpy, Window window, int delay) { XGCValues gcv; @@ -448,12 +522,15 @@ amiga (Display *dpy, Window window, int delay) int height; unsigned long fg, bg, bg2; Pixmap pixmap = 0; - int pix_w, pix_h; + int pix_w = 0, pix_h = 0; const char *string = ("_Software failure. Press left mouse button to continue.\n" "_Guru Meditation #00000003.00C01570"); + if (!get_boolean_resource("doAmiga", "DoAmiga")) + return False; + XGetWindowAttributes (dpy, window, &xgwa); fontname = get_string_resource ((xgwa.height > 600 @@ -564,6 +641,7 @@ amiga (Display *dpy, Window window, int delay) XSync(dpy, False); XClearWindow(dpy, window); XFreeFont(dpy, font); + return True; } @@ -577,7 +655,7 @@ amiga (Display *dpy, Window window, int delay) Perhaps somebody else can tell you more about it.. its just a quick hack :-} */ -static void +static Bool atari (Display *dpy, Window window, int delay) { @@ -589,9 +667,12 @@ atari (Display *dpy, Window window, int delay) Pixmap pixmap = 0; int pix_w = atari_width; int pix_h = atari_height; - int offset = atari_width + 2; + int offset; int i, x, y; + if (!get_boolean_resource("doAtari", "DoAtari")) + return False; + XGetWindowAttributes (dpy, window, &xgwa); font = XLoadQueryFont (dpy, def_font); @@ -609,11 +690,15 @@ atari (Display *dpy, Window window, int delay) gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv); pixmap = XCreatePixmapFromBitmapData(dpy, window, (char *) atari_bits, - atari_width, atari_height, - gcv.foreground, - gcv.background, + pix_w, pix_h, + gcv.foreground, gcv.background, xgwa.depth); + pixmap = double_pixmap(dpy, gc, xgwa.visual, xgwa.depth, + pixmap, pix_w, pix_h); + pix_w *= 2; + pix_h *= 2; + offset = pix_w + 2; x = 5; y = (xgwa.height - (xgwa.height / 5)); if (y < 0) y = 0; @@ -624,21 +709,24 @@ atari (Display *dpy, Window window, int delay) } for (i=7 ; i<10 ; i++) { - bsod_sleep(dpy, 1); + if (bsod_sleep(dpy, 1)) + goto DONE; XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h, (x + (i*offset)), y); } + bsod_sleep(dpy, delay); + DONE: XFreePixmap(dpy, pixmap); XFreeGC(dpy, gc); XSync(dpy, False); - bsod_sleep(dpy, delay); XClearWindow(dpy, window); XFreeFont(dpy, font); + return True; } -static void +static Bool mac (Display *dpy, Window window, int delay) { XGCValues gcv; @@ -656,6 +744,9 @@ mac (Display *dpy, Window window, int delay) const char *string = ("0 0 0 0 0 0 0 F\n" "0 0 0 0 0 0 0 3"); + if (!get_boolean_resource("doMac", "DoMac")) + return False; + XGetWindowAttributes (dpy, window, &xgwa); fontname = get_string_resource ("mac.font", "Mac.Font"); @@ -682,9 +773,6 @@ mac (Display *dpy, Window window, int delay) gcv.background, xgwa.depth); - draw_string(dpy, window, gc, &gcv, font, 0, 0, - xgwa.width, xgwa.height + offset, string, 0); - for(i = 0; i < 2; i++) { pixmap = double_pixmap(dpy, gc, xgwa.visual, xgwa.depth, @@ -702,14 +790,18 @@ mac (Display *dpy, Window window, int delay) XFreePixmap(dpy, pixmap); } + draw_string(dpy, window, gc, &gcv, font, 0, 0, + xgwa.width, xgwa.height + offset, string, 0); + XFreeGC(dpy, gc); XSync(dpy, False); bsod_sleep(dpy, delay); XClearWindow(dpy, window); XFreeFont(dpy, font); + return True; } -static void +static Bool macsbug (Display *dpy, Window window, int delay) { XGCValues gcv; @@ -820,6 +912,9 @@ macsbug (Display *dpy, Window window, int delay) const char *s; int body_lines = 1; + if (!get_boolean_resource("doMacsBug", "DoMacsBug")) + return False; + for (s = body; *s; s++) if (*s == '\n') body_lines++; XGetWindowAttributes (dpy, window, &xgwa); @@ -921,6 +1016,7 @@ macsbug (Display *dpy, Window window, int delay) XFreeGC(dpy, gc2); XClearWindow(dpy, window); XFreeFont(dpy, font); + return True; } @@ -928,40 +1024,49 @@ macsbug (Display *dpy, Window window, int delay) char *progclass = "BSOD"; char *defaults [] = { - "*delay: 30", - - ".Windows.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", - ".Windows.font2: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*", - ".Windows.foreground: White", - ".Windows.background: Blue", - - ".Amiga.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", - ".Amiga.font2: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*", - ".Amiga.foreground: Red", - ".Amiga.background: Black", - ".Amiga.background2: White", - - ".Mac.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", - ".Mac.foreground: PaleTurquoise1", - ".Mac.background: Black", - - ".Atari.foreground: Black", - ".Atari.background: White", - - ".MacsBug.font: -*-courier-medium-r-*-*-*-100-*-*-m-*-*-*", - ".MacsBug.font2: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", - ".MacsBug.font3: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*", - ".MacsBug.foreground: Black", - ".MacsBug.background: White", - ".MacsBug.borderColor: #AAAAAA", + "*delay: 30", + + "*doWindows: True", + "*doNT: True", + "*doAmiga: True", + "*doMac: True", + "*doAtari: False", /* boring */ + "*doMacsBug: True", + "*doSCO: True", + "*doSparcLinux: False", /* boring */ + + ".Windows.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", + ".Windows.font2: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*", + ".Windows.foreground: White", + ".Windows.background: Blue", + + ".Amiga.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", + ".Amiga.font2: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*", + ".Amiga.foreground: Red", + ".Amiga.background: Black", + ".Amiga.background2: White", + + ".Mac.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", + ".Mac.foreground: PaleTurquoise1", + ".Mac.background: Black", + + ".Atari.foreground: Black", + ".Atari.background: White", + + ".MacsBug.font: -*-courier-medium-r-*-*-*-100-*-*-m-*-*-*", + ".MacsBug.font2: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", + ".MacsBug.font3: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*", + ".MacsBug.foreground: Black", + ".MacsBug.background: White", + ".MacsBug.borderColor: #AAAAAA", - ".OpenServer.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", - ".OpenServer.font2: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*", - ".OpenServer.foreground: White", - ".OpenServer.background: Black", + ".SCO.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", + ".SCO.font2: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*", + ".SCO.foreground: White", + ".SCO.background: Black", - ".SparcLinux.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", - ".SparcLinux.font2: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*", + ".SparcLinux.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*", + ".SparcLinux.font2: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*", ".SparcLinux.foreground: White", ".SparcLinux.background: Black", 0 @@ -972,34 +1077,46 @@ XrmOptionDescRec options [] = { { 0, 0, 0, 0 } }; + void screenhack (Display *dpy, Window window) { + int loop = 0; int i = -1; int j = -1; int delay = get_integer_resource ("delay", "Integer"); if (delay < 3) delay = 3; if (!get_boolean_resource ("root", "Boolean")) - XSelectInput(dpy, window, KeyPressMask|ButtonPressMask); + { + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + XSelectInput (dpy, window, + xgwa.your_event_mask | KeyPressMask | ButtonPressMask); + } while (1) { - while (i == j) i = random() % 8; - j = i; - + Bool did; + do { i = (random() & 0xFF) % 8; } while (i == j); switch (i) { - case 0: windows(dpy, window, delay, True); break; - case 1: windows(dpy, window, delay, False); break; - case 2: amiga(dpy, window, delay); break; - case 3: mac(dpy, window, delay); break; - case 4: macsbug(dpy, window, delay); break; - case 5: openserver(dpy, window, delay); break; - case 6: sparc_linux(dpy, window, delay); break; - case 7: atari(dpy, window, delay); break; + case 0: did = windows(dpy, window, delay, True); break; + case 1: did = windows(dpy, window, delay, False); break; + case 2: did = amiga(dpy, window, delay); break; + case 3: did = mac(dpy, window, delay); break; + case 4: did = macsbug(dpy, window, delay); break; + case 5: did = sco(dpy, window, delay); break; + case 6: did = sparc_linux(dpy, window, delay); break; + case 7: did = atari(dpy, window, delay); break; default: abort(); break; } - XSync (dpy, True); + loop++; + if (loop > 100) j = -1; + if (loop > 200) exit(-1); + if (!did) continue; + XSync (dpy, False); + j = i; + loop = 0; } }