diff options
-rw-r--r-- | gtk/gtkgesture.c | 27 | ||||
-rw-r--r-- | gtk/gtkgesturesingle.c | 5 |
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; } |