gtkbutton: Check release coordinates on all release event types

The priv->in_button state that used to be relied upon for pointer
events has been reduced over time to a broken state, since the button
does not track crossing events anymore.

Make the coordinate-based checks apply for pointer events too, besides
touch events. This fixes GtkButton mistakenly emitting ::clicked with
pointer button releases outside the widget.

Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/3121
This commit is contained in:
Carlos Garnacho
2020-09-25 19:10:46 +02:00
parent 0ccdbfd802
commit ea6e575901

View File

@@ -336,28 +336,6 @@ click_pressed_cb (GtkGestureClick *gesture,
priv->button_down = TRUE;
}
static gboolean
touch_release_in_button (GtkGestureClick *gesture,
GtkWidget *widget,
double x,
double y)
{
GdkEvent *event;
event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (gesture));
if (!event)
return FALSE;
if (gdk_event_get_event_type (event) != GDK_TOUCH_END)
return FALSE;
if (!gtk_widget_contains (widget, x, y))
return FALSE;
return TRUE;
}
static void
click_released_cb (GtkGestureClick *gesture,
guint n_press,
@@ -366,14 +344,12 @@ click_released_cb (GtkGestureClick *gesture,
GtkWidget *widget)
{
GtkButton *button = GTK_BUTTON (widget);
GtkButtonPrivate *priv = gtk_button_get_instance_private (button);
GdkEventSequence *sequence;
gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
gtk_button_do_release (button,
gtk_widget_is_sensitive (GTK_WIDGET (button)) &&
(priv->in_button ||
touch_release_in_button (gesture, widget, x, y)));
gtk_widget_contains (widget, x, y));
sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));