[gtk+/gestures: 150/173] gesture: Handle GdkEventGrabBroken
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gestures: 150/173] gesture: Handle GdkEventGrabBroken
- Date: Fri, 16 May 2014 17:12:59 +0000 (UTC)
commit b0d522c039ddd1875fbb2742ea8c21e4eb117f72
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]