X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fdevice-x.c;h=540e407c6aa098e52bfdd59a38f08356ed044480;hb=da07d4a5ef8a197d6c99508b5f8f607417520bb7;hp=a6fc1bc64c8b27854562f9f55931baea3aa6edea;hpb=caf1416adb403b6334ce635e58b269b6c653aa39;p=chise%2Fxemacs-chise.git.1 diff --git a/src/device-x.c b/src/device-x.c index a6fc1bc..540e407 100644 --- a/src/device-x.c +++ b/src/device-x.c @@ -141,7 +141,7 @@ get_device_from_display (Display *dpy) (STRINGP (Vinvocation_name) ? (char *) XSTRING_DATA (Vinvocation_name) : FALLBACK_RESOURCE_NAME), DisplayString (dpy) ? DisplayString (dpy) : "???"); - abort(); + ABORT(); } #undef FALLBACK_RESOURCE_NAME @@ -168,6 +168,8 @@ get_x_display (Lisp_Object device) /* initializing an X connection */ /************************************************************************/ +static struct device *device_being_initialized = NULL; + static void allocate_x_device_struct (struct device *d) { @@ -418,7 +420,7 @@ x_get_visual_depth (Display *dpy, Visual *visual) vi_in.visualid = XVisualIDFromVisual (visual); vi_out = XGetVisualInfo (dpy, /*VisualScreenMask|*/VisualIDMask, &vi_in, &out_count); - if (! vi_out) abort (); + if (! vi_out) ABORT (); d = vi_out [0].depth; XFree ((char *) vi_out); return d; @@ -562,7 +564,9 @@ x_init_device (struct device *d, Lisp_Object props) */ slow_down_interrupts (); /* May not be needed but XtOpenDisplay could not deal with signals here. */ + device_being_initialized = d; dpy = DEVICE_X_DISPLAY (d) = XOpenDisplay (disp_name); + device_being_initialized = NULL; speed_up_interrupts (); if (dpy == 0) @@ -1053,10 +1057,14 @@ x_error_handler (Display *disp, XErrorEvent *event) } #endif /* EXTERNAL_WIDGET */ +#if 0 + /* This ends up calling X, which isn't allowed in an X error handler + */ stderr_out ("\n%s: ", (STRINGP (Vinvocation_name) ? (char *) XSTRING_DATA (Vinvocation_name) : "xemacs")); +#endif XmuPrintDefaultErrorMessage (disp, event, stderr); } return 0; @@ -1116,6 +1124,9 @@ x_IO_error_handler (Display *disp) Lisp_Object dev; struct device *d = get_device_from_display_1 (disp); + if (!d) + d = device_being_initialized; + assert (d != NULL); XSETDEVICE (dev, d); @@ -1150,8 +1161,10 @@ x_IO_error_handler (Display *disp) Xlib might just decide to exit(). So we mark the offending console for deletion and throw to top level. */ if (d) - enqueue_magic_eval_event (io_error_delete_device, dev); - DEVICE_X_BEING_DELETED (d) = 1; + { + enqueue_magic_eval_event (io_error_delete_device, dev); + DEVICE_X_BEING_DELETED (d) = 1; + } Fthrow (Qtop_level, Qnil); return 0; /* not reached */