From 4d2b39d98c3f392782e0ae205dfb50cbc1052b3d Mon Sep 17 00:00:00 2001 From: Ernestas Kulik Date: Tue, 29 May 2018 14:43:06 +0300 Subject: [PATCH] =?utf8?q?gesturemultipress:=20Don=E2=80=99t=20fire=20::re?= =?utf8?q?leased=20after=20::cancel?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Causing a grab in the handler for ::pressed by, e.g., popping up a context menu will cause the gesture to be canceled and, subsequently, ::end and ::released to be fired, all while the button is still physically pressed. That results in no event being available to the ::released handler and garbage coordinates, given that gtk_gesture_get_point() returns FALSE. Emitting ::released can be avoided by checking the return value gtk_gesture_get_point(). --- gtk/gtkgesturemultipress.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gtk/gtkgesturemultipress.c b/gtk/gtkgesturemultipress.c index db654036e5..d6dc115d5f 100644 --- a/gtk/gtkgesturemultipress.c +++ b/gtk/gtkgesturemultipress.c @@ -274,13 +274,16 @@ gtk_gesture_multi_press_end (GtkGesture *gesture, GtkGestureMultiPressPrivate *priv; GdkEventSequence *current; gdouble x, y; + gboolean interpreted; + GtkEventSequenceState state; multi_press = GTK_GESTURE_MULTI_PRESS (gesture); priv = gtk_gesture_multi_press_get_instance_private (multi_press); current = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); - gtk_gesture_get_point (gesture, current, &x, &y); + interpreted = gtk_gesture_get_point (gesture, current, &x, &y); + state = gtk_gesture_get_sequence_state (gesture, current); - if (gtk_gesture_get_sequence_state (gesture, current) != GTK_EVENT_SEQUENCE_DENIED) + if (state != GTK_EVENT_SEQUENCE_DENIED && interpreted) g_signal_emit (gesture, signals[RELEASED], 0, priv->n_release, x, y); priv->n_release = 0; -- 2.30.2