diff options
Diffstat (limited to 'src/nautilus-window-slot-dnd.c')
-rw-r--r-- | src/nautilus-window-slot-dnd.c | 809 |
1 files changed, 442 insertions, 367 deletions
diff --git a/src/nautilus-window-slot-dnd.c b/src/nautilus-window-slot-dnd.c index 335cfe005..fbf6c40eb 100644 --- a/src/nautilus-window-slot-dnd.c +++ b/src/nautilus-window-slot-dnd.c @@ -20,7 +20,7 @@ * see <http://www.gnu.org/licenses/>. * * Authors: Pavel Cisler <pavel@eazel.com>, - * Ettore Perazzoli <ettore@gnu.org> + * Ettore Perazzoli <ettore@gnu.org> */ #include <config.h> @@ -30,48 +30,51 @@ #include "nautilus-files-view-dnd.h" #include "nautilus-window-slot-dnd.h" -typedef struct { - gboolean have_data; - gboolean have_valid_data; - - gboolean drop_occured; - - unsigned int info; - union { - GList *selection_list; - GList *uri_list; - char *netscape_url; - GtkSelectionData *selection_data; - } data; +typedef struct +{ + gboolean have_data; + gboolean have_valid_data; - NautilusFile *target_file; - NautilusWindowSlot *target_slot; - GtkWidget *widget; + gboolean drop_occured; - gboolean is_notebook; - guint switch_location_timer; + unsigned int info; + union + { + GList *selection_list; + GList *uri_list; + char *netscape_url; + GtkSelectionData *selection_data; + } data; + + NautilusFile *target_file; + NautilusWindowSlot *target_slot; + GtkWidget *widget; + + gboolean is_notebook; + guint switch_location_timer; } NautilusDragSlotProxyInfo; static void switch_tab (NautilusDragSlotProxyInfo *drag_info) { - GtkWidget *notebook, *slot; - gint idx, n_pages; + GtkWidget *notebook, *slot; + gint idx, n_pages; - if (drag_info->target_slot == NULL) { - return; - } + if (drag_info->target_slot == NULL) + { + return; + } - notebook = gtk_widget_get_ancestor (GTK_WIDGET (drag_info->target_slot), NAUTILUS_TYPE_NOTEBOOK); - n_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)); + notebook = gtk_widget_get_ancestor (GTK_WIDGET (drag_info->target_slot), NAUTILUS_TYPE_NOTEBOOK); + n_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)); - for (idx = 0; idx < n_pages; idx++) + for (idx = 0; idx < n_pages; idx++) { - slot = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), idx); - if (NAUTILUS_WINDOW_SLOT (slot) == drag_info->target_slot) + slot = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), idx); + if (NAUTILUS_WINDOW_SLOT (slot) == drag_info->target_slot) { - gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), idx); - break; + gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), idx); + break; } } } @@ -79,437 +82,509 @@ switch_tab (NautilusDragSlotProxyInfo *drag_info) static void switch_location (NautilusDragSlotProxyInfo *drag_info) { - GFile *location; - GtkWidget *window; + GFile *location; + GtkWidget *window; - if (drag_info->target_file == NULL) { - return; - } + if (drag_info->target_file == NULL) + { + return; + } - window = gtk_widget_get_toplevel (drag_info->widget); - g_assert (NAUTILUS_IS_WINDOW (window)); + window = gtk_widget_get_toplevel (drag_info->widget); + g_assert (NAUTILUS_IS_WINDOW (window)); - location = nautilus_file_get_location (drag_info->target_file); - nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()), - location, NAUTILUS_WINDOW_OPEN_FLAG_DONT_MAKE_ACTIVE, - NULL, NAUTILUS_WINDOW (window), NULL); - g_object_unref (location); + location = nautilus_file_get_location (drag_info->target_file); + nautilus_application_open_location_full (NAUTILUS_APPLICATION (g_application_get_default ()), + location, NAUTILUS_WINDOW_OPEN_FLAG_DONT_MAKE_ACTIVE, + NULL, NAUTILUS_WINDOW (window), NULL); + g_object_unref (location); } static gboolean slot_proxy_switch_location_timer (gpointer user_data) { - NautilusDragSlotProxyInfo *drag_info = user_data; + NautilusDragSlotProxyInfo *drag_info = user_data; - drag_info->switch_location_timer = 0; + drag_info->switch_location_timer = 0; - if (drag_info->is_notebook) - switch_tab (drag_info); - else - switch_location (drag_info); + if (drag_info->is_notebook) + { + switch_tab (drag_info); + } + else + { + switch_location (drag_info); + } - return FALSE; + return FALSE; } static void slot_proxy_check_switch_location_timer (NautilusDragSlotProxyInfo *drag_info, - GtkWidget *widget) + GtkWidget *widget) { - GtkSettings *settings; - guint timeout; + GtkSettings *settings; + guint timeout; - if (drag_info->switch_location_timer) - return; + if (drag_info->switch_location_timer) + { + return; + } - settings = gtk_widget_get_settings (widget); - g_object_get (settings, "gtk-timeout-expand", &timeout, NULL); + settings = gtk_widget_get_settings (widget); + g_object_get (settings, "gtk-timeout-expand", &timeout, NULL); - drag_info->switch_location_timer = - gdk_threads_add_timeout (timeout, - slot_proxy_switch_location_timer, - drag_info); + drag_info->switch_location_timer = + gdk_threads_add_timeout (timeout, + slot_proxy_switch_location_timer, + drag_info); } static void slot_proxy_remove_switch_location_timer (NautilusDragSlotProxyInfo *drag_info) { - if (drag_info->switch_location_timer != 0) + if (drag_info->switch_location_timer != 0) { - g_source_remove (drag_info->switch_location_timer); - drag_info->switch_location_timer = 0; + g_source_remove (drag_info->switch_location_timer); + drag_info->switch_location_timer = 0; } } static gboolean -slot_proxy_drag_motion (GtkWidget *widget, - GdkDragContext *context, - int x, - int y, - unsigned int time, - gpointer user_data) +slot_proxy_drag_motion (GtkWidget *widget, + GdkDragContext *context, + int x, + int y, + unsigned int time, + gpointer user_data) { - NautilusDragSlotProxyInfo *drag_info; - NautilusWindowSlot *target_slot; - GtkWidget *window; - GdkAtom target; - int action; - char *target_uri; - GFile *location; - gboolean valid_text_drag; - gboolean valid_xds_drag; - - drag_info = user_data; - - action = 0; - valid_text_drag = FALSE; - valid_xds_drag = FALSE; - - if (gtk_drag_get_source_widget (context) == widget) { - goto out; - } - - window = gtk_widget_get_toplevel (widget); - g_assert (NAUTILUS_IS_WINDOW (window)); - - if (!drag_info->have_data) { - target = gtk_drag_dest_find_target (widget, context, NULL); + NautilusDragSlotProxyInfo *drag_info; + NautilusWindowSlot *target_slot; + GtkWidget *window; + GdkAtom target; + int action; + char *target_uri; + GFile *location; + gboolean valid_text_drag; + gboolean valid_xds_drag; + + drag_info = user_data; + + action = 0; + valid_text_drag = FALSE; + valid_xds_drag = FALSE; + + if (gtk_drag_get_source_widget (context) == widget) + { + goto out; + } - if (target == GDK_NONE) { - goto out; + window = gtk_widget_get_toplevel (widget); + g_assert (NAUTILUS_IS_WINDOW (window)); + + if (!drag_info->have_data) + { + target = gtk_drag_dest_find_target (widget, context, NULL); + + if (target == GDK_NONE) + { + goto out; + } + + gtk_drag_get_data (widget, context, target, time); } - gtk_drag_get_data (widget, context, target, time); - } + target_uri = NULL; + if (drag_info->target_file != NULL) + { + target_uri = nautilus_file_get_uri (drag_info->target_file); + } + else + { + if (drag_info->target_slot != NULL) + { + target_slot = drag_info->target_slot; + } + else + { + target_slot = nautilus_window_get_active_slot (NAUTILUS_WINDOW (window)); + } - target_uri = NULL; - if (drag_info->target_file != NULL) { - target_uri = nautilus_file_get_uri (drag_info->target_file); - } else { - if (drag_info->target_slot != NULL) { - target_slot = drag_info->target_slot; - } else { - target_slot = nautilus_window_get_active_slot (NAUTILUS_WINDOW (window)); + if (target_slot != NULL) + { + location = nautilus_window_slot_get_location (target_slot); + target_uri = g_file_get_uri (location); + } } - if (target_slot != NULL) { - location = nautilus_window_slot_get_location (target_slot); - target_uri = g_file_get_uri (location); + if (target_uri != NULL) + { + NautilusFile *file; + gboolean can; + file = nautilus_file_get_existing_by_uri (target_uri); + can = nautilus_file_can_write (file); + g_object_unref (file); + if (!can) + { + action = 0; + goto out; + } + } + + if (drag_info->have_data && + drag_info->have_valid_data) + { + if (drag_info->info == NAUTILUS_ICON_DND_GNOME_ICON_LIST) + { + nautilus_drag_default_drop_action_for_icons (context, target_uri, + drag_info->data.selection_list, + 0, + &action); + } + else if (drag_info->info == NAUTILUS_ICON_DND_URI_LIST) + { + action = nautilus_drag_default_drop_action_for_uri_list (context, target_uri); + } + else if (drag_info->info == NAUTILUS_ICON_DND_NETSCAPE_URL) + { + action = nautilus_drag_default_drop_action_for_netscape_url (context); + } + else if (drag_info->info == NAUTILUS_ICON_DND_TEXT) + { + valid_text_drag = TRUE; + } + else if (drag_info->info == NAUTILUS_ICON_DND_XDNDDIRECTSAVE || + drag_info->info == NAUTILUS_ICON_DND_RAW) + { + valid_xds_drag = TRUE; + } } - } - - if (target_uri != NULL) { - NautilusFile *file; - gboolean can; - file = nautilus_file_get_existing_by_uri (target_uri); - can = nautilus_file_can_write (file); - g_object_unref (file); - if (!can) { - action = 0; - goto out; - } - } - - if (drag_info->have_data && - drag_info->have_valid_data) { - if (drag_info->info == NAUTILUS_ICON_DND_GNOME_ICON_LIST) { - nautilus_drag_default_drop_action_for_icons (context, target_uri, - drag_info->data.selection_list, - 0, - &action); - } else if (drag_info->info == NAUTILUS_ICON_DND_URI_LIST) { - action = nautilus_drag_default_drop_action_for_uri_list (context, target_uri); - } else if (drag_info->info == NAUTILUS_ICON_DND_NETSCAPE_URL) { - action = nautilus_drag_default_drop_action_for_netscape_url (context); - } else if (drag_info->info == NAUTILUS_ICON_DND_TEXT) { - valid_text_drag = TRUE; - } else if (drag_info->info == NAUTILUS_ICON_DND_XDNDDIRECTSAVE || - drag_info->info == NAUTILUS_ICON_DND_RAW) { - valid_xds_drag = TRUE; - } - } - - g_free (target_uri); - - out: - if (action != 0 || valid_text_drag || valid_xds_drag) { - gtk_drag_highlight (widget); - slot_proxy_check_switch_location_timer (drag_info, widget); - } else { - gtk_drag_unhighlight (widget); - slot_proxy_remove_switch_location_timer (drag_info); - } - gdk_drag_status (context, action, time); + g_free (target_uri); - return TRUE; +out: + if (action != 0 || valid_text_drag || valid_xds_drag) + { + gtk_drag_highlight (widget); + slot_proxy_check_switch_location_timer (drag_info, widget); + } + else + { + gtk_drag_unhighlight (widget); + slot_proxy_remove_switch_location_timer (drag_info); + } + + gdk_drag_status (context, action, time); + + return TRUE; } static void drag_info_free (gpointer user_data) { - NautilusDragSlotProxyInfo *drag_info = user_data; + NautilusDragSlotProxyInfo *drag_info = user_data; - g_clear_object (&drag_info->target_file); - g_clear_object (&drag_info->target_slot); + g_clear_object (&drag_info->target_file); + g_clear_object (&drag_info->target_slot); - g_slice_free (NautilusDragSlotProxyInfo, drag_info); + g_slice_free (NautilusDragSlotProxyInfo, drag_info); } static void drag_info_clear (NautilusDragSlotProxyInfo *drag_info) { - slot_proxy_remove_switch_location_timer (drag_info); - - if (!drag_info->have_data) { - goto out; - } - - if (drag_info->info == NAUTILUS_ICON_DND_GNOME_ICON_LIST) { - nautilus_drag_destroy_selection_list (drag_info->data.selection_list); - } else if (drag_info->info == NAUTILUS_ICON_DND_URI_LIST) { - g_list_free (drag_info->data.uri_list); - } else if (drag_info->info == NAUTILUS_ICON_DND_NETSCAPE_URL) { - g_free (drag_info->data.netscape_url); - } else if (drag_info->info == NAUTILUS_ICON_DND_TEXT || + slot_proxy_remove_switch_location_timer (drag_info); + + if (!drag_info->have_data) + { + goto out; + } + + if (drag_info->info == NAUTILUS_ICON_DND_GNOME_ICON_LIST) + { + nautilus_drag_destroy_selection_list (drag_info->data.selection_list); + } + else if (drag_info->info == NAUTILUS_ICON_DND_URI_LIST) + { + g_list_free (drag_info->data.uri_list); + } + else if (drag_info->info == NAUTILUS_ICON_DND_NETSCAPE_URL) + { + g_free (drag_info->data.netscape_url); + } + else if (drag_info->info == NAUTILUS_ICON_DND_TEXT || drag_info->info == NAUTILUS_ICON_DND_XDNDDIRECTSAVE || - drag_info->info == NAUTILUS_ICON_DND_RAW) { - if (drag_info->data.selection_data != NULL) { - gtk_selection_data_free (drag_info->data.selection_data); + drag_info->info == NAUTILUS_ICON_DND_RAW) + { + if (drag_info->data.selection_data != NULL) + { + gtk_selection_data_free (drag_info->data.selection_data); + } } - } - out: - drag_info->have_data = FALSE; - drag_info->have_valid_data = FALSE; +out: + drag_info->have_data = FALSE; + drag_info->have_valid_data = FALSE; - drag_info->drop_occured = FALSE; + drag_info->drop_occured = FALSE; } static void -slot_proxy_drag_leave (GtkWidget *widget, - GdkDragContext *context, - unsigned int time, - gpointer user_data) +slot_proxy_drag_leave (GtkWidget *widget, + GdkDragContext *context, + unsigned int time, + gpointer user_data) { - NautilusDragSlotProxyInfo *drag_info; + NautilusDragSlotProxyInfo *drag_info; - drag_info = user_data; + drag_info = user_data; - gtk_drag_unhighlight (widget); - drag_info_clear (drag_info); + gtk_drag_unhighlight (widget); + drag_info_clear (drag_info); } static gboolean -slot_proxy_drag_drop (GtkWidget *widget, - GdkDragContext *context, - int x, - int y, - unsigned int time, - gpointer user_data) +slot_proxy_drag_drop (GtkWidget *widget, + GdkDragContext *context, + int x, + int y, + unsigned int time, + gpointer user_data) { - GdkAtom target; - NautilusDragSlotProxyInfo *drag_info; + GdkAtom target; + NautilusDragSlotProxyInfo *drag_info; - drag_info = user_data; - g_assert (!drag_info->have_data); + drag_info = user_data; + g_assert (!drag_info->have_data); - drag_info->drop_occured = TRUE; + drag_info->drop_occured = TRUE; - target = gtk_drag_dest_find_target (widget, context, NULL); - gtk_drag_get_data (widget, context, target, time); + target = gtk_drag_dest_find_target (widget, context, NULL); + gtk_drag_get_data (widget, context, target, time); - return TRUE; + return TRUE; } static void -slot_proxy_handle_drop (GtkWidget *widget, - GdkDragContext *context, - unsigned int time, - NautilusDragSlotProxyInfo *drag_info) +slot_proxy_handle_drop (GtkWidget *widget, + GdkDragContext *context, + unsigned int time, + NautilusDragSlotProxyInfo *drag_info) { - GtkWidget *window; - NautilusWindowSlot *target_slot; - NautilusFilesView *target_view; - char *target_uri; - GList *uri_list; - GFile *location; - - if (!drag_info->have_data || - !drag_info->have_valid_data) { - gtk_drag_finish (context, FALSE, FALSE, time); - drag_info_clear (drag_info); - return; - } - - window = gtk_widget_get_toplevel (widget); - g_assert (NAUTILUS_IS_WINDOW (window)); - - if (drag_info->target_slot != NULL) { - target_slot = drag_info->target_slot; - } else { - target_slot = nautilus_window_get_active_slot (NAUTILUS_WINDOW (window)); - } - - target_uri = NULL; - if (drag_info->target_file != NULL) { - target_uri = nautilus_file_get_uri (drag_info->target_file); - } else if (target_slot != NULL) { - location = nautilus_window_slot_get_location (target_slot); - target_uri = g_file_get_uri (location); - } - - target_view = NULL; - if (target_slot != NULL) { + GtkWidget *window; + NautilusWindowSlot *target_slot; + NautilusFilesView *target_view; + char *target_uri; + GList *uri_list; + GFile *location; + + if (!drag_info->have_data || + !drag_info->have_valid_data) + { + gtk_drag_finish (context, FALSE, FALSE, time); + drag_info_clear (drag_info); + return; + } + + window = gtk_widget_get_toplevel (widget); + g_assert (NAUTILUS_IS_WINDOW (window)); + + if (drag_info->target_slot != NULL) + { + target_slot = drag_info->target_slot; + } + else + { + target_slot = nautilus_window_get_active_slot (NAUTILUS_WINDOW (window)); + } + + target_uri = NULL; + if (drag_info->target_file != NULL) + { + target_uri = nautilus_file_get_uri (drag_info->target_file); + } + else if (target_slot != NULL) + { + location = nautilus_window_slot_get_location (target_slot); + target_uri = g_file_get_uri (location); + } + + target_view = NULL; + if (target_slot != NULL) + { NautilusView *view; view = nautilus_window_slot_get_current_view (target_slot); - if (view && NAUTILUS_IS_FILES_VIEW (view)) { - target_view = NAUTILUS_FILES_VIEW (view); + if (view && NAUTILUS_IS_FILES_VIEW (view)) + { + target_view = NAUTILUS_FILES_VIEW (view); + } + } + + if (target_slot != NULL && target_view != NULL) + { + if (drag_info->info == NAUTILUS_ICON_DND_GNOME_ICON_LIST) + { + uri_list = nautilus_drag_uri_list_from_selection_list (drag_info->data.selection_list); + g_assert (uri_list != NULL); + + nautilus_files_view_drop_proxy_received_uris (target_view, + uri_list, + target_uri, + gdk_drag_context_get_selected_action (context)); + g_list_free_full (uri_list, g_free); + } + else if (drag_info->info == NAUTILUS_ICON_DND_URI_LIST) + { + nautilus_files_view_drop_proxy_received_uris (target_view, + drag_info->data.uri_list, + target_uri, + gdk_drag_context_get_selected_action (context)); + } + if (drag_info->info == NAUTILUS_ICON_DND_NETSCAPE_URL) + { + nautilus_files_view_handle_netscape_url_drop (target_view, + drag_info->data.netscape_url, + target_uri, + gdk_drag_context_get_selected_action (context), + 0, 0); } - } - - if (target_slot != NULL && target_view != NULL) { - if (drag_info->info == NAUTILUS_ICON_DND_GNOME_ICON_LIST) { - uri_list = nautilus_drag_uri_list_from_selection_list (drag_info->data.selection_list); - g_assert (uri_list != NULL); - - nautilus_files_view_drop_proxy_received_uris (target_view, - uri_list, - target_uri, - gdk_drag_context_get_selected_action (context)); - g_list_free_full (uri_list, g_free); - } else if (drag_info->info == NAUTILUS_ICON_DND_URI_LIST) { - nautilus_files_view_drop_proxy_received_uris (target_view, - drag_info->data.uri_list, - target_uri, - gdk_drag_context_get_selected_action (context)); - } if (drag_info->info == NAUTILUS_ICON_DND_NETSCAPE_URL) { - nautilus_files_view_handle_netscape_url_drop (target_view, - drag_info->data.netscape_url, - target_uri, - gdk_drag_context_get_selected_action (context), - 0, 0); - } - - - gtk_drag_finish (context, TRUE, FALSE, time); - } else { - gtk_drag_finish (context, FALSE, FALSE, time); - } - - g_free (target_uri); - - drag_info_clear (drag_info); + + + gtk_drag_finish (context, TRUE, FALSE, time); + } + else + { + gtk_drag_finish (context, FALSE, FALSE, time); + } + + g_free (target_uri); + + drag_info_clear (drag_info); } static void -slot_proxy_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - int x, - int y, - GtkSelectionData *data, - unsigned int info, - unsigned int time, - gpointer user_data) +slot_proxy_drag_data_received (GtkWidget *widget, + GdkDragContext *context, + int x, + int y, + GtkSelectionData *data, + unsigned int info, + unsigned int time, + gpointer user_data) { - NautilusDragSlotProxyInfo *drag_info; - char **uris; + NautilusDragSlotProxyInfo *drag_info; + char **uris; - drag_info = user_data; + drag_info = user_data; - g_assert (!drag_info->have_data); + g_assert (!drag_info->have_data); - drag_info->have_data = TRUE; - drag_info->info = info; + drag_info->have_data = TRUE; + drag_info->info = info; - if (gtk_selection_data_get_length (data) < 0) { - drag_info->have_valid_data = FALSE; - return; - } + if (gtk_selection_data_get_length (data) < 0) + { + drag_info->have_valid_data = FALSE; + return; + } - if (info == NAUTILUS_ICON_DND_GNOME_ICON_LIST) { - drag_info->data.selection_list = nautilus_drag_build_selection_list (data); + if (info == NAUTILUS_ICON_DND_GNOME_ICON_LIST) + { + drag_info->data.selection_list = nautilus_drag_build_selection_list (data); - drag_info->have_valid_data = drag_info->data.selection_list != NULL; - } else if (info == NAUTILUS_ICON_DND_URI_LIST) { - uris = gtk_selection_data_get_uris (data); - drag_info->data.uri_list = nautilus_drag_uri_list_from_array ((const char **) uris); - g_strfreev (uris); + drag_info->have_valid_data = drag_info->data.selection_list != NULL; + } + else if (info == NAUTILUS_ICON_DND_URI_LIST) + { + uris = gtk_selection_data_get_uris (data); + drag_info->data.uri_list = nautilus_drag_uri_list_from_array ((const char **) uris); + g_strfreev (uris); - drag_info->have_valid_data = drag_info->data.uri_list != NULL; - } else if (info == NAUTILUS_ICON_DND_NETSCAPE_URL) { - drag_info->data.netscape_url = g_strdup ((char *) gtk_selection_data_get_data (data)); + drag_info->have_valid_data = drag_info->data.uri_list != NULL; + } + else if (info == NAUTILUS_ICON_DND_NETSCAPE_URL) + { + drag_info->data.netscape_url = g_strdup ((char *) gtk_selection_data_get_data (data)); - drag_info->have_valid_data = drag_info->data.netscape_url != NULL; - } else if (info == NAUTILUS_ICON_DND_TEXT || + drag_info->have_valid_data = drag_info->data.netscape_url != NULL; + } + else if (info == NAUTILUS_ICON_DND_TEXT || info == NAUTILUS_ICON_DND_XDNDDIRECTSAVE || - info == NAUTILUS_ICON_DND_RAW) { - drag_info->data.selection_data = gtk_selection_data_copy (data); - drag_info->have_valid_data = drag_info->data.selection_data != NULL; - } - - if (drag_info->drop_occured) { - slot_proxy_handle_drop (widget, context, time, drag_info); - } + info == NAUTILUS_ICON_DND_RAW) + { + drag_info->data.selection_data = gtk_selection_data_copy (data); + drag_info->have_valid_data = drag_info->data.selection_data != NULL; + } + + if (drag_info->drop_occured) + { + slot_proxy_handle_drop (widget, context, time, drag_info); + } } void -nautilus_drag_slot_proxy_init (GtkWidget *widget, - NautilusFile *target_file, +nautilus_drag_slot_proxy_init (GtkWidget *widget, + NautilusFile *target_file, NautilusWindowSlot *target_slot) { - NautilusDragSlotProxyInfo *drag_info; - - const GtkTargetEntry targets[] = { - { NAUTILUS_ICON_DND_GNOME_ICON_LIST_TYPE, 0, NAUTILUS_ICON_DND_GNOME_ICON_LIST }, - { NAUTILUS_ICON_DND_NETSCAPE_URL_TYPE, 0, NAUTILUS_ICON_DND_NETSCAPE_URL }, - { NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, 0, NAUTILUS_ICON_DND_XDNDDIRECTSAVE }, /* XDS Protocol Type */ - { NAUTILUS_ICON_DND_RAW_TYPE, 0, NAUTILUS_ICON_DND_RAW } - }; - GtkTargetList *target_list; - - g_assert (GTK_IS_WIDGET (widget)); - - drag_info = g_slice_new0 (NautilusDragSlotProxyInfo); - - g_object_set_data_full (G_OBJECT (widget), "drag-slot-proxy-data", drag_info, - drag_info_free); - - drag_info->is_notebook = (g_object_get_data (G_OBJECT (widget), "nautilus-notebook-tab") != NULL); - - if (target_file != NULL) - drag_info->target_file = nautilus_file_ref (target_file); - - if (target_slot != NULL) - drag_info->target_slot = g_object_ref (target_slot); - - drag_info->widget = widget; - - gtk_drag_dest_set (widget, 0, - NULL, 0, - GDK_ACTION_MOVE | - GDK_ACTION_COPY | - GDK_ACTION_LINK | - GDK_ACTION_ASK); - - 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_target_list_add_text_targets (target_list, NAUTILUS_ICON_DND_TEXT); - gtk_drag_dest_set_target_list (widget, target_list); - gtk_target_list_unref (target_list); - - g_signal_connect (widget, "drag-motion", - G_CALLBACK (slot_proxy_drag_motion), - drag_info); - g_signal_connect (widget, "drag-drop", - G_CALLBACK (slot_proxy_drag_drop), - drag_info); - g_signal_connect (widget, "drag-data-received", - G_CALLBACK (slot_proxy_drag_data_received), - drag_info); - g_signal_connect (widget, "drag-leave", - G_CALLBACK (slot_proxy_drag_leave), - drag_info); + NautilusDragSlotProxyInfo *drag_info; + + const GtkTargetEntry targets[] = + { + { NAUTILUS_ICON_DND_GNOME_ICON_LIST_TYPE, 0, NAUTILUS_ICON_DND_GNOME_ICON_LIST }, + { NAUTILUS_ICON_DND_NETSCAPE_URL_TYPE, 0, NAUTILUS_ICON_DND_NETSCAPE_URL }, + { NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE, 0, NAUTILUS_ICON_DND_XDNDDIRECTSAVE }, /* XDS Protocol Type */ + { NAUTILUS_ICON_DND_RAW_TYPE, 0, NAUTILUS_ICON_DND_RAW } + }; + GtkTargetList *target_list; + + g_assert (GTK_IS_WIDGET (widget)); + + drag_info = g_slice_new0 (NautilusDragSlotProxyInfo); + + g_object_set_data_full (G_OBJECT (widget), "drag-slot-proxy-data", drag_info, + drag_info_free); + + drag_info->is_notebook = (g_object_get_data (G_OBJECT (widget), "nautilus-notebook-tab") != NULL); + + if (target_file != NULL) + { + drag_info->target_file = nautilus_file_ref (target_file); + } + + if (target_slot != NULL) + { + drag_info->target_slot = g_object_ref (target_slot); + } + + drag_info->widget = widget; + + gtk_drag_dest_set (widget, 0, + NULL, 0, + GDK_ACTION_MOVE | + GDK_ACTION_COPY | + GDK_ACTION_LINK | + GDK_ACTION_ASK); + + 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_target_list_add_text_targets (target_list, NAUTILUS_ICON_DND_TEXT); + gtk_drag_dest_set_target_list (widget, target_list); + gtk_target_list_unref (target_list); + + g_signal_connect (widget, "drag-motion", + G_CALLBACK (slot_proxy_drag_motion), + drag_info); + g_signal_connect (widget, "drag-drop", + G_CALLBACK (slot_proxy_drag_drop), + drag_info); + g_signal_connect (widget, "drag-data-received", + G_CALLBACK (slot_proxy_drag_data_received), + drag_info); + g_signal_connect (widget, "drag-leave", + G_CALLBACK (slot_proxy_drag_leave), + drag_info); } |