The DND setup should take place in the "drag-begin" handler not after the drag is already taking place. This inter alia takes care that the drag icon is displayed instantly when the drag starts and not just some time later. Proposed patch attached. -- Christian Neumair <chris gnome-de org>
Index: src/file-manager/fm-list-view.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-list-view.c,v
retrieving revision 1.256
diff -u -p -r1.256 fm-list-view.c
--- src/file-manager/fm-list-view.c 12 Aug 2005 18:11:30 -0000 1.256
+++ src/file-manager/fm-list-view.c 24 Aug 2005 12:26:54 -0000
@@ -406,6 +419,34 @@ get_drag_pixbuf (FMListView *view)
return ret;
}
+static void
+drag_begin_callback (GtkWidget *widget,
+ GdkDragContext *context,
+ FMListView *view)
+{
+ GList *ref_list;
+ GdkPixbuf *pixbuf;
+
+ pixbuf = get_drag_pixbuf (view);
+ if (pixbuf) {
+ gtk_drag_set_icon_pixbuf (context,
+ pixbuf,
+ 0, 0);
+ g_object_unref (pixbuf);
+ } else {
+ gtk_drag_set_icon_default (context);
+ }
+
+ stop_drag_check (view);
+ view->details->drag_started = TRUE;
+
+ ref_list = get_filtered_selection_refs (GTK_TREE_VIEW (widget));
+ g_object_set_data_full (G_OBJECT (context),
+ "drag-info",
+ ref_list,
+ (GDestroyNotify)ref_list_free);
+}
+
static gboolean
motion_notify_callback (GtkWidget *widget,
GdkEventMotion *event,
@@ -414,8 +455,6 @@ motion_notify_callback (GtkWidget *widge
FMListView *view;
GdkDragContext *context;
GdkCursor *cursor;
- GList *ref_list;
- GdkPixbuf *pixbuf;
GtkTreePath *last_hover_path;
GtkTreeIter iter;
@@ -476,25 +515,6 @@ motion_notify_callback (GtkWidget *widge
GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK | GDK_ACTION_ASK,
view->details->drag_button,
(GdkEvent*)event);
-
- stop_drag_check (view);
- view->details->drag_started = TRUE;
-
- ref_list = get_filtered_selection_refs (GTK_TREE_VIEW (widget));
- g_object_set_data_full (G_OBJECT (context),
- "drag-info",
- ref_list,
- (GDestroyNotify)ref_list_free);
-
- pixbuf = get_drag_pixbuf (view);
- if (pixbuf) {
- gtk_drag_set_icon_pixbuf (context,
- pixbuf,
- 0, 0);
- g_object_unref (pixbuf);
- } else {
- gtk_drag_set_icon_default (context);
- }
}
return TRUE;
}
@@ -1346,6 +1366,8 @@ create_and_set_up_tree_view (FMListView
"changed",
G_CALLBACK (list_selection_changed_callback), view, 0);
+ g_signal_connect_object (view->details->tree_view, "drag_begin",
+ G_CALLBACK (drag_begin_callback), view, 0);
g_signal_connect_object (view->details->tree_view, "drag_data_get",
G_CALLBACK (drag_data_get_callback), view, 0);
g_signal_connect_object (view->details->tree_view, "motion_notify_event",
Attachment:
signature.asc
Description: This is a digitally signed message part