19 typedef struct _FileDataMult FileDataMult;
33 typedef struct _FileDataSingle FileDataSingle;
34 struct _FileDataSingle
42 static FileDataMult *file_data_multiple_new(GList *source_list, gchar *dest, gint copy);
43 static void file_data_multiple_free(FileDataMult *fdm);
44 static void file_util_move_multiple(FileDataMult *fdm);
45 static void file_util_move_multiple_ok_cb(GtkWidget *widget, gpointer data);
46 static void file_util_move_multiple_all_cb(GtkWidget *widget, gpointer data);
47 static void file_util_move_multiple_skip_cb(GtkWidget *widget, gpointer data);
48 static void file_util_move_multiple_cancel_cb(GtkWidget *widget, gpointer data);
49 static void file_util_move_multiple(FileDataMult *fdm);
51 static FileDataSingle *file_data_single_new(gchar *source, gchar *dest, gint copy);
52 static void file_data_single_free(FileDataSingle *fds);
53 static void file_util_move_single_ok_cb(GtkWidget *widget, gpointer data);
54 static void file_util_move_single(FileDataSingle *fds);
55 static void file_util_move_single_cancel_cb(GtkWidget *widget, gpointer data);
56 static void file_util_move_do(FileDialog *fd);
57 static void file_util_move_check(FileDialog *fd);
58 static void file_util_move_cb(GtkWidget *widget, gpointer data);
59 static void file_util_move_enter_cb(gchar *path, gpointer data);
60 static void file_util_move_completion_sync_cb(gchar *path, gpointer data);
61 static void real_file_util_move(gchar *source_path, GList *source_list, gchar *dest_path, gint copy);
63 static void file_util_delete_multiple_ok_cb(GtkWidget *w, gpointer data);
64 static void file_util_delete_multiple_cancel_cb(GtkWidget *w, gpointer data);
65 static void file_util_delete_multiple(GList *source_list);
66 static void file_util_delete_ok_cb(GtkWidget *w, gpointer data);
67 static void file_util_delete_cancel_cb(GtkWidget *w, gpointer data);
68 static void file_util_delete_single(gchar *path);
70 static void file_util_rename_multiple_ok_cb(GtkWidget *w, gpointer data);
71 static void file_util_rename_multiple_cancel_cb(GtkWidget *w, gpointer data);
72 static void file_util_rename_multiple(FileDialog *fd);
73 static void file_util_rename_multiple_cb(GtkWidget *w, gpointer data);
74 static void file_util_rename_multiple_select_cb(GtkWidget *clist,
75 gint row, gint column, GdkEventButton *bevent, gpointer data);
76 static void file_util_rename_multiple_do(GList *source_list);
78 static void file_util_rename_single_ok_cb(GtkWidget *w, gpointer data);
79 static void file_util_rename_single_cancel_cb(GtkWidget *w, gpointer data);
80 static void file_util_rename_single(FileDataSingle *fds);
81 static void file_util_rename_single_cb(GtkWidget *w, gpointer data);
82 static void file_util_rename_single_do(gchar *source_path);
84 static void file_util_create_dir_do(gchar *source, gchar *path);
85 static void file_util_create_dir_cb(GtkWidget *w, gpointer data);
88 *--------------------------------------------------------------------------
89 * Move and Copy routines
90 *--------------------------------------------------------------------------
97 static FileDataMult *file_data_multiple_new(GList *source_list, gchar *dest, gint copy)
99 FileDataMult *fdm = g_new0(FileDataMult, 1);
100 fdm->confirm_all = FALSE;
101 fdm->confirmed = FALSE;
103 fdm->source_list = source_list;
104 fdm->source_next = fdm->source_list;
105 fdm->dest_base = g_strdup(dest);
112 static void file_data_multiple_free(FileDataMult *fdm)
114 free_selected_list(fdm->source_list);
115 g_free(fdm->dest_base);
120 static void file_util_move_multiple_ok_cb(GtkWidget *widget, gpointer data)
122 FileDataMult *fdm = data;
123 fdm->confirmed = TRUE;
124 file_util_move_multiple(fdm);
127 static void file_util_move_multiple_all_cb(GtkWidget *widget, gpointer data)
129 FileDataMult *fdm = data;
130 fdm->confirm_all = TRUE;
131 file_util_move_multiple(fdm);
134 static void file_util_move_multiple_skip_cb(GtkWidget *widget, gpointer data)
136 FileDataMult *fdm = data;
138 file_util_move_multiple(fdm);
141 static void file_util_move_multiple_cancel_cb(GtkWidget *widget, gpointer data)
143 FileDataMult *fdm = data;
144 file_data_multiple_free(fdm);
147 static void file_util_move_multiple(FileDataMult *fdm)
149 while (fdm->dest || fdm->source_next)
153 GList *work = fdm->source_next;
154 fdm->source = work->data;
155 fdm->dest = g_strconcat(fdm->dest_base, "/", filename_from_path(fdm->source), NULL);
156 fdm->source_next = work->next;
159 if (isfile(fdm->dest) && !fdm->confirmed && !fdm->confirm_all && !fdm->skip)
162 gchar *text = g_strdup_printf(_("Overwrite file:\n %s\n with:\b %s"), fdm->dest, fdm->source);
163 cd = confirm_dialog_new(_("Overwrite file"), text, file_util_move_multiple_cancel_cb, fdm);
164 confirm_dialog_add(cd, _("Skip"), file_util_move_multiple_skip_cb);
165 confirm_dialog_add(cd, _("Yes to all"), file_util_move_multiple_all_cb);
166 confirm_dialog_add(cd, _("Yes"), file_util_move_multiple_ok_cb);
172 gint success = FALSE;
182 success = copy_file(fdm->source, fdm->dest);
186 if (move_file(fdm->source, fdm->dest))
189 file_is_gone(fdm->source, fdm->source_list);
200 title = _("Error copying file");
201 text = g_strdup_printf(_("Unable to copy file:\n%sto:\n%s\n during multiple file copy."), fdm->source, fdm->dest);
205 title = _("Error moving file");
206 text = g_strdup_printf(_("Unable to move file:\n%sto:\n%s\n during multiple file move."), fdm->source, fdm->dest);
208 cd = confirm_dialog_new(title, text, file_util_move_multiple_cancel_cb, fdm);
209 confirm_dialog_add(cd, _("Continue"), file_util_move_multiple_skip_cb);
213 fdm->confirmed = FALSE;
219 file_data_multiple_free(fdm);
226 static FileDataSingle *file_data_single_new(gchar *source, gchar *dest, gint copy)
228 FileDataSingle *fds = g_new0(FileDataSingle, 1);
229 fds->confirmed = FALSE;
230 fds->source = g_strdup(source);
231 fds->dest = g_strdup(dest);
236 static void file_data_single_free(FileDataSingle *fds)
243 static void file_util_move_single_ok_cb(GtkWidget *widget, gpointer data)
245 FileDataSingle *fds = data;
246 fds->confirmed = TRUE;
247 file_util_move_single(fds);
250 static void file_util_move_single_cancel_cb(GtkWidget *widget, gpointer data)
252 FileDataSingle *fds = data;
253 file_data_single_free(fds);
256 static void file_util_move_single(FileDataSingle *fds)
258 if (isfile(fds->dest) && !fds->confirmed)
261 gchar *text = g_strdup_printf(_("Overwrite file:\n%s\n with:\n%s"), fds->dest, fds->source);
262 cd = confirm_dialog_new(_("Overwrite file"), text, file_util_move_single_cancel_cb, fds);
263 confirm_dialog_add(cd, _("Overwrite"), file_util_move_single_ok_cb);
269 gint success = FALSE;
272 success = copy_file(fds->source, fds->dest);
276 if (move_file(fds->source, fds->dest))
279 file_is_gone(fds->source, NULL);
288 title = _("Error copying file");
289 text = g_strdup_printf(_("Unable to copy file:\n%s\nto:\n%s"), fds->source, fds->dest);
293 title = _("Error moving file");
294 text = g_strdup_printf(_("Unable to move file:\n%s\nto:\n%s"), fds->source, fds->dest);
296 warning_dialog(title, text);
299 file_data_single_free(fds);
307 static void file_util_move_do(FileDialog *fd)
309 tab_completion_append_to_history(fd->entry, fd->dest_path);
310 if (fd->multiple_files)
312 file_util_move_multiple(file_data_multiple_new(fd->source_list, fd->dest_path, fd->type));
313 fd->source_list = NULL;
317 if (isdir(fd->dest_path))
319 gchar *buf = g_strconcat(fd->dest_path, "/", filename_from_path(fd->source_path), NULL);
320 g_free(fd->dest_path);
323 file_util_move_single(file_data_single_new(fd->source_path, fd->dest_path, fd->type));
326 generic_dialog_close(NULL, fd);
329 static void file_util_move_check(FileDialog *fd)
331 g_free(fd->dest_path);
332 fd->dest_path = remove_trailing_slash(gtk_entry_get_text(GTK_ENTRY(fd->entry)));
334 if (fd->multiple_files && !isdir(fd->dest_path))
336 if (isfile(fd->dest_path))
337 warning_dialog(_("Invalid destination"), _("When operating with multiple files, please select\n a directory, not file."));
339 warning_dialog(_("Invalid directory"), _("Please select an existing directory"));
343 file_util_move_do(fd);
346 static void file_util_move_cb(GtkWidget *widget, gpointer data)
348 FileDialog *fd = data;
349 file_util_move_check(fd);
352 static void file_util_move_enter_cb(gchar *path, gpointer data)
354 FileDialog *fd = data;
355 file_util_move_check(fd);
358 static void file_util_move_completion_sync_cb(gchar *path, gpointer data)
360 FileDialog *fd = data;
361 destination_widget_sync_to_entry(fd->entry);
364 static void real_file_util_move(gchar *source_path, GList *source_list, gchar *dest_path, gint copy)
376 if (!source_path && !source_list) return;
380 path = g_strdup(source_path);
383 else if (source_list->next)
389 path = g_strdup(source_list->data);
390 free_selected_list(source_list);
397 title = _("GQview - copy");
400 text = g_strdup_printf(_("Copy file:\n%s\nto:"), path);
402 text = g_strdup_printf(_("Copy multiple files from:\n%s\nto:"), dest_path);
406 title = _("GQview - move");
409 text = g_strdup_printf(_("Move file:\n%s\nto:"), path);
411 text = g_strdup_printf(_("Move multiple files from:\n%s\nto:"), dest_path);
414 fd = generic_dialog_new(title, text, op_text, _("Cancel"),
415 file_util_move_cb, generic_dialog_close);
420 fd->source_path = path;
421 fd->source_list = source_list;
422 fd->multiple_files = multiple;
424 tabcomp = tab_completion_new_with_history(&fd->entry, fd->dialog, dest_path,
425 "move_copy", 32, file_util_move_enter_cb, fd);
426 last_path = tab_completion_set_to_last_history(fd->entry);
429 fd->dest_path = g_strdup(last_path);
433 fd->dest_path = g_strdup(dest_path);
436 /* tabcomp = tab_completion_new(&fd->entry, fd->dialog, fd->dest_path, file_util_move_enter_cb, fd);
438 gtk_box_pack_start(GTK_BOX(fd->vbox), tabcomp, FALSE, FALSE, 0);
439 gtk_widget_show(tabcomp);
441 gtk_widget_grab_focus(fd->entry);
443 dest = destination_widget_new(fd->dest_path, fd->entry);
445 tab_completion_add_tab_func(fd->entry, file_util_move_completion_sync_cb, fd);
447 gtk_box_pack_start(GTK_BOX(fd->vbox), dest, TRUE, TRUE, 0);
450 void file_util_move(gchar *source_path, GList *source_list, gchar *dest_path)
452 real_file_util_move(source_path, source_list, dest_path, FALSE);
455 void file_util_copy(gchar *source_path, GList *source_list, gchar *dest_path)
457 real_file_util_move(source_path, source_list, dest_path, TRUE);
461 *--------------------------------------------------------------------------
463 *--------------------------------------------------------------------------
467 * delete multiple files
470 static void file_util_delete_multiple_ok_cb(GtkWidget *w, gpointer data)
472 GList *source_list = data;
476 gchar *path = source_list->data;
477 source_list = g_list_remove(source_list, path);
478 if (unlink (path) < 0)
484 text = g_strdup_printf(_("Unable to delete file:\n %s\n Continue multiple delete operation?"), path);
485 cd = confirm_dialog_new(_("Delete failed"), text, file_util_delete_multiple_cancel_cb, source_list);
486 confirm_dialog_add(cd, _("Continue"), file_util_delete_multiple_ok_cb);
490 text = g_strdup_printf(_("Unable to delete file:\n%s"), path);
491 warning_dialog(_("Delete failed"), text);
499 file_is_gone(path, source_list);
505 static void file_util_delete_multiple_cancel_cb(GtkWidget *w, gpointer data)
507 GList *source_list = data;
508 free_selected_list(source_list);
511 static void file_util_delete_multiple(GList *source_list)
515 file_util_delete_multiple_ok_cb(NULL, source_list);
520 cd = confirm_dialog_new(_("Delete files"), _("About to delete multiple files..."), file_util_delete_multiple_cancel_cb, source_list);
521 confirm_dialog_add(cd, _("Delete"), file_util_delete_multiple_ok_cb);
529 static void file_util_delete_ok_cb(GtkWidget *w, gpointer data)
533 if (unlink (path) < 0)
535 gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), path);
536 warning_dialog(_("File deletion failed"), text);
541 file_is_gone(path, NULL);
547 static void file_util_delete_cancel_cb(GtkWidget *w, gpointer data)
553 static void file_util_delete_single(gchar *path)
555 gchar *buf = g_strdup(path);
559 file_util_delete_ok_cb(NULL, buf);
564 gchar *text = g_strdup_printf(_("About to delete the file:\n %s"), buf);
565 cd = confirm_dialog_new(_("Delete file"), text, file_util_delete_cancel_cb, buf);
566 confirm_dialog_add(cd, _("Delete"), file_util_delete_ok_cb);
571 void file_util_delete(gchar *source_path, GList *source_list)
573 if (!source_path && !source_list) return;
577 file_util_delete_single(source_path);
579 else if (!source_list->next)
581 file_util_delete_single(source_list->data);
582 free_selected_list(source_list);
586 file_util_delete_multiple(source_list);
591 *--------------------------------------------------------------------------
593 *--------------------------------------------------------------------------
597 * rename multiple files
600 static void file_util_rename_multiple_ok_cb(GtkWidget *w, gpointer data)
602 FileDialog *fd = data;
603 if (!GTK_WIDGET_VISIBLE(fd->dialog)) gtk_widget_show(fd->dialog);
605 file_util_rename_multiple(fd);
608 static void file_util_rename_multiple_cancel_cb(GtkWidget *w, gpointer data)
610 FileDialog *fd = data;
611 if (!GTK_WIDGET_VISIBLE(fd->dialog)) gtk_widget_show(fd->dialog);
615 static void file_util_rename_multiple(FileDialog *fd)
617 if (isfile(fd->dest_path) && !fd->type)
620 gchar *text = g_strdup_printf(_("Overwrite file:\n%s\nby renaming:\n%s"), fd->dest_path, fd->source_path);
621 cd = confirm_dialog_new(_("Overwrite file"), text, file_util_rename_multiple_cancel_cb, fd);
622 confirm_dialog_add(cd, _("Overwrite"), file_util_rename_multiple_ok_cb);
624 gtk_widget_hide(fd->dialog);
629 if (rename (fd->source_path, fd->dest_path) < 0)
631 gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\n to:\n%s"), filename_from_path(fd->source_path), filename_from_path(fd->dest_path));
632 warning_dialog(_("Error renaming file"), text);
642 file_is_renamed(fd->source_path, fd->dest_path);
644 clist = gtk_object_get_user_data(GTK_OBJECT(fd->entry));
645 path = gtk_object_get_user_data(GTK_OBJECT(clist));
646 row = gtk_clist_find_row_from_data(GTK_CLIST(clist), path);
648 n = g_list_length(GTK_CLIST(clist)->row_list);
649 if (debug) printf("r=%d n=%d\n", row, n);
659 gtk_object_set_user_data(GTK_OBJECT(clist), NULL);
660 gtk_clist_remove(GTK_CLIST(clist), row);
661 gtk_clist_select_row(GTK_CLIST(clist), n, -1);
665 if (debug) printf("closed by #%d\n", n);
666 generic_dialog_close(NULL, fd);
672 static void file_util_rename_multiple_cb(GtkWidget *w, gpointer data)
674 FileDialog *fd = data;
678 name = gtk_entry_get_text(GTK_ENTRY(fd->entry));
679 base = remove_level_from_path(fd->source_path);
680 g_free(fd->dest_path);
681 fd->dest_path = g_strconcat(base, "/", name, NULL);
684 if (strlen(name) == 0 || strcmp(fd->source_path, fd->dest_path) == 0)
690 file_util_rename_multiple(fd);
693 static void file_util_rename_multiple_select_cb(GtkWidget *clist,
694 gint row, gint column, GdkEventButton *bevent, gpointer data)
696 FileDialog *fd = data;
701 label = gtk_object_get_user_data(GTK_OBJECT(fd->dialog));
702 path = gtk_clist_get_row_data(GTK_CLIST(clist), row);
703 g_free(fd->source_path);
704 fd->source_path = g_strdup(path);
705 gtk_object_set_user_data(GTK_OBJECT(clist), path);
706 name = filename_from_path(fd->source_path);
708 gtk_label_set(GTK_LABEL(label), name);
709 gtk_entry_set_text(GTK_ENTRY(fd->entry), name);
711 gtk_widget_grab_focus(fd->entry);
714 static void file_util_rename_multiple_do(GList *source_list)
722 fd = generic_dialog_new(_("GQview - rename"), _("Rename multiple files:"), _("Rename"), _("Cancel"),
723 file_util_rename_multiple_cb, generic_dialog_close);
725 fd->source_path = g_strdup(source_list->data);
726 fd->dest_path = NULL;
728 scrolled = gtk_scrolled_window_new(NULL, NULL);
729 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
730 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
731 gtk_box_pack_start(GTK_BOX(fd->vbox), scrolled, TRUE, TRUE, 0);
732 gtk_widget_show(scrolled);
734 clist=gtk_clist_new (1);
735 gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 0, TRUE);
736 gtk_signal_connect (GTK_OBJECT (clist), "select_row",(GtkSignalFunc) file_util_rename_multiple_select_cb, fd);
737 gtk_widget_set_usize(clist, 250, 150);
738 gtk_container_add (GTK_CONTAINER (scrolled), clist);
739 gtk_widget_show (clist);
741 gtk_object_set_user_data(GTK_OBJECT(clist), source_list->data);
748 buf[0] = filename_from_path(work->data);
750 row = gtk_clist_append(GTK_CLIST(clist), buf);
751 gtk_clist_set_row_data_full(GTK_CLIST(clist), row,
752 work->data, (GtkDestroyNotify) g_free);
756 g_list_free(source_list);
758 label = gtk_label_new(_("Rename:"));
759 gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
760 gtk_widget_show(label);
762 label = gtk_label_new(filename_from_path(fd->source_path));
763 gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
764 gtk_widget_show(label);
765 gtk_object_set_user_data(GTK_OBJECT(fd->dialog), label);
767 label = gtk_label_new(_("to:"));
768 gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
769 gtk_widget_show(label);
771 fd->entry = gtk_entry_new();
772 gtk_entry_set_text(GTK_ENTRY(fd->entry), filename_from_path(fd->source_path));
773 gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0);
774 gtk_widget_grab_focus(fd->entry);
775 gtk_widget_show(fd->entry);
777 gtk_object_set_user_data(GTK_OBJECT(fd->entry), clist);
784 static void file_util_rename_single_ok_cb(GtkWidget *w, gpointer data)
786 FileDataSingle *fds = data;
787 fds->confirmed = TRUE;
788 file_util_rename_single(fds);
791 static void file_util_rename_single_cancel_cb(GtkWidget *w, gpointer data)
793 FileDataSingle *fds = data;
794 file_data_single_free(fds);
797 static void file_util_rename_single(FileDataSingle *fds)
799 if (isfile(fds->dest) && !fds->confirmed)
802 gchar *text = g_strdup_printf(_("Overwrite file:\n%s\nwith:\n%s"), fds->dest,fds->source);
803 cd = confirm_dialog_new(_("Overwrite file"), text, file_util_rename_single_cancel_cb, fds);
804 confirm_dialog_add(cd, _("Overwrite"), file_util_rename_single_ok_cb);
810 if (rename (fds->source, fds->dest) < 0)
812 gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\nto:\n%s"), filename_from_path(fds->source), filename_from_path(fds->dest));
813 warning_dialog(_("Error renaming file"), text);
818 file_is_renamed(fds->source, fds->dest);
821 file_data_single_free(fds);
824 static void file_util_rename_single_cb(GtkWidget *w, gpointer data)
826 FileDialog *fd = data;
827 gchar *name = gtk_entry_get_text(GTK_ENTRY(fd->entry));
828 gchar *buf = g_strconcat(fd->dest_path, "/", name, NULL);
830 if (strlen(name) == 0 || strcmp(fd->source_path, buf) == 0)
836 g_free(fd->dest_path);
839 file_util_rename_single(file_data_single_new(fd->source_path, fd->dest_path, fd->type));
841 generic_dialog_close(NULL, fd);
844 static void file_util_rename_single_do(gchar *source_path)
848 gchar *name = filename_from_path(source_path);
850 text = g_strdup_printf(_("Rename file:\n%s\nto:"), name);
851 fd = generic_dialog_new(_("GQview - rename"), text, _("Rename"), _("Cancel"),
852 file_util_rename_single_cb, generic_dialog_close);
855 fd->source_path = g_strdup(source_path);
856 fd->dest_path = remove_level_from_path(source_path);
858 fd->entry = gtk_entry_new();
859 gtk_entry_set_text(GTK_ENTRY(fd->entry), name);
860 gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0);
861 gtk_widget_grab_focus(fd->entry);
862 gtk_widget_show(fd->entry);
865 void file_util_rename(gchar *source_path, GList *source_list)
867 if (!source_path && !source_list) return;
871 file_util_rename_single_do(source_path);
873 else if (!source_list->next)
875 file_util_rename_single_do(source_list->data);
876 free_selected_list(source_list);
880 file_util_rename_multiple_do(source_list);
885 *--------------------------------------------------------------------------
886 * Create directory routines
887 *--------------------------------------------------------------------------
890 static void file_util_create_dir_do(gchar *source, gchar *path)
894 gchar *text = g_strdup_printf(_("The path:\n%s\nalready exists as a file."), filename_from_path(path));
895 warning_dialog(_("Could not create directory"), text);
898 else if (isdir(path))
900 gchar *text = g_strdup_printf(_("The directory:\n%s\nalready exists."), filename_from_path(path));
901 warning_dialog(_("Directory exists"), text);
906 if (mkdir (path, 0755) < 0)
908 gchar *text = g_strdup_printf(_("Unable to create directory:\n%s"), filename_from_path(path));
909 warning_dialog(_("Error creating directory"), text);
914 if (strcmp(source, current_path) == 0)
916 gchar *buf = g_strdup(current_path);
917 filelist_change_to(buf);
924 static void file_util_create_dir_cb(GtkWidget *w, gpointer data)
926 FileDialog *fd = data;
927 gchar *name = gtk_entry_get_text(GTK_ENTRY(fd->entry));
929 if (strlen(name) == 0) return;
931 g_free(fd->dest_path);
932 fd->dest_path = g_strconcat(fd->source_path, "/", name, NULL);
934 file_util_create_dir_do(fd->source_path, fd->dest_path);
936 generic_dialog_close(NULL, fd);
939 void file_util_create_dir(gchar *path)
945 if (!isdir(path)) return;
946 name = filename_from_path(path);
948 text = g_strdup_printf(_("Create directory in:\n%s\nnamed:"), path);
949 fd = generic_dialog_new(_("GQview - new directory"), text, _("Create"), _("Cancel"),
950 file_util_create_dir_cb, generic_dialog_close);
953 fd->source_path = g_strdup(path);
954 fd->dest_path = NULL;
956 fd->entry = gtk_entry_new();
957 gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0);
958 gtk_widget_grab_focus(fd->entry);
959 gtk_widget_show(fd->entry);