[gtk+/xi2: 1169/1239] GdkWindow: release all grabs on window if it's hidden.



commit 45a58a294e5e62f3a83214d4d248c93870d0dfdc
Author: Carlos Garnacho <carlos gnome org>
Date:   Wed Sep 16 13:47:48 2009 +0200

    GdkWindow: release all grabs on window if it's hidden.

 gdk/gdkwindow.c          |   33 +++++++++++++++++++--------------
 gdk/x11/gdkdisplay-x11.c |    1 -
 2 files changed, 19 insertions(+), 15 deletions(-)
---
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 5434e71..142ac61 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -6448,26 +6448,31 @@ gdk_window_hide (GdkWindow *window)
   else if (was_mapped)
     {
       GdkDisplay *display;
+      GdkDeviceManager *device_manager;
+      GList *devices, *d;
 
       /* May need to break grabs on children */
       display = gdk_drawable_get_display (window);
+      device_manager = gdk_device_manager_get_for_display (display);
 
-      /* FIXME: which device(s)? */
-      if (_gdk_display_end_device_grab (display,
-                                        display->core_pointer,
-                                        _gdk_windowing_window_get_next_serial (display),
-                                        window,
-                                        TRUE))
-	gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME);
+      /* Get all devices */
+      devices = gdk_device_manager_get_devices (device_manager, GDK_DEVICE_TYPE_MASTER);
+      devices = g_list_concat (devices, gdk_device_manager_get_devices (device_manager, GDK_DEVICE_TYPE_SLAVE));
+      devices = g_list_concat (devices, gdk_device_manager_get_devices (device_manager, GDK_DEVICE_TYPE_FLOATING));
 
-      if (_gdk_display_end_device_grab (display,
-                                        gdk_device_get_relative (display->core_pointer),
-                                        _gdk_windowing_window_get_next_serial (display),
-                                        window,
-                                        TRUE))
-        gdk_display_keyboard_ungrab (display, GDK_CURRENT_TIME);
+      for (d = devices; d; d = d->next)
+        {
+          GdkDevice *device = d->data;
+
+          if (_gdk_display_end_device_grab (display, device,
+                                            _gdk_windowing_window_get_next_serial (display),
+                                            window,
+                                            TRUE))
+            gdk_display_device_ungrab (display, device, GDK_CURRENT_TIME);
+        }
 
       private->state = GDK_WINDOW_STATE_WITHDRAWN;
+      g_list_free (devices);
     }
 
   did_hide = _gdk_window_update_viewable (window);
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index 9783c5c..eca82f2 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -400,7 +400,6 @@ gdk_display_x11_translate_event (GdkEventTranslator *translator,
 	}
     }
 
-  /* FIXME: if window is NULL, xwindow should still have something meaningful here? */
   if (xwindow != None &&
       screen_x11 && screen_x11->wmspec_check_window != None &&
       xwindow == screen_x11->wmspec_check_window)



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