summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristóf Széles <[email protected]>2026-05-16 20:20:31 +0200
committerVictor Kareh <[email protected]>2026-05-20 08:14:09 -0400
commit98f11f4e55be9d3a628afb0f98b7f2a45d5635df (patch)
treef186f4cb32a8ae2d3534290022d37817808b32f7
parent5382d8fcdf08ac2c833858370ac0176158e37ffe (diff)
downloadcaja-98f11f4e55be9d3a628afb0f98b7f2a45d5635df.tar.bz2
caja-98f11f4e55be9d3a628afb0f98b7f2a45d5635df.tar.xz
Fix duplicate conflict dialog when moving files across volumes
-rw-r--r--libcaja-private/caja-file-operations.c33
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);