]> granicus.if.org Git - nethack/commitdiff
X11: Handle X errors via panic
authorPasi Kallinen <paxed@alt.org>
Sat, 13 Oct 2018 12:07:23 +0000 (15:07 +0300)
committerPasi Kallinen <paxed@alt.org>
Sat, 13 Oct 2018 12:07:27 +0000 (15:07 +0300)
This leaves a usable backtrace for debugging.

doc/fixes36.2
win/X11/winX.c

index 127f7ee1b54792da6a43043aeb99cee12b716478..a9c798f699b0dbd99db6c5c301c667d0ca312880 100644 (file)
@@ -225,6 +225,7 @@ X11: make key translations work with menus on Linux
 X11: allow mouse wheel scrolling to work in menus by default
 X11: handle paged menu control keys
 X11: remember perm_invent window geometry
+X11: handle X errors via panic
 
 
 General New Features
index ddf27740e446b549dbded7f5aaff5499e6ed5031..c79376c3585c35dcf1a4bae195ba49f468c174a8 100644 (file)
@@ -85,6 +85,8 @@ int click_x, click_y, click_button; /* Click position on a map window   */
                                     /* (filled by set_button_values()). */
 int updated_inventory;
 
+static int (*old_error_handler) (Display *, XErrorEvent *);
+
 #if !defined(NO_SIGNAL) && defined(SAFERHANGUP)
 #if XtSpecificationRelease >= 6
 #define X11_HANGUP_SIGNAL
@@ -148,6 +150,7 @@ static void FDECL(nhFreePixel, (XtAppContext, XrmValuePtr, XtPointer,
 static boolean FDECL(new_resource_macro, (String, unsigned));
 static void NDECL(load_default_resources);
 static void NDECL(release_default_resources);
+static int FDECL(panic_on_error, (Display *, XErrorEvent *));
 #ifdef X11_HANGUP_SIGNAL
 static void FDECL(X11_sig, (int));
 static void FDECL(X11_sig_cb, (XtPointer, XtSignalId *));
@@ -1273,6 +1276,21 @@ static XtResource resources[] = {
 #endif
 };
 
+static int
+panic_on_error(display, error)
+Display *display;
+XErrorEvent *error;
+{
+    char buf[BUFSZ];
+    XGetErrorText(display, error->error_code, buf, BUFSZ);
+    fprintf(stderr, "X Error: code %i (%s), request %i, minor %i, serial %lu\n",
+            error->error_code, buf,
+            error->request_code, error->minor_code,
+            error->serial);
+    panic("X Error");
+    return 0;
+}
+
 void
 X11_init_nhwindows(argcp, argv)
 int *argcp;
@@ -1318,6 +1336,8 @@ char **argv;
 
     /* We don't need to realize the top level widget. */
 
+    old_error_handler = XSetErrorHandler(panic_on_error);
+
 #ifdef TEXTCOLOR
     /* add new color converter to deal with overused colormaps */
     XtSetTypeConverter(XtRString, XtRPixel, nhCvtStringToPixel,