[gtk+] Only store error codes in inner-most X error trap



commit 14e38da150516ffe5cece04de16fb3c976caa21f
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Mon Sep 20 16:12:11 2010 -0400

    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

 gdk/x11/gdkdisplay-x11.c |    1 +
 tests/testerrors.c       |   11 ++++++++++-
 2 files changed, 11 insertions(+), 1 deletions(-)
---
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index 3b82590..3986290 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -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 */
         }
     }
 
diff --git a/tests/testerrors.c b/tests/testerrors.c
index b8d1a8a..d371f1b 100755
--- a/tests/testerrors.c
+++ b/tests/testerrors.c
@@ -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 */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]