[gtk+/gestures: 150/202] gesture: Handle GdkEventGrabBroken



commit 3d34f26a6a16de728b45e557f6552c2cf4fc49a9
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat May 10 20:46:47 2014 +0200

    gesture: Handle GdkEventGrabBroken
    
    That may happen separately from grab-notify, and also due to external
    reasons, so ensure all sequences are cancelled if a grab is taken
    in some GdkWindows that would obscure events on the controller.

 gtk/gtkgesture.c       |   27 +++++++++++++++++++++++++++
 gtk/gtkgesturesingle.c |    5 +++++
 2 files changed, 32 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkgesture.c b/gtk/gtkgesture.c
index e738e61..9689f55 100644
--- a/gtk/gtkgesture.c
+++ b/gtk/gtkgesture.c
@@ -479,6 +479,27 @@ _gtk_gesture_cancel_all (GtkGesture *gesture)
 }
 
 static gboolean
+gesture_within_window (GtkGesture *gesture,
+                       GdkWindow  *parent)
+{
+  GdkWindow *window;
+  GtkWidget *widget;
+
+  widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
+  window = gtk_widget_get_window (widget);
+
+  while (window)
+    {
+      if (window == parent)
+        return TRUE;
+
+      window = gdk_window_get_effective_parent (window);
+    }
+
+  return FALSE;
+}
+
+static gboolean
 gtk_gesture_handle_event (GtkEventController *controller,
                           const GdkEvent     *event)
 {
@@ -544,6 +565,12 @@ gtk_gesture_handle_event (GtkEventController *controller,
     case GDK_TOUCH_CANCEL:
       _gtk_gesture_cancel_sequence (gesture, sequence);
       break;
+    case GDK_GRAB_BROKEN:
+      if (!event->grab_broken.grab_window ||
+          !gesture_within_window (gesture, event->grab_broken.grab_window))
+        _gtk_gesture_cancel_all (gesture);
+
+      return FALSE;
     default:
       /* Unhandled event */
       return FALSE;
diff --git a/gtk/gtkgesturesingle.c b/gtk/gtkgesturesingle.c
index 3e8b9c3..8d8f118 100644
--- a/gtk/gtkgesturesingle.c
+++ b/gtk/gtkgesturesingle.c
@@ -166,6 +166,11 @@ gtk_gesture_single_handle_event (GtkEventController *controller,
         }
 
       break;
+    case GDK_TOUCH_CANCEL:
+    case GDK_GRAB_BROKEN:
+      return GTK_EVENT_CONTROLLER_CLASS (gtk_gesture_single_parent_class)->handle_event (controller,
+                                                                                         event);
+      break;
     default:
       return FALSE;
     }


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