From 9fa65eadae5a2b8555e8cfdf214e0c11038625af Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 6 Jun 2020 00:23:04 -0400 Subject: [PATCH] listitemwidget: Don't look at rubberbanding Move the selection changes to button release, to avoid conflict with the drag gesture for rubberbanding. This avoids peeking at the parent, and is generally nicer. Among other things, you can now shift-click to select a range in the colors demo in gtk4-demo. --- gtk/gtklistitemwidget.c | 65 +++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/gtk/gtklistitemwidget.c b/gtk/gtklistitemwidget.c index f700269823..5c57d1b257 100644 --- a/gtk/gtklistitemwidget.c +++ b/gtk/gtklistitemwidget.c @@ -324,8 +324,6 @@ gtk_list_item_widget_click_gesture_pressed (GtkGestureClick *gesture, { GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self); GtkWidget *widget = GTK_WIDGET (self); - GtkWidget * parent = gtk_widget_get_parent (widget); - gboolean rubberband; if (priv->list_item && !priv->list_item->selectable && !priv->list_item->activatable) { @@ -333,29 +331,6 @@ gtk_list_item_widget_click_gesture_pressed (GtkGestureClick *gesture, return; } - if (GTK_IS_LIST_BASE (parent)) - rubberband = gtk_list_base_get_enable_rubberband (GTK_LIST_BASE (parent)); - else - rubberband = FALSE; - - if (!rubberband && (!priv->list_item || priv->list_item->selectable)) - { - GdkModifierType state; - GdkEvent *event; - gboolean extend, modify; - - event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), - gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture))); - state = gdk_event_get_modifier_state (event); - extend = (state & GDK_SHIFT_MASK) != 0; - modify = (state & GDK_CONTROL_MASK) != 0; - - gtk_widget_activate_action (GTK_WIDGET (self), - "list.select-item", - "(ubb)", - priv->position, modify, extend); - } - if (!priv->list_item || priv->list_item->activatable) { if (n_press == 2 || priv->single_click_activate) @@ -373,6 +348,36 @@ gtk_list_item_widget_click_gesture_pressed (GtkGestureClick *gesture, gtk_widget_grab_focus (widget); } +static void +gtk_list_item_widget_click_gesture_released (GtkGestureClick *gesture, + int n_press, + double x, + double y, + GtkListItemWidget *self) +{ + GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self); + + if (!priv->list_item || priv->list_item->selectable) + { + GdkModifierType state; + GdkEvent *event; + gboolean extend, modify; + + event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), + gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture))); + state = gdk_event_get_modifier_state (event); + extend = (state & GDK_SHIFT_MASK) != 0; + modify = (state & GDK_CONTROL_MASK) != 0; + + gtk_widget_activate_action (GTK_WIDGET (self), + "list.select-item", + "(ubb)", + priv->position, modify, extend); + } + + gtk_widget_unset_state_flags (GTK_WIDGET (self), GTK_STATE_FLAG_ACTIVE); +} + static void gtk_list_item_widget_enter_cb (GtkEventControllerFocus *controller, GtkListItemWidget *self) @@ -406,16 +411,6 @@ gtk_list_item_widget_hover_cb (GtkEventControllerMotion *controller, } } -static void -gtk_list_item_widget_click_gesture_released (GtkGestureClick *gesture, - int n_press, - double x, - double y, - GtkListItemWidget *self) -{ - gtk_widget_unset_state_flags (GTK_WIDGET (self), GTK_STATE_FLAG_ACTIVE); -} - static void gtk_list_item_widget_click_gesture_canceled (GtkGestureClick *gesture, GdkEventSequence *sequence,