diff options
author | Carlos Soriano <csoriano@gnome.org> | 2016-08-29 18:24:05 +0200 |
---|---|---|
committer | Carlos Soriano <csoriano@gnome.org> | 2016-08-29 18:25:29 +0200 |
commit | bc88db402e424f34fd7a8fa583217c984df7f4b4 (patch) | |
tree | 040dc9433d4ad9cc38482fc7f83f560d58fdf803 /src/nautilus-dnd.c | |
parent | e19470ae3c0bd16fde484d0640f0c48a4f6ba4d0 (diff) | |
download | nautilus-wip/csoriano/uncrustify.tar.gz |
general: run uncrustifywip/csoriano/uncrustify
And make the style of Nautilus the same for all files.
Hopefully we can fix all the style issues we can find in the next days,
so expect a little of movement on this.
Diffstat (limited to 'src/nautilus-dnd.c')
-rw-r--r-- | src/nautilus-dnd.c | 1505 |
1 files changed, 809 insertions, 696 deletions
diff --git a/src/nautilus-dnd.c b/src/nautilus-dnd.c index 1731b473b..fb5ebeca1 100644 --- a/src/nautilus-dnd.c +++ b/src/nautilus-dnd.c @@ -1,26 +1,25 @@ - /* nautilus-dnd.c - Common Drag & drop handling code shared by the icon container - and the list view. - - Copyright (C) 2000, 2001 Eazel, Inc. - - The Gnome Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Authors: Pavel Cisler <pavel@eazel.com>, - Ettore Perazzoli <ettore@gnu.org> -*/ + * and the list view. + * + * Copyright (C) 2000, 2001 Eazel, Inc. + * + * The Gnome Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * The Gnome Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Gnome Library; see the file COPYING.LIB. If not, + * see <http://www.gnu.org/licenses/>. + * + * Authors: Pavel Cisler <pavel@eazel.com>, + * Ettore Perazzoli <ettore@gnu.org> + */ #include <config.h> #include "nautilus-dnd.h" @@ -52,7 +51,7 @@ * margin */ #define MIN_AUTOSCROLL_DELTA 5 - + /* the largest amount of auto scroll used when we are right over the view * edge */ @@ -60,30 +59,31 @@ void nautilus_drag_init (NautilusDragInfo *drag_info, - const GtkTargetEntry *drag_types, - int drag_type_count, - gboolean add_text_targets) + const GtkTargetEntry *drag_types, + int drag_type_count, + gboolean add_text_targets) { - drag_info->target_list = gtk_target_list_new (drag_types, - drag_type_count); + drag_info->target_list = gtk_target_list_new (drag_types, + drag_type_count); - if (add_text_targets) { - gtk_target_list_add_text_targets (drag_info->target_list, - NAUTILUS_ICON_DND_TEXT); - } + if (add_text_targets) + { + gtk_target_list_add_text_targets (drag_info->target_list, + NAUTILUS_ICON_DND_TEXT); + } - drag_info->drop_occured = FALSE; - drag_info->need_to_destroy = FALSE; + drag_info->drop_occured = FALSE; + drag_info->need_to_destroy = FALSE; } void nautilus_drag_finalize (NautilusDragInfo *drag_info) { - gtk_target_list_unref (drag_info->target_list); - nautilus_drag_destroy_selection_list (drag_info->selection_list); - nautilus_drag_destroy_selection_list (drag_info->selection_cache); + gtk_target_list_unref (drag_info->target_list); + nautilus_drag_destroy_selection_list (drag_info->selection_list); + nautilus_drag_destroy_selection_list (drag_info->selection_cache); - g_free (drag_info); + g_free (drag_info); } @@ -92,47 +92,53 @@ nautilus_drag_finalize (NautilusDragInfo *drag_info) NautilusDragSelectionItem * nautilus_drag_selection_item_new (void) { - return g_new0 (NautilusDragSelectionItem, 1); + return g_new0 (NautilusDragSelectionItem, 1); } static void drag_selection_item_destroy (NautilusDragSelectionItem *item) { - g_clear_object (&item->file); - g_free (item->uri); - g_free (item); + g_clear_object (&item->file); + g_free (item->uri); + g_free (item); } void nautilus_drag_destroy_selection_list (GList *list) { - GList *p; + GList *p; - if (list == NULL) - return; + if (list == NULL) + { + return; + } - for (p = list; p != NULL; p = p->next) - drag_selection_item_destroy (p->data); + for (p = list; p != NULL; p = p->next) + { + drag_selection_item_destroy (p->data); + } - g_list_free (list); + g_list_free (list); } GList * nautilus_drag_uri_list_from_selection_list (const GList *selection_list) { - NautilusDragSelectionItem *selection_item; - GList *uri_list; - const GList *l; - - uri_list = NULL; - for (l = selection_list; l != NULL; l = l->next) { - selection_item = (NautilusDragSelectionItem *) l->data; - if (selection_item->uri != NULL) { - uri_list = g_list_prepend (uri_list, g_strdup (selection_item->uri)); - } - } + NautilusDragSelectionItem *selection_item; + GList *uri_list; + const GList *l; + + uri_list = NULL; + for (l = selection_list; l != NULL; l = l->next) + { + selection_item = (NautilusDragSelectionItem *) l->data; + if (selection_item->uri != NULL) + { + uri_list = g_list_prepend (uri_list, g_strdup (selection_item->uri)); + } + } - return g_list_reverse (uri_list); + return g_list_reverse (uri_list); } /* @@ -141,303 +147,336 @@ nautilus_drag_uri_list_from_selection_list (const GList *selection_list) GList * nautilus_drag_file_list_from_selection_list (const GList *selection_list) { - NautilusDragSelectionItem *selection_item; - GList *file_list; - const GList *l; - - file_list = NULL; - for (l = selection_list; l != NULL; l = l->next) { - selection_item = (NautilusDragSelectionItem *) l->data; - if (selection_item->file != NULL) { - file_list = g_list_prepend (file_list, g_object_ref (selection_item->file)); - } - } + NautilusDragSelectionItem *selection_item; + GList *file_list; + const GList *l; + + file_list = NULL; + for (l = selection_list; l != NULL; l = l->next) + { + selection_item = (NautilusDragSelectionItem *) l->data; + if (selection_item->file != NULL) + { + file_list = g_list_prepend (file_list, g_object_ref (selection_item->file)); + } + } - return g_list_reverse (file_list); + return g_list_reverse (file_list); } GList * nautilus_drag_uri_list_from_array (const char **uris) { - GList *uri_list; - int i; + GList *uri_list; + int i; - if (uris == NULL) { - return NULL; - } + if (uris == NULL) + { + return NULL; + } - uri_list = NULL; + uri_list = NULL; - for (i = 0; uris[i] != NULL; i++) { - uri_list = g_list_prepend (uri_list, g_strdup (uris[i])); - } + for (i = 0; uris[i] != NULL; i++) + { + uri_list = g_list_prepend (uri_list, g_strdup (uris[i])); + } - return g_list_reverse (uri_list); + return g_list_reverse (uri_list); } GList * nautilus_drag_build_selection_list (GtkSelectionData *data) { - GList *result; - const guchar *p, *oldp; - int size; - - result = NULL; - oldp = gtk_selection_data_get_data (data); - size = gtk_selection_data_get_length (data); - - while (size > 0) { - NautilusDragSelectionItem *item; - guint len; - - /* The list is in the form: - - name\rx:y:width:height\r\n + GList *result; + const guchar *p, *oldp; + int size; + + result = NULL; + oldp = gtk_selection_data_get_data (data); + size = gtk_selection_data_get_length (data); + + while (size > 0) + { + NautilusDragSelectionItem *item; + guint len; + + /* The list is in the form: + * + * name\rx:y:width:height\r\n + * + * The geometry information after the first \r is optional. */ + + /* 1: Decode name. */ + + p = memchr (oldp, '\r', size); + if (p == NULL) + { + break; + } - The geometry information after the first \r is optional. */ + item = nautilus_drag_selection_item_new (); + + len = p - oldp; + + item->uri = g_malloc (len + 1); + memcpy (item->uri, oldp, len); + item->uri[len] = 0; + item->file = nautilus_file_get_by_uri (item->uri); + + p++; + if (*p == '\n' || *p == '\0') + { + result = g_list_prepend (result, item); + if (p == 0) + { + g_warning ("Invalid x-special/gnome-icon-list data received: " + "missing newline character."); + break; + } + else + { + oldp = p + 1; + continue; + } + } - /* 1: Decode name. */ + size -= p - oldp; + oldp = p; - p = memchr (oldp, '\r', size); - if (p == NULL) { - break; - } + /* 2: Decode geometry information. */ - item = nautilus_drag_selection_item_new (); + item->got_icon_position = sscanf ((const gchar *) p, "%d:%d:%d:%d%*s", + &item->icon_x, &item->icon_y, + &item->icon_width, &item->icon_height) == 4; + if (!item->got_icon_position) + { + g_warning ("Invalid x-special/gnome-icon-list data received: " + "invalid icon position specification."); + } - len = p - oldp; + result = g_list_prepend (result, item); + + p = memchr (p, '\r', size); + if (p == NULL || p[1] != '\n') + { + g_warning ("Invalid x-special/gnome-icon-list data received: " + "missing newline character."); + if (p == NULL) + { + break; + } + } + else + { + p += 2; + } - item->uri = g_malloc (len + 1); - memcpy (item->uri, oldp, len); - item->uri[len] = 0; - item->file = nautilus_file_get_by_uri (item->uri); + size -= p - oldp; + oldp = p; + } - p++; - if (*p == '\n' || *p == '\0') { - result = g_list_prepend (result, item); - if (p == 0) { - g_warning ("Invalid x-special/gnome-icon-list data received: " - "missing newline character."); - break; - } else { - oldp = p + 1; - continue; - } - } + return g_list_reverse (result); +} - size -= p - oldp; - oldp = p; +static gboolean +nautilus_drag_file_local_internal (const char *target_uri_string, + const char *first_source_uri) +{ + /* check if the first item on the list has target_uri_string as a parent + * FIXME: + * we should really test each item but that would be slow for large selections + * and currently dropped items can only be from the same container + */ + GFile *target, *item, *parent; + gboolean result; - /* 2: Decode geometry information. */ + result = FALSE; - item->got_icon_position = sscanf ((const gchar *) p, "%d:%d:%d:%d%*s", - &item->icon_x, &item->icon_y, - &item->icon_width, &item->icon_height) == 4; - if (!item->got_icon_position) { - g_warning ("Invalid x-special/gnome-icon-list data received: " - "invalid icon position specification."); - } + target = g_file_new_for_uri (target_uri_string); - result = g_list_prepend (result, item); + /* get the parent URI of the first item in the selection */ + item = g_file_new_for_uri (first_source_uri); + parent = g_file_get_parent (item); + g_object_unref (item); - p = memchr (p, '\r', size); - if (p == NULL || p[1] != '\n') { - g_warning ("Invalid x-special/gnome-icon-list data received: " - "missing newline character."); - if (p == NULL) { - break; - } - } else { - p += 2; - } + if (parent != NULL) + { + result = g_file_equal (parent, target); + g_object_unref (parent); + } - size -= p - oldp; - oldp = p; - } + g_object_unref (target); - return g_list_reverse (result); + return result; } -static gboolean -nautilus_drag_file_local_internal (const char *target_uri_string, - const char *first_source_uri) -{ - /* check if the first item on the list has target_uri_string as a parent - * FIXME: - * we should really test each item but that would be slow for large selections - * and currently dropped items can only be from the same container - */ - GFile *target, *item, *parent; - gboolean result; - - result = FALSE; - - target = g_file_new_for_uri (target_uri_string); - - /* get the parent URI of the first item in the selection */ - item = g_file_new_for_uri (first_source_uri); - parent = g_file_get_parent (item); - g_object_unref (item); - - if (parent != NULL) { - result = g_file_equal (parent, target); - g_object_unref (parent); - } - - g_object_unref (target); - - return result; -} - gboolean -nautilus_drag_uris_local (const char *target_uri, - const GList *source_uri_list) +nautilus_drag_uris_local (const char *target_uri, + const GList *source_uri_list) { - /* must have at least one item */ - g_assert (source_uri_list); - - return nautilus_drag_file_local_internal (target_uri, source_uri_list->data); + /* must have at least one item */ + g_assert (source_uri_list); + + return nautilus_drag_file_local_internal (target_uri, source_uri_list->data); } gboolean -nautilus_drag_items_local (const char *target_uri_string, - const GList *selection_list) +nautilus_drag_items_local (const char *target_uri_string, + const GList *selection_list) { - /* must have at least one item */ - g_assert (selection_list); + /* must have at least one item */ + g_assert (selection_list); - return nautilus_drag_file_local_internal (target_uri_string, - ((NautilusDragSelectionItem *)selection_list->data)->uri); + return nautilus_drag_file_local_internal (target_uri_string, + ((NautilusDragSelectionItem *) selection_list->data)->uri); } gboolean nautilus_drag_items_on_desktop (const GList *selection_list) { - char *uri; - GFile *desktop, *item, *parent; - gboolean result; - - /* check if the first item on the list is in trash. - * FIXME: - * we should really test each item but that would be slow for large selections - * and currently dropped items can only be from the same container - */ - uri = ((NautilusDragSelectionItem *)selection_list->data)->uri; - if (eel_uri_is_desktop (uri)) { - return TRUE; - } - - desktop = nautilus_get_desktop_location (); - - item = g_file_new_for_uri (uri); - parent = g_file_get_parent (item); - g_object_unref (item); - - result = FALSE; - - if (parent) { - result = g_file_equal (desktop, parent); - g_object_unref (parent); - } - g_object_unref (desktop); - - return result; - + char *uri; + GFile *desktop, *item, *parent; + gboolean result; + + /* check if the first item on the list is in trash. + * FIXME: + * we should really test each item but that would be slow for large selections + * and currently dropped items can only be from the same container + */ + uri = ((NautilusDragSelectionItem *) selection_list->data)->uri; + if (eel_uri_is_desktop (uri)) + { + return TRUE; + } + + desktop = nautilus_get_desktop_location (); + + item = g_file_new_for_uri (uri); + parent = g_file_get_parent (item); + g_object_unref (item); + + result = FALSE; + + if (parent) + { + result = g_file_equal (desktop, parent); + g_object_unref (parent); + } + g_object_unref (desktop); + + return result; } GdkDragAction nautilus_drag_default_drop_action_for_netscape_url (GdkDragContext *context) { - /* Mozilla defaults to copy, but unless thats the - only allowed thing (enforced by ctrl) we want to LINK */ - if (gdk_drag_context_get_suggested_action (context) == GDK_ACTION_COPY && - gdk_drag_context_get_actions (context) != GDK_ACTION_COPY) { - return GDK_ACTION_LINK; - } else if (gdk_drag_context_get_suggested_action (context) == GDK_ACTION_MOVE) { - /* Don't support move */ - return GDK_ACTION_COPY; - } - - return gdk_drag_context_get_suggested_action (context); + /* Mozilla defaults to copy, but unless thats the + * only allowed thing (enforced by ctrl) we want to LINK */ + if (gdk_drag_context_get_suggested_action (context) == GDK_ACTION_COPY && + gdk_drag_context_get_actions (context) != GDK_ACTION_COPY) + { + return GDK_ACTION_LINK; + } + else if (gdk_drag_context_get_suggested_action (context) == GDK_ACTION_MOVE) + { + /* Don't support move */ + return GDK_ACTION_COPY; + } + + return gdk_drag_context_get_suggested_action (context); } static gboolean check_same_fs (NautilusFile *file1, - NautilusFile *file2) + NautilusFile *file2) { - char *id1, *id2; - gboolean result; + char *id1, *id2; + gboolean result; - result = FALSE; + result = FALSE; - if (file1 != NULL && file2 != NULL) { - id1 = nautilus_file_get_filesystem_id (file1); - id2 = nautilus_file_get_filesystem_id (file2); + if (file1 != NULL && file2 != NULL) + { + id1 = nautilus_file_get_filesystem_id (file1); + id2 = nautilus_file_get_filesystem_id (file2); - if (id1 != NULL && id2 != NULL) { - result = (strcmp (id1, id2) == 0); - } + if (id1 != NULL && id2 != NULL) + { + result = (strcmp (id1, id2) == 0); + } - g_free (id1); - g_free (id2); - } + g_free (id1); + g_free (id2); + } - return result; + return result; } static gboolean source_is_deletable (GFile *file) { - NautilusFile *naut_file; - gboolean ret; + NautilusFile *naut_file; + gboolean ret; - /* if there's no a cached NautilusFile, it returns NULL */ - naut_file = nautilus_file_get (file); - if (naut_file == NULL) { - return FALSE; - } - - ret = nautilus_file_can_delete (naut_file); - nautilus_file_unref (naut_file); + /* if there's no a cached NautilusFile, it returns NULL */ + naut_file = nautilus_file_get (file); + if (naut_file == NULL) + { + return FALSE; + } - return ret; + ret = nautilus_file_can_delete (naut_file); + nautilus_file_unref (naut_file); + + return ret; } NautilusDragInfo * nautilus_drag_get_source_data (GdkDragContext *context) { - GtkWidget *source_widget; - NautilusDragInfo *source_data; - - source_widget = gtk_drag_get_source_widget (context); - if (source_widget == NULL) - return NULL; - - if (NAUTILUS_IS_CANVAS_CONTAINER (source_widget)) { - source_data = nautilus_canvas_dnd_get_drag_source_data (NAUTILUS_CANVAS_CONTAINER (source_widget), + GtkWidget *source_widget; + NautilusDragInfo *source_data; + + source_widget = gtk_drag_get_source_widget (context); + if (source_widget == NULL) + { + return NULL; + } + + if (NAUTILUS_IS_CANVAS_CONTAINER (source_widget)) + { + source_data = nautilus_canvas_dnd_get_drag_source_data (NAUTILUS_CANVAS_CONTAINER (source_widget), + context); + } + else if (GTK_IS_TREE_VIEW (source_widget)) + { + NautilusWindow *window; + NautilusWindowSlot *active_slot; + NautilusView *view; + + window = NAUTILUS_WINDOW (gtk_widget_get_toplevel (source_widget)); + active_slot = nautilus_window_get_active_slot (window); + view = nautilus_window_slot_get_current_view (active_slot); + if (NAUTILUS_IS_LIST_VIEW (view)) + { + source_data = nautilus_list_view_dnd_get_drag_source_data (NAUTILUS_LIST_VIEW (view), context); - } else if (GTK_IS_TREE_VIEW (source_widget)) { - NautilusWindow *window; - NautilusWindowSlot *active_slot; - NautilusView *view; - - window = NAUTILUS_WINDOW (gtk_widget_get_toplevel (source_widget)); - active_slot = nautilus_window_get_active_slot (window); - view = nautilus_window_slot_get_current_view (active_slot); - if (NAUTILUS_IS_LIST_VIEW (view)) { - source_data = nautilus_list_view_dnd_get_drag_source_data (NAUTILUS_LIST_VIEW (view), - context); - } else { - g_warning ("Got a drag context with a tree view source widget, but current view is not list view"); - source_data = NULL; - } - } else { - /* it's a slot or something else */ - g_warning ("Requested drag source data from a widget that doesn't support it"); - source_data = NULL; } - - return source_data; + else + { + g_warning ("Got a drag context with a tree view source widget, but current view is not list view"); + source_data = NULL; + } + } + else + { + /* it's a slot or something else */ + g_warning ("Requested drag source data from a widget that doesn't support it"); + source_data = NULL; + } + + return source_data; } void @@ -447,506 +486,580 @@ nautilus_drag_default_drop_action_for_icons (GdkDragContext *context, guint32 source_actions, int *action) { - gboolean same_fs; - gboolean target_is_source_parent; - gboolean source_deletable; - const char *dropped_uri; - GFile *target, *dropped, *dropped_directory; - GdkDragAction actions; - NautilusFile *dropped_file, *target_file; - - if (target_uri_string == NULL) { - *action = 0; - return; - } - - /* this is needed because of how dnd works. The actions at the time drag-begin - * is done are not set, because they are first set on drag-motion. However, - * for our use case, which is validation with the sidebar for dnd feedback - * when the dnd doesn't have as a destination the sidebar itself, we need - * a way to know the actions at drag-begin time. Either canvas view or - * list view know them when starting the drag, but asking for them here - * would be breaking the current model too much. So instead we rely on the - * caller, which will ask if appropiate to those objects about the actions - * available, instead of relying solely on the context here. */ - if (source_actions) - actions = source_actions & (GDK_ACTION_MOVE | GDK_ACTION_COPY); + gboolean same_fs; + gboolean target_is_source_parent; + gboolean source_deletable; + const char *dropped_uri; + GFile *target, *dropped, *dropped_directory; + GdkDragAction actions; + NautilusFile *dropped_file, *target_file; + + if (target_uri_string == NULL) + { + *action = 0; + return; + } + + /* this is needed because of how dnd works. The actions at the time drag-begin + * is done are not set, because they are first set on drag-motion. However, + * for our use case, which is validation with the sidebar for dnd feedback + * when the dnd doesn't have as a destination the sidebar itself, we need + * a way to know the actions at drag-begin time. Either canvas view or + * list view know them when starting the drag, but asking for them here + * would be breaking the current model too much. So instead we rely on the + * caller, which will ask if appropiate to those objects about the actions + * available, instead of relying solely on the context here. */ + if (source_actions) + { + actions = source_actions & (GDK_ACTION_MOVE | GDK_ACTION_COPY); + } + else + { + actions = gdk_drag_context_get_actions (context) & (GDK_ACTION_MOVE | GDK_ACTION_COPY); + } + if (actions == 0) + { + /* We can't use copy or move, just go with the suggested action. */ + *action = gdk_drag_context_get_suggested_action (context); + return; + } + + if (gdk_drag_context_get_suggested_action (context) == GDK_ACTION_ASK) + { + /* Don't override ask */ + *action = gdk_drag_context_get_suggested_action (context); + return; + } + + dropped_uri = ((NautilusDragSelectionItem *) items->data)->uri; + dropped_file = ((NautilusDragSelectionItem *) items->data)->file; + target_file = nautilus_file_get_by_uri (target_uri_string); + + if (eel_uri_is_desktop (dropped_uri) && + !eel_uri_is_desktop (target_uri_string)) + { + /* Desktop items only move on the desktop */ + *action = 0; + return; + } + + /* + * Check for trash URI. We do a find_directory for any Trash directory. + * Passing 0 permissions as gnome-vfs would override the permissions + * passed with 700 while creating .Trash directory + */ + if (eel_uri_is_trash (target_uri_string)) + { + /* Only move to Trash */ + if (actions & GDK_ACTION_MOVE) + { + *action = GDK_ACTION_MOVE; + } + nautilus_file_unref (target_file); + return; + } + else if (dropped_file != NULL && nautilus_file_is_launcher (dropped_file)) + { + if (actions & GDK_ACTION_MOVE) + { + *action = GDK_ACTION_MOVE; + } + nautilus_file_unref (target_file); + return; + } + else if (eel_uri_is_desktop (target_uri_string)) + { + target = nautilus_get_desktop_location (); + + nautilus_file_unref (target_file); + target_file = nautilus_file_get (target); + + if (eel_uri_is_desktop (dropped_uri)) + { + /* Only move to Desktop icons */ + if (actions & GDK_ACTION_MOVE) + { + *action = GDK_ACTION_MOVE; + } + + g_object_unref (target); + nautilus_file_unref (target_file); + return; + } + } + else if (target_file != NULL && nautilus_file_is_archive (target_file)) + { + *action = GDK_ACTION_COPY; + + nautilus_file_unref (target_file); + return; + } + else + { + target = g_file_new_for_uri (target_uri_string); + } + + same_fs = check_same_fs (target_file, dropped_file); + + nautilus_file_unref (target_file); + + /* Compare the first dropped uri with the target uri for same fs match. */ + dropped = g_file_new_for_uri (dropped_uri); + dropped_directory = g_file_get_parent (dropped); + target_is_source_parent = FALSE; + if (dropped_directory != NULL) + { + /* If the dropped file is already in the same directory but + * is in another filesystem we still want to move, not copy + * as this is then just a move of a mountpoint to another + * position in the dir */ + target_is_source_parent = g_file_equal (dropped_directory, target); + g_object_unref (dropped_directory); + } + source_deletable = source_is_deletable (dropped); + + if ((same_fs && source_deletable) || target_is_source_parent || + g_file_has_uri_scheme (dropped, "trash")) + { + if (actions & GDK_ACTION_MOVE) + { + *action = GDK_ACTION_MOVE; + } + else + { + *action = gdk_drag_context_get_suggested_action (context); + } + } + else + { + if (actions & GDK_ACTION_COPY) + { + *action = GDK_ACTION_COPY; + } else - actions = gdk_drag_context_get_actions (context) & (GDK_ACTION_MOVE | GDK_ACTION_COPY); - if (actions == 0) { - /* We can't use copy or move, just go with the suggested action. */ - *action = gdk_drag_context_get_suggested_action (context); - return; - } - - if (gdk_drag_context_get_suggested_action (context) == GDK_ACTION_ASK) { - /* Don't override ask */ - *action = gdk_drag_context_get_suggested_action (context); - return; - } - - dropped_uri = ((NautilusDragSelectionItem *)items->data)->uri; - dropped_file = ((NautilusDragSelectionItem *)items->data)->file; - target_file = nautilus_file_get_by_uri (target_uri_string); - - if (eel_uri_is_desktop (dropped_uri) && - !eel_uri_is_desktop (target_uri_string)) { - /* Desktop items only move on the desktop */ - *action = 0; - return; - } - - /* - * Check for trash URI. We do a find_directory for any Trash directory. - * Passing 0 permissions as gnome-vfs would override the permissions - * passed with 700 while creating .Trash directory - */ - if (eel_uri_is_trash (target_uri_string)) { - /* Only move to Trash */ - if (actions & GDK_ACTION_MOVE) { - *action = GDK_ACTION_MOVE; - } - nautilus_file_unref (target_file); - return; - - } else if (dropped_file != NULL && nautilus_file_is_launcher (dropped_file)) { - if (actions & GDK_ACTION_MOVE) { - *action = GDK_ACTION_MOVE; - } - nautilus_file_unref (target_file); - return; - } else if (eel_uri_is_desktop (target_uri_string)) { - target = nautilus_get_desktop_location (); - - nautilus_file_unref (target_file); - target_file = nautilus_file_get (target); - - if (eel_uri_is_desktop (dropped_uri)) { - /* Only move to Desktop icons */ - if (actions & GDK_ACTION_MOVE) { - *action = GDK_ACTION_MOVE; - } - - g_object_unref (target); - nautilus_file_unref (target_file); - return; - } - } else if (target_file != NULL && nautilus_file_is_archive (target_file)) { - *action = GDK_ACTION_COPY; - - nautilus_file_unref (target_file); - return; - } else { - target = g_file_new_for_uri (target_uri_string); - } - - same_fs = check_same_fs (target_file, dropped_file); - - nautilus_file_unref (target_file); - - /* Compare the first dropped uri with the target uri for same fs match. */ - dropped = g_file_new_for_uri (dropped_uri); - dropped_directory = g_file_get_parent (dropped); - target_is_source_parent = FALSE; - if (dropped_directory != NULL) { - /* If the dropped file is already in the same directory but - is in another filesystem we still want to move, not copy - as this is then just a move of a mountpoint to another - position in the dir */ - target_is_source_parent = g_file_equal (dropped_directory, target); - g_object_unref (dropped_directory); - } - source_deletable = source_is_deletable (dropped); - - if ((same_fs && source_deletable) || target_is_source_parent || - g_file_has_uri_scheme (dropped, "trash")) { - if (actions & GDK_ACTION_MOVE) { - *action = GDK_ACTION_MOVE; - } else { - *action = gdk_drag_context_get_suggested_action (context); - } - } else { - if (actions & GDK_ACTION_COPY) { - *action = GDK_ACTION_COPY; - } else { - *action = gdk_drag_context_get_suggested_action (context); - } - } - - g_object_unref (target); - g_object_unref (dropped); - + { + *action = gdk_drag_context_get_suggested_action (context); + } + } + + g_object_unref (target); + g_object_unref (dropped); } GdkDragAction nautilus_drag_default_drop_action_for_uri_list (GdkDragContext *context, - const char *target_uri_string) + const char *target_uri_string) { - if (eel_uri_is_trash (target_uri_string) && (gdk_drag_context_get_actions (context) & GDK_ACTION_MOVE)) { - /* Only move to Trash */ - return GDK_ACTION_MOVE; - } else { - return gdk_drag_context_get_suggested_action (context); - } + if (eel_uri_is_trash (target_uri_string) && (gdk_drag_context_get_actions (context) & GDK_ACTION_MOVE)) + { + /* Only move to Trash */ + return GDK_ACTION_MOVE; + } + else + { + return gdk_drag_context_get_suggested_action (context); + } } /* Encode a "x-special/gnome-icon-list" selection. - Along with the URIs of the dragged files, this encodes - the location and size of each icon relative to the cursor. -*/ + * Along with the URIs of the dragged files, this encodes + * the location and size of each icon relative to the cursor. + */ static void -add_one_gnome_icon (const char *uri, int x, int y, int w, int h, - gpointer data) +add_one_gnome_icon (const char *uri, + int x, + int y, + int w, + int h, + gpointer data) { - GString *result; + GString *result; - result = (GString *) data; + result = (GString *) data; - g_string_append_printf (result, "%s\r%d:%d:%hu:%hu\r\n", - uri, x, y, w, h); + g_string_append_printf (result, "%s\r%d:%d:%hu:%hu\r\n", + uri, x, y, w, h); } static void -add_one_uri (const char *uri, int x, int y, int w, int h, gpointer data) +add_one_uri (const char *uri, + int x, + int y, + int w, + int h, + gpointer data) { - GString *result; - - result = (GString *) data; + GString *result; + + result = (GString *) data; - g_string_append (result, uri); - g_string_append (result, "\r\n"); + g_string_append (result, uri); + g_string_append (result, "\r\n"); } static void cache_one_item (const char *uri, - int x, int y, - int w, int h, - gpointer data) + int x, + int y, + int w, + int h, + gpointer data) { - GList **cache = data; - NautilusDragSelectionItem *item; - - item = nautilus_drag_selection_item_new (); - item->uri = g_strdup (uri); - item->file = nautilus_file_get_by_uri (uri); - item->icon_x = x; - item->icon_y = y; - item->icon_width = w; - item->icon_height = h; - *cache = g_list_prepend (*cache, item); + GList **cache = data; + NautilusDragSelectionItem *item; + + item = nautilus_drag_selection_item_new (); + item->uri = g_strdup (uri); + item->file = nautilus_file_get_by_uri (uri); + item->icon_x = x; + item->icon_y = y; + item->icon_width = w; + item->icon_height = h; + *cache = g_list_prepend (*cache, item); } GList * -nautilus_drag_create_selection_cache (gpointer container_context, - NautilusDragEachSelectedItemIterator each_selected_item_iterator) +nautilus_drag_create_selection_cache (gpointer container_context, + NautilusDragEachSelectedItemIterator each_selected_item_iterator) { - GList *cache = NULL; + GList *cache = NULL; - (* each_selected_item_iterator) (cache_one_item, container_context, &cache); - cache = g_list_reverse (cache); + (*each_selected_item_iterator)(cache_one_item, container_context, &cache); + cache = g_list_reverse (cache); - return cache; + return cache; } /* Common function for drag_data_get_callback calls. * Returns FALSE if it doesn't handle drag data */ gboolean -nautilus_drag_drag_data_get_from_cache (GList *cache, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint32 time) -{ - GList *l; - GString *result; - NautilusDragEachSelectedItemDataGet func; - - if (cache == NULL) { - return FALSE; - } - - switch (info) { - case NAUTILUS_ICON_DND_GNOME_ICON_LIST: - func = add_one_gnome_icon; - break; - case NAUTILUS_ICON_DND_URI_LIST: - case NAUTILUS_ICON_DND_TEXT: - func = add_one_uri; - break; - default: - return FALSE; - } - - result = g_string_new (NULL); - - for (l = cache; l != NULL; l = l->next) { - NautilusDragSelectionItem *item = l->data; - (*func) (item->uri, item->icon_x, item->icon_y, item->icon_width, item->icon_height, result); - } - - gtk_selection_data_set (selection_data, - gtk_selection_data_get_target (selection_data), - 8, (guchar *) result->str, result->len); - g_string_free (result, TRUE); - - return TRUE; +nautilus_drag_drag_data_get_from_cache (GList *cache, + GdkDragContext *context, + GtkSelectionData *selection_data, + guint info, + guint32 time) +{ + GList *l; + GString *result; + NautilusDragEachSelectedItemDataGet func; + + if (cache == NULL) + { + return FALSE; + } + + switch (info) + { + case NAUTILUS_ICON_DND_GNOME_ICON_LIST: + { + func = add_one_gnome_icon; + } + break; + + case NAUTILUS_ICON_DND_URI_LIST: + case NAUTILUS_ICON_DND_TEXT: + { + func = add_one_uri; + } + break; + + default: + return FALSE; + } + + result = g_string_new (NULL); + + for (l = cache; l != NULL; l = l->next) + { + NautilusDragSelectionItem *item = l->data; + (*func)(item->uri, item->icon_x, item->icon_y, item->icon_width, item->icon_height, result); + } + + gtk_selection_data_set (selection_data, + gtk_selection_data_get_target (selection_data), + 8, (guchar *) result->str, result->len); + g_string_free (result, TRUE); + + return TRUE; } typedef struct { - GMainLoop *loop; - GdkDragAction chosen; + GMainLoop *loop; + GdkDragAction chosen; } DropActionMenuData; static void menu_deactivate_callback (GtkWidget *menu, - gpointer data) + gpointer data) { - DropActionMenuData *damd; - - damd = data; + DropActionMenuData *damd; + + damd = data; - if (g_main_loop_is_running (damd->loop)) - g_main_loop_quit (damd->loop); + if (g_main_loop_is_running (damd->loop)) + { + g_main_loop_quit (damd->loop); + } } static void -drop_action_activated_callback (GtkWidget *menu_item, - gpointer data) +drop_action_activated_callback (GtkWidget *menu_item, + gpointer data) { - DropActionMenuData *damd; - - damd = data; + DropActionMenuData *damd; + + damd = data; - damd->chosen = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu_item), - "action")); + damd->chosen = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu_item), + "action")); - if (g_main_loop_is_running (damd->loop)) - g_main_loop_quit (damd->loop); + if (g_main_loop_is_running (damd->loop)) + { + g_main_loop_quit (damd->loop); + } } static void append_drop_action_menu_item (GtkWidget *menu, - const char *text, - GdkDragAction action, - gboolean sensitive, - DropActionMenuData *damd) + const char *text, + GdkDragAction action, + gboolean sensitive, + DropActionMenuData *damd) { - GtkWidget *menu_item; + GtkWidget *menu_item; - menu_item = gtk_menu_item_new_with_mnemonic (text); - gtk_widget_set_sensitive (menu_item, sensitive); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + menu_item = gtk_menu_item_new_with_mnemonic (text); + gtk_widget_set_sensitive (menu_item, sensitive); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); - g_object_set_data (G_OBJECT (menu_item), - "action", - GINT_TO_POINTER (action)); - - g_signal_connect (menu_item, "activate", - G_CALLBACK (drop_action_activated_callback), - damd); + g_object_set_data (G_OBJECT (menu_item), + "action", + GINT_TO_POINTER (action)); - gtk_widget_show (menu_item); + g_signal_connect (menu_item, "activate", + G_CALLBACK (drop_action_activated_callback), + damd); + + gtk_widget_show (menu_item); } /* Pops up a menu of actions to perform on dropped files */ GdkDragAction -nautilus_drag_drop_action_ask (GtkWidget *widget, - GdkDragAction actions) -{ - GtkWidget *menu; - GtkWidget *menu_item; - DropActionMenuData damd; - - /* Create the menu and set the sensitivity of the items based on the - * allowed actions. - */ - menu = gtk_menu_new (); - gtk_menu_set_screen (GTK_MENU (menu), gtk_widget_get_screen (widget)); - - append_drop_action_menu_item (menu, _("_Move Here"), - GDK_ACTION_MOVE, - (actions & GDK_ACTION_MOVE) != 0, - &damd); - - append_drop_action_menu_item (menu, _("_Copy Here"), - GDK_ACTION_COPY, - (actions & GDK_ACTION_COPY) != 0, - &damd); - - append_drop_action_menu_item (menu, _("_Link Here"), - GDK_ACTION_LINK, - (actions & GDK_ACTION_LINK) != 0, - &damd); - - eel_gtk_menu_append_separator (GTK_MENU (menu)); - - menu_item = gtk_menu_item_new_with_mnemonic (_("Cancel")); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); - gtk_widget_show (menu_item); - - damd.chosen = 0; - damd.loop = g_main_loop_new (NULL, FALSE); - - g_signal_connect (menu, "deactivate", - G_CALLBACK (menu_deactivate_callback), - &damd); - - gtk_grab_add (menu); - - gtk_menu_popup (GTK_MENU (menu), NULL, NULL, - NULL, NULL, 0, GDK_CURRENT_TIME); - - g_main_loop_run (damd.loop); - - gtk_grab_remove (menu); - - g_main_loop_unref (damd.loop); - - g_object_ref_sink (menu); - g_object_unref (menu); - - return damd.chosen; +nautilus_drag_drop_action_ask (GtkWidget *widget, + GdkDragAction actions) +{ + GtkWidget *menu; + GtkWidget *menu_item; + DropActionMenuData damd; + + /* Create the menu and set the sensitivity of the items based on the + * allowed actions. + */ + menu = gtk_menu_new (); + gtk_menu_set_screen (GTK_MENU (menu), gtk_widget_get_screen (widget)); + + append_drop_action_menu_item (menu, _("_Move Here"), + GDK_ACTION_MOVE, + (actions & GDK_ACTION_MOVE) != 0, + &damd); + + append_drop_action_menu_item (menu, _("_Copy Here"), + GDK_ACTION_COPY, + (actions & GDK_ACTION_COPY) != 0, + &damd); + + append_drop_action_menu_item (menu, _("_Link Here"), + GDK_ACTION_LINK, + (actions & GDK_ACTION_LINK) != 0, + &damd); + + eel_gtk_menu_append_separator (GTK_MENU (menu)); + + menu_item = gtk_menu_item_new_with_mnemonic (_("Cancel")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + gtk_widget_show (menu_item); + + damd.chosen = 0; + damd.loop = g_main_loop_new (NULL, FALSE); + + g_signal_connect (menu, "deactivate", + G_CALLBACK (menu_deactivate_callback), + &damd); + + gtk_grab_add (menu); + + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, + NULL, NULL, 0, GDK_CURRENT_TIME); + + g_main_loop_run (damd.loop); + + gtk_grab_remove (menu); + + g_main_loop_unref (damd.loop); + + g_object_ref_sink (menu); + g_object_unref (menu); + + return damd.chosen; } gboolean nautilus_drag_autoscroll_in_scroll_region (GtkWidget *widget) { - float x_scroll_delta, y_scroll_delta; + float x_scroll_delta, y_scroll_delta; - nautilus_drag_autoscroll_calculate_delta (widget, &x_scroll_delta, &y_scroll_delta); + nautilus_drag_autoscroll_calculate_delta (widget, &x_scroll_delta, &y_scroll_delta); - return x_scroll_delta != 0 || y_scroll_delta != 0; + return x_scroll_delta != 0 || y_scroll_delta != 0; } void -nautilus_drag_autoscroll_calculate_delta (GtkWidget *widget, float *x_scroll_delta, float *y_scroll_delta) -{ - GtkAllocation allocation; - GdkDisplay *display; - GdkSeat *seat; - GdkDevice *pointer; - int x, y; - - g_assert (GTK_IS_WIDGET (widget)); - - display = gtk_widget_get_display (widget); - seat = gdk_display_get_default_seat (display); - pointer = gdk_seat_get_pointer (seat); - gdk_window_get_device_position (gtk_widget_get_window (widget), pointer, - &x, &y, NULL); - - /* Find out if we are anywhere close to the tree view edges - * to see if we need to autoscroll. - */ - *x_scroll_delta = 0; - *y_scroll_delta = 0; - - if (x < AUTO_SCROLL_MARGIN) { - *x_scroll_delta = (float)(x - AUTO_SCROLL_MARGIN); - } - - gtk_widget_get_allocation (widget, &allocation); - if (x > allocation.width - AUTO_SCROLL_MARGIN) { - if (*x_scroll_delta != 0) { - /* Already trying to scroll because of being too close to - * the top edge -- must be the window is really short, - * don't autoscroll. - */ - return; - } - *x_scroll_delta = (float)(x - (allocation.width - AUTO_SCROLL_MARGIN)); - } - - if (y < AUTO_SCROLL_MARGIN) { - *y_scroll_delta = (float)(y - AUTO_SCROLL_MARGIN); - } - - if (y > allocation.height - AUTO_SCROLL_MARGIN) { - if (*y_scroll_delta != 0) { - /* Already trying to scroll because of being too close to - * the top edge -- must be the window is really narrow, - * don't autoscroll. - */ - return; - } - *y_scroll_delta = (float)(y - (allocation.height - AUTO_SCROLL_MARGIN)); - } - - if (*x_scroll_delta == 0 && *y_scroll_delta == 0) { - /* no work */ - return; - } - - /* Adjust the scroll delta to the proper acceleration values depending on how far - * into the sroll margins we are. - * FIXME bugzilla.eazel.com 2486: - * we could use an exponential acceleration factor here for better feel - */ - if (*x_scroll_delta != 0) { - *x_scroll_delta /= AUTO_SCROLL_MARGIN; - *x_scroll_delta *= (MAX_AUTOSCROLL_DELTA - MIN_AUTOSCROLL_DELTA); - *x_scroll_delta += MIN_AUTOSCROLL_DELTA; - } - - if (*y_scroll_delta != 0) { - *y_scroll_delta /= AUTO_SCROLL_MARGIN; - *y_scroll_delta *= (MAX_AUTOSCROLL_DELTA - MIN_AUTOSCROLL_DELTA); - *y_scroll_delta += MIN_AUTOSCROLL_DELTA; - } - +nautilus_drag_autoscroll_calculate_delta (GtkWidget *widget, + float *x_scroll_delta, + float *y_scroll_delta) +{ + GtkAllocation allocation; + GdkDisplay *display; + GdkSeat *seat; + GdkDevice *pointer; + int x, y; + + g_assert (GTK_IS_WIDGET (widget)); + + display = gtk_widget_get_display (widget); + seat = gdk_display_get_default_seat (display); + pointer = gdk_seat_get_pointer (seat); + gdk_window_get_device_position (gtk_widget_get_window (widget), pointer, + &x, &y, NULL); + + /* Find out if we are anywhere close to the tree view edges + * to see if we need to autoscroll. + */ + *x_scroll_delta = 0; + *y_scroll_delta = 0; + + if (x < AUTO_SCROLL_MARGIN) + { + *x_scroll_delta = (float) (x - AUTO_SCROLL_MARGIN); + } + + gtk_widget_get_allocation (widget, &allocation); + if (x > allocation.width - AUTO_SCROLL_MARGIN) + { + if (*x_scroll_delta != 0) + { + /* Already trying to scroll because of being too close to + * the top edge -- must be the window is really short, + * don't autoscroll. + */ + return; + } + *x_scroll_delta = (float) (x - (allocation.width - AUTO_SCROLL_MARGIN)); + } + + if (y < AUTO_SCROLL_MARGIN) + { + *y_scroll_delta = (float) (y - AUTO_SCROLL_MARGIN); + } + + if (y > allocation.height - AUTO_SCROLL_MARGIN) + { + if (*y_scroll_delta != 0) + { + /* Already trying to scroll because of being too close to + * the top edge -- must be the window is really narrow, + * don't autoscroll. + */ + return; + } + *y_scroll_delta = (float) (y - (allocation.height - AUTO_SCROLL_MARGIN)); + } + + if (*x_scroll_delta == 0 && *y_scroll_delta == 0) + { + /* no work */ + return; + } + + /* Adjust the scroll delta to the proper acceleration values depending on how far + * into the sroll margins we are. + * FIXME bugzilla.eazel.com 2486: + * we could use an exponential acceleration factor here for better feel + */ + if (*x_scroll_delta != 0) + { + *x_scroll_delta /= AUTO_SCROLL_MARGIN; + *x_scroll_delta *= (MAX_AUTOSCROLL_DELTA - MIN_AUTOSCROLL_DELTA); + *x_scroll_delta += MIN_AUTOSCROLL_DELTA; + } + + if (*y_scroll_delta != 0) + { + *y_scroll_delta /= AUTO_SCROLL_MARGIN; + *y_scroll_delta *= (MAX_AUTOSCROLL_DELTA - MIN_AUTOSCROLL_DELTA); + *y_scroll_delta += MIN_AUTOSCROLL_DELTA; + } } void nautilus_drag_autoscroll_start (NautilusDragInfo *drag_info, - GtkWidget *widget, - GSourceFunc callback, - gpointer user_data) -{ - if (nautilus_drag_autoscroll_in_scroll_region (widget)) { - if (drag_info->auto_scroll_timeout_id == 0) { - drag_info->waiting_to_autoscroll = TRUE; - drag_info->start_auto_scroll_in = g_get_monotonic_time () - + AUTOSCROLL_INITIAL_DELAY; - - drag_info->auto_scroll_timeout_id = g_timeout_add - (AUTOSCROLL_TIMEOUT_INTERVAL, - callback, - user_data); - } - } else { - if (drag_info->auto_scroll_timeout_id != 0) { - g_source_remove (drag_info->auto_scroll_timeout_id); - drag_info->auto_scroll_timeout_id = 0; - } - } + GtkWidget *widget, + GSourceFunc callback, + gpointer user_data) +{ + if (nautilus_drag_autoscroll_in_scroll_region (widget)) + { + if (drag_info->auto_scroll_timeout_id == 0) + { + drag_info->waiting_to_autoscroll = TRUE; + drag_info->start_auto_scroll_in = g_get_monotonic_time () + + AUTOSCROLL_INITIAL_DELAY; + + drag_info->auto_scroll_timeout_id = g_timeout_add + (AUTOSCROLL_TIMEOUT_INTERVAL, + callback, + user_data); + } + } + else + { + if (drag_info->auto_scroll_timeout_id != 0) + { + g_source_remove (drag_info->auto_scroll_timeout_id); + drag_info->auto_scroll_timeout_id = 0; + } + } } void nautilus_drag_autoscroll_stop (NautilusDragInfo *drag_info) { - if (drag_info->auto_scroll_timeout_id != 0) { - g_source_remove (drag_info->auto_scroll_timeout_id); - drag_info->auto_scroll_timeout_id = 0; - } + if (drag_info->auto_scroll_timeout_id != 0) + { + g_source_remove (drag_info->auto_scroll_timeout_id); + drag_info->auto_scroll_timeout_id = 0; + } } gboolean nautilus_drag_selection_includes_special_link (GList *selection_list) { - GList *node; - char *uri; + GList *node; + char *uri; - for (node = selection_list; node != NULL; node = node->next) { - uri = ((NautilusDragSelectionItem *) node->data)->uri; + for (node = selection_list; node != NULL; node = node->next) + { + uri = ((NautilusDragSelectionItem *) node->data)->uri; + + if (eel_uri_is_desktop (uri)) + { + return TRUE; + } + } - if (eel_uri_is_desktop (uri)) { - return TRUE; - } - } - - return FALSE; + return FALSE; } |