diff options
| author | Kristóf Széles <[email protected]> | 2026-05-16 20:20:31 +0200 |
|---|---|---|
| committer | Victor Kareh <[email protected]> | 2026-05-20 08:14:09 -0400 |
| commit | 98f11f4e55be9d3a628afb0f98b7f2a45d5635df (patch) | |
| tree | f186f4cb32a8ae2d3534290022d37817808b32f7 | |
| parent | 5382d8fcdf08ac2c833858370ac0176158e37ffe (diff) | |
| download | caja-98f11f4e55be9d3a628afb0f98b7f2a45d5635df.tar.bz2 caja-98f11f4e55be9d3a628afb0f98b7f2a45d5635df.tar.xz | |
Fix duplicate conflict dialog when moving files across volumes
| -rw-r--r-- | libcaja-private/caja-file-operations.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/libcaja-private/caja-file-operations.c b/libcaja-private/caja-file-operations.c index 1500aff1..fe2548fb 100644 --- a/libcaja-private/caja-file-operations.c +++ b/libcaja-private/caja-file-operations.c @@ -3452,6 +3452,7 @@ static void copy_move_file (CopyMoveJob *job, GFile *dest_dir, gboolean same_fs, gboolean unique_names, + GFile *precomputed_dest, char **dest_fs_type, SourceInfo *source_info, TransferInfo *transfer_info, @@ -3639,7 +3640,7 @@ copy_move_directory (CopyMoveJob *copy_job, g_file_info_get_name (info)); last_item = (last_item_above) && (!nextinfo); - copy_move_file (copy_job, src_file, *dest, same_fs, FALSE, &dest_fs_type, + copy_move_file (copy_job, src_file, *dest, same_fs, FALSE, NULL, &dest_fs_type, source_info, transfer_info, NULL, NULL, FALSE, &local_skipped_file, readonly_source_fs, last_item); g_object_unref (src_file); @@ -4145,6 +4146,7 @@ copy_move_file (CopyMoveJob *copy_job, GFile *dest_dir, gboolean same_fs, gboolean unique_names, + GFile *precomputed_dest, char **dest_fs_type, SourceInfo *source_info, TransferInfo *transfer_info, @@ -4185,6 +4187,11 @@ copy_move_file (CopyMoveJob *copy_job, if (unique_names) { dest = get_unique_target_file (src, dest_dir, same_fs, *dest_fs_type, unique_name_nr++); + } else if (precomputed_dest != NULL) { + /* Set by the cross-filesystem move fallback when the user already + * picked a new name during move_file_prepare. Reuse that exact + * destination so the conflict dialog is not shown a second time. */ + dest = g_object_ref (precomputed_dest); } else { dest = get_target_file (src, dest_dir, *dest_fs_type, same_fs); } @@ -4624,6 +4631,7 @@ copy_files (CopyMoveJob *job, copy_move_file (job, src, dest, same_fs, unique_names, + NULL, &dest_fs_type, source_info, transfer_info, job->debuting_files, @@ -4813,13 +4821,26 @@ report_move_progress (CopyMoveJob *move_job, int total, int left) typedef struct { GFile *file; + /* If set, the copy+delete move phase must use this destination + * (e.g. after the user picked a new name in move_file_prepare). */ + GFile *precomputed_dest; gboolean overwrite; gboolean has_position; GdkPoint position; } MoveFileCopyFallback; +static void +move_file_copy_fallback_free (gpointer data) +{ + MoveFileCopyFallback *fallback = data; + + g_clear_object (&fallback->precomputed_dest); + g_free (fallback); +} + static MoveFileCopyFallback * move_copy_file_callback_new (GFile *file, + GFile *precomputed_dest, gboolean overwrite, GdkPoint *position) { @@ -4827,6 +4848,9 @@ move_copy_file_callback_new (GFile *file, fallback = g_new (MoveFileCopyFallback, 1); fallback->file = file; + fallback->precomputed_dest = precomputed_dest != NULL + ? g_object_ref (precomputed_dest) + : NULL; fallback->overwrite = overwrite; if (position) { fallback->has_position = TRUE; @@ -5029,6 +5053,7 @@ move_file_prepare (CopyMoveJob *move_job, g_error_free (error); fallback = move_copy_file_callback_new (src, + dest, overwrite, position); *fallback_files = g_list_prepend (*fallback_files, fallback); @@ -5175,7 +5200,9 @@ move_files (CopyMoveJob *job, selected overwrite on all toplevel items */ skipped_file = FALSE; copy_move_file (job, src, job->destination, - same_fs, FALSE, dest_fs_type, + same_fs, FALSE, + fallback->precomputed_dest, + dest_fs_type, source_info, transfer_info, job->debuting_files, point, fallback->overwrite, &skipped_file, FALSE, @@ -5278,7 +5305,7 @@ move_job (GIOSchedulerJob *io_job, &source_info, &transfer_info); aborted: - g_list_free_full (fallbacks, g_free); + g_list_free_full (fallbacks, move_file_copy_fallback_free); g_free (dest_fs_id); g_free (dest_fs_type); |
