1 /* xscreensaver, Copyright (c) 1998, 2000 Jamie Zawinski <jwz@jwz.org>
3 * Permission to use, copy, modify, distribute, and sell this software and its
4 * documentation for any purpose is hereby granted without fee, provided that
5 * the above copyright notice appear in all copies and that both that
6 * copyright notice and this permission notice appear in supporting
7 * documentation. No representations are made about the suitability of this
8 * software for any purpose. It is provided "as is" without express or
11 * Blue Screen of Death: the finest in personal computer emulation.
12 * Concept cribbed from Stephen Martin <smartin@mks.com>;
13 * this version written by jwz, 4-Jun-98.
16 * - Should simulate a Unix kernel panic and reboot.
17 * - Making various boot noises would be fun, too.
18 * - Maybe scatter some random bits across the screen,
19 * to simulate corruption of video ram?
20 * - Should randomize the various hex numbers printed.
23 #include "screenhack.h"
25 #include <X11/Xutil.h>
29 # include "images/amiga.xpm"
32 #include "images/atari.xbm"
33 #include "images/mac.xbm"
37 draw_string (Display *dpy, Window window, GC gc, XGCValues *gcv,
40 int win_width, int win_height,
41 const char *string, int delay)
44 int width = 0, height = 0, cw = 0;
45 int char_width, line_height;
47 const char *s = string;
48 const char *se = string;
50 /* This pretty much assumes fixed-width fonts */
51 char_width = (font->per_char
52 ? font->per_char['n'-font->min_char_or_byte2].width
53 : font->min_bounds.width);
54 line_height = font->ascent + font->descent + 1;
58 if (*s == '\n' || !*s)
61 if (cw > width) width = cw;
70 x = (win_width - (width * char_width)) / 2;
71 y = (win_height - (height * line_height)) / 2;
82 if (*s == '\n' || !*s)
87 if (*se == '@' || *se == '_')
89 if (*se == '@') flip = True;
91 off = (char_width * (width - (s - se))) / 2;
96 XSetForeground(dpy, gc, gcv->background);
97 XSetBackground(dpy, gc, gcv->foreground);
101 XDrawImageString(dpy, window, gc, x+off, y+font->ascent, se, s-se);
105 XSetForeground(dpy, gc, gcv->foreground);
106 XSetBackground(dpy, gc, gcv->background);
126 double_pixmap(Display *dpy, GC gc, Visual *visual, int depth, Pixmap pixmap,
127 int pix_w, int pix_h)
130 Pixmap p2 = XCreatePixmap(dpy, pixmap, pix_w*2, pix_h*2, depth);
131 XImage *i1 = XGetImage(dpy, pixmap, 0, 0, pix_w, pix_h, ~0L, ZPixmap);
132 XImage *i2 = XCreateImage(dpy, visual, depth, ZPixmap, 0, 0,
133 pix_w*2, pix_h*2, 8, 0);
134 i2->data = (char *) calloc(i2->height, i2->bytes_per_line);
135 for (y = 0; y < pix_h; y++)
136 for (x = 0; x < pix_w; x++)
138 unsigned long p = XGetPixel(i1, x, y);
139 XPutPixel(i2, x*2, y*2, p);
140 XPutPixel(i2, x*2+1, y*2, p);
141 XPutPixel(i2, x*2, y*2+1, p);
142 XPutPixel(i2, x*2+1, y*2+1, p);
144 free(i1->data); i1->data = 0;
146 XPutImage(dpy, p2, gc, i2, 0, 0, 0, 0, i2->width, i2->height);
147 free(i2->data); i2->data = 0;
149 XFreePixmap(dpy, pixmap);
154 /* Sleep for N seconds and return False. But if a key or mouse event is
155 seen, discard all pending key or mouse events, and return True.
158 bsod_sleep(Display *dpy, int seconds)
161 int quantum = 250000;
164 q = 1, quantum = 100000;
169 while (XPending (dpy))
172 XNextEvent (dpy, &event);
173 if (event.xany.type == ButtonPress)
175 if (event.xany.type == KeyPress)
179 XLookupString (&event.xkey, &c, 1, &keysym, 0);
180 if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
183 screenhack_handle_event (dpy, &event);
199 windows (Display *dpy, Window window, int delay, Bool w95p)
202 XWindowAttributes xgwa;
204 const char *def_font = "fixed";
210 "A fatal exception 0E has occured at F0AD:42494C4C\n"
211 "the current application will be terminated.\n"
213 "* Press any key to terminate the current application.\n"
214 "* Press CTRL+ALT+DELETE again to restart your computer.\n"
215 " You will lose any unsaved information in all applications.\n"
218 "_Press any key to continue");
220 const char *wnt = /* from Jim Niemira <urmane@urmane.org> */
221 ("*** STOP: 0x0000001E (0x80000003,0x80106fc0,0x8025ea21,0xfd6829e8)\n"
222 "Unhandled Kernel exception c0000047 from fa8418b4 (8025ea21,fd6829e8)\n"
224 "Dll Base Date Stamp - Name Dll Base Date Stamp - Name\n"
225 "80100000 2be154c9 - ntoskrnl.exe 80400000 2bc153b0 - hal.dll\n"
226 "80258000 2bd49628 - ncrc710.sys 8025c000 2bd49688 - SCSIPORT.SYS \n"
227 "80267000 2bd49683 - scsidisk.sys 802a6000 2bd496b9 - Fastfat.sys\n"
228 "fa800000 2bd49666 - Floppy.SYS fa810000 2bd496db - Hpfs_Rec.SYS\n"
229 "fa820000 2bd49676 - Null.SYS fa830000 2bd4965a - Beep.SYS\n"
230 "fa840000 2bdaab00 - i8042prt.SYS fa850000 2bd5a020 - SERMOUSE.SYS\n"
231 "fa860000 2bd4966f - kbdclass.SYS fa870000 2bd49671 - MOUCLASS.SYS\n"
232 "fa880000 2bd9c0be - Videoprt.SYS fa890000 2bd49638 - NCC1701E.SYS\n"
233 "fa8a0000 2bd4a4ce - Vga.SYS fa8b0000 2bd496d0 - Msfs.SYS\n"
234 "fa8c0000 2bd496c3 - Npfs.SYS fa8e0000 2bd496c9 - Ntfs.SYS\n"
235 "fa940000 2bd496df - NDIS.SYS fa930000 2bd49707 - wdlan.sys\n"
236 "fa970000 2bd49712 - TDI.SYS fa950000 2bd5a7fb - nbf.sys\n"
237 "fa980000 2bd72406 - streams.sys fa9b0000 2bd4975f - ubnb.sys\n"
238 "fa9c0000 2bd5bfd7 - usbser.sys fa9d0000 2bd4971d - netbios.sys\n"
239 "fa9e0000 2bd49678 - Parallel.sys fa9f0000 2bd4969f - serial.SYS\n"
240 "faa00000 2bd49739 - mup.sys faa40000 2bd4971f - SMBTRSUP.SYS\n"
241 "faa10000 2bd6f2a2 - srv.sys faa50000 2bd4971a - afd.sys\n"
242 "faa60000 2bd6fd80 - rdr.sys faaa0000 2bd49735 - bowser.sys\n"
244 "Address dword dump Dll Base - Name\n"
245 "801afc20 80106fc0 80106fc0 00000000 00000000 80149905 : "
246 "fa840000 - i8042prt.SYS\n"
247 "801afc24 80149905 80149905 ff8e6b8c 80129c2c ff8e6b94 : "
248 "8025c000 - SCSIPORT.SYS\n"
249 "801afc2c 80129c2c 80129c2c ff8e6b94 00000000 ff8e6b94 : "
250 "80100000 - ntoskrnl.exe\n"
251 "801afc34 801240f2 80124f02 ff8e6df4 ff8e6f60 ff8e6c58 : "
252 "80100000 - ntoskrnl.exe\n"
253 "801afc54 80124f16 80124f16 ff8e6f60 ff8e6c3c 8015ac7e : "
254 "80100000 - ntoskrnl.exe\n"
255 "801afc64 8015ac7e 8015ac7e ff8e6df4 ff8e6f60 ff8e6c58 : "
256 "80100000 - ntoskrnl.exe\n"
257 "801afc70 80129bda 80129bda 00000000 80088000 80106fc0 : "
258 "80100000 - ntoskrnl.exe\n"
260 "Kernel Debugger Using: COM2 (Port 0x2f8, Baud Rate 19200)\n"
261 "Restart and set the recovery options in the system control panel\n"
262 "or the /CRASHDEBUG system start option. If this message reappears,\n"
263 "contact your system administrator or technical support group."
266 if (!get_boolean_resource((w95p? "doWindows" : "doNT"), "DoWindows"))
269 XGetWindowAttributes (dpy, window, &xgwa);
271 fontname = get_string_resource ((xgwa.height > 600
277 : "windowsNT.font")),
279 if (!fontname || !*fontname) fontname = (char *)def_font;
280 font = XLoadQueryFont (dpy, fontname);
281 if (!font) font = XLoadQueryFont (dpy, def_font);
283 if (fontname && fontname != def_font)
286 gcv.font = font->fid;
287 gcv.foreground = get_pixel_resource((w95p
288 ? "windows95.foreground"
289 : "windowsNT.foreground"),
290 "Windows.Foreground",
292 gcv.background = get_pixel_resource((w95p
293 ? "windows95.background"
294 : "windowsNT.background"),
295 "Windows.Background",
297 XSetWindowBackground(dpy, window, gcv.background);
298 XClearWindow(dpy, window);
300 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
303 draw_string(dpy, window, gc, &gcv, font,
304 0, 0, xgwa.width, xgwa.height, w95, 0);
306 draw_string(dpy, window, gc, &gcv, font, 0, 0, 10, 10, wnt, 750);
310 bsod_sleep(dpy, delay);
311 XClearWindow(dpy, window);
312 XFreeFont(dpy, font);
316 /* SCO OpenServer 5 panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
319 sco (Display *dpy, Window window, int delay)
322 XWindowAttributes xgwa;
324 const char *def_font = "fixed";
327 int lines_1 = 0, lines_2 = 0, lines_3 = 0, lines_4 = 0;
330 const char *sco_panic_1 =
331 ("Unexpected trap in kernel mode:\n"
333 "cr0 0x80010013 cr2 0x00000014 cr3 0x00000000 tlb 0x00000000\n"
334 "ss 0x00071054 uesp 0x00012055 efl 0x00080888 ipl 0x00000005\n"
335 "cs 0x00092585 eip 0x00544a4b err 0x004d4a47 trap 0x0000000E\n"
336 "eax 0x0045474b ecx 0x0042544b edx 0x57687920 ebx 0x61726520\n"
337 "esp 0x796f7520 ebp 0x72656164 esi 0x696e6720 edi 0x74686973\n"
338 "ds 0x3f000000 es 0x43494c48 fs 0x43525343 gs 0x4f4d4b53\n"
340 "PANIC: k_trap - kernel mode trap type 0x0000000E\n"
341 "Trying to dump 5023 pages to dumpdev hd (1/41), 63 pages per '.'\n"
343 const char *sco_panic_2 =
344 ("...............................................................................\n"
346 const char *sco_panic_3 =
347 ("5023 pages dumped\n"
351 const char *sco_panic_4 =
352 ("** Safe to Power Off **\n"
354 "** Press Any Key to Reboot **\n"
357 if (!get_boolean_resource("doSCO", "DoSCO"))
360 for (s = sco_panic_1; *s; s++) if (*s == '\n') lines_1++;
361 for (s = sco_panic_2; *s; s++) if (*s == '\n') lines_2++;
362 for (s = sco_panic_3; *s; s++) if (*s == '\n') lines_3++;
363 for (s = sco_panic_4; *s; s++) if (*s == '\n') lines_4++;
365 XGetWindowAttributes (dpy, window, &xgwa);
367 fontname = get_string_resource ((xgwa.height > 600
371 if (!fontname || !*fontname) fontname = (char *)def_font;
372 font = XLoadQueryFont (dpy, fontname);
373 if (!font) font = XLoadQueryFont (dpy, def_font);
375 if (fontname && fontname != def_font)
378 gcv.font = font->fid;
379 gcv.foreground = get_pixel_resource(("sco.foreground"),
382 gcv.background = get_pixel_resource(("sco.background"),
385 XSetWindowBackground(dpy, window, gcv.background);
386 XClearWindow(dpy, window);
388 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
390 draw_string(dpy, window, gc, &gcv, font,
391 10, xgwa.height - ((lines_1 + lines_2 + lines_3 + lines_4 + 1) *
392 (font->ascent + font->descent + 1)),
396 for (s = sco_panic_2; *s; s++)
398 char *ss = strdup(sco_panic_2);
399 ss[s - sco_panic_2] = 0;
400 draw_string(dpy, window, gc, &gcv, font,
401 10, xgwa.height - ((lines_2 + lines_3 + lines_4 + 1) *
402 (font->ascent + font->descent + 1)),
407 if (bsod_sleep (dpy, -1))
411 draw_string(dpy, window, gc, &gcv, font,
412 10, xgwa.height - ((lines_3 + lines_4 + 1) *
413 (font->ascent + font->descent + 1)),
417 if (bsod_sleep(dpy, 1))
419 draw_string(dpy, window, gc, &gcv, font,
420 10, xgwa.height - ((lines_4 + 1) *
421 (font->ascent + font->descent + 1)),
426 bsod_sleep(dpy, delay);
428 XClearWindow(dpy, window);
430 XFreeFont(dpy, font);
435 /* Linux (sparc) panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
438 sparc_linux (Display *dpy, Window window, int delay)
441 XWindowAttributes xgwa;
443 const char *def_font = "fixed";
449 const char *linux_panic =
450 ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
451 "Unable to handle kernel paging request at virtual address f0d4a000\n"
452 "tsk->mm->context = 00000014\n"
453 "tsk->mm->pgd = f26b0000\n"
458 "gawk(22827): Oops\n"
459 "PSR: 044010c1 PC: f001c2cc NPC: f001c2d0 Y: 00000000\n"
460 "g0: 00001000 g1: fffffff7 g2: 04401086 g3: 0001eaa0\n"
461 "g4: 000207dc g5: f0130400 g6: f0d4a018 g7: 00000001\n"
462 "o0: 00000000 o1: f0d4a298 o2: 00000040 o3: f1380718\n"
463 "o4: f1380718 o5: 00000200 sp: f1b13f08 ret_pc: f001c2a0\n"
464 "l0: efffd880 l1: 00000001 l2: f0d4a230 l3: 00000014\n"
465 "l4: 0000ffff l5: f0131550 l6: f012c000 l7: f0130400\n"
466 "i0: f1b13fb0 i1: 00000001 i2: 00000002 i3: 0007c000\n"
467 "i4: f01457c0 i5: 00000004 i6: f1b13f70 i7: f0015360\n"
468 "Instruction DUMP:\n"
471 if (!get_boolean_resource("doSparcLinux", "DoSparcLinux"))
474 for (s = linux_panic; *s; s++) if (*s == '\n') lines++;
476 XGetWindowAttributes (dpy, window, &xgwa);
478 fontname = get_string_resource ((xgwa.height > 600
480 : "sparclinux.font"),
482 if (!fontname || !*fontname) fontname = (char *)def_font;
483 font = XLoadQueryFont (dpy, fontname);
484 if (!font) font = XLoadQueryFont (dpy, def_font);
486 if (fontname && fontname != def_font)
489 gcv.font = font->fid;
490 gcv.foreground = get_pixel_resource(("sparclinux.foreground"),
491 "SparcLinux.Foreground",
493 gcv.background = get_pixel_resource(("sparclinux.background"),
494 "SparcLinux.Background",
496 XSetWindowBackground(dpy, window, gcv.background);
497 XClearWindow(dpy, window);
499 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
501 draw_string(dpy, window, gc, &gcv, font,
502 10, xgwa.height - (lines * (font->ascent + font->descent + 1)),
507 bsod_sleep(dpy, delay);
508 XClearWindow(dpy, window);
509 XFreeFont(dpy, font);
514 amiga (Display *dpy, Window window, int delay)
517 XWindowAttributes xgwa;
519 const char *def_font = "fixed";
523 unsigned long fg, bg, bg2;
525 int pix_w = 0, pix_h = 0;
528 ("_Software failure. Press left mouse button to continue.\n"
529 "_Guru Meditation #00000003.00C01570");
531 if (!get_boolean_resource("doAmiga", "DoAmiga"))
534 XGetWindowAttributes (dpy, window, &xgwa);
536 fontname = get_string_resource ((xgwa.height > 600
537 ? "amiga.font2" : "amiga.font"),
539 if (!fontname || !*fontname) fontname = (char *)def_font;
540 font = XLoadQueryFont (dpy, fontname);
541 if (!font) font = XLoadQueryFont (dpy, def_font);
543 if (fontname && fontname != def_font)
546 gcv.font = font->fid;
547 fg = gcv.foreground = get_pixel_resource("amiga.foreground",
550 bg = gcv.background = get_pixel_resource("amiga.background",
553 bg2 = get_pixel_resource("amiga.background2", "Amiga.Background",
555 XSetWindowBackground(dpy, window, bg2);
556 XClearWindow(dpy, window);
558 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
559 gcv.background = fg; gcv.foreground = bg;
560 gc2 = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
562 height = (font->ascent + font->descent) * 6;
566 XpmAttributes xpmattrs;
568 xpmattrs.valuemask = 0;
571 xpmattrs.valuemask |= XpmCloseness;
572 xpmattrs.closeness = 40000;
575 xpmattrs.valuemask |= XpmVisual;
576 xpmattrs.visual = xgwa.visual;
579 xpmattrs.valuemask |= XpmDepth;
580 xpmattrs.depth = xgwa.depth;
583 xpmattrs.valuemask |= XpmColormap;
584 xpmattrs.colormap = xgwa.colormap;
587 result = XpmCreatePixmapFromData(dpy, window, amiga_hand,
588 &pixmap, 0 /* mask */, &xpmattrs);
589 if (!pixmap || (result != XpmSuccess && result != XpmColorError))
591 pix_w = xpmattrs.width;
592 pix_h = xpmattrs.height;
594 #endif /* HAVE_XPM */
596 if (pixmap && xgwa.height > 600) /* scale up the bitmap */
598 pixmap = double_pixmap(dpy, gc, xgwa.visual, xgwa.depth,
599 pixmap, pix_w, pix_h);
606 int x = (xgwa.width - pix_w) / 2;
607 int y = ((xgwa.height - pix_h) / 2);
608 XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h, x, y);
613 XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h, x, y + height);
614 XClearArea(dpy, window, 0, 0, xgwa.width, y + height, False);
615 XFreePixmap(dpy, pixmap);
618 XFillRectangle(dpy, window, gc2, 0, 0, xgwa.width, height);
619 draw_string(dpy, window, gc, &gcv, font, 0, 0, xgwa.width, height, string,0);
625 XFillRectangle(dpy, window, gca, 0, 0, xgwa.width, font->ascent);
626 XFillRectangle(dpy, window, gca, 0, 0, font->ascent, height);
627 XFillRectangle(dpy, window, gca, xgwa.width-font->ascent, 0,
628 font->ascent, height);
629 XFillRectangle(dpy, window, gca, 0, height-font->ascent, xgwa.width,
631 gca = (gca == gc ? gc2 : gc);
633 if (bsod_sleep(dpy, 1))
642 XClearWindow(dpy, window);
643 XFreeFont(dpy, font);
648 /* Atari ST, by Marcus Herbert <rhoenie@nobiscum.de>
649 Marcus had this to say:
651 Though I still have my Atari somewhere, I hardly remember
652 the meaning of the bombs. I think 9 bombs was "bus error" or
653 something like that. And you often had a few bombs displayed
654 quickly and then the next few ones coming up step by step.
655 Perhaps somebody else can tell you more about it.. its just
659 atari (Display *dpy, Window window, int delay)
663 XWindowAttributes xgwa;
664 const char *def_font = "fixed";
668 int pix_w = atari_width;
669 int pix_h = atari_height;
673 if (!get_boolean_resource("doAtari", "DoAtari"))
676 XGetWindowAttributes (dpy, window, &xgwa);
678 font = XLoadQueryFont (dpy, def_font);
681 gcv.font = font->fid;
682 gcv.foreground = get_pixel_resource("atari.foreground", "Atari.Foreground",
684 gcv.background = get_pixel_resource("atari.background", "Atari.Background",
687 XSetWindowBackground(dpy, window, gcv.background);
688 XClearWindow(dpy, window);
690 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
692 pixmap = XCreatePixmapFromBitmapData(dpy, window, (char *) atari_bits,
694 gcv.foreground, gcv.background,
696 pixmap = double_pixmap(dpy, gc, xgwa.visual, xgwa.depth,
697 pixmap, pix_w, pix_h);
703 y = (xgwa.height - (xgwa.height / 5));
706 for (i=0 ; i<7 ; i++) {
707 XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h,
708 (x + (i*offset)), y);
711 for (i=7 ; i<10 ; i++) {
712 if (bsod_sleep(dpy, 1))
714 XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h,
715 (x + (i*offset)), y);
718 bsod_sleep(dpy, delay);
720 XFreePixmap(dpy, pixmap);
723 XClearWindow(dpy, window);
724 XFreeFont(dpy, font);
730 mac (Display *dpy, Window window, int delay)
733 XWindowAttributes xgwa;
735 const char *def_font = "fixed";
739 int pix_w = mac_width;
740 int pix_h = mac_height;
741 int offset = mac_height * 4;
744 const char *string = ("0 0 0 0 0 0 0 F\n"
747 if (!get_boolean_resource("doMac", "DoMac"))
750 XGetWindowAttributes (dpy, window, &xgwa);
752 fontname = get_string_resource ("mac.font", "Mac.Font");
753 if (!fontname || !*fontname) fontname = (char *)def_font;
754 font = XLoadQueryFont (dpy, fontname);
755 if (!font) font = XLoadQueryFont (dpy, def_font);
757 if (fontname && fontname != def_font)
760 gcv.font = font->fid;
761 gcv.foreground = get_pixel_resource("mac.foreground", "Mac.Foreground",
763 gcv.background = get_pixel_resource("mac.background", "Mac.Background",
765 XSetWindowBackground(dpy, window, gcv.background);
766 XClearWindow(dpy, window);
768 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
770 pixmap = XCreatePixmapFromBitmapData(dpy, window, (char *) mac_bits,
771 mac_width, mac_height,
776 for(i = 0; i < 2; i++)
778 pixmap = double_pixmap(dpy, gc, xgwa.visual, xgwa.depth,
779 pixmap, pix_w, pix_h);
780 pix_w *= 2; pix_h *= 2;
784 int x = (xgwa.width - pix_w) / 2;
785 int y = (((xgwa.height + offset) / 2) -
787 (font->ascent + font->descent) * 2);
789 XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h, x, y);
790 XFreePixmap(dpy, pixmap);
793 draw_string(dpy, window, gc, &gcv, font, 0, 0,
794 xgwa.width, xgwa.height + offset, string, 0);
798 bsod_sleep(dpy, delay);
799 XClearWindow(dpy, window);
800 XFreeFont(dpy, font);
805 macsbug (Display *dpy, Window window, int delay)
808 XWindowAttributes xgwa;
810 const char *def_font = "fixed";
814 int char_width, line_height;
815 int col_right, row_top, row_bottom, page_right, page_bottom, body_top;
818 const char *left = (" SP \n"
865 const char *bottom = (" _A09D\n"
866 " +00884 40843714 #$0700,SR "
868 " +00886 40843765 *+$0400 "
870 " +00888 40843718 $0004(A7),([0,A7[)"
871 " ; 04E8D0AE | 66B8");
874 const char *body = ("Bus Error at 4BF6D6CC\n"
875 "while reading word from 4BF6D6CC in User data space\n"
876 " Unable to access that address\n"
878 " Frame Type: B008");
880 const char * body = ("PowerPC unmapped memory exception at 003AFDAC "
881 "BowelsOfTheMemoryMgr+04F9C\n"
882 " Calling chain using A6/R1 links\n"
883 " Back chain ISA Caller\n"
884 " 00000000 PPC 28C5353C __start+00054\n"
885 " 24DB03C0 PPC 28B9258C main+0039C\n"
886 " 24DB0350 PPC 28B9210C MainEvent+00494\n"
887 " 24DB02B0 PPC 28B91B40 HandleEvent+00278\n"
888 " 24DB0250 PPC 28B83DAC DoAppleEvent+00020\n"
889 " 24DB0210 PPC FFD3E5D0 "
890 "AEProcessAppleEvent+00020\n"
891 " 24DB0132 68K 00589468\n"
892 " 24DAFF8C 68K 00589582\n"
893 " 24DAFF26 68K 00588F70\n"
894 " 24DAFEB3 PPC 00307098 "
895 "EmToNatEndMoveParams+00014\n"
896 " 24DAFE40 PPC 28B9D0B0 DoScript+001C4\n"
897 " 24DAFDD0 PPC 28B9C35C RunScript+00390\n"
898 " 24DAFC60 PPC 28BA36D4 run_perl+000E0\n"
899 " 24DAFC10 PPC 28BC2904 perl_run+002CC\n"
900 " 24DAFA80 PPC 28C18490 Perl_runops+00068\n"
901 " 24DAFA30 PPC 28BE6CC0 Perl_pp_backtick+000FC\n"
902 " 24DAF9D0 PPC 28BA48B8 Perl_my_popen+00158\n"
903 " 24DAF980 PPC 28C5395C sfclose+00378\n"
904 " 24DAF930 PPC 28BA568C free+0000C\n"
905 " 24DAF8F0 PPC 28BA6254 pool_free+001D0\n"
906 " 24DAF8A0 PPC FFD48F14 DisposePtr+00028\n"
907 " 24DAF7C9 PPC 00307098 "
908 "EmToNatEndMoveParams+00014\n"
909 " 24DAF780 PPC 003AA180 __DisposePtr+00010");
915 if (!get_boolean_resource("doMacsBug", "DoMacsBug"))
918 for (s = body; *s; s++) if (*s == '\n') body_lines++;
920 XGetWindowAttributes (dpy, window, &xgwa);
922 fontname = get_string_resource ((xgwa.height > 850
928 if (!fontname || !*fontname) fontname = (char *)def_font;
929 font = XLoadQueryFont (dpy, fontname);
930 if (!font) font = XLoadQueryFont (dpy, def_font);
932 if (fontname && fontname != def_font)
935 gcv.font = font->fid;
936 gcv.foreground = get_pixel_resource("macsbug.foreground",
937 "MacsBug.Foreground",
939 gcv.background = get_pixel_resource("macsbug.background",
940 "MacsBug.Background",
943 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
945 gcv.foreground = gcv.background;
946 gc2 = XCreateGC(dpy, window, GCForeground, &gcv);
948 XSetWindowBackground(dpy, window,
949 get_pixel_resource("macsbug.borderColor",
950 "MacsBug.BorderColor",
951 dpy, xgwa.colormap));
952 XClearWindow(dpy, window);
954 char_width = (font->per_char
955 ? font->per_char['n'-font->min_char_or_byte2].width
956 : font->min_bounds.width);
957 line_height = font->ascent + font->descent + 1;
959 col_right = char_width * 12;
960 page_bottom = line_height * 47;
962 if (page_bottom > xgwa.height) page_bottom = xgwa.height;
964 row_bottom = page_bottom - line_height;
965 row_top = row_bottom - (line_height * 4);
966 page_right = col_right + (char_width * 88);
967 body_top = row_top - (line_height * body_lines);
973 xoff = (xgwa.width - page_right) / 2;
974 yoff = (xgwa.height - page_bottom) / 2;
975 if (xoff < 0) xoff = 0;
976 if (yoff < 0) yoff = 0;
978 XFillRectangle(dpy, window, gc2, xoff, yoff, page_right, page_bottom);
980 draw_string(dpy, window, gc, &gcv, font, xoff, yoff, 10, 10, left, 0);
981 draw_string(dpy, window, gc, &gcv, font, xoff+col_right, yoff+row_top,
984 XFillRectangle(dpy, window, gc, xoff + col_right, yoff, 2, page_bottom);
985 XDrawLine(dpy, window, gc,
986 xoff+col_right, yoff+row_top, xoff+page_right, yoff+row_top);
987 XDrawLine(dpy, window, gc,
988 xoff+col_right, yoff+row_bottom, xoff+page_right, yoff+row_bottom);
989 XDrawRectangle(dpy, window, gc, xoff, yoff, page_right, page_bottom);
994 draw_string(dpy, window, gc, &gcv, font,
995 xoff + col_right + char_width, yoff + body_top, 10, 10, body,
1000 XDrawLine(dpy, window, gc,
1001 xoff+col_right+(char_width/2)+2, yoff+row_bottom+3,
1002 xoff+col_right+(char_width/2)+2, yoff+page_bottom-3);
1005 XDrawLine(dpy, window, gc2,
1006 xoff+col_right+(char_width/2)+2, yoff+row_bottom+3,
1007 xoff+col_right+(char_width/2)+2, yoff+page_bottom-3);
1010 if (bsod_sleep(dpy, 0))
1017 XClearWindow(dpy, window);
1018 XFreeFont(dpy, font);
1025 * by Martin Pool <mbp@samba.org>, Feb 2000.
1027 * This is meant to look like the preferred failure mode of NCD
1028 * Xterms. The parameters for choosing what to copy where might not
1029 * be quite right, but it looks about ugly enough.
1032 blitdamage (Display *dpy, Window window, int delay)
1035 XWindowAttributes xwa;
1038 int delta_x = 0, delta_y = 0;
1040 int chunk_h, chunk_w;
1046 if (!get_boolean_resource("doBlitDamage", "DoBlitDamage"))
1049 XGetWindowAttributes(dpy, window, &xwa);
1051 grab_screen_image(xwa.screen, window);
1056 gc_mask = GCForeground;
1058 gcv.plane_mask = random();
1059 gc_mask |= GCPlaneMask;
1061 gc0 = XCreateGC(dpy, window, gc_mask, &gcv);
1064 chunk_w = w / (random() % 1 + 1);
1065 chunk_h = h / (random() % 1 + 1);
1066 if (random() & 0x1000)
1067 delta_y = random() % 600;
1068 if (!delta_y || (random() & 0x2000))
1069 delta_x = random() % 600;
1075 for (i = 0; i < steps; i++) {
1076 if (x + chunk_w > w)
1081 if (y + chunk_h > h)
1086 XCopyArea(dpy, window, window, gc0,
1094 bsod_sleep(dpy, delay);
1103 char *progclass = "BSOD";
1105 char *defaults [] = {
1112 "*doAtari: False", /* boring */
1115 "*doSparcLinux: False", /* boring */
1116 "*doBlitDamage: True",
1118 ".Windows.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
1119 ".Windows.font2: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
1120 ".Windows.foreground: White",
1121 ".Windows.background: Blue",
1123 ".Amiga.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
1124 ".Amiga.font2: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
1125 ".Amiga.foreground: Red",
1126 ".Amiga.background: Black",
1127 ".Amiga.background2: White",
1129 ".Mac.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
1130 ".Mac.foreground: PaleTurquoise1",
1131 ".Mac.background: Black",
1133 ".Atari.foreground: Black",
1134 ".Atari.background: White",
1136 ".MacsBug.font: -*-courier-medium-r-*-*-*-100-*-*-m-*-*-*",
1137 ".MacsBug.font2: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
1138 ".MacsBug.font3: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
1139 ".MacsBug.foreground: Black",
1140 ".MacsBug.background: White",
1141 ".MacsBug.borderColor: #AAAAAA",
1143 ".SCO.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
1144 ".SCO.font2: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
1145 ".SCO.foreground: White",
1146 ".SCO.background: Black",
1148 ".SparcLinux.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
1149 ".SparcLinux.font2: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
1150 ".SparcLinux.foreground: White",
1151 ".SparcLinux.background: Black",
1155 XrmOptionDescRec options [] = {
1156 { "-delay", ".delay", XrmoptionSepArg, 0 },
1162 screenhack (Display *dpy, Window window)
1167 int delay = get_integer_resource ("delay", "Integer");
1168 if (delay < 3) delay = 3;
1170 if (!get_boolean_resource ("root", "Boolean"))
1172 XWindowAttributes xgwa;
1173 XGetWindowAttributes (dpy, window, &xgwa);
1174 XSelectInput (dpy, window,
1175 xgwa.your_event_mask | KeyPressMask | ButtonPressMask);
1181 do { i = (random() & 0xFF) % 9; } while (i == j);
1184 case 0: did = windows(dpy, window, delay, True); break;
1185 case 1: did = windows(dpy, window, delay, False); break;
1186 case 2: did = amiga(dpy, window, delay); break;
1187 case 3: did = mac(dpy, window, delay); break;
1188 case 4: did = macsbug(dpy, window, delay); break;
1189 case 5: did = sco(dpy, window, delay); break;
1190 case 6: did = sparc_linux(dpy, window, delay); break;
1191 case 7: did = atari(dpy, window, delay); break;
1192 case 8: did = blitdamage(dpy, window, delay); break;
1193 default: abort(); break;
1196 if (loop > 100) j = -1;
1197 if (loop > 200) exit(-1);