From fa8d59b3f728b714d69c8a464d91007cc180d954 Mon Sep 17 00:00:00 2001 From: "Gene Z. Ragan" Date: Wed, 14 Mar 2001 04:39:38 +0000 Subject: I have been itching to check some code in for 1.2, so now I am doing it! 2001-03-13 Gene Z. Ragan I have been itching to check some code in for 1.2, so now I am doing it! This will enable drag support from Netscape to Nautilus. Only the desktop handles the drags for now. When I complete the async calls in NautilusFile, it will be safe to have the signal handled by other views such as FMDirectoryView. * libnautilus-extensions/nautilus-icon-container.c: * libnautilus-extensions/nautilus-icon-container.h: (nautilus_icon_container_initialize_class): Change name of signal create_nautilus_links to handle_uri_list. * libnautilus-extensions/nautilus-icon-dnd.c: (drag_data_received_callback), (receive_dropped_uri_list), (nautilus_icon_container_get_drop_action): Add more general logic to handle a drop of a list of URIs. Don't expect them to only contain only the paths to gmc desktop entries. * src/file-manager/fm-desktop-icon-view.c: (fm_desktop_icon_view_initialize): Connect to changed signal name handle_uri_list. (icon_view_handle_uri_list): Use more generalized logic to handle a drop of a URI list. Determine what the list element contains and either convert from a DesktopEntry or create a link that contains a URI. --- ChangeLog | 32 ++++++++++ libnautilus-extensions/nautilus-icon-container.c | 8 +-- libnautilus-extensions/nautilus-icon-container.h | 2 +- libnautilus-extensions/nautilus-icon-dnd.c | 49 +++++++--------- libnautilus-private/nautilus-icon-container.c | 8 +-- libnautilus-private/nautilus-icon-container.h | 2 +- libnautilus-private/nautilus-icon-dnd.c | 49 +++++++--------- src/file-manager/fm-desktop-icon-view.c | 75 ++++++++++++++++++++---- 8 files changed, 145 insertions(+), 80 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4086688d4..522ccd145 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,35 @@ +2001-03-13 Gene Z. Ragan + + I have been itching to check some code in for 1.2, + so now I am doing it! + + This will enable drag support from Netscape to Nautilus. + Only the desktop handles the drags for now. When I complete + the async calls in NautilusFile, it will be safe to have the signal + handled by other views such as FMDirectoryView. + + * libnautilus-extensions/nautilus-icon-container.c: + * libnautilus-extensions/nautilus-icon-container.h: + (nautilus_icon_container_initialize_class): + Change name of signal create_nautilus_links + to handle_uri_list. + + * libnautilus-extensions/nautilus-icon-dnd.c: + (drag_data_received_callback), (receive_dropped_uri_list), + (nautilus_icon_container_get_drop_action): + Add more general logic to handle a drop of a list of URIs. + Don't expect them to only contain only the paths to + gmc desktop entries. + + * src/file-manager/fm-desktop-icon-view.c: + (fm_desktop_icon_view_initialize): + Connect to changed signal name handle_uri_list. + + (icon_view_handle_uri_list): + Use more generalized logic to handle a drop of a URI list. + Determine what the list element contains and either convert from + a DesktopEntry or create a link that contains a URI. + 2001-03-13 Jason Leach reviewed by: Darin Adler diff --git a/libnautilus-extensions/nautilus-icon-container.c b/libnautilus-extensions/nautilus-icon-container.c index 153e6c4f4..a33305bc7 100644 --- a/libnautilus-extensions/nautilus-icon-container.c +++ b/libnautilus-extensions/nautilus-icon-container.c @@ -176,7 +176,7 @@ enum { RENAMING_ICON, LAYOUT_CHANGED, MOVE_COPY_ITEMS, - CREATE_NAUTILUS_LINKS, + HANDLE_URI_LIST, PREVIEW, SELECTION_CHANGED, LAST_SIGNAL @@ -3210,12 +3210,12 @@ nautilus_icon_container_initialize_class (NautilusIconContainerClass *class) GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_INT); - signals[CREATE_NAUTILUS_LINKS] - = gtk_signal_new ("create_nautilus_links", + signals[HANDLE_URI_LIST] + = gtk_signal_new ("handle_uri_list", GTK_RUN_LAST, object_class->type, GTK_SIGNAL_OFFSET (NautilusIconContainerClass, - create_nautilus_links), + handle_uri_list), gtk_marshal_NONE__POINTER_INT_INT, GTK_TYPE_NONE, 3, GTK_TYPE_POINTER, diff --git a/libnautilus-extensions/nautilus-icon-container.h b/libnautilus-extensions/nautilus-icon-container.h index 7528fa8d5..8f88893a3 100644 --- a/libnautilus-extensions/nautilus-icon-container.h +++ b/libnautilus-extensions/nautilus-icon-container.h @@ -88,7 +88,7 @@ typedef struct { int copy_action, int x, int y); - void (* create_nautilus_links) (NautilusIconContainer *container, + void (* handle_uri_list) (NautilusIconContainer *container, GList *item_uris, int x, int y); diff --git a/libnautilus-extensions/nautilus-icon-dnd.c b/libnautilus-extensions/nautilus-icon-dnd.c index 7b2896201..cf0c0e504 100644 --- a/libnautilus-extensions/nautilus-icon-dnd.c +++ b/libnautilus-extensions/nautilus-icon-dnd.c @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -374,7 +373,7 @@ nautilus_icon_container_dropped_icon_feedback (GtkWidget *widget, It is called upon drag_motion events to get the actual data In that case, it just makes sure it gets the data. It is called upon drop_drop events to execute the actual - actions on the received action. In that case, it actually fist makes sure + actions on the received action. In that case, it actually first makes sure that we have got the data then processes it. */ @@ -389,7 +388,7 @@ drag_data_received_callback (GtkWidget *widget, gpointer user_data) { NautilusDragInfo *drag_info; - + drag_info = &(NAUTILUS_ICON_CONTAINER (widget)->details->dnd_info->drag_info); drag_info->got_drop_data_type = TRUE; @@ -401,13 +400,24 @@ drag_data_received_callback (GtkWidget *widget, break; case NAUTILUS_ICON_DND_COLOR: case NAUTILUS_ICON_DND_BGIMAGE: - case NAUTILUS_ICON_DND_KEYWORD: + case NAUTILUS_ICON_DND_KEYWORD: case NAUTILUS_ICON_DND_URI_LIST: + case NAUTILUS_ICON_DND_URL: /* Save the data so we can do the actual work on drop. */ g_assert (drag_info->selection_data == NULL); drag_info->selection_data = nautilus_gtk_selection_data_copy_deep (data); break; + + /* Netscape keeps sending us the data, even though we accept the first drag */ + //case NAUTILUS_ICON_DND_URL: + // if (drag_info->selection_data != NULL) { + // nautilus_gtk_selection_data_free_deep (drag_info->selection_data); + // drag_info->selection_data = nautilus_gtk_selection_data_copy_deep (data); + // } + // break; + default: + g_message ("drag_data_received_callback unknown"); break; } @@ -443,6 +453,7 @@ drag_data_received_callback (GtkWidget *widget, gtk_drag_finish (context, FALSE, FALSE, time); break; case NAUTILUS_ICON_DND_URI_LIST: + case NAUTILUS_ICON_DND_URL: receive_dropped_uri_list (NAUTILUS_ICON_CONTAINER (widget), (char*) data->data, x, y); @@ -637,35 +648,14 @@ receive_dropped_keyword (NautilusIconContainer *container, char* keyword, int x, /* handle dropped uri list */ static void receive_dropped_uri_list (NautilusIconContainer *container, char *uri_list, int x, int y) -{ - /* FIXME bugzilla.eazel.com 5080: - * this needs a better name - it's link/desktop specific - */ - GList *li, *files; - int argc; - char **argv; - int i; - +{ if (uri_list == NULL) { return; } - - files = gnome_uri_list_extract_filenames (uri_list); - argc = g_list_length (files); - argv = g_new (char *, argc + 1); - argv[argc] = NULL; - - for (i=0, li = files; li; i++, li = g_list_next (li)) { - argv[i] = li->data; - } - - /* Extract .desktop info and create link/links */ - gtk_signal_emit_by_name (GTK_OBJECT (container), "create_nautilus_links", - files, + + gtk_signal_emit_by_name (GTK_OBJECT (container), "handle_uri_list", + uri_list, x, y); - - gnome_uri_list_free_strings (files); - g_free(argv); } static int @@ -1089,6 +1079,7 @@ nautilus_icon_container_get_drop_action (NautilusIconContainer *container, break; case NAUTILUS_ICON_DND_URI_LIST: + case NAUTILUS_ICON_DND_URL: *default_action = context->suggested_action; *non_default_action = context->suggested_action; break; diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c index 153e6c4f4..a33305bc7 100644 --- a/libnautilus-private/nautilus-icon-container.c +++ b/libnautilus-private/nautilus-icon-container.c @@ -176,7 +176,7 @@ enum { RENAMING_ICON, LAYOUT_CHANGED, MOVE_COPY_ITEMS, - CREATE_NAUTILUS_LINKS, + HANDLE_URI_LIST, PREVIEW, SELECTION_CHANGED, LAST_SIGNAL @@ -3210,12 +3210,12 @@ nautilus_icon_container_initialize_class (NautilusIconContainerClass *class) GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_INT); - signals[CREATE_NAUTILUS_LINKS] - = gtk_signal_new ("create_nautilus_links", + signals[HANDLE_URI_LIST] + = gtk_signal_new ("handle_uri_list", GTK_RUN_LAST, object_class->type, GTK_SIGNAL_OFFSET (NautilusIconContainerClass, - create_nautilus_links), + handle_uri_list), gtk_marshal_NONE__POINTER_INT_INT, GTK_TYPE_NONE, 3, GTK_TYPE_POINTER, diff --git a/libnautilus-private/nautilus-icon-container.h b/libnautilus-private/nautilus-icon-container.h index 7528fa8d5..8f88893a3 100644 --- a/libnautilus-private/nautilus-icon-container.h +++ b/libnautilus-private/nautilus-icon-container.h @@ -88,7 +88,7 @@ typedef struct { int copy_action, int x, int y); - void (* create_nautilus_links) (NautilusIconContainer *container, + void (* handle_uri_list) (NautilusIconContainer *container, GList *item_uris, int x, int y); diff --git a/libnautilus-private/nautilus-icon-dnd.c b/libnautilus-private/nautilus-icon-dnd.c index 7b2896201..cf0c0e504 100644 --- a/libnautilus-private/nautilus-icon-dnd.c +++ b/libnautilus-private/nautilus-icon-dnd.c @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -374,7 +373,7 @@ nautilus_icon_container_dropped_icon_feedback (GtkWidget *widget, It is called upon drag_motion events to get the actual data In that case, it just makes sure it gets the data. It is called upon drop_drop events to execute the actual - actions on the received action. In that case, it actually fist makes sure + actions on the received action. In that case, it actually first makes sure that we have got the data then processes it. */ @@ -389,7 +388,7 @@ drag_data_received_callback (GtkWidget *widget, gpointer user_data) { NautilusDragInfo *drag_info; - + drag_info = &(NAUTILUS_ICON_CONTAINER (widget)->details->dnd_info->drag_info); drag_info->got_drop_data_type = TRUE; @@ -401,13 +400,24 @@ drag_data_received_callback (GtkWidget *widget, break; case NAUTILUS_ICON_DND_COLOR: case NAUTILUS_ICON_DND_BGIMAGE: - case NAUTILUS_ICON_DND_KEYWORD: + case NAUTILUS_ICON_DND_KEYWORD: case NAUTILUS_ICON_DND_URI_LIST: + case NAUTILUS_ICON_DND_URL: /* Save the data so we can do the actual work on drop. */ g_assert (drag_info->selection_data == NULL); drag_info->selection_data = nautilus_gtk_selection_data_copy_deep (data); break; + + /* Netscape keeps sending us the data, even though we accept the first drag */ + //case NAUTILUS_ICON_DND_URL: + // if (drag_info->selection_data != NULL) { + // nautilus_gtk_selection_data_free_deep (drag_info->selection_data); + // drag_info->selection_data = nautilus_gtk_selection_data_copy_deep (data); + // } + // break; + default: + g_message ("drag_data_received_callback unknown"); break; } @@ -443,6 +453,7 @@ drag_data_received_callback (GtkWidget *widget, gtk_drag_finish (context, FALSE, FALSE, time); break; case NAUTILUS_ICON_DND_URI_LIST: + case NAUTILUS_ICON_DND_URL: receive_dropped_uri_list (NAUTILUS_ICON_CONTAINER (widget), (char*) data->data, x, y); @@ -637,35 +648,14 @@ receive_dropped_keyword (NautilusIconContainer *container, char* keyword, int x, /* handle dropped uri list */ static void receive_dropped_uri_list (NautilusIconContainer *container, char *uri_list, int x, int y) -{ - /* FIXME bugzilla.eazel.com 5080: - * this needs a better name - it's link/desktop specific - */ - GList *li, *files; - int argc; - char **argv; - int i; - +{ if (uri_list == NULL) { return; } - - files = gnome_uri_list_extract_filenames (uri_list); - argc = g_list_length (files); - argv = g_new (char *, argc + 1); - argv[argc] = NULL; - - for (i=0, li = files; li; i++, li = g_list_next (li)) { - argv[i] = li->data; - } - - /* Extract .desktop info and create link/links */ - gtk_signal_emit_by_name (GTK_OBJECT (container), "create_nautilus_links", - files, + + gtk_signal_emit_by_name (GTK_OBJECT (container), "handle_uri_list", + uri_list, x, y); - - gnome_uri_list_free_strings (files); - g_free(argv); } static int @@ -1089,6 +1079,7 @@ nautilus_icon_container_get_drop_action (NautilusIconContainer *container, break; case NAUTILUS_ICON_DND_URI_LIST: + case NAUTILUS_ICON_DND_URL: *default_action = context->suggested_action; *non_default_action = context->suggested_action; break; diff --git a/src/file-manager/fm-desktop-icon-view.c b/src/file-manager/fm-desktop-icon-view.c index 7ec9c8910..f442316b5 100644 --- a/src/file-manager/fm-desktop-icon-view.c +++ b/src/file-manager/fm-desktop-icon-view.c @@ -31,9 +31,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -93,8 +95,8 @@ static void volume_mounted_callback (NautilusVolum static void volume_unmounted_callback (NautilusVolumeMonitor *monitor, NautilusVolume *volume, FMDesktopIconView *icon_view); -static void icon_view_create_nautilus_links (NautilusIconContainer *container, - const GList *item_uris, +static void icon_view_handle_uri_list (NautilusIconContainer *container, + const char *item_uris, int x, int y, FMDirectoryView *view); @@ -436,8 +438,8 @@ fm_desktop_icon_view_initialize (FMDesktopIconView *desktop_icon_view) GTK_OBJECT (desktop_icon_view)); gtk_signal_connect (GTK_OBJECT (icon_container), - "create_nautilus_links", - GTK_SIGNAL_FUNC (icon_view_create_nautilus_links), + "handle_uri_list", + GTK_SIGNAL_FUNC (icon_view_handle_uri_list), desktop_icon_view); nautilus_preferences_add_callback (NAUTILUS_PREFERENCES_HOME_URI, @@ -644,14 +646,18 @@ volume_unmounted_callback (NautilusVolumeMonitor *monitor, } static void -icon_view_create_nautilus_links (NautilusIconContainer *container, const GList *item_uris, - int x, int y, FMDirectoryView *view) +icon_view_handle_uri_list (NautilusIconContainer *container, const char *item_uris, + int x, int y, FMDirectoryView *view) { const GList *element; - char *desktop_path; + GList *uri_list; + char *desktop_path, *local_path; GnomeDesktopEntry *entry; int index; GdkPoint point; + const char *uri; + char *stripped_uri, *linkname; + gboolean made_entry_link; if (item_uris == NULL) { return; @@ -660,15 +666,60 @@ icon_view_create_nautilus_links (NautilusIconContainer *container, const GList * desktop_path = nautilus_get_desktop_directory (); point.x = x; point.y = y; - + + uri_list = gnome_uri_list_extract_uris (item_uris); + /* Iterate through all of the URIs in the list */ - for (element = item_uris, index = 0; element != NULL; element = element->next, index++) { - entry = gnome_desktop_entry_load ((char *)element->data); - nautilus_link_local_create_from_gnome_entry (entry, desktop_path, &point); - gnome_desktop_entry_free (entry); + for (element = uri_list, index = 0; element != NULL; element = element->next, index++) { + uri = element->data; + + /* I would use gnome_vfs_get_local_path_from_uri here, but it requires that the URI + * be in the file:// format and the URIs we get from Netscape and panel drags are in + * the file: format + */ + local_path = NULL; + stripped_uri = NULL; + made_entry_link = FALSE; + + if (nautilus_istr_has_prefix (uri, "file://")) { + local_path = nautilus_str_get_after_prefix (uri, "file://"); + } else if (nautilus_istr_has_prefix (uri, "file:")) { + local_path = g_strdup (uri += strlen ("file:")); + } + + /* Is this a path that points to a .desktop file? */ + if (local_path != NULL) { + entry = gnome_desktop_entry_load (local_path); + if (entry != NULL) { + nautilus_link_local_create_from_gnome_entry (entry, desktop_path, &point); + gnome_desktop_entry_free (entry); + made_entry_link = TRUE; + } + g_free (local_path); + } + + if (!made_entry_link) { + /* We have some type of URI. Create a Nautilus link for it. + * Generate the file name by extracting the basename of the URI. + */ + if (nautilus_str_has_suffix (uri, "/")) { + stripped_uri = nautilus_str_strip_trailing_chr (uri, '/'); + linkname = strrchr (stripped_uri, '/'); + } else { + linkname = strrchr (uri, '/'); + } + + if (linkname != NULL) { + linkname++; + nautilus_link_local_create (desktop_path, linkname, "gnome-http-url.png", uri, + &point, NAUTILUS_LINK_GENERIC); + } + g_free (stripped_uri); + } } g_free (desktop_path); + gnome_uri_list_free_strings (uri_list); } static gboolean -- cgit v1.2.1