From de30a74cdf43c1fba67d88bae3931a79fef38af1 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 19 Jun 2018 13:17:57 +0200 Subject: [PATCH 1/2] gtkwidget: Avoid doubly coordinate conversion when emulating press We are poking again into the event propagation machinery, which expects events in toplevel coordinates. Since we can't fetch the original event back at this point, translate the coordinates back to the toplevel so the emulated press ends up in the right place. https://gitlab.gnome.org/GNOME/gtk/issues/1159 Closes: #1159 --- gtk/gtkwidget.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 69a5d2219b..8a42c8073e 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -2523,12 +2523,20 @@ _gtk_widget_emulate_press (GtkWidget *widget, { GtkWidget *event_widget, *next_child, *parent; GdkEvent *press; + gdouble x, y; event_widget = gtk_get_event_target ((GdkEvent *) event); if (event_widget == widget) return; + gdk_event_get_coords (event, &x, &y); + gtk_widget_translate_coordinatesf (event_widget, + gtk_widget_get_toplevel (event_widget), + x, y, + &x, &y); + gdk_event_set_coords (event, x, y); + if (event->any.type == GDK_TOUCH_BEGIN || event->any.type == GDK_TOUCH_UPDATE || event->any.type == GDK_TOUCH_END) From 8e3bf65b3bf7d8375105261814c5d80066b8d085 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 19 Jun 2018 13:38:09 +0200 Subject: [PATCH 2/2] gtkgesture: Check claimed status after event delivery The claimed status check should happen after ::end is emitted, as the gesture may deny the sequence that much late. In this case the event should keep propagating. https://gitlab.gnome.org/GNOME/gtk/issues/1159 Closes: #1159 --- gtk/gtkgesture.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gtk/gtkgesture.c b/gtk/gtkgesture.c index c7aeb29988..7276a3043d 100644 --- a/gtk/gtkgesture.c +++ b/gtk/gtkgesture.c @@ -698,9 +698,6 @@ gtk_gesture_handle_event (GtkEventController *controller, { gboolean was_claimed; - was_claimed = - gtk_gesture_get_sequence_state (gesture, sequence) == GTK_EVENT_SEQUENCE_CLAIMED; - if (_gtk_gesture_update_point (gesture, event, FALSE)) { if (was_recognized && @@ -710,6 +707,9 @@ gtk_gesture_handle_event (GtkEventController *controller, _gtk_gesture_remove_point (gesture, event); } + was_claimed = + gtk_gesture_get_sequence_state (gesture, sequence) == GTK_EVENT_SEQUENCE_CLAIMED; + return was_claimed && was_recognized; } else if (event_type == GDK_MOTION_NOTIFY ||