]> Pileus Git - ~andy/gtk/blobdiff - gdk/gdk.c
[ Merges from gtk-1-2 ]
[~andy/gtk] / gdk / gdk.c
index e907f04adb55bb371b64926bb2b96ddb5f113a8f..de1d55ea8cbca1a951d16043bf9497f67986fe39 100644 (file)
--- a/gdk/gdk.c
+++ b/gdk/gdk.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