summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHavoc Pennington <hp@pobox.com>2001-09-01 05:53:07 +0000
committerHavoc Pennington <hp@src.gnome.org>2001-09-01 05:53:07 +0000
commit2a0a5dfdf806f79bdcf8de4bf06109ef8c4eb849 (patch)
tree5c791b1aba204dc7da4110ea8eba1650e6e91884
parent501dd26713773576dc7f0b334ac4121477ff64bc (diff)
downloadmetacity-2a0a5dfdf806f79bdcf8de4bf06109ef8c4eb849.tar.gz
clean up the code, and replace GDK X error handler with one that chains up
2001-09-01 Havoc Pennington <hp@pobox.com> * src/errors.c: clean up the code, and replace GDK X error handler with one that chains up to GDK but first logs the error to logfile.
-rw-r--r--ChangeLog5
-rw-r--r--src/errors.c112
-rw-r--r--src/main.c8
3 files changed, 33 insertions, 92 deletions
diff --git a/ChangeLog b/ChangeLog
index da3bc48e..3e140454 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2001-09-01 Havoc Pennington <hp@pobox.com>
+
+ * src/errors.c: clean up the code, and replace GDK X error handler
+ with one that chains up to GDK but first logs the error to logfile.
+
2001-08-31 Havoc Pennington <hp@pobox.com>
* src/tabpopup.c (meta_ui_tab_popup_new): fix args to
diff --git a/src/errors.c b/src/errors.c
index b3dad835..10fdc111 100644
--- a/src/errors.c
+++ b/src/errors.c
@@ -22,14 +22,13 @@
#include "errors.h"
#include <errno.h>
+#include <stdlib.h>
#include <gdk/gdk.h>
-typedef struct _ErrorTrap ErrorTrap;
+static int (* saved_gdk_error_handler) (Display *display,
+ XErrorEvent *error);
-struct _ErrorTrap
-{
- int error_code;
-};
+static int (* saved_gdk_io_error_handler) (Display *display);
static int x_error_handler (Display *display,
XErrorEvent *error);
@@ -38,104 +37,44 @@ static int x_io_error_handler (Display *display);
void
meta_errors_init (void)
{
- XSetErrorHandler (x_error_handler);
- XSetIOErrorHandler (x_io_error_handler);
+ saved_gdk_error_handler = XSetErrorHandler (x_error_handler);
+ saved_gdk_io_error_handler = XSetIOErrorHandler (x_io_error_handler);
}
void
meta_error_trap_push (MetaDisplay *display)
{
- ErrorTrap *et;
-
gdk_error_trap_push ();
- return;
-
- /* below here is old method */
- et = g_new (ErrorTrap, 1);
-
- et->error_code = Success;
- display->error_traps = g_slist_prepend (display->error_traps, et);
}
int
meta_error_trap_pop (MetaDisplay *display)
{
- int result;
- ErrorTrap *et;
- GSList *next;
-
+ /* just use GDK trap */
XSync (display->xdisplay, False);
- return gdk_error_trap_pop ();
- /* below here is old method */
-
- if (display->error_traps == NULL)
- meta_bug ("No error trap to pop\n");
-
- XSync (display->xdisplay, False);
-
- et = display->error_traps->data;
-
- result = et->error_code;
-
- next = display->error_traps->next;
- g_slist_free_1 (display->error_traps);
- display->error_traps = next;
-
- g_free (et);
-
- if (result != Success)
- {
- gchar buf[64];
-
- XGetErrorText (display->xdisplay, result, buf, 63);
- meta_verbose ("Popping error code %d (%s)\n",
- result, buf);
- }
-
- return result;
+ return gdk_error_trap_pop ();
}
-
static int
x_error_handler (Display *xdisplay,
XErrorEvent *error)
{
- if (error->error_code)
- {
- MetaDisplay *display;
-
- display = meta_display_for_x_display (xdisplay);
-
- if (display == NULL)
- meta_bug ("Error received for unknown display?\n");
-
- if (display->error_traps == NULL)
- {
- gchar buf[64];
-
- XGetErrorText (xdisplay, error->error_code, buf, 63);
-
- meta_bug ("Received an X Window System error without handling it.\n"
- "The error was '%s'.\n"
- " (Details: 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
- {
- ErrorTrap *et;
-
- et = display->error_traps->data;
-
- et->error_code = error->error_code;
- }
- }
+ int retval;
+ gchar buf[64];
- return 0;
+ XGetErrorText (xdisplay, error->error_code, buf, 63);
+
+ meta_verbose ("X error: %s serial %ld error_code %d request_code %d minor_code %d)\n",
+ buf,
+ error->serial,
+ error->error_code,
+ error->request_code,
+ error->minor_code);
+
+ retval = saved_gdk_error_handler (xdisplay, error);
+
+ return retval;
}
static int
@@ -162,11 +101,8 @@ x_io_error_handler (Display *xdisplay)
display->name);
}
- meta_display_close (display);
+ /* Xlib would force an exit anyhow */
+ exit (1);
- /* I believe Xlib will force an exit after we return, which
- * seems sort of broken to me, but if true we should probably just
- * exit for ourselves. But for now I'm not doing it.
- */
return 0;
}
diff --git a/src/main.c b/src/main.c
index 571f1c47..52a393f1 100644
--- a/src/main.c
+++ b/src/main.c
@@ -153,10 +153,7 @@ main (int argc, char **argv)
{
putenv (display_name);
/* DO NOT FREE display_name, putenv() sucks */
- }
-
- /* gtk_init() below overrides this, so it can be removed */
- meta_errors_init ();
+ }
g_type_init ();
@@ -164,6 +161,9 @@ main (int argc, char **argv)
meta_session_init (client_id); /* client_id == NULL is fine */
meta_ui_init (&argc, &argv);
+
+ /* must be after UI init so we can override GDK handlers */
+ meta_errors_init ();
if (!meta_display_open (NULL))
meta_exit (META_EXIT_ERROR);