Am Freitag, den 01.07.2005, 12:07 +0200 schrieb Alexander Larsson: > On Thu, 2005-06-30 at 14:31 +0200, Christian Neumair wrote: > > Am Donnerstag, den 23.06.2005, 22:07 +0200 schrieb Christian Neumair: > > > Am Dienstag, den 07.06.2005, 11:36 +0200 schrieb Alexander Larsson: > > > > On Thu, 2005-06-02 at 11:33 +0200, Christian Neumair wrote: > > > > > One thing that bugged me for ages in Nautilus is that one can not drop > > > > > text (from gedit, Epiphany) to Nautilus to create a new file. After > > > > > applying the attached patch, this works. > > > > > > > [patch review] > > > > > > Thanks for your review! The attached patch should fix all the issues you pointed out. > > > > OK, new version. I've now also fixed the handle_* method declarations > > and the odd > > nautilus_file_operations_new_file_from_template/target_filename variable > > usage. > > I tested this, and it doesn't seem to handle dnd of non-ascii. I tried > to drop "åäö" into a file and got: "\u00e5\u00e4\u00f6". OK, I've fixed this. We should have received the dropped text by gtk_selection_data_get_text instead of simply using the raw data. I've also redefined NAUTILUS_ICON_DND_TEXT_TYPE to "UTF8_STRING" instead of "text/plain". Without the latter it didn't work. If it turns out that "UTF8_STRING" isn't enough for our needs, we can also use gtk_drag_dest_add_text_targets and friends. -- Christian Neumair <chris gnome-de org>
Index: libnautilus-private/nautilus-dnd.h =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-dnd.h,v retrieving revision 1.11 diff -u -p -r1.11 nautilus-dnd.h --- libnautilus-private/nautilus-dnd.h 13 Jan 2005 13:27:51 -0000 1.11 +++ libnautilus-private/nautilus-dnd.h 1 Jul 2005 20:37:09 -0000 @@ -32,7 +32,7 @@ /* Drag & Drop target names. */ #define NAUTILUS_ICON_DND_GNOME_ICON_LIST_TYPE "x-special/gnome-icon-list" #define NAUTILUS_ICON_DND_URI_LIST_TYPE "text/uri-list" -#define NAUTILUS_ICON_DND_TEXT_TYPE "text/plain" +#define NAUTILUS_ICON_DND_TEXT_TYPE "UTF8_STRING" #define NAUTILUS_ICON_DND_URL_TYPE "_NETSCAPE_URL" #define NAUTILUS_ICON_DND_COLOR_TYPE "application/x-color" #define NAUTILUS_ICON_DND_BGIMAGE_TYPE "property/bgimage" Index: libnautilus-private/nautilus-file-operations.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file-operations.c,v retrieving revision 1.191 diff -u -p -r1.191 nautilus-file-operations.c --- libnautilus-private/nautilus-file-operations.c 1 Jul 2005 15:39:07 -0000 1.191 +++ libnautilus-private/nautilus-file-operations.c 1 Jul 2005 20:37:11 -0000 @@ -26,6 +26,7 @@ #include <config.h> #include <string.h> +#include <stdio.h> #include "nautilus-file-operations.h" #include "nautilus-file-operations-progress.h" @@ -38,6 +39,7 @@ #include <eel/eel-vfs-extensions.h> #include <gnome.h> +#include <gdk/gdkdnd.h> #include <gtk/gtklabel.h> #include <gtk/gtkmessagedialog.h> #include <libgnomevfs/gnome-vfs-async-ops.h> @@ -2231,7 +2233,6 @@ typedef struct { NautilusNewFileCallback done_callback; gpointer data; GtkWidget *parent_view; - char *empty_file; GHashTable *debuting_uris; } NewFileTransferState; @@ -2298,11 +2299,6 @@ new_file_transfer_callback (GnomeVFSAsyn (* state->done_callback) (uri, state->data); /* uri is owned by hashtable, don't free */ - - if (state->empty_file != NULL) { - unlink (state->empty_file); - g_free (state->empty_file); - } eel_remove_weak_pointer (&state->parent_view); g_hash_table_destroy (state->debuting_uris); g_free (state); @@ -2351,61 +2347,48 @@ new_file_transfer_callback (GnomeVFSAsyn } void -nautilus_file_operations_new_file (GtkWidget *parent_view, - const char *parent_dir, - const char *source_uri_text, - NautilusNewFileCallback done_callback, - gpointer data) +nautilus_file_operations_new_file_from_template (GtkWidget *parent_view, + const char *parent_dir, + const char *target_filename, + const char *template_uri, + gboolean move_template, + NautilusNewFileCallback done_callback, + gpointer data) { GList *target_uri_list; GList *source_uri_list; GnomeVFSURI *target_uri, *parent_uri, *source_uri; - char *filename; + GnomeVFSXferOptions options; NewFileTransferState *state; SyncTransferInfo *sync_transfer_info; + char *tmp; + + g_assert (parent_dir != NULL); + g_assert (template_uri != NULL); state = g_new (NewFileTransferState, 1); state->done_callback = done_callback; state->data = data; state->parent_view = parent_view; - state->empty_file = NULL; /* pass in the target directory and the new folder name as a destination URI */ parent_uri = gnome_vfs_uri_new (parent_dir); - if (source_uri_text != NULL) { - source_uri = gnome_vfs_uri_new (source_uri_text); - if (source_uri == NULL) { - (*done_callback) (NULL, data); - g_free (state); - return; - } - filename = gnome_vfs_uri_extract_short_path_name (source_uri); - target_uri = gnome_vfs_uri_append_string (parent_uri, filename); - g_free (filename); + source_uri = gnome_vfs_uri_new (template_uri); + if (source_uri == NULL) { + (*done_callback) (NULL, data); + g_free (state); + return; + } + + if (target_filename != NULL) { + target_uri = gnome_vfs_uri_append_file_name (parent_uri, target_filename); } else { - char empty_file[] = "/tmp/emptyXXXXXX"; - char *empty_uri; - int fd; - - fd = mkstemp (empty_file); - if (fd == -1) { - (*done_callback) (NULL, data); - g_free (state); - } - close (fd); - - empty_uri = gnome_vfs_get_uri_from_local_path (empty_file); - source_uri = gnome_vfs_uri_new (empty_uri); - g_free (empty_uri); - - state->empty_file = g_strdup (empty_file); - - filename = g_filename_from_utf8 (_("new file"), -1, NULL, NULL, NULL); - target_uri = gnome_vfs_uri_append_file_name (parent_uri, filename); - g_free (filename); + tmp = gnome_vfs_uri_extract_short_name (source_uri); + target_uri = gnome_vfs_uri_append_file_name (parent_uri, tmp); + g_free (tmp); } - + state->debuting_uris = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); eel_add_weak_pointer (&state->parent_view); @@ -2415,9 +2398,14 @@ nautilus_file_operations_new_file (GtkWi sync_transfer_info = g_new (SyncTransferInfo, 1); sync_transfer_info->iterator = NULL; sync_transfer_info->debuting_uris = state->debuting_uris; - + + options = GNOME_VFS_XFER_USE_UNIQUE_NAMES; + if (move_template) { + options |= GNOME_VFS_XFER_REMOVESOURCE; + } + gnome_vfs_async_xfer (&state->handle, source_uri_list, target_uri_list, - GNOME_VFS_XFER_USE_UNIQUE_NAMES, + options, GNOME_VFS_XFER_ERROR_MODE_QUERY, GNOME_VFS_XFER_OVERWRITE_MODE_QUERY, GNOME_VFS_PRIORITY_DEFAULT, @@ -2427,6 +2415,50 @@ nautilus_file_operations_new_file (GtkWi gnome_vfs_uri_list_free (target_uri_list); gnome_vfs_uri_list_free (source_uri_list); gnome_vfs_uri_unref (parent_uri); +} + +void +nautilus_file_operations_new_file (GtkWidget *parent_view, + const char *parent_dir, + const char *initial_contents, + NautilusNewFileCallback done_callback, + gpointer data) +{ + char source_file_str[] = "/tmp/nautilus-sourceXXXXXX"; + char *source_file_uri; + FILE *source_file; + char *target_filename; + int fd; + + fd = mkstemp (source_file_str); + if (fd == -1) { + (*done_callback) (NULL, data); + return; + } + + if (initial_contents != NULL) { + source_file = fdopen (fd, "a+"); + + fprintf (source_file, "%s", initial_contents); + fclose (source_file); + } + + close (fd); + + target_filename = g_filename_from_utf8 (_("new file"), -1, NULL, NULL, NULL); + + source_file_uri = gnome_vfs_get_uri_from_local_path (source_file_str); + + nautilus_file_operations_new_file_from_template (parent_view, + parent_dir, + target_filename, + source_file_uri, + TRUE, + done_callback, + data); + + g_free (source_file_uri); + g_free (target_filename); } void Index: libnautilus-private/nautilus-file-operations.h =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file-operations.h,v retrieving revision 1.19 diff -u -p -r1.19 nautilus-file-operations.h --- libnautilus-private/nautilus-file-operations.h 12 Dec 2003 17:55:45 -0000 1.19 +++ libnautilus-private/nautilus-file-operations.h 1 Jul 2005 20:37:11 -0000 @@ -27,6 +27,7 @@ #ifndef NAUTILUS_FILE_OPERATIONS_H #define NAUTILUS_FILE_OPERATIONS_H +#include <gdk/gdkdnd.h> #include <gtk/gtkwidget.h> #include <libgnomevfs/gnome-vfs-types.h> @@ -53,9 +54,17 @@ void nautilus_file_operations_new_folder gpointer done_callback_data); void nautilus_file_operations_new_file (GtkWidget *parent_view, const char *parent_dir, - const char *source_uri_text, + const char *initial_contents, NautilusNewFileCallback done_callback, gpointer data); +void nautilus_file_operations_new_file_from_template (GtkWidget *parent_view, + const char *parent_dir, + const char *target_filename, + const char *template_uri, + gboolean move_template, + NautilusNewFileCallback done_callback, + gpointer data); + void nautilus_file_operations_delete (const GList *item_uris, GtkWidget *parent_view); Index: libnautilus-private/nautilus-icon-container.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-container.c,v retrieving revision 1.389 diff -u -p -r1.389 nautilus-icon-container.c --- libnautilus-private/nautilus-icon-container.c 20 Jun 2005 08:58:04 -0000 1.389 +++ libnautilus-private/nautilus-icon-container.c 1 Jul 2005 20:37:14 -0000 @@ -231,6 +231,7 @@ enum { MOVE_COPY_ITEMS, HANDLE_URL, HANDLE_URI_LIST, + HANDLE_TEXT, PREVIEW, SELECTION_CHANGED, ICON_ADDED, @@ -4117,12 +4118,12 @@ nautilus_icon_container_class_init (Naut G_STRUCT_OFFSET (NautilusIconContainerClass, move_copy_items), NULL, NULL, - nautilus_marshal_VOID__POINTER_POINTER_POINTER_INT_INT_INT, + nautilus_marshal_VOID__POINTER_POINTER_POINTER_ENUM_INT_INT, G_TYPE_NONE, 6, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER, - G_TYPE_INT, + GDK_TYPE_DRAG_ACTION, G_TYPE_INT, G_TYPE_INT); signals[HANDLE_URL] @@ -4132,10 +4133,10 @@ nautilus_icon_container_class_init (Naut G_STRUCT_OFFSET (NautilusIconContainerClass, handle_url), NULL, NULL, - nautilus_marshal_VOID__STRING_INT_INT_INT, + nautilus_marshal_VOID__STRING_ENUM_INT_INT, G_TYPE_NONE, 4, G_TYPE_STRING, - G_TYPE_INT, + GDK_TYPE_DRAG_ACTION, G_TYPE_INT, G_TYPE_INT); signals[HANDLE_URI_LIST] @@ -4145,13 +4146,25 @@ nautilus_icon_container_class_init (Naut G_STRUCT_OFFSET (NautilusIconContainerClass, handle_uri_list), NULL, NULL, - nautilus_marshal_VOID__STRING_INT_INT_INT, + nautilus_marshal_VOID__STRING_ENUM_INT_INT, G_TYPE_NONE, 4, G_TYPE_STRING, + GDK_TYPE_DRAG_ACTION, G_TYPE_INT, + G_TYPE_INT); + signals[HANDLE_TEXT] + = g_signal_new ("handle_text", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusIconContainerClass, + handle_text), + NULL, NULL, + nautilus_marshal_VOID__STRING_ENUM_INT_INT, + G_TYPE_NONE, 4, + G_TYPE_STRING, + GDK_TYPE_DRAG_ACTION, G_TYPE_INT, G_TYPE_INT); - signals[GET_CONTAINER_URI] = g_signal_new ("get_container_uri", G_TYPE_FROM_CLASS (class), Index: libnautilus-private/nautilus-icon-container.h =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-container.h,v retrieving revision 1.86 diff -u -p -r1.86 nautilus-icon-container.h --- libnautilus-private/nautilus-icon-container.h 2 Jun 2005 10:48:55 -0000 1.86 +++ libnautilus-private/nautilus-icon-container.h 1 Jul 2005 20:37:15 -0000 @@ -97,15 +97,22 @@ typedef struct { GList *item_uris, GdkPoint *relative_item_points, const char *target_uri, - int copy_action, + GdkDragAction action, int x, int y); void (* handle_url) (NautilusIconContainer *container, char *url, + GdkDragAction action, int x, int y); void (* handle_uri_list) (NautilusIconContainer *container, char *uri_list, + GdkDragAction action, + int x, + int y); + void (* handle_text) (NautilusIconContainer *container, + char *text, + GdkDragAction action, int x, int y); Index: libnautilus-private/nautilus-icon-dnd.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-dnd.c,v retrieving revision 1.144 diff -u -p -r1.144 nautilus-icon-dnd.c --- libnautilus-private/nautilus-icon-dnd.c 15 Jun 2005 18:04:16 -0000 1.144 +++ libnautilus-private/nautilus-icon-dnd.c 1 Jul 2005 20:37:21 -0000 @@ -72,6 +72,7 @@ static const GtkTargetEntry drop_types [ { NAUTILUS_ICON_DND_GNOME_ICON_LIST_TYPE, 0, NAUTILUS_ICON_DND_GNOME_ICON_LIST }, { NAUTILUS_ICON_DND_URI_LIST_TYPE, 0, NAUTILUS_ICON_DND_URI_LIST }, { NAUTILUS_ICON_DND_URL_TYPE, 0, NAUTILUS_ICON_DND_URL }, + { NAUTILUS_ICON_DND_TEXT_TYPE, 0, NAUTILUS_ICON_DND_TEXT }, { NAUTILUS_ICON_DND_COLOR_TYPE, 0, NAUTILUS_ICON_DND_COLOR }, { NAUTILUS_ICON_DND_BGIMAGE_TYPE, 0, NAUTILUS_ICON_DND_BGIMAGE }, { NAUTILUS_ICON_DND_KEYWORD_TYPE, 0, NAUTILUS_ICON_DND_KEYWORD }, @@ -643,6 +644,20 @@ receive_dropped_uri_list (NautilusIconCo x, y); } +/* handle dropped text */ +static void +receive_dropped_text (NautilusIconContainer *container, const char *text, GdkDragAction action, int x, int y) +{ + if (text == NULL) { + return; + } + + g_signal_emit_by_name (container, "handle_text", + text, + action, + x, y); +} + static int auto_scroll_timeout_callback (gpointer data) { @@ -1131,6 +1146,7 @@ nautilus_icon_container_get_drop_action break; case NAUTILUS_ICON_DND_TEXT: + *action = GDK_ACTION_COPY; break; } } @@ -1551,6 +1567,7 @@ drag_data_received_callback (GtkWidget * { NautilusDragInfo *drag_info; EelBackground *background; + char *tmp; gboolean success; drag_info = &(NAUTILUS_ICON_CONTAINER (widget)->details->dnd_info->drag_info); @@ -1566,6 +1583,7 @@ drag_data_received_callback (GtkWidget * case NAUTILUS_ICON_DND_BGIMAGE: case NAUTILUS_ICON_DND_KEYWORD: case NAUTILUS_ICON_DND_URI_LIST: + case NAUTILUS_ICON_DND_TEXT: case NAUTILUS_ICON_DND_RESET_BACKGROUND: /* Save the data so we can do the actual work on drop. */ if (drag_info->selection_data != NULL) { @@ -1627,6 +1645,14 @@ drag_data_received_callback (GtkWidget * (NAUTILUS_ICON_CONTAINER (widget), (char *) data->data, context->action, x, y); success = TRUE; + break; + case NAUTILUS_ICON_DND_TEXT: + tmp = gtk_selection_data_get_text (data); + receive_dropped_text + (NAUTILUS_ICON_CONTAINER (widget), + (char *) tmp, context->action, x, y); + success = TRUE; + g_free (tmp); break; case NAUTILUS_ICON_DND_RESET_BACKGROUND: background = eel_get_widget_background (widget); Index: libnautilus-private/nautilus-marshal.list =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-marshal.list,v retrieving revision 1.8 diff -u -p -r1.8 nautilus-marshal.list --- libnautilus-private/nautilus-marshal.list 13 Jan 2005 13:27:51 -0000 1.8 +++ libnautilus-private/nautilus-marshal.list 1 Jul 2005 20:37:21 -0000 @@ -6,11 +6,11 @@ INT:POINTER,BOOLEAN INT:POINTER,POINTER POINTER:VOID VOID:DOUBLE -VOID:STRING,INT,INT,INT +VOID:STRING,ENUM,INT,INT VOID:POINTER,POINTER VOID:POINTER,POINTER VOID:POINTER,STRING +VOID:POINTER,STRING,ENUM,INT,INT VOID:STRING,STRING -VOID:POINTER,POINTER,POINTER,INT,INT,INT -VOID:POINTER,STRING,UINT,INT,INT +VOID:POINTER,POINTER,POINTER,ENUM,INT,INT VOID:POINTER,ENUM Index: libnautilus-private/nautilus-tree-view-drag-dest.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-tree-view-drag-dest.c,v retrieving revision 1.9 diff -u -p -r1.9 nautilus-tree-view-drag-dest.c --- libnautilus-private/nautilus-tree-view-drag-dest.c 16 Jun 2005 13:43:10 -0000 1.9 +++ libnautilus-private/nautilus-tree-view-drag-dest.c 1 Jul 2005 20:37:21 -0000 @@ -65,6 +65,7 @@ enum { MOVE_COPY_ITEMS, HANDLE_URL, HANDLE_URI_LIST, + HANDLE_TEXT, LAST_SIGNAL }; @@ -80,7 +81,8 @@ GNOME_CLASS_BOILERPLATE (NautilusTreeVie static const GtkTargetEntry drag_types [] = { { NAUTILUS_ICON_DND_GNOME_ICON_LIST_TYPE, 0, NAUTILUS_ICON_DND_GNOME_ICON_LIST }, { NAUTILUS_ICON_DND_URI_LIST_TYPE, 0, NAUTILUS_ICON_DND_URI_LIST }, - { NAUTILUS_ICON_DND_URL_TYPE, 0, NAUTILUS_ICON_DND_URL } + { NAUTILUS_ICON_DND_URL_TYPE, 0, NAUTILUS_ICON_DND_URL }, + { NAUTILUS_ICON_DND_TEXT_TYPE, 0, NAUTILUS_ICON_DND_TEXT } /* FIXME: Should handle emblems once the list view supports them */ }; @@ -384,6 +386,17 @@ get_drop_action (NautilusTreeViewDragDes case NAUTILUS_ICON_DND_URI_LIST : return context->suggested_action; + + case NAUTILUS_ICON_DND_TEXT: + drop_target = get_drop_target (dest, path); + + if (!drop_target) { + return 0; + } + + g_free (drop_target); + + return GDK_ACTION_COPY; } return 0; @@ -580,6 +593,26 @@ receive_dropped_uri_list (NautilusTreeVi } static void +receive_dropped_text (NautilusTreeViewDragDest *dest, + GdkDragContext *context, + int x, int y) +{ + char *text; + + if (!dest->details->drag_data) { + return; + } + + text = gtk_selection_data_get_text (dest->details->drag_data); + g_signal_emit (dest, signals[HANDLE_TEXT], 0, + (char *) text, + context->action, + x, y); + g_free (text); +} + + +static void receive_dropped_url (NautilusTreeViewDragDest *dest, GdkDragContext *context, int x, int y) @@ -620,6 +653,8 @@ drag_data_received_callback (GtkWidget * } } + g_warning ("teest: %s", gtk_selection_data_get_text (selection_data)); + if (dest->details->drop_occurred) { success = FALSE; switch (info) { @@ -635,6 +670,10 @@ drag_data_received_callback (GtkWidget * receive_dropped_uri_list (dest, context, x, y); success = TRUE; break; + case NAUTILUS_ICON_DND_TEXT: + receive_dropped_text (dest, context, x, y); + success = TRUE; + break; } dest->details->drop_occurred = FALSE; @@ -762,11 +801,11 @@ nautilus_tree_view_drag_dest_class_init move_copy_items), NULL, NULL, - nautilus_marshal_VOID__POINTER_STRING_UINT_INT_INT, + nautilus_marshal_VOID__POINTER_STRING_ENUM_INT_INT, G_TYPE_NONE, 5, G_TYPE_POINTER, G_TYPE_STRING, - G_TYPE_UINT, + GDK_TYPE_DRAG_ACTION, G_TYPE_INT, G_TYPE_INT); signals[HANDLE_URL] = @@ -776,10 +815,10 @@ nautilus_tree_view_drag_dest_class_init G_STRUCT_OFFSET (NautilusTreeViewDragDestClass, handle_url), NULL, NULL, - nautilus_marshal_VOID__STRING_INT_INT_INT, + nautilus_marshal_VOID__STRING_ENUM_INT_INT, G_TYPE_NONE, 4, G_TYPE_STRING, - G_TYPE_INT, + GDK_TYPE_DRAG_ACTION, G_TYPE_INT, G_TYPE_INT); signals[HANDLE_URI_LIST] = @@ -789,10 +828,23 @@ nautilus_tree_view_drag_dest_class_init G_STRUCT_OFFSET (NautilusTreeViewDragDestClass, handle_uri_list), NULL, NULL, - nautilus_marshal_VOID__STRING_INT_INT_INT, + nautilus_marshal_VOID__STRING_ENUM_INT_INT, G_TYPE_NONE, 4, G_TYPE_STRING, + GDK_TYPE_DRAG_ACTION, G_TYPE_INT, + G_TYPE_INT); + signals[HANDLE_TEXT] = + g_signal_new ("handle_text", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusTreeViewDragDestClass, + handle_text), + NULL, NULL, + nautilus_marshal_VOID__STRING_ENUM_INT_INT, + G_TYPE_NONE, 4, + G_TYPE_STRING, + GDK_TYPE_DRAG_ACTION, G_TYPE_INT, G_TYPE_INT); } Index: libnautilus-private/nautilus-tree-view-drag-dest.h =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-tree-view-drag-dest.h,v retrieving revision 1.2 diff -u -p -r1.2 nautilus-tree-view-drag-dest.h --- libnautilus-private/nautilus-tree-view-drag-dest.h 13 Jan 2005 13:27:51 -0000 1.2 +++ libnautilus-private/nautilus-tree-view-drag-dest.h 1 Jul 2005 20:37:21 -0000 @@ -61,15 +61,22 @@ struct _NautilusTreeViewDragDestClass { void (*move_copy_items) (NautilusTreeViewDragDest *dest, const GList *item_uris, const char *target_uri, - guint action, + GdkDragAction action, int x, int y); void (* handle_url) (NautilusTreeViewDragDest *dest, char *url, + GdkDragAction action, int x, int y); void (* handle_uri_list) (NautilusTreeViewDragDest *dest, char *uri_list, + GdkDragAction action, + int x, + int y); + void (* handle_text) (NautilusTreeViewDragDest *dest, + char *text, + GdkDragAction action, int x, int y); }; Index: src/file-manager/fm-directory-view.c =================================================================== RCS file: /cvs/gnome/nautilus/src/file-manager/fm-directory-view.c,v retrieving revision 1.698 diff -u -p -r1.698 fm-directory-view.c --- src/file-manager/fm-directory-view.c 1 Jul 2005 10:30:33 -0000 1.698 +++ src/file-manager/fm-directory-view.c 1 Jul 2005 20:37:25 -0000 @@ -1,5 +1,4 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ - +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ /* fm-directory-view.c * * Copyright (C) 1999, 2000 Free Software Foundation @@ -3677,12 +3676,9 @@ fm_directory_view_new_folder (FMDirector g_free (parent_uri); } -void -fm_directory_view_new_file (FMDirectoryView *directory_view, - NautilusFile *source) +static NewFolderData * +setup_new_folder_data (FMDirectoryView *directory_view) { - char *parent_uri; - char *source_uri; NewFolderData *data; data = new_folder_data_new (directory_view); @@ -3694,20 +3690,58 @@ fm_directory_view_new_file (FMDirectoryV (GClosureNotify)NULL, G_CONNECT_AFTER); - - source_uri = NULL; - if (source != NULL) { - source_uri = nautilus_file_get_uri (source); - } + return data; +} + +static void +fm_directory_view_new_file_with_initial_contents (FMDirectoryView *directory_view, + const char *initial_contents) +{ + NewFolderData *data; + char *parent_uri; + + data = setup_new_folder_data (directory_view); + parent_uri = fm_directory_view_get_backing_uri (directory_view); + nautilus_file_operations_new_file (GTK_WIDGET (directory_view), parent_uri, - source_uri, + initial_contents, new_folder_done, data); + g_free (parent_uri); - g_free (source_uri); } +void +fm_directory_view_new_file (FMDirectoryView *directory_view, + NautilusFile *source) +{ + NewFolderData *data; + char *parent_uri; + char *source_uri; + + if (source == NULL) { + fm_directory_view_new_file_with_initial_contents (directory_view, NULL); + return; + } + + g_return_if_fail (nautilus_file_is_local (source)); + + data = setup_new_folder_data (directory_view); + + source_uri = nautilus_file_get_uri (source); + parent_uri = fm_directory_view_get_backing_uri (directory_view); + + nautilus_file_operations_new_file_from_template (GTK_WIDGET (directory_view), + parent_uri, + NULL, + source_uri, + FALSE, + new_folder_done, data); + + g_free (parent_uri); + g_free (source_uri); +} /* handle the open command */ @@ -8558,6 +8592,31 @@ fm_directory_view_handle_uri_list_drop ( g_free (container_uri); } + +void +fm_directory_view_handle_text_drop (FMDirectoryView *view, + const char *text, + GdkDragAction action, + int x, + int y) +{ + char *container_uri; + + if (text == NULL) { + return; + } + + g_return_if_fail (action == GDK_ACTION_COPY); + + container_uri = fm_directory_view_get_backing_uri (view); + g_return_if_fail (container_uri != NULL); + + fm_directory_view_new_file_with_initial_contents ( + view, text); + + g_free (container_uri); +} + static void real_sort_files (FMDirectoryView *view, GList **files) Index: src/file-manager/fm-directory-view.h =================================================================== RCS file: /cvs/gnome/nautilus/src/file-manager/fm-directory-view.h,v retrieving revision 1.140 diff -u -p -r1.140 fm-directory-view.h --- src/file-manager/fm-directory-view.h 16 Jun 2005 08:40:47 -0000 1.140 +++ src/file-manager/fm-directory-view.h 1 Jul 2005 20:37:26 -0000 @@ -400,6 +400,11 @@ void fm_directory_view_ha GdkDragAction action, int x, int y); +void fm_directory_view_handle_text_drop (FMDirectoryView *view, + const char *text, + GdkDragAction action, + int x, + int y); void fm_directory_view_freeze_updates (FMDirectoryView *view); void fm_directory_view_unfreeze_updates (FMDirectoryView *view); void fm_directory_view_add_subdirectory (FMDirectoryView *view, Index: src/file-manager/fm-icon-view.c =================================================================== RCS file: /cvs/gnome/nautilus/src/file-manager/fm-icon-view.c,v retrieving revision 1.310 diff -u -p -r1.310 fm-icon-view.c --- src/file-manager/fm-icon-view.c 16 Jun 2005 08:40:47 -0000 1.310 +++ src/file-manager/fm-icon-view.c 1 Jul 2005 20:37:27 -0000 @@ -2477,6 +2477,14 @@ icon_view_handle_uri_list (NautilusIconC item_uris, action, x, y); } +static void +icon_view_handle_text (NautilusIconContainer *container, const char *text, + GdkDragAction action, int x, int y, FMIconView *view) +{ + fm_directory_view_handle_text_drop (FM_DIRECTORY_VIEW (view), + text, action, x, y); +} + static char * icon_view_get_first_visible_file (NautilusView *view) { @@ -2643,6 +2651,8 @@ fm_icon_view_init (FMIconView *icon_view G_CALLBACK (icon_view_handle_url), icon_view, 0); g_signal_connect_object (get_icon_container (icon_view), "handle_uri_list", G_CALLBACK (icon_view_handle_uri_list), icon_view, 0); + g_signal_connect_object (get_icon_container (icon_view), "handle_text", + G_CALLBACK (icon_view_handle_text), icon_view, 0); } static NautilusView * Index: src/file-manager/fm-list-view.c =================================================================== RCS file: /cvs/gnome/nautilus/src/file-manager/fm-list-view.c,v retrieving revision 1.250 diff -u -p -r1.250 fm-list-view.c --- src/file-manager/fm-list-view.c 20 Jun 2005 10:12:38 -0000 1.250 +++ src/file-manager/fm-list-view.c 1 Jul 2005 20:37:29 -0000 @@ -1071,6 +1071,13 @@ list_view_handle_uri_list (NautilusTreeV item_uris, action, x, y); } +static void +list_view_handle_text (NautilusTreeViewDragDest *dest, const char *text, + GdkDragAction action, int x, int y, FMListView *view) +{ + fm_directory_view_handle_text_drop (FM_DIRECTORY_VIEW (view), + text, action, x, y); +} static void move_copy_items_callback (NautilusTreeViewDragDest *dest, @@ -1187,6 +1194,8 @@ create_and_set_up_tree_view (FMListView G_CALLBACK (list_view_handle_url), view, 0); g_signal_connect_object (view->details->drag_dest, "handle_uri_list", G_CALLBACK (list_view_handle_uri_list), view, 0); + g_signal_connect_object (view->details->drag_dest, "handle_text", + G_CALLBACK (list_view_handle_text), view, 0); g_signal_connect_object (gtk_tree_view_get_selection (view->details->tree_view), "changed", Index: src/file-manager/fm-tree-view.c =================================================================== RCS file: /cvs/gnome/nautilus/src/file-manager/fm-tree-view.c,v retrieving revision 1.14 diff -u -p -r1.14 fm-tree-view.c --- src/file-manager/fm-tree-view.c 1 Jul 2005 14:13:49 -0000 1.14 +++ src/file-manager/fm-tree-view.c 1 Jul 2005 20:37:29 -0000 @@ -547,7 +547,7 @@ static void move_copy_items_callback (NautilusTreeViewDragDest *dest, const GList *item_uris, const char *target_uri, - guint action, + GdkDragAction action, int x, int y, gpointer user_data)
Attachment:
signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil