1 /* xscreensaver, Copyright (c) 1998 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)
164 while (XPending (dpy))
167 XNextEvent (dpy, &event);
168 if (event.xany.type == KeyPress)
172 XLookupString (&event.xkey, &c, 1, &keysym, 0);
173 if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
176 screenhack_handle_event (dpy, &event);
192 windows (Display *dpy, Window window, int delay, Bool w95p)
195 XWindowAttributes xgwa;
197 const char *def_font = "fixed";
203 "A fatal exception 0E has occured at F0AD:42494C4C\n"
204 "the current application will be terminated.\n"
206 "* Press any key to terminate the current application.\n"
207 "* Press CTRL+ALT+DELETE again to restart your computer.\n"
208 " You will lose any unsaved information in all applications.\n"
211 "_Press any key to continue");
214 ("*** STOP: 0x0000001E (0x80000003,0x80106fc0,0x8025ea21,0xfd6829e8)\n"
215 "Unhandled Kernel exception c0000047 from fa8418b4 (8025ea21,fd6829e8)\n"
217 "Dll Base Date Stamp - Name Dll Base Date Stamp - Name\n"
218 "80100000 2be154c9 - ntoskrnl.exe 80400000 2bc153b0 - hal.dll\n"
219 "80258000 2bd49628 - ncrc710.sys 8025c000 2bd49688 - SCSIPORT.SYS \n"
220 "80267000 2bd49683 - scsidisk.sys 802a6000 2bd496b9 - Fastfat.sys\n"
221 "fa800000 2bd49666 - Floppy.SYS fa810000 2bd496db - Hpfs_Rec.SYS\n"
222 "fa820000 2bd49676 - Null.SYS fa830000 2bd4965a - Beep.SYS\n"
223 "fa840000 2bdaab00 - i8042prt.SYS fa850000 2bd5a020 - SERMOUSE.SYS\n"
224 "fa860000 2bd4966f - kbdclass.SYS fa870000 2bd49671 - MOUCLASS.SYS\n"
225 "fa880000 2bd9c0be - Videoprt.SYS fa890000 2bd49638 - NCC1701E.SYS\n"
226 "fa8a0000 2bd4a4ce - Vga.SYS fa8b0000 2bd496d0 - Msfs.SYS\n"
227 "fa8c0000 2bd496c3 - Npfs.SYS fa8e0000 2bd496c9 - Ntfs.SYS\n"
228 "fa940000 2bd496df - NDIS.SYS fa930000 2bd49707 - wdlan.sys\n"
229 "fa970000 2bd49712 - TDI.SYS fa950000 2bd5a7fb - nbf.sys\n"
230 "fa980000 2bd72406 - streams.sys fa9b0000 2bd4975f - ubnb.sys\n"
231 "fa9c0000 2bd5bfd7 - usbser.sys fa9d0000 2bd4971d - netbios.sys\n"
232 "fa9e0000 2bd49678 - Parallel.sys fa9f0000 2bd4969f - serial.SYS\n"
233 "faa00000 2bd49739 - mup.sys faa40000 2bd4971f - SMBTRSUP.SYS\n"
234 "faa10000 2bd6f2a2 - srv.sys faa50000 2bd4971a - afd.sys\n"
235 "faa60000 2bd6fd80 - rdr.sys faaa0000 2bd49735 - bowser.sys\n"
237 "Address dword dump Dll Base - Name\n"
238 "801afc20 80106fc0 80106fc0 00000000 00000000 80149905 : "
239 "fa840000 - i8042prt.SYS\n"
240 "801afc24 80149905 80149905 ff8e6b8c 80129c2c ff8e6b94 : "
241 "8025c000 - SCSIPORT.SYS\n"
242 "801afc2c 80129c2c 80129c2c ff8e6b94 00000000 ff8e6b94 : "
243 "80100000 - ntoskrnl.exe\n"
244 "801afc34 801240f2 80124f02 ff8e6df4 ff8e6f60 ff8e6c58 : "
245 "80100000 - ntoskrnl.exe\n"
246 "801afc54 80124f16 80124f16 ff8e6f60 ff8e6c3c 8015ac7e : "
247 "80100000 - ntoskrnl.exe\n"
248 "801afc64 8015ac7e 8015ac7e ff8e6df4 ff8e6f60 ff8e6c58 : "
249 "80100000 - ntoskrnl.exe\n"
250 "801afc70 80129bda 80129bda 00000000 80088000 80106fc0 : "
251 "80100000 - ntoskrnl.exe\n"
253 "Kernel Debugger Using: COM2 (Port 0x2f8, Baud Rate 19200)\n"
254 "Restart and set the recovery options in the system control panel\n"
255 "or the /CRASHDEBUG system start option. If this message reappears,\n"
256 "contact your system administrator or technical support group."
259 if (!get_boolean_resource((w95p? "doWindows" : "doNT"), "DoWindows"))
262 XGetWindowAttributes (dpy, window, &xgwa);
264 fontname = get_string_resource ((xgwa.height > 600
270 : "windowsNT.font")),
272 if (!fontname || !*fontname) fontname = (char *)def_font;
273 font = XLoadQueryFont (dpy, fontname);
274 if (!font) font = XLoadQueryFont (dpy, def_font);
276 if (fontname && fontname != def_font)
279 gcv.font = font->fid;
280 gcv.foreground = get_pixel_resource((w95p
281 ? "windows95.foreground"
282 : "windowsNT.foreground"),
283 "Windows.Foreground",
285 gcv.background = get_pixel_resource((w95p
286 ? "windows95.background"
287 : "windowsNT.background"),
288 "Windows.Background",
290 XSetWindowBackground(dpy, window, gcv.background);
291 XClearWindow(dpy, window);
293 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
296 draw_string(dpy, window, gc, &gcv, font,
297 0, 0, xgwa.width, xgwa.height, w95, 0);
299 draw_string(dpy, window, gc, &gcv, font, 0, 0, 10, 10, wnt, 750);
303 bsod_sleep(dpy, delay);
304 XClearWindow(dpy, window);
305 XFreeFont(dpy, font);
309 /* SCO OpenServer 5 panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
312 sco (Display *dpy, Window window, int delay)
315 XWindowAttributes xgwa;
317 const char *def_font = "fixed";
323 const char *sco_panic =
324 ("Unexpected trap in kernel mode:\n"
326 "cr0 0x80010013 cr2 0x00000014 cr3 0x00000000 tlb 0x00000000\n"
327 "ss 0x00071054 uesp 0x00012055 efl 0x00080888 ipl 0x00000005\n"
328 "cs 0x00092585 eip 0x00544a4b err 0x004d4a47 trap 0x0000000E\n"
329 "eax 0x0045474b ecx 0x0042544b edx 0x57687920 ebx 0x61726520\n"
330 "esp 0x796f7520 ebp 0x72656164 esi 0x696e6720 edi 0x74686973\n"
331 "ds 0x3f000000 es 0x43494c48 fs 0x43525343 gs 0x4f4d4b53\n"
333 "PANIC: k_trap - kernel mode trap type 0x0000000E\n"
334 "Trying to dump 5023 pages to dumpdev hd (1/41), 63 pages per '.'\n"
335 "...............................................................................\n"
336 "5023 pages dumped\n"
339 "** Safe to Power Off **\n"
341 "** Press Any Key to Reboot **\n"
344 if (!get_boolean_resource("doSCO", "DoSCO"))
347 for (s = sco_panic; *s; s++) if (*s == '\n') lines++;
349 XGetWindowAttributes (dpy, window, &xgwa);
351 fontname = get_string_resource ((xgwa.height > 600
355 if (!fontname || !*fontname) fontname = (char *)def_font;
356 font = XLoadQueryFont (dpy, fontname);
357 if (!font) font = XLoadQueryFont (dpy, def_font);
359 if (fontname && fontname != def_font)
362 gcv.font = font->fid;
363 gcv.foreground = get_pixel_resource(("sco.foreground"),
366 gcv.background = get_pixel_resource(("sco.background"),
369 XSetWindowBackground(dpy, window, gcv.background);
370 XClearWindow(dpy, window);
372 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
374 draw_string(dpy, window, gc, &gcv, font,
375 10, xgwa.height - (lines * (font->ascent + font->descent + 1)),
380 bsod_sleep(dpy, delay);
381 XClearWindow(dpy, window);
382 XFreeFont(dpy, font);
387 /* Linux (sparc) panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
390 sparc_linux (Display *dpy, Window window, int delay)
393 XWindowAttributes xgwa;
395 const char *def_font = "fixed";
401 const char *linux_panic =
402 ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
403 "Unable to handle kernel paging request at virtual address f0d4a000\n"
404 "tsk->mm->context = 00000014\n"
405 "tsk->mm->pgd = f26b0000\n"
410 "gawk(22827): Oops\n"
411 "PSR: 044010c1 PC: f001c2cc NPC: f001c2d0 Y: 00000000\n"
412 "g0: 00001000 g1: fffffff7 g2: 04401086 g3: 0001eaa0\n"
413 "g4: 000207dc g5: f0130400 g6: f0d4a018 g7: 00000001\n"
414 "o0: 00000000 o1: f0d4a298 o2: 00000040 o3: f1380718\n"
415 "o4: f1380718 o5: 00000200 sp: f1b13f08 ret_pc: f001c2a0\n"
416 "l0: efffd880 l1: 00000001 l2: f0d4a230 l3: 00000014\n"
417 "l4: 0000ffff l5: f0131550 l6: f012c000 l7: f0130400\n"
418 "i0: f1b13fb0 i1: 00000001 i2: 00000002 i3: 0007c000\n"
419 "i4: f01457c0 i5: 00000004 i6: f1b13f70 i7: f0015360\n"
420 "Instruction DUMP:\n"
423 if (!get_boolean_resource("doSparcLinux", "DoSparcLinux"))
426 for (s = linux_panic; *s; s++) if (*s == '\n') lines++;
428 XGetWindowAttributes (dpy, window, &xgwa);
430 fontname = get_string_resource ((xgwa.height > 600
432 : "sparclinux.font"),
434 if (!fontname || !*fontname) fontname = (char *)def_font;
435 font = XLoadQueryFont (dpy, fontname);
436 if (!font) font = XLoadQueryFont (dpy, def_font);
438 if (fontname && fontname != def_font)
441 gcv.font = font->fid;
442 gcv.foreground = get_pixel_resource(("sparclinux.foreground"),
443 "SparcLinux.Foreground",
445 gcv.background = get_pixel_resource(("sparclinux.background"),
446 "SparcLinux.Background",
448 XSetWindowBackground(dpy, window, gcv.background);
449 XClearWindow(dpy, window);
451 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
453 draw_string(dpy, window, gc, &gcv, font,
454 10, xgwa.height - (lines * (font->ascent + font->descent + 1)),
459 bsod_sleep(dpy, delay);
460 XClearWindow(dpy, window);
461 XFreeFont(dpy, font);
466 amiga (Display *dpy, Window window, int delay)
469 XWindowAttributes xgwa;
471 const char *def_font = "fixed";
475 unsigned long fg, bg, bg2;
477 int pix_w = 0, pix_h = 0;
480 ("_Software failure. Press left mouse button to continue.\n"
481 "_Guru Meditation #00000003.00C01570");
483 if (!get_boolean_resource("doAmiga", "DoAmiga"))
486 XGetWindowAttributes (dpy, window, &xgwa);
488 fontname = get_string_resource ((xgwa.height > 600
489 ? "amiga.font2" : "amiga.font"),
491 if (!fontname || !*fontname) fontname = (char *)def_font;
492 font = XLoadQueryFont (dpy, fontname);
493 if (!font) font = XLoadQueryFont (dpy, def_font);
495 if (fontname && fontname != def_font)
498 gcv.font = font->fid;
499 fg = gcv.foreground = get_pixel_resource("amiga.foreground",
502 bg = gcv.background = get_pixel_resource("amiga.background",
505 bg2 = get_pixel_resource("amiga.background2", "Amiga.Background",
507 XSetWindowBackground(dpy, window, bg2);
508 XClearWindow(dpy, window);
510 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
511 gcv.background = fg; gcv.foreground = bg;
512 gc2 = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
514 height = (font->ascent + font->descent) * 6;
518 XpmAttributes xpmattrs;
520 xpmattrs.valuemask = 0;
523 xpmattrs.valuemask |= XpmCloseness;
524 xpmattrs.closeness = 40000;
527 xpmattrs.valuemask |= XpmVisual;
528 xpmattrs.visual = xgwa.visual;
531 xpmattrs.valuemask |= XpmDepth;
532 xpmattrs.depth = xgwa.depth;
535 xpmattrs.valuemask |= XpmColormap;
536 xpmattrs.colormap = xgwa.colormap;
539 result = XpmCreatePixmapFromData(dpy, window, amiga_hand,
540 &pixmap, 0 /* mask */, &xpmattrs);
541 if (!pixmap || (result != XpmSuccess && result != XpmColorError))
543 pix_w = xpmattrs.width;
544 pix_h = xpmattrs.height;
546 #endif /* HAVE_XPM */
548 if (pixmap && xgwa.height > 600) /* scale up the bitmap */
550 pixmap = double_pixmap(dpy, gc, xgwa.visual, xgwa.depth,
551 pixmap, pix_w, pix_h);
558 int x = (xgwa.width - pix_w) / 2;
559 int y = ((xgwa.height - pix_h) / 2);
560 XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h, x, y);
565 XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h, x, y + height);
566 XClearArea(dpy, window, 0, 0, xgwa.width, y + height, False);
567 XFreePixmap(dpy, pixmap);
570 XFillRectangle(dpy, window, gc2, 0, 0, xgwa.width, height);
571 draw_string(dpy, window, gc, &gcv, font, 0, 0, xgwa.width, height, string,0);
577 XFillRectangle(dpy, window, gca, 0, 0, xgwa.width, font->ascent);
578 XFillRectangle(dpy, window, gca, 0, 0, font->ascent, height);
579 XFillRectangle(dpy, window, gca, xgwa.width-font->ascent, 0,
580 font->ascent, height);
581 XFillRectangle(dpy, window, gca, 0, height-font->ascent, xgwa.width,
583 gca = (gca == gc ? gc2 : gc);
585 if (bsod_sleep(dpy, 1))
594 XClearWindow(dpy, window);
595 XFreeFont(dpy, font);
600 /* Atari ST, by Marcus Herbert <rhoenie@nobiscum.de>
601 Marcus had this to say:
603 Though I still have my Atari somewhere, I hardly remember
604 the meaning of the bombs. I think 9 bombs was "bus error" or
605 something like that. And you often had a few bombs displayed
606 quickly and then the next few ones coming up step by step.
607 Perhaps somebody else can tell you more about it.. its just
611 atari (Display *dpy, Window window, int delay)
615 XWindowAttributes xgwa;
616 const char *def_font = "fixed";
620 int pix_w = atari_width;
621 int pix_h = atari_height;
625 if (!get_boolean_resource("doAtari", "DoAtari"))
628 XGetWindowAttributes (dpy, window, &xgwa);
630 font = XLoadQueryFont (dpy, def_font);
633 gcv.font = font->fid;
634 gcv.foreground = get_pixel_resource("atari.foreground", "Atari.Foreground",
636 gcv.background = get_pixel_resource("atari.background", "Atari.Background",
639 XSetWindowBackground(dpy, window, gcv.background);
640 XClearWindow(dpy, window);
642 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
644 pixmap = XCreatePixmapFromBitmapData(dpy, window, (char *) atari_bits,
646 gcv.foreground, gcv.background,
648 pixmap = double_pixmap(dpy, gc, xgwa.visual, xgwa.depth,
649 pixmap, pix_w, pix_h);
655 y = (xgwa.height - (xgwa.height / 5));
658 for (i=0 ; i<7 ; i++) {
659 XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h,
660 (x + (i*offset)), y);
663 for (i=7 ; i<10 ; i++) {
665 XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h,
666 (x + (i*offset)), y);
669 XFreePixmap(dpy, pixmap);
672 bsod_sleep(dpy, delay);
673 XClearWindow(dpy, window);
674 XFreeFont(dpy, font);
680 mac (Display *dpy, Window window, int delay)
683 XWindowAttributes xgwa;
685 const char *def_font = "fixed";
689 int pix_w = mac_width;
690 int pix_h = mac_height;
691 int offset = mac_height * 4;
694 const char *string = ("0 0 0 0 0 0 0 F\n"
697 if (!get_boolean_resource("doMac", "DoMac"))
700 XGetWindowAttributes (dpy, window, &xgwa);
702 fontname = get_string_resource ("mac.font", "Mac.Font");
703 if (!fontname || !*fontname) fontname = (char *)def_font;
704 font = XLoadQueryFont (dpy, fontname);
705 if (!font) font = XLoadQueryFont (dpy, def_font);
707 if (fontname && fontname != def_font)
710 gcv.font = font->fid;
711 gcv.foreground = get_pixel_resource("mac.foreground", "Mac.Foreground",
713 gcv.background = get_pixel_resource("mac.background", "Mac.Background",
715 XSetWindowBackground(dpy, window, gcv.background);
716 XClearWindow(dpy, window);
718 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
720 pixmap = XCreatePixmapFromBitmapData(dpy, window, (char *) mac_bits,
721 mac_width, mac_height,
726 for(i = 0; i < 2; i++)
728 pixmap = double_pixmap(dpy, gc, xgwa.visual, xgwa.depth,
729 pixmap, pix_w, pix_h);
730 pix_w *= 2; pix_h *= 2;
734 int x = (xgwa.width - pix_w) / 2;
735 int y = (((xgwa.height + offset) / 2) -
737 (font->ascent + font->descent) * 2);
739 XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h, x, y);
740 XFreePixmap(dpy, pixmap);
743 draw_string(dpy, window, gc, &gcv, font, 0, 0,
744 xgwa.width, xgwa.height + offset, string, 0);
748 bsod_sleep(dpy, delay);
749 XClearWindow(dpy, window);
750 XFreeFont(dpy, font);
755 macsbug (Display *dpy, Window window, int delay)
758 XWindowAttributes xgwa;
760 const char *def_font = "fixed";
764 int char_width, line_height;
765 int col_right, row_top, row_bottom, page_right, page_bottom, body_top;
768 const char *left = (" SP \n"
815 const char *bottom = (" _A09D\n"
816 " +00884 40843714 #$0700,SR "
818 " +00886 40843765 *+$0400 "
820 " +00888 40843718 $0004(A7),([0,A7[)"
821 " ; 04E8D0AE | 66B8");
824 const char *body = ("Bus Error at 4BF6D6CC\n"
825 "while reading word from 4BF6D6CC in User data space\n"
826 " Unable to access that address\n"
828 " Frame Type: B008");
830 const char * body = ("PowerPC unmapped memory exception at 003AFDAC "
831 "BowelsOfTheMemoryMgr+04F9C\n"
832 " Calling chain using A6/R1 links\n"
833 " Back chain ISA Caller\n"
834 " 00000000 PPC 28C5353C __start+00054\n"
835 " 24DB03C0 PPC 28B9258C main+0039C\n"
836 " 24DB0350 PPC 28B9210C MainEvent+00494\n"
837 " 24DB02B0 PPC 28B91B40 HandleEvent+00278\n"
838 " 24DB0250 PPC 28B83DAC DoAppleEvent+00020\n"
839 " 24DB0210 PPC FFD3E5D0 "
840 "AEProcessAppleEvent+00020\n"
841 " 24DB0132 68K 00589468\n"
842 " 24DAFF8C 68K 00589582\n"
843 " 24DAFF26 68K 00588F70\n"
844 " 24DAFEB3 PPC 00307098 "
845 "EmToNatEndMoveParams+00014\n"
846 " 24DAFE40 PPC 28B9D0B0 DoScript+001C4\n"
847 " 24DAFDD0 PPC 28B9C35C RunScript+00390\n"
848 " 24DAFC60 PPC 28BA36D4 run_perl+000E0\n"
849 " 24DAFC10 PPC 28BC2904 perl_run+002CC\n"
850 " 24DAFA80 PPC 28C18490 Perl_runops+00068\n"
851 " 24DAFA30 PPC 28BE6CC0 Perl_pp_backtick+000FC\n"
852 " 24DAF9D0 PPC 28BA48B8 Perl_my_popen+00158\n"
853 " 24DAF980 PPC 28C5395C sfclose+00378\n"
854 " 24DAF930 PPC 28BA568C free+0000C\n"
855 " 24DAF8F0 PPC 28BA6254 pool_free+001D0\n"
856 " 24DAF8A0 PPC FFD48F14 DisposePtr+00028\n"
857 " 24DAF7C9 PPC 00307098 "
858 "EmToNatEndMoveParams+00014\n"
859 " 24DAF780 PPC 003AA180 __DisposePtr+00010");
865 if (!get_boolean_resource("doMacsBug", "DoMacsBug"))
868 for (s = body; *s; s++) if (*s == '\n') body_lines++;
870 XGetWindowAttributes (dpy, window, &xgwa);
872 fontname = get_string_resource ((xgwa.height > 850
878 if (!fontname || !*fontname) fontname = (char *)def_font;
879 font = XLoadQueryFont (dpy, fontname);
880 if (!font) font = XLoadQueryFont (dpy, def_font);
882 if (fontname && fontname != def_font)
885 gcv.font = font->fid;
886 gcv.foreground = get_pixel_resource("macsbug.foreground",
887 "MacsBug.Foreground",
889 gcv.background = get_pixel_resource("macsbug.background",
890 "MacsBug.Background",
893 gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
895 gcv.foreground = gcv.background;
896 gc2 = XCreateGC(dpy, window, GCForeground, &gcv);
898 XSetWindowBackground(dpy, window,
899 get_pixel_resource("macsbug.borderColor",
900 "MacsBug.BorderColor",
901 dpy, xgwa.colormap));
902 XClearWindow(dpy, window);
904 char_width = (font->per_char
905 ? font->per_char['n'-font->min_char_or_byte2].width
906 : font->min_bounds.width);
907 line_height = font->ascent + font->descent + 1;
909 col_right = char_width * 12;
910 page_bottom = line_height * 47;
912 if (page_bottom > xgwa.height) page_bottom = xgwa.height;
914 row_bottom = page_bottom - line_height;
915 row_top = row_bottom - (line_height * 4);
916 page_right = col_right + (char_width * 88);
917 body_top = row_top - (line_height * body_lines);
923 xoff = (xgwa.width - page_right) / 2;
924 yoff = (xgwa.height - page_bottom) / 2;
925 if (xoff < 0) xoff = 0;
926 if (yoff < 0) yoff = 0;
928 XFillRectangle(dpy, window, gc2, xoff, yoff, page_right, page_bottom);
930 draw_string(dpy, window, gc, &gcv, font, xoff, yoff, 10, 10, left, 0);
931 draw_string(dpy, window, gc, &gcv, font, xoff+col_right, yoff+row_top,
934 XFillRectangle(dpy, window, gc, xoff + col_right, yoff, 2, page_bottom);
935 XDrawLine(dpy, window, gc,
936 xoff+col_right, yoff+row_top, xoff+page_right, yoff+row_top);
937 XDrawLine(dpy, window, gc,
938 xoff+col_right, yoff+row_bottom, xoff+page_right, yoff+row_bottom);
939 XDrawRectangle(dpy, window, gc, xoff, yoff, page_right, page_bottom);
944 draw_string(dpy, window, gc, &gcv, font,
945 xoff + col_right + char_width, yoff + body_top, 10, 10, body,
950 XDrawLine(dpy, window, gc,
951 xoff+col_right+(char_width/2)+2, yoff+row_bottom+3,
952 xoff+col_right+(char_width/2)+2, yoff+page_bottom-3);
955 XDrawLine(dpy, window, gc2,
956 xoff+col_right+(char_width/2)+2, yoff+row_bottom+3,
957 xoff+col_right+(char_width/2)+2, yoff+page_bottom-3);
960 if (bsod_sleep(dpy, 0))
967 XClearWindow(dpy, window);
968 XFreeFont(dpy, font);
974 char *progclass = "BSOD";
976 char *defaults [] = {
983 "*doAtari: False", /* boring */
986 "*doSparcLinux: False", /* boring */
988 ".Windows.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
989 ".Windows.font2: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
990 ".Windows.foreground: White",
991 ".Windows.background: Blue",
993 ".Amiga.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
994 ".Amiga.font2: -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
995 ".Amiga.foreground: Red",
996 ".Amiga.background: Black",
997 ".Amiga.background2: White",
999 ".Mac.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
1000 ".Mac.foreground: PaleTurquoise1",
1001 ".Mac.background: Black",
1003 ".Atari.foreground: Black",
1004 ".Atari.background: White",
1006 ".MacsBug.font: -*-courier-medium-r-*-*-*-100-*-*-m-*-*-*",
1007 ".MacsBug.font2: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
1008 ".MacsBug.font3: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
1009 ".MacsBug.foreground: Black",
1010 ".MacsBug.background: White",
1011 ".MacsBug.borderColor: #AAAAAA",
1013 ".SCO.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
1014 ".SCO.font2: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
1015 ".SCO.foreground: White",
1016 ".SCO.background: Black",
1018 ".SparcLinux.font: -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
1019 ".SparcLinux.font2: -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
1020 ".SparcLinux.foreground: White",
1021 ".SparcLinux.background: Black",
1025 XrmOptionDescRec options [] = {
1026 { "-delay", ".delay", XrmoptionSepArg, 0 },
1032 screenhack (Display *dpy, Window window)
1037 int delay = get_integer_resource ("delay", "Integer");
1038 if (delay < 3) delay = 3;
1040 if (!get_boolean_resource ("root", "Boolean"))
1042 XWindowAttributes xgwa;
1043 XGetWindowAttributes (dpy, window, &xgwa);
1044 XSelectInput (dpy, window,
1045 xgwa.your_event_mask | KeyPressMask | ButtonPressMask);
1051 do { i = (random() & 0xFF) % 8; } while (i == j);
1054 case 0: did = windows(dpy, window, delay, True); break;
1055 case 1: did = windows(dpy, window, delay, False); break;
1056 case 2: did = amiga(dpy, window, delay); break;
1057 case 3: did = mac(dpy, window, delay); break;
1058 case 4: did = macsbug(dpy, window, delay); break;
1059 case 5: did = sco(dpy, window, delay); break;
1060 case 6: did = sparc_linux(dpy, window, delay); break;
1061 case 7: did = atari(dpy, window, delay); break;
1062 default: abort(); break;
1065 if (loop > 100) j = -1;
1066 if (loop > 200) exit(-1);