Commit c8698f92 authored by Owen Taylor's avatar Owen Taylor Committed by Owen Taylor

Move here, and save/restore the X error handler to allow people using GTK+

Thu Jan 17 13:08:34 2002  Owen Taylor  <otaylor@redhat.com>

	* gdk/x11/gdkmain-x11.c (gdk_error_trap_push): Move
	here, and save/restore the X error handler to allow
	people using GTK+ to set the X error handler to something
	custom without disturbing the operation of GDK.

	* gdk/linux-fb/gdkmain-fb.c (gdk_error_trap_push)
	* gdk/win32/gdkmain-win32.c (gdk_error_trap_pop): Add
	dummy implementations.

	* gdk/x11/gdkmain-x11.c gdk/x11/gdkevents-x11.c
	gdk/x11/gdkdnd-x11.c: Use gdk_error_trap_push()/pop()
	for all error trapping.

	* gdk/x11/gdkdnd-x11.c: Remove '#if 0' code.

	* gdk/x11/gdkdnd-x11.c (gdk_window_cache_new): Fix
	problem where we would add the results anyways,
	and then add it again if no error occurred, and problem
	where we could leave _gdk_error_warnings() unset.
parent 5ce4d158
Thu Jan 17 13:08:34 2002 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkmain-x11.c (gdk_error_trap_push): Move
here, and save/restore the X error handler to allow
people using GTK+ to set the X error handler to something
custom without disturbing the operation of GDK.
* gdk/linux-fb/gdkmain-fb.c (gdk_error_trap_push)
* gdk/win32/gdkmain-win32.c (gdk_error_trap_pop): Add
dummy implementations.
* gdk/x11/gdkmain-x11.c gdk/x11/gdkevents-x11.c
gdk/x11/gdkdnd-x11.c: Use gdk_error_trap_push()/pop()
for all error trapping.
* gdk/x11/gdkdnd-x11.c: Remove '#if 0' code.
* gdk/x11/gdkdnd-x11.c (gdk_window_cache_new): Fix
problem where we would add the results anyways,
and then add it again if no error occurred, and problem
where we could leave _gdk_error_warnings() unset.
Wed Jan 16 20:28:38 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtkfilesel.c: Fix "deleting" filename by adding
......
Thu Jan 17 13:08:34 2002 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkmain-x11.c (gdk_error_trap_push): Move
here, and save/restore the X error handler to allow
people using GTK+ to set the X error handler to something
custom without disturbing the operation of GDK.
* gdk/linux-fb/gdkmain-fb.c (gdk_error_trap_push)
* gdk/win32/gdkmain-win32.c (gdk_error_trap_pop): Add
dummy implementations.
* gdk/x11/gdkmain-x11.c gdk/x11/gdkevents-x11.c
gdk/x11/gdkdnd-x11.c: Use gdk_error_trap_push()/pop()
for all error trapping.
* gdk/x11/gdkdnd-x11.c: Remove '#if 0' code.
* gdk/x11/gdkdnd-x11.c (gdk_window_cache_new): Fix
problem where we would add the results anyways,
and then add it again if no error occurred, and problem
where we could leave _gdk_error_warnings() unset.
Wed Jan 16 20:28:38 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtkfilesel.c: Fix "deleting" filename by adding
......
Thu Jan 17 13:08:34 2002 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkmain-x11.c (gdk_error_trap_push): Move
here, and save/restore the X error handler to allow
people using GTK+ to set the X error handler to something
custom without disturbing the operation of GDK.
* gdk/linux-fb/gdkmain-fb.c (gdk_error_trap_push)
* gdk/win32/gdkmain-win32.c (gdk_error_trap_pop): Add
dummy implementations.
* gdk/x11/gdkmain-x11.c gdk/x11/gdkevents-x11.c
gdk/x11/gdkdnd-x11.c: Use gdk_error_trap_push()/pop()
for all error trapping.
* gdk/x11/gdkdnd-x11.c: Remove '#if 0' code.
* gdk/x11/gdkdnd-x11.c (gdk_window_cache_new): Fix
problem where we would add the results anyways,
and then add it again if no error occurred, and problem
where we could leave _gdk_error_warnings() unset.
Wed Jan 16 20:28:38 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtkfilesel.c: Fix "deleting" filename by adding
......
Thu Jan 17 13:08:34 2002 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkmain-x11.c (gdk_error_trap_push): Move
here, and save/restore the X error handler to allow
people using GTK+ to set the X error handler to something
custom without disturbing the operation of GDK.
* gdk/linux-fb/gdkmain-fb.c (gdk_error_trap_push)
* gdk/win32/gdkmain-win32.c (gdk_error_trap_pop): Add
dummy implementations.
* gdk/x11/gdkmain-x11.c gdk/x11/gdkevents-x11.c
gdk/x11/gdkdnd-x11.c: Use gdk_error_trap_push()/pop()
for all error trapping.
* gdk/x11/gdkdnd-x11.c: Remove '#if 0' code.
* gdk/x11/gdkdnd-x11.c (gdk_window_cache_new): Fix
problem where we would add the results anyways,
and then add it again if no error occurred, and problem
where we could leave _gdk_error_warnings() unset.
Wed Jan 16 20:28:38 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtkfilesel.c: Fix "deleting" filename by adding
......
Thu Jan 17 13:08:34 2002 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkmain-x11.c (gdk_error_trap_push): Move
here, and save/restore the X error handler to allow
people using GTK+ to set the X error handler to something
custom without disturbing the operation of GDK.
* gdk/linux-fb/gdkmain-fb.c (gdk_error_trap_push)
* gdk/win32/gdkmain-win32.c (gdk_error_trap_pop): Add
dummy implementations.
* gdk/x11/gdkmain-x11.c gdk/x11/gdkevents-x11.c
gdk/x11/gdkdnd-x11.c: Use gdk_error_trap_push()/pop()
for all error trapping.
* gdk/x11/gdkdnd-x11.c: Remove '#if 0' code.
* gdk/x11/gdkdnd-x11.c (gdk_window_cache_new): Fix
problem where we would add the results anyways,
and then add it again if no error occurred, and problem
where we could leave _gdk_error_warnings() unset.
Wed Jan 16 20:28:38 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtkfilesel.c: Fix "deleting" filename by adding
......
Thu Jan 17 13:08:34 2002 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkmain-x11.c (gdk_error_trap_push): Move
here, and save/restore the X error handler to allow
people using GTK+ to set the X error handler to something
custom without disturbing the operation of GDK.
* gdk/linux-fb/gdkmain-fb.c (gdk_error_trap_push)
* gdk/win32/gdkmain-win32.c (gdk_error_trap_pop): Add
dummy implementations.
* gdk/x11/gdkmain-x11.c gdk/x11/gdkevents-x11.c
gdk/x11/gdkdnd-x11.c: Use gdk_error_trap_push()/pop()
for all error trapping.
* gdk/x11/gdkdnd-x11.c: Remove '#if 0' code.
* gdk/x11/gdkdnd-x11.c (gdk_window_cache_new): Fix
problem where we would add the results anyways,
and then add it again if no error occurred, and problem
where we could leave _gdk_error_warnings() unset.
Wed Jan 16 20:28:38 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtkfilesel.c: Fix "deleting" filename by adding
......
Thu Jan 17 13:08:34 2002 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkmain-x11.c (gdk_error_trap_push): Move
here, and save/restore the X error handler to allow
people using GTK+ to set the X error handler to something
custom without disturbing the operation of GDK.
* gdk/linux-fb/gdkmain-fb.c (gdk_error_trap_push)
* gdk/win32/gdkmain-win32.c (gdk_error_trap_pop): Add
dummy implementations.
* gdk/x11/gdkmain-x11.c gdk/x11/gdkevents-x11.c
gdk/x11/gdkdnd-x11.c: Use gdk_error_trap_push()/pop()
for all error trapping.
* gdk/x11/gdkdnd-x11.c: Remove '#if 0' code.
* gdk/x11/gdkdnd-x11.c (gdk_window_cache_new): Fix
problem where we would add the results anyways,
and then add it again if no error occurred, and problem
where we could leave _gdk_error_warnings() unset.
Wed Jan 16 20:28:38 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtkfilesel.c: Fix "deleting" filename by adding
......
......@@ -37,7 +37,6 @@
#endif
typedef struct _GdkPredicate GdkPredicate;
typedef struct _GdkErrorTrap GdkErrorTrap;
struct _GdkPredicate
{
......@@ -45,19 +44,12 @@ struct _GdkPredicate
gpointer data;
};
struct _GdkErrorTrap
{
gint error_warnings;
gint error_code;
};
/* Private variable declarations
*/
static int gdk_initialized = 0; /* 1 if the library is initialized,
* 0 otherwise.
*/
static GSList *gdk_error_traps = NULL; /* List of error traps */
static GSList *gdk_error_trap_free_list = NULL; /* Free list */
static gchar *gdk_progclass = NULL;
......@@ -432,77 +424,6 @@ gdk_exit_func (void)
#endif
/*************************************************************
* gdk_error_trap_push:
* Push an error trap. X errors will be trapped until
* the corresponding gdk_error_pop(), which will return
* the error code, if any.
* arguments:
*
* results:
*************************************************************/
void
gdk_error_trap_push (void)
{
GSList *node;
GdkErrorTrap *trap;
if (gdk_error_trap_free_list)
{
node = gdk_error_trap_free_list;
gdk_error_trap_free_list = gdk_error_trap_free_list->next;
}
else
{
node = g_slist_alloc ();
node->data = g_new (GdkErrorTrap, 1);
}
node->next = gdk_error_traps;
gdk_error_traps = node;
trap = node->data;
trap->error_code = _gdk_error_code;
trap->error_warnings = _gdk_error_warnings;
_gdk_error_code = 0;
_gdk_error_warnings = 0;
}
/*************************************************************
* gdk_error_trap_pop:
* Pop an error trap added with gdk_error_push()
* arguments:
*
* results:
* 0, if no error occured, otherwise the error code.
*************************************************************/
gint
gdk_error_trap_pop (void)
{
GSList *node;
GdkErrorTrap *trap;
gint result;
g_return_val_if_fail (gdk_error_traps != NULL, 0);
node = gdk_error_traps;
gdk_error_traps = gdk_error_traps->next;
node->next = gdk_error_trap_free_list;
gdk_error_trap_free_list = node;
result = _gdk_error_code;
trap = node->data;
_gdk_error_code = trap->error_code;
_gdk_error_warnings = trap->error_warnings;
return result;
}
void
gdk_threads_enter ()
{
......
......@@ -1533,3 +1533,13 @@ gdk_fb_set_rotation (GdkFBAngle angle)
#endif
}
void
gdk_error_trap_push (void)
{
}
gint
gdk_error_trap_pop (void)
{
return 0;
}
......@@ -258,3 +258,14 @@ gdk_get_display (void)
{
return "Win32";
}
void
gdk_error_trap_push (void)
{
}
gint
gdk_error_trap_pop (void)
{
return 0;
}
This diff is collapsed.
......@@ -1790,25 +1790,19 @@ gdk_event_send_client_message_to_all_recurse (XEvent *xev,
unsigned char *data;
Window *ret_children, ret_root, ret_parent;
unsigned int ret_nchildren;
gint old_warnings = _gdk_error_warnings;
gboolean send = FALSE;
gboolean found = FALSE;
gboolean result = FALSE;
int i;
if (!wm_state_atom)
wm_state_atom = gdk_x11_get_xatom_by_name ("WM_STATE");
_gdk_error_warnings = FALSE;
_gdk_error_code = 0;
XGetWindowProperty (gdk_display, xid, wm_state_atom, 0, 0, False, AnyPropertyType,
&type, &format, &nitems, &after, &data);
if (_gdk_error_code)
{
_gdk_error_warnings = old_warnings;
return FALSE;
}
gdk_error_trap_push ();
if (XGetWindowProperty (gdk_display, xid, wm_state_atom, 0, 0, False, AnyPropertyType,
&type, &format, &nitems, &after, &data) != Success)
goto out;
if (type)
{
......@@ -1818,14 +1812,9 @@ gdk_event_send_client_message_to_all_recurse (XEvent *xev,
else
{
/* OK, we're all set, now let's find some windows to send this to */
if (XQueryTree (gdk_display, xid, &ret_root, &ret_parent,
&ret_children, &ret_nchildren) != True ||
_gdk_error_code)
{
_gdk_error_warnings = old_warnings;
return FALSE;
}
if (!XQueryTree (gdk_display, xid, &ret_root, &ret_parent,
&ret_children, &ret_nchildren))
goto out;
for(i = 0; i < ret_nchildren; i++)
if (gdk_event_send_client_message_to_all_recurse (xev, ret_children[i], level + 1))
......@@ -1840,16 +1829,18 @@ gdk_event_send_client_message_to_all_recurse (XEvent *xev,
gdk_send_xevent (xid, False, NoEventMask, xev);
}
_gdk_error_warnings = old_warnings;
result = send || found;
out:
gdk_error_trap_pop ();
return (send || found);
return result;
}
void
gdk_event_send_clientmessage_toall (GdkEvent *event)
{
XEvent sev;
gint old_warnings = _gdk_error_warnings;
g_return_if_fail(event != NULL);
......@@ -1861,8 +1852,6 @@ gdk_event_send_clientmessage_toall (GdkEvent *event)
sev.xclient.message_type = gdk_x11_atom_to_xatom (event->client.message_type);
gdk_event_send_client_message_to_all_recurse(&sev, _gdk_root_window, 0);
_gdk_error_warnings = old_warnings;
}
/*
......
......@@ -62,6 +62,7 @@ struct _GdkPredicate
struct _GdkErrorTrap
{
int (*old_handler) (Display *, XErrorEvent *);
gint error_warnings;
gint error_code;
};
......@@ -89,6 +90,8 @@ static int gdk_initialized = 0; /* 1 if the library is initialized,
static gint autorepeat;
static gboolean gdk_synchronize = FALSE;
static GSList *gdk_error_traps = NULL; /* List of error traps */
static GSList *gdk_error_trap_free_list = NULL; /* Free list */
GdkArgDesc _gdk_windowing_args[] = {
{ "display", GDK_ARG_STRING, &_gdk_display_name, (GdkArgFunc)NULL },
......@@ -694,6 +697,79 @@ gdk_x_io_error (Display *display)
exit(1);
}
/*************************************************************
* gdk_error_trap_push:
* Push an error trap. X errors will be trapped until
* the corresponding gdk_error_pop(), which will return
* the error code, if any.
* arguments:
*
* results:
*************************************************************/
void
gdk_error_trap_push (void)
{
GSList *node;
GdkErrorTrap *trap;
if (gdk_error_trap_free_list)
{
node = gdk_error_trap_free_list;
gdk_error_trap_free_list = gdk_error_trap_free_list->next;
}
else
{
node = g_slist_alloc ();
node->data = g_new (GdkErrorTrap, 1);
}
node->next = gdk_error_traps;
gdk_error_traps = node;
trap = node->data;
trap->old_handler = XSetErrorHandler (gdk_x_error);
trap->error_code = _gdk_error_code;
trap->error_warnings = _gdk_error_warnings;
_gdk_error_code = 0;
_gdk_error_warnings = 0;
}
/*************************************************************
* gdk_error_trap_pop:
* Pop an error trap added with gdk_error_push()
* arguments:
*
* results:
* 0, if no error occured, otherwise the error code.
*************************************************************/
gint
gdk_error_trap_pop (void)
{
GSList *node;
GdkErrorTrap *trap;
gint result;
g_return_val_if_fail (gdk_error_traps != NULL, 0);
node = gdk_error_traps;
gdk_error_traps = gdk_error_traps->next;
node->next = gdk_error_trap_free_list;
gdk_error_trap_free_list = node;
result = _gdk_error_code;
trap = node->data;
_gdk_error_code = trap->error_code;
_gdk_error_warnings = trap->error_warnings;
XSetErrorHandler (trap->old_handler);
return result;
}
gchar *
gdk_get_display (void)
{
......@@ -704,17 +780,13 @@ gint
gdk_send_xevent (Window window, gboolean propagate, glong event_mask,
XEvent *event_send)
{
Status result;
gint old_warnings = _gdk_error_warnings;
gboolean result;
_gdk_error_code = 0;
_gdk_error_warnings = 0;
gdk_error_trap_push ();
result = XSendEvent (gdk_display, window, propagate, event_mask, event_send);
XSync (gdk_display, False);
_gdk_error_warnings = old_warnings;
return result && !_gdk_error_code;
return result && gdk_error_trap_pop() == Success;
}
void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment