summaryrefslogtreecommitdiff
path: root/gdk/x11/gdkmain-x11.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdk/x11/gdkmain-x11.c')
-rw-r--r--gdk/x11/gdkmain-x11.c74
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