Handle XError and XIOError for unknown displays

The atk-bridge GTK+ module opens its own display; if we get an
XIOError on that display, we shouldn't abort with a meta_bug()
but just exit normally. Also fix a segfault if we got an XError
for that display.

https://bugzilla.gnome.org/show_bug.cgi?id=604319
This commit is contained in:
Owen W. Taylor 2009-11-20 10:42:07 -05:00
parent 7834bba6f7
commit 708c6162c4

View File

@ -186,10 +186,10 @@ x_error_handler (Display *xdisplay,
display = meta_display_for_x_display (xdisplay); display = meta_display_for_x_display (xdisplay);
/* Display can be NULL here because the compositing manager /* Display can be NULL here Xlib only has one global error handler; and
* has its own Display, but Xlib only has one global error handler * there might be other displays open in the process.
*/ */
if (display->error_traps > 0) if (display && display->error_traps > 0)
{ {
/* we're in an error trap, chain to the trap handler /* we're in an error trap, chain to the trap handler
* saved from GDK * saved from GDK
@ -228,21 +228,18 @@ x_io_error_handler (Display *xdisplay)
display = meta_display_for_x_display (xdisplay); display = meta_display_for_x_display (xdisplay);
if (display == NULL)
meta_bug ("IO error received for unknown display?\n");
if (errno == EPIPE) if (errno == EPIPE)
{ {
meta_warning (_("Lost connection to the display '%s';\n" meta_warning (_("Lost connection to the display '%s';\n"
"most likely the X server was shut down or you killed/destroyed\n" "most likely the X server was shut down or you killed/destroyed\n"
"the window manager.\n"), "the window manager.\n"),
display->name); display ? display->name : DisplayString (xdisplay));
} }
else else
{ {
meta_warning (_("Fatal IO error %d (%s) on display '%s'.\n"), meta_warning (_("Fatal IO error %d (%s) on display '%s'.\n"),
errno, g_strerror (errno), errno, g_strerror (errno),
display->name); display ? display->name : DisplayString (xdisplay));
} }
/* Xlib would force an exit anyhow */ /* Xlib would force an exit anyhow */