+static Bool
+macsbug (Display *dpy, Window window, int delay)
+{
+ XGCValues gcv;
+ XWindowAttributes xgwa;
+ char *fontname;
+ const char *def_font = "fixed";
+ XFontStruct *font;
+ GC gc, gc2;
+
+ int char_width, line_height;
+ int col_right, row_top, row_bottom, page_right, page_bottom, body_top;
+ int xoff, yoff;
+
+ const char *left = (" SP \n"
+ " 04EB0A58 \n"
+ "58 00010000\n"
+ "5C 00010000\n"
+ " ........\n"
+ "60 00000000\n"
+ "64 000004EB\n"
+ " ........\n"
+ "68 0000027F\n"
+ "6C 2D980035\n"
+ " ....-..5\n"
+ "70 00000054\n"
+ "74 0173003E\n"
+ " ...T.s.>\n"
+ "78 04EBDA76\n"
+ "7C 04EBDA8E\n"
+ " .S.L.a.U\n"
+ "80 00000000\n"
+ "84 000004EB\n"
+ " ........\n"
+ "88 00010000\n"
+ "8C 00010000\n"
+ " ...{3..S\n"
+ "\n"
+ "\n"
+ " CurApName \n"
+ " Finder \n"
+ "\n"
+ " 32-bit VM \n"
+ "SR Smxnzvc0\n"
+ "D0 04EC0062\n"
+ "D1 00000053\n"
+ "D2 FFFF0100\n"
+ "D3 00010000\n"
+ "D4 00010000\n"
+ "D5 04EBDA76\n"
+ "D6 04EBDA8E\n"
+ "D7 00000001\n"
+ "\n"
+ "A0 04EBDA76\n"
+ "A1 04EBDA8E\n"
+ "A2 A0A00060\n"
+ "A3 027F2D98\n"
+ "A4 027F2E58\n"
+ "A5 04EC04F0\n"
+ "A6 04EB0A86\n"
+ "A7 04EB0A58");
+ const char *bottom = (" _A09D\n"
+ " +00884 40843714 #$0700,SR "
+ " ; A973 | A973\n"
+ " +00886 40843765 *+$0400 "
+ " | 4A1F\n"
+ " +00888 40843718 $0004(A7),([0,A7[)"
+ " ; 04E8D0AE | 66B8");
+
+#if 0
+ const char *body = ("Bus Error at 4BF6D6CC\n"
+ "while reading word from 4BF6D6CC in User data space\n"
+ " Unable to access that address\n"
+ " PC: 2A0DE3E6\n"
+ " Frame Type: B008");
+#else
+ const char * body = ("PowerPC unmapped memory exception at 003AFDAC "
+ "BowelsOfTheMemoryMgr+04F9C\n"
+ " Calling chain using A6/R1 links\n"
+ " Back chain ISA Caller\n"
+ " 00000000 PPC 28C5353C __start+00054\n"
+ " 24DB03C0 PPC 28B9258C main+0039C\n"
+ " 24DB0350 PPC 28B9210C MainEvent+00494\n"
+ " 24DB02B0 PPC 28B91B40 HandleEvent+00278\n"
+ " 24DB0250 PPC 28B83DAC DoAppleEvent+00020\n"
+ " 24DB0210 PPC FFD3E5D0 "
+ "AEProcessAppleEvent+00020\n"
+ " 24DB0132 68K 00589468\n"
+ " 24DAFF8C 68K 00589582\n"
+ " 24DAFF26 68K 00588F70\n"
+ " 24DAFEB3 PPC 00307098 "
+ "EmToNatEndMoveParams+00014\n"
+ " 24DAFE40 PPC 28B9D0B0 DoScript+001C4\n"
+ " 24DAFDD0 PPC 28B9C35C RunScript+00390\n"
+ " 24DAFC60 PPC 28BA36D4 run_perl+000E0\n"
+ " 24DAFC10 PPC 28BC2904 perl_run+002CC\n"
+ " 24DAFA80 PPC 28C18490 Perl_runops+00068\n"
+ " 24DAFA30 PPC 28BE6CC0 Perl_pp_backtick+000FC\n"
+ " 24DAF9D0 PPC 28BA48B8 Perl_my_popen+00158\n"
+ " 24DAF980 PPC 28C5395C sfclose+00378\n"
+ " 24DAF930 PPC 28BA568C free+0000C\n"
+ " 24DAF8F0 PPC 28BA6254 pool_free+001D0\n"
+ " 24DAF8A0 PPC FFD48F14 DisposePtr+00028\n"
+ " 24DAF7C9 PPC 00307098 "
+ "EmToNatEndMoveParams+00014\n"
+ " 24DAF780 PPC 003AA180 __DisposePtr+00010");
+#endif
+
+ 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);
+
+ fontname = get_string_resource ((xgwa.height > 850
+ ? "macsbug.font3"
+ : (xgwa.height > 700
+ ? "macsbug.font2"
+ : "macsbug.font")),
+ "MacsBug.Font");
+ if (!fontname || !*fontname) fontname = (char *)def_font;
+ font = XLoadQueryFont (dpy, fontname);
+ if (!font) font = XLoadQueryFont (dpy, def_font);
+ if (!font) exit(-1);
+ if (fontname && fontname != def_font)
+ free (fontname);
+
+ gcv.font = font->fid;
+ gcv.foreground = get_pixel_resource("macsbug.foreground",
+ "MacsBug.Foreground",
+ dpy, xgwa.colormap);
+ gcv.background = get_pixel_resource("macsbug.background",
+ "MacsBug.Background",
+ dpy, xgwa.colormap);
+
+ gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+
+ gcv.foreground = gcv.background;
+ gc2 = XCreateGC(dpy, window, GCForeground, &gcv);
+
+ XSetWindowBackground(dpy, window,
+ get_pixel_resource("macsbug.borderColor",
+ "MacsBug.BorderColor",
+ dpy, xgwa.colormap));
+ XClearWindow(dpy, window);
+
+ char_width = (font->per_char
+ ? font->per_char['n'-font->min_char_or_byte2].width
+ : font->min_bounds.width);
+ line_height = font->ascent + font->descent + 1;
+
+ col_right = char_width * 12;
+ page_bottom = line_height * 47;
+
+ if (page_bottom > xgwa.height) page_bottom = xgwa.height;
+
+ row_bottom = page_bottom - line_height;
+ row_top = row_bottom - (line_height * 4);
+ page_right = col_right + (char_width * 88);
+ body_top = row_top - (line_height * body_lines);
+
+ page_bottom += 2;
+ row_bottom += 2;
+ body_top -= 4;
+
+ xoff = (xgwa.width - page_right) / 2;
+ yoff = (xgwa.height - page_bottom) / 2;
+ if (xoff < 0) xoff = 0;
+ if (yoff < 0) yoff = 0;
+
+ XFillRectangle(dpy, window, gc2, xoff, yoff, page_right, page_bottom);
+
+ draw_string(dpy, window, gc, &gcv, font, xoff, yoff, 10, 10, left, 0);
+ draw_string(dpy, window, gc, &gcv, font, xoff+col_right, yoff+row_top,
+ 10, 10, bottom, 0);
+
+ XFillRectangle(dpy, window, gc, xoff + col_right, yoff, 2, page_bottom);
+ XDrawLine(dpy, window, gc,
+ xoff+col_right, yoff+row_top, xoff+page_right, yoff+row_top);
+ XDrawLine(dpy, window, gc,
+ xoff+col_right, yoff+row_bottom, xoff+page_right, yoff+row_bottom);
+ XDrawRectangle(dpy, window, gc, xoff, yoff, page_right, page_bottom);
+
+ if (body_top > 4)
+ body_top = 4;
+
+ draw_string(dpy, window, gc, &gcv, font,
+ xoff + col_right + char_width, yoff + body_top, 10, 10, body,
+ 500);
+
+ while (delay > 0)
+ {
+ XDrawLine(dpy, window, gc,
+ xoff+col_right+(char_width/2)+2, yoff+row_bottom+3,
+ xoff+col_right+(char_width/2)+2, yoff+page_bottom-3);
+ XSync(dpy, False);
+ usleep(666666L);
+ XDrawLine(dpy, window, gc2,
+ xoff+col_right+(char_width/2)+2, yoff+row_bottom+3,
+ xoff+col_right+(char_width/2)+2, yoff+page_bottom-3);
+ XSync(dpy, False);
+ usleep(333333L);
+ if (bsod_sleep(dpy, 0))
+ break;
+ delay--;
+ }
+
+ XFreeGC(dpy, gc);
+ XFreeGC(dpy, gc2);
+ XClearWindow(dpy, window);
+ XFreeFont(dpy, font);
+ return True;
+}
+
+