Commit a4cea258 authored by Alexander Larsson's avatar Alexander Larsson Committed by Alexander Larsson

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.
parent c113f3a2
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
......
......@@ -3224,10 +3224,11 @@ nautilus_icon_container_initialize_class (NautilusIconContainerClass *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);
signals[GET_CONTAINER_URI]
......
......@@ -82,8 +82,9 @@ static void receive_dropped_keyword (NautilusIconCo
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 *widget,
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 (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)
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 (NautilusIconContainer *container, char *uri_list, int
gtk_signal_emit_by_name (GTK_OBJECT (container), "handle_uri_list",
uri_list,
action,
x, y);
}
......
......@@ -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
......
......@@ -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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment