summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtkgesture.c27
-rw-r--r--gtk/gtkgesturesingle.c5
2 files changed, 32 insertions, 0 deletions
diff --git a/gtk/gtkgesture.c b/gtk/gtkgesture.c
index e738e61c1c..9689f55a54 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 3e8b9c3ec6..8d8f1188bd 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;
}