diff options
Diffstat (limited to 'gdk/x11/gdkmain-x11.c')
-rw-r--r-- | gdk/x11/gdkmain-x11.c | 74 |
1 files changed, 56 insertions, 18 deletions
diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index e907f04adb..de1d55ea8c 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.c @@ -31,6 +31,7 @@ #include <stdlib.h> #include <string.h> #include <limits.h> +#include <errno.h> #ifdef HAVE_SYS_SELECT_H #include <sys/select.h> @@ -48,6 +49,7 @@ #include "gdkinput.h" #include "gdkx.h" #include "gdki18n.h" +#include "gdkkeysyms.h" #ifndef X_GETTIMEOFDAY #define X_GETTIMEOFDAY(tv) gettimeofday (tv, NULL) @@ -333,6 +335,7 @@ gdk_init_check (int *argc, gdk_im_set_best_style (GDK_IM_PREEDIT_POSITION); else if (strcmp ("callbacks", (*argv)[i]) == 0) gdk_im_set_best_style (GDK_IM_PREEDIT_CALLBACKS); + (*argv)[i] = NULL; } } else if (strcmp ("--xim-status", (*argv)[i]) == 0) @@ -348,6 +351,7 @@ gdk_init_check (int *argc, gdk_im_set_best_style (GDK_IM_STATUS_AREA); else if (strcmp ("callbacks", (*argv)[i]) == 0) gdk_im_set_best_style (GDK_IM_STATUS_CALLBACKS); + (*argv)[i] = NULL; } } #endif @@ -406,9 +410,9 @@ gdk_init_check (int *argc, g_free(argv_orig[i]); g_free(argv_orig); - gdk_wm_delete_window = XInternAtom (gdk_display, "WM_DELETE_WINDOW", True); - gdk_wm_take_focus = XInternAtom (gdk_display, "WM_TAKE_FOCUS", True); - gdk_wm_protocols = XInternAtom (gdk_display, "WM_PROTOCOLS", True); + gdk_wm_delete_window = XInternAtom (gdk_display, "WM_DELETE_WINDOW", False); + gdk_wm_take_focus = XInternAtom (gdk_display, "WM_TAKE_FOCUS", False); + gdk_wm_protocols = XInternAtom (gdk_display, "WM_PROTOCOLS", False); gdk_wm_window_protocols[0] = gdk_wm_delete_window; gdk_wm_window_protocols[1] = gdk_wm_take_focus; gdk_selection_property = XInternAtom (gdk_display, "GDK_SELECTION", False); @@ -1032,20 +1036,35 @@ static int gdk_x_error (Display *display, XErrorEvent *error) { - char buf[64]; - - if (gdk_error_warnings) + if (error->error_code) { - XGetErrorText (display, error->error_code, buf, 63); - g_error ("%s\n serial %ld error_code %d request_code %d minor_code %d\n", - buf, - error->serial, - error->error_code, - error->request_code, - error->minor_code); + if (gdk_error_warnings) + { + char buf[64]; + + XGetErrorText (display, error->error_code, buf, 63); + +#ifdef G_ENABLE_DEBUG + g_error ("%s\n serial %ld error_code %d request_code %d minor_code %d\n", + buf, + error->serial, + error->error_code, + error->request_code, + error->minor_code); +#else /* !G_ENABLE_DEBUG */ + fprintf (stderr, "Gdk-ERROR **: %s\n serial %ld error_code %d request_code %d minor_code %d\n", + buf, + error->serial, + error->error_code, + error->request_code, + error->minor_code); + + exit(1); +#endif /* G_ENABLE_DEBUG */ + } + gdk_error_code = error->error_code; } - gdk_error_code = -1; return 0; } @@ -1071,8 +1090,27 @@ gdk_x_error (Display *display, static int gdk_x_io_error (Display *display) { - g_error ("an x io error occurred"); - return 0; + /* This is basically modelled after the code in XLib. We need + * an explicit error handler here, so we can disable our atexit() + * which would otherwise cause a nice segfault. + * We fprintf(stderr, instead of g_warning() because g_warning() + * could possibly be redirected to a dialog + */ + if (errno == EPIPE) + { + fprintf (stderr, "Gdk-ERROR **: X connection to %s broken (explicit kill or server shutdown).\n", gdk_display ? DisplayString (gdk_display) : gdk_get_display()); + } + else + { + fprintf (stderr, "Gdk-ERROR **: Fatal IO error %d (%s) on X server %s.\n", + errno, g_strerror (errno), + gdk_display ? DisplayString (gdk_display) : gdk_get_display()); + } + + /* Disable the atexit shutdown for GDK */ + gdk_initialized = 0; + + exit(1); } gchar * @@ -1104,7 +1142,7 @@ gdk_error_trap_push (void) } else { - node = g_slist_alloc(); + node = g_slist_alloc (); node->data = g_new (GdkErrorTrap, 1); } @@ -1166,7 +1204,7 @@ gdk_send_xevent (Window window, gboolean propagate, glong event_mask, XSync (gdk_display, False); gdk_error_warnings = old_warnings; - return result && (gdk_error_code != -1); + return result && !gdk_error_code; } #ifndef HAVE_XCONVERTCASE |