Re: [Nautilus-list] RH merge, DnD
- From: Maciej Stachowiak <mjs noisehavoc org>
- To: Alex Larsson <alexl redhat com>
- Cc: nautilus-list lists eazel com, darin bentspoon com
- Subject: Re: [Nautilus-list] RH merge, DnD
- Date: Tue, 4 Sep 2001 13:49:40 -0700
On 04Sep2001 04:01PM (-0400), Alex Larsson wrote:
> Here is a DnD patch that makes drag and drop from the panel to the desktop
> and nautilus windows to work.
>
> According to jrb (who wrote it) it is sort of hackish, but is better that
> we currently have.
>
What's the deal with the "Drag and Drop is only supported on local
filesystems" error? Nautilus should certainly be able to DnD to and
from ftp sites, webdav folders, via ssh, etc.
- Maciej
>
> Index: ChangeLog
> ===================================================================
> RCS file: /cvs/gnome/nautilus/ChangeLog,v
> retrieving revision 1.4749
> diff -u -p -r1.4749 ChangeLog
> --- ChangeLog 2001/09/04 15:37:01 1.4749
> +++ ChangeLog 2001/09/04 19:59:46
> @@ -1,3 +1,19 @@
> +2001-09-04 Alex Larsson <alexl redhat com>
> +
> + Merge some stuff from the redhat-outstanding-patches branch
> +
> + * libnautilus-private/nautilus-icon-container.c:
> + * libnautilus-private/nautilus-icon-dnd.c:
> + Change signature of the "handle_uri_list" callback to include the
> + drag action.
> +
> + * src/file-manager/fm-icon-view.c (icon_view_handle_uri_list):
> + Handle uri's more gracefully.
> +
> + * src/file-manager/fm-desktop-icon-view.c:
> + (icon_view_handle_uri_list): Remove. Now handled in the
> + parent class.
> +
> 2001-09-03 Alex Larsson <alexl redhat com>
>
> Merge some stuff from the redhat-outstanding-patches branch
> Index: libnautilus-private/nautilus-icon-container.c
> ===================================================================
> RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-container.c,v
> retrieving revision 1.217
> diff -u -p -r1.217 nautilus-icon-container.c
> --- libnautilus-private/nautilus-icon-container.c 2001/09/04 15:37:08 1.217
> +++ libnautilus-private/nautilus-icon-container.c 2001/09/04 19:59:47
> @@ -3224,9 +3224,10 @@ nautilus_icon_container_initialize_class
> object_class->type,
> GTK_SIGNAL_OFFSET (NautilusIconContainerClass,
> handle_uri_list),
> - gtk_marshal_NONE__POINTER_INT_INT,
> - GTK_TYPE_NONE, 3,
> + eel_gtk_marshal_NONE__POINTER_INT_INT_INT,
> + GTK_TYPE_NONE, 4,
> GTK_TYPE_POINTER,
> + GTK_TYPE_INT,
> GTK_TYPE_INT,
> GTK_TYPE_INT);
>
> Index: libnautilus-private/nautilus-icon-dnd.c
> ===================================================================
> RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-dnd.c,v
> retrieving revision 1.91
> diff -u -p -r1.91 nautilus-icon-dnd.c
> --- libnautilus-private/nautilus-icon-dnd.c 2001/07/20 17:36:33 1.91
> +++ libnautilus-private/nautilus-icon-dnd.c 2001/09/04 19:59:47
> @@ -82,8 +82,9 @@ static void receive_dropped_keyword
> char* keyword,
> int x,
> int y);
> -static void receive_dropped_uri_list (NautilusIconContainer *container,
> +static void receive_dropped_uri_list (NautilusIconContainer *container,
> char* keyword,
> + GdkDragAction action,
> int x,
> int y);
> static void nautilus_icon_container_free_drag_data (NautilusIconContainer *container);
> @@ -461,7 +462,7 @@ drag_data_received_callback (GtkWidget *
> case EEL_ICON_DND_URL:
> receive_dropped_uri_list
> (NAUTILUS_ICON_CONTAINER (widget),
> - (char*) data->data, x, y);
> + (char*) data->data, context->action, x, y);
> gtk_drag_finish (context, TRUE, FALSE, time);
> break;
>
> @@ -660,7 +661,7 @@ receive_dropped_keyword (NautilusIconCon
>
> /* handle dropped uri list */
> static void
> -receive_dropped_uri_list (NautilusIconContainer *container, char *uri_list, int x, int y)
> +receive_dropped_uri_list (NautilusIconContainer *container, char *uri_list, GdkDragAction action, int x, int y)
> {
> if (uri_list == NULL) {
> return;
> @@ -668,6 +669,7 @@ receive_dropped_uri_list (NautilusIconCo
>
> gtk_signal_emit_by_name (GTK_OBJECT (container), "handle_uri_list",
> uri_list,
> + action,
> x, y);
> }
>
> Index: src/file-manager/fm-desktop-icon-view.c
> ===================================================================
> RCS file: /cvs/gnome/nautilus/src/file-manager/fm-desktop-icon-view.c,v
> retrieving revision 1.142
> diff -u -p -r1.142 fm-desktop-icon-view.c
> --- src/file-manager/fm-desktop-icon-view.c 2001/08/15 21:04:01 1.142
> +++ src/file-manager/fm-desktop-icon-view.c 2001/09/04 19:59:47
> @@ -109,11 +109,6 @@ static void volume_mounted_callback
> static void volume_unmounted_callback (NautilusVolumeMonitor *monitor,
> NautilusVolume *volume,
> FMDesktopIconView *icon_view);
> -static void icon_view_handle_uri_list (NautilusIconContainer *container,
> - const char *item_uris,
> - int x,
> - int y,
> - FMDirectoryView *view);
> static int desktop_icons_compare_callback (NautilusIconContainer *container,
> NautilusFile *file_a,
> NautilusFile *file_b,
> @@ -651,11 +646,6 @@ fm_desktop_icon_view_initialize (FMDeskt
> desktop_icon_view,
> GTK_OBJECT (desktop_icon_view));
>
> - gtk_signal_connect (GTK_OBJECT (icon_container),
> - "handle_uri_list",
> - GTK_SIGNAL_FUNC (icon_view_handle_uri_list),
> - desktop_icon_view);
> -
> eel_preferences_add_callback (NAUTILUS_PREFERENCES_HOME_URI,
> home_uri_changed,
> desktop_icon_view);
> @@ -863,70 +853,6 @@ volume_unmounted_callback (NautilusVolum
>
> g_free (volume_name);
> g_free (link_path);
> -}
> -
> -static void
> -icon_view_handle_uri_list (NautilusIconContainer *container, const char *item_uris,
> - int x, int y, FMDirectoryView *view)
> -{
> - GList *uri_list, *node;
> - GnomeDesktopEntry *entry;
> - GdkPoint point;
> - char *uri, *local_path;
> - char *stripped_uri;
> - const char *last_slash, *link_name;
> -
> - if (item_uris == NULL) {
> - return;
> - }
> -
> - point.x = x;
> - point.y = y;
> -
> - uri_list = gnome_uri_list_extract_uris (item_uris);
> -
> - for (node = uri_list; node != NULL; node = node->next) {
> - /* Most of what comes in here is not really URIs, but
> - * rather paths that have a file: prefix in them.
> - */
> - uri = eel_make_uri_from_half_baked_uri (node->data);
> -
> - /* Make a link using the desktop file contents? */
> - local_path = gnome_vfs_get_local_path_from_uri (uri);
> - if (local_path != NULL) {
> - entry = gnome_desktop_entry_load (local_path);
> - if (entry != NULL) {
> - /* FIXME: Handle name conflicts? */
> - nautilus_link_local_create_from_gnome_entry (entry, desktop_directory, &point);
> - gnome_desktop_entry_free (entry);
> - }
> - g_free (local_path);
> - if (entry != NULL) {
> - continue;
> - }
> - }
> -
> - /* Make a link from the URI alone. Generate the file
> - * name by extracting the basename of the URI.
> - */
> - /* FIXME: This should be using eel_uri_get_basename
> - * instead of a "roll our own" solution.
> - */
> - stripped_uri = eel_str_strip_trailing_chr (uri, '/');
> - last_slash = strrchr (stripped_uri, '/');
> - link_name = last_slash == NULL ? NULL : last_slash + 1;
> -
> - if (!eel_str_is_empty (link_name)) {
> - /* FIXME: Handle name conflicts? */
> - nautilus_link_local_create (desktop_directory, link_name,
> - "gnome-http-url", uri,
> - &point, NAUTILUS_LINK_GENERIC);
> - }
> -
> - g_free (stripped_uri);
> - }
> -
> - gnome_uri_list_free_strings (uri_list);
> }
>
> /* update_link_and_delete_copies
> Index: src/file-manager/fm-icon-view.c
> ===================================================================
> RCS file: /cvs/gnome/nautilus/src/file-manager/fm-icon-view.c,v
> retrieving revision 1.209
> diff -u -p -r1.209 fm-icon-view.c
> --- src/file-manager/fm-icon-view.c 2001/07/26 09:16:37 1.209
> +++ src/file-manager/fm-icon-view.c 2001/09/04 19:59:47
> @@ -33,7 +33,10 @@
> #include <eel/eel-glib-extensions.h>
> #include <eel/eel-gtk-extensions.h>
> #include <eel/eel-gtk-macros.h>
> +#include <eel/eel-stock-dialogs.h>
> +#include <eel/eel-dnd.h>
> #include <eel/eel-string.h>
> +#include <eel/eel-vfs-extensions.h>
> #include <errno.h>
> #include <fcntl.h>
> #include <gtk/gtkmain.h>
> @@ -45,10 +48,12 @@
> #include <libgnome/gnome-i18n.h>
> #include <libgnome/gnome-config.h>
> #include <libgnome/gnome-metadata.h>
> +#include <libgnome/gnome-mime.h>
> #include <libgnomevfs/gnome-vfs-async-ops.h>
> #include <libgnomevfs/gnome-vfs-uri.h>
> #include <libgnomevfs/gnome-vfs-utils.h>
> #include <libgnomevfs/gnome-vfs-xfer.h>
> +#include <libgnomevfs/gnome-vfs-mime.h>
> #include <libnautilus-private/nautilus-audio-player.h>
> #include <libnautilus-private/nautilus-bonobo-extensions.h>
> #include <libnautilus-private/nautilus-directory-background.h>
> @@ -115,49 +120,56 @@ typedef enum {
> } MenuItemType;
>
> /* forward declarations */
> -static void create_icon_container (FMIconView *icon_view);
> -static void fm_icon_view_initialize (FMIconView *icon_view);
> -static void fm_icon_view_initialize_class (FMIconViewClass *klass);
> -static gboolean fm_icon_view_is_empty (FMDirectoryView *view);
> -static void fm_icon_view_set_directory_sort_by (FMIconView *icon_view,
> - NautilusFile *file,
> - const char *sort_by);
> -static void fm_icon_view_set_zoom_level (FMIconView *view,
> - NautilusZoomLevel new_level,
> - gboolean always_set_level);
> -gboolean fm_icon_view_supports_auto_layout (FMIconView *view);
> -static void fm_icon_view_update_icon_container_fonts (FMIconView *icon_view);
> -static void fm_icon_view_update_icon_container_smooth_font (FMIconView *icon_view);
> -static void fm_icon_view_update_icon_container_font_size_table (FMIconView *icon_view);
> -static void fm_icon_view_update_click_mode (FMIconView *icon_view);
> -static void fm_icon_view_update_smooth_graphics_mode (FMIconView *icon_view);
> -static gboolean fm_icon_view_using_tighter_layout (FMIconView *icon_view);
> -static gboolean fm_icon_view_get_directory_tighter_layout (FMIconView *icon_view,
> - NautilusFile *file);
> -static void fm_icon_view_set_directory_tighter_layout (FMIconView *icon_view,
> - NautilusFile *file,
> - gboolean tighter_layout);
> -static gboolean real_supports_auto_layout (FMIconView *view);
> -static const SortCriterion *get_sort_criterion_by_id (const char *id);
> -static const SortCriterion *get_sort_criterion_by_sort_type (NautilusFileSortType sort_type);
> -static void set_sort_criterion_by_id (FMIconView *icon_view,
> - const char *id);
> -static gboolean set_sort_reversed (FMIconView *icon_view,
> - gboolean new_value);
> -static void switch_to_manual_layout (FMIconView *view);
> -static void preview_audio (FMIconView *icon_view,
> - NautilusFile *file,
> - gboolean start_flag);
> -static void update_layout_menus (FMIconView *view);
> -static void default_sort_in_reverse_order_changed_callback (gpointer callback_data);
> -static void default_sort_order_changed_callback (gpointer callback_data);
> -static void default_use_tighter_layout_changed_callback (gpointer callback_data);
> -static void default_use_manual_layout_changed_callback (gpointer callback_data);
> -static void default_zoom_level_changed_callback (gpointer callback_data);
> -static void default_zoom_level_font_size_changed_callback (gpointer callback_data);
> -static void font_changed_callback (gpointer callback_data);
> -static void smooth_font_changed_callback (gpointer callback_data);
> +static void create_icon_container (FMIconView *icon_view);
> +static void fm_icon_view_initialize (FMIconView *icon_view);
> +static void fm_icon_view_initialize_class (FMIconViewClass *klass);
> +static gboolean fm_icon_view_is_empty (FMDirectoryView *view);
> +static void fm_icon_view_set_directory_sort_by (FMIconView *icon_view,
> + NautilusFile *file,
> + const char *sort_by);
> +static void fm_icon_view_set_zoom_level (FMIconView *view,
> + NautilusZoomLevel new_level,
> + gboolean always_set_level);
> +gboolean fm_icon_view_supports_auto_layout (FMIconView *view);
> +static void fm_icon_view_update_icon_container_fonts (FMIconView *icon_view);
> +static void fm_icon_view_update_icon_container_smooth_font (FMIconView *icon_view);
> +static void fm_icon_view_update_icon_container_font_size_table (FMIconView *icon_view);
> +static void fm_icon_view_update_click_mode (FMIconView *icon_view);
> +static void fm_icon_view_update_smooth_graphics_mode (FMIconView *icon_view);
> +static gboolean fm_icon_view_using_tighter_layout (FMIconView *icon_view);
> +static gboolean fm_icon_view_get_directory_tighter_layout (FMIconView *icon_view,
> + NautilusFile *file);
> +static void fm_icon_view_set_directory_tighter_layout (FMIconView *icon_view,
> + NautilusFile *file,
> + gboolean tighter_layout);
> +static gboolean real_supports_auto_layout (FMIconView *view);
> +static const SortCriterion *get_sort_criterion_by_id (const char *id);
> +static const SortCriterion *get_sort_criterion_by_sort_type (NautilusFileSortType sort_type);
> +static void set_sort_criterion_by_id (FMIconView *icon_view,
> + const char *id);
> +static gboolean set_sort_reversed (FMIconView *icon_view,
> + gboolean new_value);
> +static void switch_to_manual_layout (FMIconView *view);
> +static void preview_audio (FMIconView *icon_view,
> + NautilusFile *file,
> + gboolean start_flag);
> +static void update_layout_menus (FMIconView *view);
> +static void default_sort_in_reverse_order_changed_callback (gpointer callback_data);
> +static void default_sort_order_changed_callback (gpointer callback_data);
> +static void default_use_tighter_layout_changed_callback (gpointer callback_data);
> +static void default_use_manual_layout_changed_callback (gpointer callback_data);
> +static void default_zoom_level_changed_callback (gpointer callback_data);
> +static void default_zoom_level_font_size_changed_callback (gpointer callback_data);
> +static void font_changed_callback (gpointer callback_data);
> +static void smooth_font_changed_callback (gpointer callback_data);
> +static void icon_view_handle_uri_list (NautilusIconContainer *container,
> + const char *item_uris,
> + GdkDragAction action,
> + int x,
> + int y,
> + FMIconView *view);
>
> +
> static int preview_sound_auto_value;
>
> EEL_DEFINE_CLASS_BOILERPLATE (FMIconView,
> @@ -2321,6 +2333,8 @@ fm_icon_view_initialize_class (FMIconVie
> static void
> fm_icon_view_initialize (FMIconView *icon_view)
> {
> + NautilusIconContainer *icon_container;
> +
> g_return_if_fail (GTK_BIN (icon_view)->child == NULL);
>
> icon_view->details = g_new0 (FMIconViewDetails, 1);
> @@ -2329,6 +2343,7 @@ fm_icon_view_initialize (FMIconView *ico
> icon_view->details->timeout = -1;
> icon_view->details->audio_preview_file = NULL;
> create_icon_container (icon_view);
> + icon_container = get_icon_container (icon_view);
>
> eel_preferences_add_callback_while_alive (NAUTILUS_PREFERENCES_ICON_VIEW_FONT,
> font_changed_callback,
> @@ -2362,6 +2377,12 @@ fm_icon_view_initialize (FMIconView *ico
> default_zoom_level_changed_callback,
> icon_view,
> GTK_OBJECT (icon_view));
> +
> + gtk_signal_connect (GTK_OBJECT (icon_container),
> + "handle_uri_list",
> + GTK_SIGNAL_FUNC (icon_view_handle_uri_list),
> + icon_view);
> +
> }
>
> static gboolean
> @@ -2650,4 +2671,148 @@ create_icon_container (FMIconView *icon_
> fm_icon_view_update_smooth_graphics_mode (icon_view);
>
> gtk_widget_show (GTK_WIDGET (icon_container));
> +}
> +
> +static void
> +icon_view_handle_uri_list (NautilusIconContainer *container, const char *item_uris,
> + GdkDragAction action, int x, int y, FMIconView *view)
> +{
> +
> + GList *uri_list, *node, *real_uri_list = NULL;
> + GnomeVFSURI *container_uri;
> + GnomeDesktopEntry *entry;
> + GdkPoint point;
> + char *local_path;
> + char *stripped_uri;
> + char *container_uri_string;
> + const char *last_slash, *link_name;
> + int n_uris;
> + gboolean all_local;
> + GArray *points;
> +
> + if (item_uris == NULL) {
> + return;
> + }
> +
> + container_uri_string = fm_directory_view_get_uri (FM_DIRECTORY_VIEW (view));
> + container_uri = gnome_vfs_uri_new (container_uri_string);
> + g_return_if_fail (container_uri != NULL);
> +
> + if (gnome_vfs_uri_is_local (container_uri) == FALSE) {
> + eel_show_warning_dialog (_("Drag and drop is only supported to local file systems."),
> + _("Drag and Drop error"),
> + fm_directory_view_get_containing_window (FM_DIRECTORY_VIEW (view)));
> + gnome_vfs_uri_unref (container_uri);
> + g_free (container_uri_string);
> + return;
> + }
> +
> + if (action == GDK_ACTION_ASK) {
> + action = eel_drag_drop_action_ask
> + (GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK);
> + }
> +
> + /* We don't support GDK_ACTION_ASK or GDK_ACTION_PRIVATE
> + * and we don't support combinations either. */
> + if ((action != GDK_ACTION_DEFAULT) &&
> + (action != GDK_ACTION_COPY) &&
> + (action != GDK_ACTION_MOVE) &&
> + (action != GDK_ACTION_LINK)) {
> + eel_show_warning_dialog (_("An invalid drag type was used."),
> + _("Drag and Drop error"),
> + fm_directory_view_get_containing_window (FM_DIRECTORY_VIEW (view)));
> + g_free (container_uri);
> + gnome_vfs_uri_unref (container_uri);
> + return;
> + }
> +
> + point.x = x;
> + point.y = y;
> +
> + /* Most of what comes in here is not really URIs, but rather paths that
> + * have a file: prefix in them. We try to sanitize the uri list as a
> + * result. Additionally, if they are all local files, then we can copy
> + * them. Otherwise, we just make links.
> + */
> + all_local = TRUE;
> + n_uris = 0;
> + uri_list = gnome_uri_list_extract_uris (item_uris);
> + for (node = uri_list; node != NULL; node = node->next) {
> + gchar *sanitized_uri;
> +
> + sanitized_uri = eel_make_uri_from_half_baked_uri (node->data);
> + if (sanitized_uri == NULL)
> + continue;
> + real_uri_list = g_list_append (real_uri_list, sanitized_uri);
> + if (strncmp (sanitized_uri, "file", 4) != 0)
> + all_local = FALSE;
> + n_uris++;
> + }
> + gnome_uri_list_free_strings (uri_list);
> +
> + if (all_local == TRUE &&
> + (action == GDK_ACTION_COPY ||
> + action == GDK_ACTION_MOVE)) {
> + /* Copying files */
> + if (n_uris == 1) {
> + GdkPoint tmp_point = { 0, 0 };
> +
> + /* pass in a 1-item array of icon positions, relative to x, y */
> + points = g_array_new (FALSE, TRUE, sizeof (GdkPoint));
> + g_array_append_val (points, tmp_point);
> + } else {
> + points = NULL;
> + }
> + fm_directory_view_move_copy_items (real_uri_list, points,
> + container_uri_string,
> + action, x, y, FM_DIRECTORY_VIEW (view));
> +
> + if (points)
> + g_array_free (points, TRUE);
> + } else {
> + for (node = real_uri_list; node != NULL; node = node->next) {
> + /* Make a link using the desktop file contents? */
> + local_path = gnome_vfs_get_local_path_from_uri (node->data);
> + if (local_path != NULL) {
> + entry = gnome_desktop_entry_load (local_path);
> + if (entry != NULL) {
> +
> + /* FIXME: Handle name conflicts? */
> + nautilus_link_local_create_from_gnome_entry (entry, container_uri_string, &point);
> + gnome_desktop_entry_free (entry);
> + }
> + g_free (local_path);
> + if (entry != NULL) {
> + continue;
> + }
> + }
> +
> + /* Make a link from the URI alone. Generate the file
> + * name by extracting the basename of the URI.
> + */
> + /* FIXME: This should be using eel_uri_get_basename
> + * instead of a "roll our own" solution.
> + */
> + stripped_uri = eel_str_strip_trailing_chr ((char *)node->data, '/');
> + g_print ("local_path:%s\nstripped_uri:%s\n", (char *)node->data, stripped_uri);
> + last_slash = strrchr (stripped_uri, '/');
> + link_name = last_slash == NULL ? NULL : last_slash + 1;
> +
> + if (!eel_str_is_empty (link_name)) {
> + /* FIXME: Handle name conflicts? */
> + nautilus_link_local_create (container_uri_string, link_name,
> + "gnome-http-url", local_path,
> + &point, NAUTILUS_LINK_GENERIC);
> + }
> +
> + g_free (stripped_uri);
> +
> + break;
> + }
> + }
> +
> + gnome_uri_list_free_strings (real_uri_list);
> + gnome_vfs_uri_unref (container_uri);
> + g_free (container_uri_string);
> +
> }
>
>
> _______________________________________________
> Nautilus-list mailing list
> Nautilus-list lists eazel com
> http://lists.eazel.com/mailman/listinfo/nautilus-list
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]