summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErnestas Kulik <ernestask@gnome.org>2018-05-28 12:53:53 +0300
committerErnestas Kulik <ernestask@gnome.org>2018-05-31 13:35:19 +0300
commite8c6e544c787748c5ca1230c86f23328891bc6b6 (patch)
tree00b573684ede8b04de0939114e3c90b6ea26d2c8
parent4f2c3119118ebefae0cd47cd025bc39e6cac73be (diff)
downloadnautilus-e8c6e544c787748c5ca1230c86f23328891bc6b6.tar.gz
list-view: Perform DnD using gesture
Since claiming the event sequence in the button press handler makes the ::motion-notify-event not fire, there is not much choice.
-rw-r--r--src/nautilus-list-view-dnd.c24
-rw-r--r--src/nautilus-list-view-dnd.h6
-rw-r--r--src/nautilus-list-view-private.h1
-rw-r--r--src/nautilus-list-view.c41
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);