]> Pileus Git - ~andy/gtk/commitdiff
gdk: Don't fully destroy the implicit touch grab on ::grab-broken
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 21 Feb 2012 02:12:10 +0000 (03:12 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 1 Mar 2012 21:25:26 +0000 (16:25 -0500)
the backing GdkTouchGrabInfo will be needed if the overriding device
grab finishes before the touch does in order to send events back to
the implicit grab window. Instead, wait until the touch is physically
finished before removing the matching GdkTouchGrabInfo

gdk/gdkdisplay.c
gdk/gdkwindow.c

index b62b81069d2e2446c157d23f495c8b6132b33285..63bb316f8e209e846be393ed08238b34ecac25d2 100644 (file)
@@ -700,24 +700,18 @@ _gdk_display_break_touch_grabs (GdkDisplay *display,
                                 GdkDevice  *device,
                                 GdkWindow  *new_grab_window)
 {
-  guint i = 0;
+  guint i;
 
-  while (i < display->touch_implicit_grabs->len)
+  for (i = 0; i < display->touch_implicit_grabs->len; i++)
     {
       GdkTouchGrabInfo *info;
 
       info = &g_array_index (display->touch_implicit_grabs,
                              GdkTouchGrabInfo, i);
 
-      if (info->device == device &&
-          info->window != new_grab_window)
-        {
-          generate_grab_broken_event (GDK_WINDOW (info->window),
-                                      device, TRUE, new_grab_window);
-          g_array_remove_index_fast (display->touch_implicit_grabs, i);
-        }
-      else
-        i++;
+      if (info->device == device && info->window != new_grab_window)
+        generate_grab_broken_event (GDK_WINDOW (info->window),
+                                    device, TRUE, new_grab_window);
     }
 }
 
index 27eb343ac4e674811b1d3bd82dd4222fbaaa5c84..e05a6ec6e0fcd7cf320435240ac51b2d64a5da17 100644 (file)
@@ -9252,9 +9252,9 @@ proxy_pointer_event (GdkDisplay                 *display,
 
   if (pointer_info->need_touch_press_enter &&
       gdk_device_get_source (pointer_info->last_slave) != GDK_SOURCE_TOUCHSCREEN &&
-      gdk_device_get_source (pointer_info->last_slave) != GDK_SOURCE_TOUCHPAD) &&
+      gdk_device_get_source (pointer_info->last_slave) != GDK_SOURCE_TOUCHPAD &&
       (source_event->type != GDK_TOUCH_UPDATE ||
-       _gdk_event_get_pointer_emulated (source_event))
+       _gdk_event_get_pointer_emulated (source_event)))
     {
       pointer_info->need_touch_press_enter = FALSE;
       need_synthetic_enter = TRUE;
@@ -9687,7 +9687,8 @@ proxy_button_event (GdkEvent *source_event,
       if ((type == GDK_TOUCH_END &&
            _gdk_event_get_pointer_emulated (source_event)) &&
            pointer_window == pointer_info->window_under_pointer &&
-           gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN)
+           (gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHSCREEN ||
+            gdk_device_get_source (source_device) == GDK_SOURCE_TOUCHPAD))
         {
           /* Synthesize a leave notify event
            * whenever a touch device is released