diff options
author | Ernestas Kulik <ernestask@gnome.org> | 2018-05-29 14:43:06 +0300 |
---|---|---|
committer | Ernestas Kulik <ernestask@gnome.org> | 2018-05-29 19:09:28 +0300 |
commit | 4d2b39d98c3f392782e0ae205dfb50cbc1052b3d (patch) | |
tree | 652210b3cdb5dedf416726cd6bb7494f7e703ee6 | |
parent | e9765c0405e0c83585eb2c13c09ddeba12faa599 (diff) | |
download | gtk+-4d2b39d98c3f392782e0ae205dfb50cbc1052b3d.tar.gz |
gesturemultipress: Don’t fire ::released after ::cancel
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().
-rw-r--r-- | gtk/gtkgesturemultipress.c | 7 |
1 files 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; |