Merge branch 'wip/antoniof/listbase-rubberband-better-fix' into 'main'
authorBenjamin Otte <otte.benjamin@googlemail.com>
Wed, 21 Dec 2022 01:14:57 +0000 (01:14 +0000)
committerBenjamin Otte <otte.benjamin@googlemail.com>
Wed, 21 Dec 2022 01:19:15 +0000 (20:19 -0500)
listbase: Cancel rubberband if not handling drag

See merge request GNOME/gtk!4831

(cherry picked from commit ae097d9674177ea4d91d67c170f27fda8b337a1d)

efbd2289 listbase: Cancel rubberband if not handling drag

gtk/gtklistbase.c

index 1571be69c72592435c0e8d88db0bcf63832403dc..d77088481ab2b6113497a5548d7daff494140ec3 100644 (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