summaryrefslogtreecommitdiff
path: root/libnautilus-private/nautilus-clipboard.c
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2008-05-19 23:20:58 +0000
committerCosimo Cecchi <cosimoc@src.gnome.org>2008-05-19 23:20:58 +0000
commit3befbe347efabba62285675978c7c491117c953d (patch)
tree38a53e3dd95aa197ee6b376b8e47908cc965dec4 /libnautilus-private/nautilus-clipboard.c
parentddc055fab0f9d7490fc08754c4b9aee7cdb975ce (diff)
downloadnautilus-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/nautilus-clipboard.c')
-rw-r--r--libnautilus-private/nautilus-clipboard.c97
1 files changed, 97 insertions, 0 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);
+ }
+}