Merge branch 'wip/antoniof/listbase-rubberband-better-fix' into 'main'

listbase: Cancel rubberband if not handling drag

See merge request GNOME/gtk!4831
This commit is contained in:
Benjamin Otte 2022-12-21 01:14:57 +00:00
commit ae097d9674

View File

@ -1572,25 +1572,16 @@ gtk_list_base_start_rubberband (GtkListBase *self,
}
static void
gtk_list_base_stop_rubberband (GtkListBase *self,
gboolean modify,
gboolean extend)
gtk_list_base_apply_rubberband_selection (GtkListBase *self,
gboolean modify,
gboolean extend)
{
GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self);
GtkListItemManagerItem *item;
GtkSelectionModel *model;
if (!priv->rubberband)
return;
for (item = gtk_list_item_manager_get_first (priv->item_manager);
item != NULL;
item = gtk_rb_tree_node_get_next (item))
{
if (item->widget)
gtk_widget_unset_state_flags (item->widget, GTK_STATE_FLAG_ACTIVE);
}
model = gtk_list_item_manager_get_model (priv->item_manager);
if (model != NULL)
{
@ -1651,6 +1642,24 @@ gtk_list_base_stop_rubberband (GtkListBase *self,
gtk_bitset_unref (mask);
gtk_bitset_unref (rubberband_selection);
}
}
static void
gtk_list_base_stop_rubberband (GtkListBase *self)
{
GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self);
GtkListItemManagerItem *item;
if (!priv->rubberband)
return;
for (item = gtk_list_item_manager_get_first (priv->item_manager);
item != NULL;
item = gtk_rb_tree_node_get_next (item))
{
if (item->widget)
gtk_widget_unset_state_flags (item->widget, GTK_STATE_FLAG_ACTIVE);
}
gtk_list_item_tracker_free (priv->item_manager, priv->rubberband->start_tracker);
g_clear_pointer (&priv->rubberband->widget, gtk_widget_unparent);
@ -1763,14 +1772,23 @@ gtk_list_base_drag_end (GtkGestureDrag *gesture,
GtkListBase *self)
{
GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self);
GdkEventSequence *sequence;
gboolean modify, extend;
if (!priv->rubberband)
return;
sequence = gtk_gesture_get_last_updated_sequence (GTK_GESTURE (gesture));
if (!gtk_gesture_handles_sequence (GTK_GESTURE (gesture), sequence))
{
gtk_list_base_stop_rubberband (self);
return;
}
gtk_list_base_drag_update (gesture, offset_x, offset_y, self);
get_selection_modifiers (GTK_GESTURE (gesture), &modify, &extend);
gtk_list_base_stop_rubberband (self, modify, extend);
gtk_list_base_apply_rubberband_selection (self, modify, extend);
gtk_list_base_stop_rubberband (self);
}
void