Only store error codes in inner-most X error trap

When an error occurs with nested traps in place, only the innermost
trap should have the error code stored in it; outer traps are
shielded by the inner trap.

https://bugzilla.gnome.org/show_bug.cgi?id=629608
This commit is contained in:
Owen W. Taylor 2010-09-20 16:12:11 -04:00
parent 1592738d2f
commit 14e38da150
2 changed files with 11 additions and 1 deletions

View File

@ -2721,6 +2721,7 @@ _gdk_x11_display_error_event (GdkDisplay *display,
{
ignore = TRUE;
trap->error_code = error->error_code;
break; /* only innermost trap gets the error code */
}
}

View File

@ -56,13 +56,22 @@ test_error_trapping (GdkDisplay *gdk_display)
XSync (d, TRUE);
/* verify that we can catch with nested traps */
/* verify that we can catch with nested traps; inner-most
* active trap gets the error */
gdk_error_trap_push ();
gdk_error_trap_push ();
XSetCloseDownMode (d, 12345);
error = gdk_error_trap_pop ();
g_assert (error == BadValue);
error = gdk_error_trap_pop ();
g_assert (error == Success);
gdk_error_trap_push ();
XSetCloseDownMode (d, 12345);
gdk_error_trap_push ();
error = gdk_error_trap_pop ();
g_assert (error == Success);
error = gdk_error_trap_pop ();
g_assert (error == BadValue);
/* try nested, without sync */