summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libnautilus-private/nautilus-dnd.c19
-rw-r--r--src/nautilus-notebook.c198
2 files changed, 23 insertions, 194 deletions
diff --git a/libnautilus-private/nautilus-dnd.c b/libnautilus-private/nautilus-dnd.c
index 744f9986a..fe7cbf84c 100644
--- a/libnautilus-private/nautilus-dnd.c
+++ b/libnautilus-private/nautilus-dnd.c
@@ -1003,10 +1003,12 @@ slot_proxy_drag_motion (GtkWidget *widget,
unsigned int time,
gpointer user_data)
{
+ NautilusDragSlotProxyInfo *drag_info;
+ NautilusWindowSlotInfo *target_slot;
+ GtkWidget *window;
GdkAtom target;
int action;
char *target_uri;
- NautilusDragSlotProxyInfo *drag_info;
drag_info = user_data;
@@ -1016,6 +1018,9 @@ slot_proxy_drag_motion (GtkWidget *widget,
goto out;
}
+ window = gtk_widget_get_toplevel (widget);
+ g_assert (NAUTILUS_IS_WINDOW_INFO (window));
+
if (!drag_info->have_data) {
target = gtk_drag_dest_find_target (widget, context, NULL);
gtk_drag_get_data (widget, context, target, time);
@@ -1024,6 +1029,16 @@ slot_proxy_drag_motion (GtkWidget *widget,
target_uri = NULL;
if (drag_info->target_location != NULL) {
target_uri = g_file_get_uri (drag_info->target_location);
+ } else {
+ if (drag_info->target_slot != NULL) {
+ target_slot = drag_info->target_slot;
+ } else {
+ target_slot = nautilus_window_info_get_active_slot (NAUTILUS_WINDOW_INFO (window));
+ }
+
+ if (target_slot != NULL) {
+ target_uri = nautilus_window_slot_info_get_current_location (target_slot);
+ }
}
if (drag_info->have_data &&
@@ -1253,8 +1268,6 @@ nautilus_drag_slot_proxy_init (GtkWidget *widget,
GDK_ACTION_LINK |
GDK_ACTION_ASK);
- gtk_drag_source_add_uri_targets (widget);
-
target_list = gtk_target_list_new (targets, G_N_ELEMENTS (targets));
gtk_target_list_add_uri_targets (target_list, NAUTILUS_ICON_DND_URI_LIST);
gtk_drag_dest_set_target_list (widget, target_list);
diff --git a/src/nautilus-notebook.c b/src/nautilus-notebook.c
index 9f29c97e3..1dabc2d21 100644
--- a/src/nautilus-notebook.c
+++ b/src/nautilus-notebook.c
@@ -243,182 +243,6 @@ button_press_cb (NautilusNotebook *notebook,
}
static void
-notebook_tab_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- int x,
- int y,
- GtkSelectionData *selection_data,
- unsigned int info,
- unsigned int time,
- NautilusWindowSlot *slot)
-{
- NautilusWindow *window;
- NautilusNavigationWindow *navigation_window;
- GtkWidget *notebook;
- GList *uri_list, *selection_list;
- char **uris;
- int i;
-
- g_signal_stop_emission_by_name (widget, "drag_data_received");
-
- if (selection_data->length <= 0 ||
- selection_data->data == NULL) {
- return;
- }
-
- if (slot->window == NULL || slot->content_view == NULL) {
- return;
- }
-
- window = slot->window;
-
- navigation_window = NAUTILUS_NAVIGATION_WINDOW (window);
-
- notebook = navigation_window->notebook;
-
- if (selection_data->target == gdk_atom_intern (NAUTILUS_ICON_DND_URI_LIST_TYPE, FALSE)) {
- uris = gtk_selection_data_get_uris (selection_data);
- } else if (selection_data->target == gdk_atom_intern (NAUTILUS_ICON_DND_GNOME_ICON_LIST_TYPE, FALSE)) {
- selection_list = nautilus_drag_build_selection_list (selection_data);
- if (selection_list == NULL) {
- return;
- }
-
- uris = nautilus_drag_uri_array_from_selection_list (selection_list);
-
- nautilus_drag_destroy_selection_list (selection_list);
- } else {
- return;
- }
-
- if (uris == NULL || uris[0] == NULL) {
- g_strfreev (uris);
- return;
- }
-
- uri_list = NULL;
- for (i = 0; uris[i] != NULL; i++) {
- uri_list = g_list_prepend (uri_list, uris[i]);
- }
- uri_list = g_list_reverse (uri_list);
-
- if (slot->content_view != NULL) {
- nautilus_view_drop_proxy_received_uris (slot->content_view,
- uri_list, NULL,
- context->action);
- }
-
- g_list_free (uri_list);
-
- g_strfreev (uris);
-}
-
-static inline GdkAtom
-find_drop_target (GtkWidget *widget,
- GdkDragContext *context)
-{
- GtkTargetList *target_list;
-
- target_list = gtk_drag_dest_get_target_list (widget);
- if (target_list != NULL) {
- return gtk_drag_dest_find_target (widget, context, target_list);
- }
-
- return GDK_NONE;
-}
-
-static inline GdkDragAction
-get_drop_action (GtkWidget *drop_widget,
- GdkDragContext *context)
-{
- if (!NAUTILUS_IS_NOTEBOOK (drop_widget)) {
- if (context->suggested_action & GDK_ACTION_ASK) {
- return context->suggested_action;
- }
-
- if (context->actions & GDK_ACTION_MOVE) {
- return GDK_ACTION_MOVE;
- }
-
- if (context->actions & GDK_ACTION_COPY) {
- return GDK_ACTION_COPY;
- }
- }
-
- if (context->actions & GDK_ACTION_LINK) {
- return GDK_ACTION_LINK;
- }
-
- return 0;
-}
-
-static gboolean
-notebook_tab_drag_motion (GtkWidget* widget,
- GdkDragContext *context,
- int x,
- int y,
- unsigned int time,
- NautilusWindowSlot *slot)
-{
-
- GdkDragAction action;
- gboolean highlighted;
-
- highlighted = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget),
- "drop-highlight"));
-
- action = 0;
- if (find_drop_target (widget, context) != GDK_NONE) {
- action = get_drop_action (widget, context);
- }
-
- if (action != 0 && !highlighted) {
- gtk_drag_highlight (widget);
- highlighted = TRUE;
- }
-
- gdk_drag_status (context, action, time);
- g_object_set_data (G_OBJECT (widget), "drop-highlight",
- GUINT_TO_POINTER (highlighted));
-
- return TRUE;
-}
-
-static void
-notebook_tab_drag_leave (GtkWidget* widget,
- GdkDragContext *context,
- unsigned int time,
- NautilusWindowSlot *slot)
-{
- gtk_drag_unhighlight (widget);
- g_object_set_data (G_OBJECT (widget), "drop-highlight",
- GUINT_TO_POINTER (FALSE));
-}
-
-
-static gboolean
-notebook_tab_drag_drop (GtkWidget *widget,
- GdkDragContext *context,
- int x,
- int y,
- unsigned int time,
- G_GNUC_UNUSED gpointer user_data)
-{
- GdkAtom target;
-
- target = find_drop_target (widget, context);
- if (target != GDK_NONE) {
- gtk_drag_get_data (widget, context, target, time);
- gtk_drag_finish (context, TRUE, FALSE, time);
- return TRUE;
- } else {
- gtk_drag_finish (context, FALSE, FALSE, time);
- return FALSE;
- }
-}
-
-
-static void
nautilus_notebook_init (NautilusNotebook *notebook)
{
gtk_notebook_set_scrollable (GTK_NOTEBOOK (notebook), TRUE);
@@ -543,6 +367,7 @@ tab_label_style_set_cb (GtkWidget *hbox,
static GtkWidget *
build_tab_label (NautilusNotebook *nb, NautilusWindowSlot *slot)
{
+ NautilusDragSlotProxyInfo *drag_info;
GtkWidget *hbox, *label, *close_button, *image, *spinner, *icon;
/* set hbox spacing and label padding (see below) so that there's an
@@ -593,21 +418,12 @@ build_tab_label (NautilusNotebook *nb, NautilusWindowSlot *slot)
g_signal_connect (hbox, "style-set",
G_CALLBACK (tab_label_style_set_cb), NULL);
- /* Set up drag-and-drop target */
- g_signal_connect_object (hbox, "drag-data-received",
- G_CALLBACK (notebook_tab_drag_data_received), slot, 0);
- g_signal_connect_object (hbox, "drag-motion",
- G_CALLBACK (notebook_tab_drag_motion), slot, 0);
- g_signal_connect_object (hbox, "drag-leave",
- G_CALLBACK (notebook_tab_drag_leave), slot, 0);
- g_signal_connect_object (hbox, "drag-drop",
- G_CALLBACK (notebook_tab_drag_drop), slot, 0);
-
- gtk_drag_dest_set (hbox, 0,
- url_drag_types, G_N_ELEMENTS (url_drag_types),
- GDK_ACTION_MOVE | GDK_ACTION_COPY |
- GDK_ACTION_LINK | GDK_ACTION_ASK);
- gtk_drag_dest_set_track_motion (hbox, TRUE);
+ drag_info = g_new0 (NautilusDragSlotProxyInfo, 1);
+ drag_info->target_slot = slot;
+ g_object_set_data_full (G_OBJECT (hbox), "proxy-drag-info",
+ drag_info, (GDestroyNotify) g_free);
+
+ nautilus_drag_slot_proxy_init (hbox, drag_info);
g_object_set_data (G_OBJECT (hbox), "label", label);
g_object_set_data (G_OBJECT (hbox), "spinner", spinner);