diff options
-rw-r--r-- | src/nautilus-list-view-dnd.c | 24 | ||||
-rw-r--r-- | src/nautilus-list-view-dnd.h | 6 | ||||
-rw-r--r-- | src/nautilus-list-view-private.h | 1 | ||||
-rw-r--r-- | src/nautilus-list-view.c | 41 |
4 files changed, 51 insertions, 21 deletions
diff --git a/src/nautilus-list-view-dnd.c b/src/nautilus-list-view-dnd.c index 96dc4bc4f..21910060f 100644 --- a/src/nautilus-list-view-dnd.c +++ b/src/nautilus-list-view-dnd.c @@ -268,16 +268,15 @@ nautilus_list_view_dnd_init (NautilusListView *list_view) G_CALLBACK (drag_data_get_callback), list_view, 0); } -gboolean +void nautilus_list_view_dnd_drag_begin (NautilusListView *list_view, - GdkEvent *event) + gdouble offset_x, + gdouble offset_y, + const GdkEvent *event) { - gdouble x; - gdouble y; - if (list_view->details->drag_button == 0) { - return GDK_EVENT_PROPAGATE; + return; } if (!source_target_list) @@ -285,16 +284,11 @@ nautilus_list_view_dnd_drag_begin (NautilusListView *list_view, source_target_list = nautilus_list_model_get_drag_target_list (); } - if (G_UNLIKELY (!gdk_event_get_coords (event, &x, &y))) - { - g_return_val_if_reached (GDK_EVENT_PROPAGATE); - } - if (gtk_drag_check_threshold (GTK_WIDGET (list_view->details->tree_view), list_view->details->drag_x, list_view->details->drag_y, - x, - y)) + list_view->details->drag_x + offset_x, + list_view->details->drag_y + offset_y)) { guint32 actions; @@ -304,10 +298,8 @@ nautilus_list_view_dnd_drag_begin (NautilusListView *list_view, source_target_list, actions, list_view->details->drag_button, - event, + (GdkEvent *) event, -1, -1); } - - return GDK_EVENT_STOP; } diff --git a/src/nautilus-list-view-dnd.h b/src/nautilus-list-view-dnd.h index cbde06c41..03e102ed3 100644 --- a/src/nautilus-list-view-dnd.h +++ b/src/nautilus-list-view-dnd.h @@ -25,8 +25,10 @@ #include "nautilus-dnd.h" void nautilus_list_view_dnd_init (NautilusListView *list_view); -gboolean nautilus_list_view_dnd_drag_begin (NautilusListView *list_view, - GdkEvent *event); +void nautilus_list_view_dnd_drag_begin (NautilusListView *list_view, + gdouble offset_x, + gdouble offset_y, + const GdkEvent *event); NautilusDragInfo * nautilus_list_view_dnd_get_drag_source_data (NautilusListView *list_view, GdkDragContext *context); diff --git a/src/nautilus-list-view-private.h b/src/nautilus-list-view-private.h index 8dc831d82..132534289 100644 --- a/src/nautilus-list-view-private.h +++ b/src/nautilus-list-view-private.h @@ -73,6 +73,7 @@ struct NautilusListViewDetails { NautilusTagManager *tag_manager; GCancellable *starred_cancellable; + GtkGesture *tree_view_drag_gesture; GtkGesture *tree_view_multi_press_gesture; }; diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c index 38ae37d91..163afb0a0 100644 --- a/src/nautilus-list-view.c +++ b/src/nautilus-list-view.c @@ -364,9 +364,7 @@ on_motion_notify (GtkWidget *widget, } } - nautilus_list_view_dnd_init (view); - - return nautilus_list_view_dnd_drag_begin (view, event); + return GDK_EVENT_PROPAGATE; } static gboolean @@ -2101,6 +2099,32 @@ on_longpress_gesture_pressed_event (GtkGestureLongPress *gesture, } static void +on_tree_view_drag_gesture_drag_begin (GtkGestureDrag *gesture, + gdouble start_x, + gdouble start_y, + gpointer user_data) +{ + nautilus_list_view_dnd_init (NAUTILUS_LIST_VIEW (user_data)); +} + +static void +on_tree_view_drag_gesture_drag_update (GtkGestureDrag *gesture, + gdouble offset_x, + gdouble offset_y, + gpointer user_data) +{ + GdkEventSequence *sequence; + const GdkEvent *event; + NautilusListView *list_view; + + sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); + event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence); + list_view = NAUTILUS_LIST_VIEW (user_data); + + nautilus_list_view_dnd_drag_begin (list_view, offset_x, offset_y, event); +} + +static void create_and_set_up_tree_view (NautilusListView *view) { GtkCellRenderer *cell; @@ -2148,6 +2172,16 @@ create_and_set_up_tree_view (NautilusListView *view) "changed", G_CALLBACK (list_selection_changed_callback), view, 0); + view->details->tree_view_drag_gesture = gtk_gesture_drag_new (GTK_WIDGET (view->details->tree_view)); + + gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (view->details->tree_view_drag_gesture), + GTK_PHASE_CAPTURE); + gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (view->details->tree_view_drag_gesture), 0); + + g_signal_connect (view->details->tree_view_drag_gesture, "drag-begin", + G_CALLBACK (on_tree_view_drag_gesture_drag_begin), view); + g_signal_connect (view->details->tree_view_drag_gesture, "drag-update", + G_CALLBACK (on_tree_view_drag_gesture_drag_update), view); view->details->tree_view_multi_press_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (view->details->tree_view)); @@ -3641,6 +3675,7 @@ nautilus_list_view_dispose (GObject *object) default_column_order_changed_callback, list_view); + g_clear_object (&list_view->details->tree_view_drag_gesture); g_clear_object (&list_view->details->tree_view_multi_press_gesture); G_OBJECT_CLASS (nautilus_list_view_parent_class)->dispose (object); |