diff options
author | Cosimo Cecchi <cosimoc@gnome.org> | 2008-05-19 23:20:58 +0000 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@src.gnome.org> | 2008-05-19 23:20:58 +0000 |
commit | 3befbe347efabba62285675978c7c491117c953d (patch) | |
tree | 38a53e3dd95aa197ee6b376b8e47908cc965dec4 /libnautilus-private | |
parent | ddc055fab0f9d7490fc08754c4b9aee7cdb975ce (diff) | |
download | nautilus-3befbe347efabba62285675978c7c491117c953d.tar.gz |
Empty the clipboard when copying/moving with DnD a file contained in it.
2008-05-20 Cosimo Cecchi <cosimoc@gnome.org>
* libnautilus-private/nautilus-clipboard.c:
(convert_lines_to_str_list),
(nautilus_clipboard_get_uri_list_from_selection_data),
(nautilus_clipboard_get),
(nautilus_clipboard_clear_if_colliding_uris):
* libnautilus-private/nautilus-clipboard.h:
* src/file-manager/fm-directory-view.c:
(fm_directory_view_get_copied_files_atom), (copy_or_cut_files),
(paste_clipboard_data), (action_paste_files_callback),
(paste_into), (real_update_paste_menu):
* src/file-manager/fm-directory-view.h:
* src/file-manager/fm-icon-view.c: (icon_view_move_copy_items):
* src/file-manager/fm-list-view.c: (move_copy_items_callback):
* src/file-manager/fm-tree-view.c: (move_copy_items_callback),
(button_pressed_callback), (copy_or_cut_files),
(paste_clipboard_data), (fm_tree_view_paste_cb):
Empty the clipboard when copying/moving with DnD a file contained
in it. Also, refactor some clipboard code from fm-directory-view.c and
fm-tree-view.c into nautilus-clipboard.c. (#532850).
svn path=/trunk/; revision=14181
Diffstat (limited to 'libnautilus-private')
-rw-r--r-- | libnautilus-private/nautilus-clipboard.c | 97 | ||||
-rw-r--r-- | libnautilus-private/nautilus-clipboard.h | 9 |
2 files changed, 105 insertions, 1 deletions
diff --git a/libnautilus-private/nautilus-clipboard.c b/libnautilus-private/nautilus-clipboard.c index a41d1224a..8b9520bfd 100644 --- a/libnautilus-private/nautilus-clipboard.c +++ b/libnautilus-private/nautilus-clipboard.c @@ -39,6 +39,7 @@ #include <gtk/gtksignal.h> #include <gtk/gtktext.h> #include <gtk/gtktextview.h> +#include <eel/eel-glib-extensions.h> #include <string.h> typedef struct _TargetCallbackData TargetCallbackData; @@ -553,4 +554,100 @@ nautilus_clipboard_set_up_text_view (GtkTextView *target, text_view_disconnect_callbacks); } +static GList * +convert_lines_to_str_list (char **lines, gboolean *cut) +{ + int i; + GList *result; + + if (cut) { + *cut = FALSE; + } + + if (lines[0] == NULL) { + return NULL; + } + if (strcmp (lines[0], "cut") == 0) { + if (cut) { + *cut = TRUE; + } + } else if (strcmp (lines[0], "copy") != 0) { + return NULL; + } + + result = NULL; + for (i = 1; lines[i] != NULL; i++) { + result = g_list_prepend (result, g_strdup (lines[i])); + } + return g_list_reverse (result); +} + +GList* +nautilus_clipboard_get_uri_list_from_selection_data (GtkSelectionData *selection_data, + gboolean *cut, + GdkAtom copied_files_atom) +{ + GList *items; + char **lines; + + if (selection_data->type != copied_files_atom + || selection_data->length <= 0) { + items = NULL; + } else { + /* Not sure why it's legal to assume there's an extra byte + * past the end of the selection data that it's safe to write + * to. But gtk_editable_selection_received does this, so I + * think it is OK. + */ + selection_data->data[selection_data->length] = '\0'; + lines = g_strsplit (selection_data->data, "\n", 0); + items = convert_lines_to_str_list (lines, cut); + g_strfreev (lines); + } + + return items; +} + +GtkClipboard * +nautilus_clipboard_get (GtkWidget *widget) +{ + return gtk_clipboard_get_for_display (gtk_widget_get_display (GTK_WIDGET (widget)), + GDK_SELECTION_CLIPBOARD); +} + +void +nautilus_clipboard_clear_if_colliding_uris (GtkWidget *widget, + const GList *item_uris, + GdkAtom copied_files_atom) +{ + GtkSelectionData *data; + GList *clipboard_item_uris, *l; + gboolean collision; + + collision = FALSE; + data = gtk_clipboard_wait_for_contents (nautilus_clipboard_get (widget), + copied_files_atom); + if (data == NULL) { + return; + } + + clipboard_item_uris = nautilus_clipboard_get_uri_list_from_selection_data (data, NULL, + copied_files_atom); + + for (l = (GList *) item_uris; l; l = l->next) { + if (g_list_find_custom ((GList *) item_uris, l->data, + (GCompareFunc) g_strcmp0)) { + collision = TRUE; + break; + } + } + + if (collision) { + gtk_clipboard_clear (nautilus_clipboard_get (widget)); + } + + if (clipboard_item_uris) { + eel_g_list_free_deep (clipboard_item_uris); + } +} diff --git a/libnautilus-private/nautilus-clipboard.h b/libnautilus-private/nautilus-clipboard.h index 8640ba74d..170f456ec 100644 --- a/libnautilus-private/nautilus-clipboard.h +++ b/libnautilus-private/nautilus-clipboard.h @@ -44,6 +44,13 @@ void nautilus_clipboard_set_up_editable (GtkEditable *target, gboolean shares_selection_changes); void nautilus_clipboard_set_up_text_view (GtkTextView *target, GtkUIManager *ui_manager); - +void nautilus_clipboard_clear_if_colliding_uris (GtkWidget *widget, + const GList *item_uris, + GdkAtom copied_files_atom); +GtkClipboard* nautilus_clipboard_get (GtkWidget *widget); +GList* nautilus_clipboard_get_uri_list_from_selection_data + (GtkSelectionData *selection_data, + gboolean *cut, + GdkAtom copied_files_atom); #endif /* NAUTILUS_CLIPBOARD_H */ |