summaryrefslogtreecommitdiff
path: root/libnautilus-private/nautilus-file-changes-queue.c
diff options
context:
space:
mode:
authorPavel Cisler <pavel@eazel.com>2000-09-12 09:25:48 +0000
committerPavel Cisler <pce@src.gnome.org>2000-09-12 09:25:48 +0000
commite8d3b4590332148edfdee58cf9fddba80c4f4e11 (patch)
tree0739158f06888252a169c3eed040e9170a715758 /libnautilus-private/nautilus-file-changes-queue.c
parent9b9e79d172ff3f80d854eefff8fec63e78898c61 (diff)
downloadnautilus-e8d3b4590332148edfdee58cf9fddba80c4f4e11.tar.gz
Work in progress on saving drop locations during a copy/move operation.
2000-09-11 Pavel Cisler <pavel@eazel.com> * libnautilus-extensions/nautilus-directory-notify.h: * libnautilus-extensions/nautilus-directory.c: * libnautilus-extensions/nautilus-file-changes-queue.c: * libnautilus-extensions/nautilus-file-changes-queue.h: * libnautilus-extensions/nautilus-file-operations.c: (icon_position_iterator_new), (icon_position_iterator_free), (create_xfer_dialog), (handle_xfer_vfs_error), (apply_one_position), (sync_xfer_callback), (nautilus_file_operations_copy_move), (nautilus_file_changes_queue_schedule_position_setting), (position_setting_list_free), (nautilus_directory_set_icon_position), (nautilus_directory_schedule_metadata_copy), (nautilus_directory_schedule_metadata_move), (nautilus_file_changes_consume_changes), (nautilus_directory_schedule_position_setting): Work in progress on saving drop locations during a copy/move operation. Add a new NautilusFileChangesQueue element type to handle scheduling of the position saving operation. Hook it up to a call that saves the icon position into the metadata. Add icon position handling to the synchronous copy engine callback. * libnautilus-extensions/nautilus-icon-container.h: * libnautilus-extensions/nautilus-icon-dnd.c: (handle_nonlocal_move): Pass relative icon positions (FIXME 626). * src/file-manager/fm-directory-view.c: (fm_directory_view_move_copy_items): * src/file-manager/fm-directory-view.h: * src/file-manager/fm-icon-view.c: (icon_view_move_copy_items): Add drop location to relative icon positions to get correct icon drop placement. * libnautilus-extensions/nautilus-file-operations.c: (get_link_name), (get_duplicate_name), (handle_xfer_duplicate): Rework a bit, fix a leak (FIXME 2556). * libnautilus-extensions/nautilus-file-operations.c: (nautilus_file_operations_copy_move), Fix a leak. * libnautilus-extensions/nautilus-file-operations.c: (create_xfer_dialog): Fix a bug in dialog result handling code. * libnautilus-extensions/nautilus-drag.h: Some minor tweaks
Diffstat (limited to 'libnautilus-private/nautilus-file-changes-queue.c')
-rw-r--r--libnautilus-private/nautilus-file-changes-queue.c61
1 files changed, 55 insertions, 6 deletions
diff --git a/libnautilus-private/nautilus-file-changes-queue.c b/libnautilus-private/nautilus-file-changes-queue.c
index 5bc14f284..9d921f28b 100644
--- a/libnautilus-private/nautilus-file-changes-queue.c
+++ b/libnautilus-private/nautilus-file-changes-queue.c
@@ -23,10 +23,10 @@
*/
#include <config.h>
-#include "nautilus-file-changes-queue.h"
-#include "nautilus-glib-extensions.h"
#include "nautilus-directory-notify.h"
+#include "nautilus-file-changes-queue.h"
+#include "nautilus-glib-extensions.h"
#ifdef G_THREADS_ENABLED
#define MUTEX_LOCK(a) if ((a) != NULL) g_mutex_lock (a)
@@ -43,13 +43,15 @@ typedef enum {
CHANGE_FILE_MOVED,
CHANGE_METADATA_COPY,
CHANGE_METADATA_MOVE,
- CHANGE_METADATA_REMOVE
+ CHANGE_METADATA_REMOVE,
+ CHANGE_POSITION_SETTING
} NautilusFileChangeKind;
typedef struct {
NautilusFileChangeKind kind;
char *from_uri;
char *to_uri;
+ GdkPoint point;
} NautilusFileChange;
typedef struct {
@@ -224,6 +226,22 @@ nautilus_file_changes_queue_schedule_metadata_remove (const char *uri)
nautilus_file_changes_queue_add_common (queue, new_item);
}
+void
+nautilus_file_changes_queue_schedule_position_setting (const char *uri,
+ GdkPoint point)
+{
+ NautilusFileChange *new_item;
+ NautilusFileChangesQueue *queue;
+
+ queue = nautilus_file_changes_queue_get ();
+
+ new_item = g_new (NautilusFileChange, 1);
+ new_item->kind = CHANGE_POSITION_SETTING;
+ new_item->from_uri = g_strdup (uri);
+ new_item->point = point;
+ nautilus_file_changes_queue_add_common (queue, new_item);
+}
+
static NautilusFileChange *
nautilus_file_changes_queue_get_change (NautilusFileChangesQueue *queue)
{
@@ -273,6 +291,20 @@ pairs_list_free (GList *pairs)
nautilus_g_list_free_deep (pairs);
}
+static void
+position_setting_list_free (GList *list)
+{
+ GList *p;
+ NautilusFileChangesQueuePositionSetting *item;
+
+ for (p = list; p != NULL; p = p->next) {
+ item = p->data;
+ g_free (item->uri);
+ }
+ /* delete the list and the now empty structs */
+ nautilus_g_list_free_deep (list);
+}
+
/* go through changes in the change queue, send ones with the same kind
* in a list to the different nautilus_directory_notify calls
*/
@@ -282,11 +314,13 @@ nautilus_file_changes_consume_changes (gboolean consume_all)
NautilusFileChange *change;
GList *additions, *deletions, *moves;
GList *metadata_copy_requests, *metadata_move_requests, *metadata_remove_requests;
+ GList *position_setting_requests;
URIPair *pair;
+ NautilusFileChangesQueuePositionSetting *position_setting;
int kind;
int chunk_count;
NautilusFileChangesQueue *queue;
-
+
additions = NULL;
deletions = NULL;
@@ -294,6 +328,7 @@ nautilus_file_changes_consume_changes (gboolean consume_all)
metadata_copy_requests = NULL;
metadata_move_requests = NULL;
metadata_remove_requests = NULL;
+ position_setting_requests = NULL;
kind = CHANGE_FILE_INITIAL;
queue = nautilus_file_changes_queue_get();
@@ -321,7 +356,8 @@ nautilus_file_changes_consume_changes (gboolean consume_all)
g_assert ((deletions != NULL) + (moves != NULL)
+ (additions != NULL) + (metadata_copy_requests != NULL)
+ (metadata_move_requests != NULL)
- + (metadata_remove_requests != NULL) <= 1);
+ + (metadata_remove_requests != NULL)
+ + (position_setting_requests != NULL) <= 1);
if (deletions != NULL) {
nautilus_directory_notify_files_removed (deletions);
@@ -350,9 +386,14 @@ nautilus_file_changes_consume_changes (gboolean consume_all)
}
if (metadata_remove_requests != NULL) {
nautilus_directory_schedule_metadata_remove (metadata_remove_requests);
- pairs_list_free (metadata_remove_requests);
+ nautilus_g_list_free_deep (metadata_remove_requests);
metadata_remove_requests = NULL;
}
+ if (position_setting_requests != NULL) {
+ nautilus_directory_schedule_position_setting (position_setting_requests);
+ position_setting_list_free (position_setting_requests);
+ position_setting_requests = NULL;
+ }
}
if (change == NULL) {
@@ -398,6 +439,14 @@ nautilus_file_changes_consume_changes (gboolean consume_all)
change->from_uri);
break;
+ case CHANGE_POSITION_SETTING:
+ position_setting = g_new (NautilusFileChangesQueuePositionSetting, 1);
+ position_setting->uri = change->from_uri;
+ position_setting->point = change->point;
+ position_setting_requests = g_list_append (position_setting_requests,
+ position_setting);
+ break;
+
default:
g_assert_not_reached ();
break;