[nautilus/wip/coreyberla/dnd-threshold: 1/2] dnd: Make "change location on hover" a little bit less aggressive




commit 9714aab38c574a76e2482ec1a330c50fc12e8996
Author: Corey Berla <corey berla me>
Date:   Mon Aug 8 12:14:24 2022 -0700

    dnd: Make "change location on hover" a little bit less aggressive
    
    Reset the hover timeout if the x,y passes the GTK drag threshold
    before the HOVER_TIMEOUT.  This makes it less likely that a location
    will occur if the drag is merely happening over an item.  In GTK4
    the cells cover a bigger space so this is even more likely to occur.
    
    Fixes: https://gitlab.gnome.org/GNOME/nautilus/-/issues/1526

 src/gtk/nautilusgtkplacessidebar.c |  8 +++++++-
 src/nautilus-list-base.c           | 22 ++++++++++++++++++++++
 src/nautilus-window-slot-dnd.c     | 11 ++++++++++-
 3 files changed, 39 insertions(+), 2 deletions(-)
---
diff --git a/src/gtk/nautilusgtkplacessidebar.c b/src/gtk/nautilusgtkplacessidebar.c
index 876a587f6..9ba3e0c99 100644
--- a/src/gtk/nautilusgtkplacessidebar.c
+++ b/src/gtk/nautilusgtkplacessidebar.c
@@ -130,6 +130,7 @@ struct _NautilusGtkPlacesSidebar {
   GtkWidget *row_placeholder;
   DropState drop_state;
   guint hover_timer_id;
+  graphene_point_t hover_start_point;
   GtkListBoxRow *hover_row;
 
   /* volume mounting - delayed open process */
@@ -1652,16 +1653,21 @@ drag_motion_callback (GtkDropTarget    *target,
   int row_index;
   int row_placeholder_index;
   const GValue *value;
+  graphene_point_t start;
 
   sidebar->dragging_over = TRUE;
   action = 0;
   row = gtk_list_box_get_row_at_y (GTK_LIST_BOX (sidebar->list_box), y);
 
-  if (row != sidebar->hover_row)
+  start = sidebar->hover_start_point;
+  if (row != sidebar->hover_row ||
+      gtk_drag_check_threshold (GTK_WIDGET (sidebar), start.x, start.y, x, y))
     {
       g_clear_handle_id (&sidebar->hover_timer_id, g_source_remove);
       sidebar->hover_row = row;
       sidebar->hover_timer_id = g_timeout_add (HOVER_TIMEOUT, hover_timer, sidebar);
+      sidebar->hover_start_point.x = x;
+      sidebar->hover_start_point.y = y;
     }
 
   /* Workaround https://gitlab.gnome.org/GNOME/gtk/-/issues/5023 */
diff --git a/src/nautilus-list-base.c b/src/nautilus-list-base.c
index 4bd754b8e..9b283473d 100644
--- a/src/nautilus-list-base.c
+++ b/src/nautilus-list-base.c
@@ -49,6 +49,7 @@ struct _NautilusListBasePrivate
 
     GdkDragAction drag_item_action;
     GdkDragAction drag_view_action;
+    graphene_point_t hover_start_point;
     guint hover_timer_id;
     GtkDropTarget *view_drop_target;
 };
@@ -586,6 +587,26 @@ on_item_drag_hover_leave (GtkDropControllerMotion *controller,
     g_clear_handle_id (&priv->hover_timer_id, g_source_remove);
 }
 
+static void
+on_item_drag_hover_motion (GtkDropControllerMotion *controller,
+                           gdouble                  x,
+                           gdouble                  y,
+                           gpointer                 user_data)
+{
+    NautilusViewCell *cell = user_data;
+    g_autoptr (NautilusListBase) self = nautilus_view_cell_get_view (cell);
+    NautilusListBasePrivate *priv = nautilus_list_base_get_instance_private (self);
+    graphene_point_t start = priv->hover_start_point;
+
+    if (gtk_drag_check_threshold (GTK_WIDGET (cell), start.x, start.y, x, y))
+    {
+        g_clear_handle_id (&priv->hover_timer_id, g_source_remove);
+        priv->hover_timer_id = g_timeout_add (HOVER_TIMEOUT, hover_timer, cell);
+        priv->hover_start_point.x = x;
+        priv->hover_start_point.y = y;
+    }
+}
+
 static GdkDragAction
 get_preferred_action (NautilusFile *target_file,
                       const GValue *value)
@@ -886,6 +907,7 @@ setup_cell_common (GtkListItem      *listitem,
     gtk_widget_add_controller (GTK_WIDGET (cell), controller);
     g_signal_connect (controller, "enter", G_CALLBACK (on_item_drag_hover_enter), cell);
     g_signal_connect (controller, "leave", G_CALLBACK (on_item_drag_hover_leave), cell);
+    g_signal_connect (controller, "motion", G_CALLBACK (on_item_drag_hover_motion), cell);
 }
 
 static void
diff --git a/src/nautilus-window-slot-dnd.c b/src/nautilus-window-slot-dnd.c
index 1c1839737..8645d472d 100644
--- a/src/nautilus-window-slot-dnd.c
+++ b/src/nautilus-window-slot-dnd.c
@@ -35,6 +35,7 @@ typedef struct
     NautilusWindowSlot *target_slot;
     GtkWidget *widget;
 
+    graphene_point_t hover_start_point;
     guint switch_location_timer;
 } NautilusDragSlotProxyInfo;
 
@@ -107,6 +108,7 @@ slot_proxy_drag_motion (GtkDropTarget *target,
     char *target_uri;
     GFile *location;
     const GValue *value;
+    graphene_point_t start;
 
     drag_info = user_data;
 
@@ -170,7 +172,14 @@ slot_proxy_drag_motion (GtkDropTarget *target,
     g_free (target_uri);
 
 out:
-    slot_proxy_check_switch_location_timer (drag_info);
+    start = drag_info->hover_start_point;
+    if (gtk_drag_check_threshold (drag_info->widget, start.x, start.y, x, y))
+    {
+        slot_proxy_remove_switch_location_timer (drag_info);
+        slot_proxy_check_switch_location_timer (drag_info);
+        drag_info->hover_start_point.x = x;
+        drag_info->hover_start_point.y = y;
+    }
 
     return action;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]