summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex Larsson <alexl@redhat.com>2001-09-04 21:16:09 +0000
committerAlexander Larsson <alexl@src.gnome.org>2001-09-04 21:16:09 +0000
commita4cea258532fafc95ce07ff00193589c9ca757bc (patch)
tree0b2d030ce669605a863a7f771de0b75eaee8dc44 /src
parentc113f3a2d1a3b3669c82167e0a32f496257fcb35 (diff)
downloadnautilus-a4cea258532fafc95ce07ff00193589c9ca757bc.tar.gz
Merge some stuff from the redhat-outstanding-patches branch
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.
Diffstat (limited to 'src')
-rw-r--r--src/file-manager/fm-desktop-icon-view.c74
-rw-r--r--src/file-manager/fm-icon-view.c249
2 files changed, 207 insertions, 116 deletions
diff --git a/src/file-manager/fm-desktop-icon-view.c b/src/file-manager/fm-desktop-icon-view.c
index 17c9b1462..1be4875e6 100644
--- a/src/file-manager/fm-desktop-icon-view.c
+++ b/src/file-manager/fm-desktop-icon-view.c
@@ -109,11 +109,6 @@ static void volume_mounted_callback (NautilusVolum
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 (FMDesktopIconView *desktop_icon_view)
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);
@@ -865,70 +855,6 @@ volume_unmounted_callback (NautilusVolumeMonitor *monitor,
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
*
* Look for a particular type of link on the desktop. If the right
diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c
index 8672d3f27..29bbac330 100644
--- a/src/file-manager/fm-icon-view.c
+++ b/src/file-manager/fm-icon-view.c
@@ -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,48 +120,55 @@ 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;
@@ -2321,6 +2333,8 @@ fm_icon_view_initialize_class (FMIconViewClass *klass)
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 *icon_view)
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 *icon_view)
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
@@ -2651,3 +2672,147 @@ create_icon_container (FMIconView *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)) {
+ 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);
+
+}