diff --git a/src/ChangeLog b/src/ChangeLog index 5e16fc85e..176ab9d71 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2003-08-18 Pavel Roskin + + * file.c (panel_operate_generate_prompt): Remove source + calculation, it doesn't belong here. + (panel_operate): Change arguments: drop ask_user and thedefault, + introduce force_single. force_single changes default to the + current file and ignores selection. Adjust all dependencies. + 2003-08-17 Pavel Roskin * dir.h (file_entry): Rename "buf" to "st". Adjust all diff --git a/src/cmd.c b/src/cmd.c index e2902d785..4b3207beb 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -313,7 +313,7 @@ void copy_cmd (void) { save_cwds_stat (); - if (panel_operate (cpanel, OP_COPY, NULL, TRUE)) { + if (panel_operate (cpanel, OP_COPY, 0)) { update_panels (UP_OPTIMIZE, UP_KEEPSEL); repaint_screen (); } @@ -323,7 +323,7 @@ copy_cmd (void) void ren_cmd (void) { save_cwds_stat (); - if (panel_operate (cpanel, OP_MOVE, NULL, TRUE)){ + if (panel_operate (cpanel, OP_MOVE, 0)){ update_panels (UP_OPTIMIZE, UP_KEEPSEL); repaint_screen (); } @@ -333,7 +333,7 @@ void ren_cmd (void) void copy_cmd_local (void) { save_cwds_stat (); - if (panel_operate (cpanel, OP_COPY, selection (cpanel)->fname, TRUE)){ + if (panel_operate (cpanel, OP_COPY, 1)){ update_panels (UP_OPTIMIZE, UP_KEEPSEL); repaint_screen (); } @@ -343,7 +343,7 @@ void copy_cmd_local (void) void ren_cmd_local (void) { save_cwds_stat (); - if (panel_operate (cpanel, OP_MOVE, selection (cpanel)->fname, TRUE)){ + if (panel_operate (cpanel, OP_MOVE, 1)){ update_panels (UP_OPTIMIZE, UP_KEEPSEL); repaint_screen (); } @@ -384,7 +384,7 @@ void delete_cmd (void) { save_cwds_stat (); - if (panel_operate (cpanel, OP_DELETE, NULL, TRUE)){ + if (panel_operate (cpanel, OP_DELETE, 0)){ update_panels (UP_OPTIMIZE, UP_KEEPSEL); repaint_screen (); } diff --git a/src/file.c b/src/file.c index 3a7347475..3e0f59fb1 100644 --- a/src/file.c +++ b/src/file.c @@ -1531,7 +1531,10 @@ erase_dir_iff_empty (FileOpContext *ctx, char *s) /* {{{ Panel operate routines */ -/* Returns currently selected file or the first marked file if there is one */ +/* + * Return currently selected entry name or the name of the first marked + * entry if there is one. + */ static char * panel_get_file (WPanel *panel, struct stat *stat_buf) { @@ -1687,15 +1690,21 @@ static char *prompt_parts[] = { N_("files/directories"), N_(" with source mask:"), N_(" to:") }; -static char * -panel_operate_generate_prompt (WPanel *panel, int operation, int only_one, - struct stat *src_stat) +/* + * Generate user prompt for panel operation. + * single_source is the name if the source entry or NULL for multiple + * entries. + * src_stat is only used when single_source is not NULL. + */ +static void +panel_operate_generate_prompt (const WPanel *panel, const int operation, + const char *single_source, + const struct stat *src_stat) { register char *sp, *cp; register int i; char format_string[BUF_MEDIUM]; char *dp = format_string; - char *source = NULL; #ifdef ENABLE_NLS static int i18n_flag = 0; @@ -1714,10 +1723,7 @@ panel_operate_generate_prompt (WPanel *panel, int operation, int only_one, } #endif /* ENABLE_NLS */ - sp = only_one ? one_format : many_format; - - if (only_one) - source = panel_get_file (panel, src_stat); + sp = single_source ? one_format : many_format; while (*sp) { switch (*sp) { @@ -1734,9 +1740,10 @@ panel_operate_generate_prompt (WPanel *panel, int operation, int only_one, cp = operation == OP_DELETE ? "?" : prompt_parts[6]; break; case 'f': - if (only_one) { - cp = S_ISDIR (src_stat->st_mode) ? - prompt_parts[2] : prompt_parts[0]; + if (single_source) { + cp = S_ISDIR (src_stat-> + st_mode) ? prompt_parts[2] : + prompt_parts[0]; } else { cp = (panel->marked == panel->dirs_marked) ? prompt_parts[3] @@ -1759,10 +1766,10 @@ panel_operate_generate_prompt (WPanel *panel, int operation, int only_one, } *dp = '\0'; - if (only_one) { + if (single_source) { i = fmd_xlen - strlen (format_string) - 4; g_snprintf (cmd_buf, sizeof (cmd_buf), format_string, - name_trunc (source, i)); + name_trunc (single_source, i)); } else { g_snprintf (cmd_buf, sizeof (cmd_buf), format_string, panel->marked); @@ -1772,8 +1779,6 @@ panel_operate_generate_prompt (WPanel *panel, int operation, int only_one, fmd_init_i18n (TRUE); /* to recalculate positions of child widgets */ } } - - return source; } /** @@ -1784,10 +1789,13 @@ panel_operate_generate_prompt (WPanel *panel, int operation, int only_one, * * Returns 1 if did change the directory * structure, Returns 0 if user aborted + * + * force_single forces operation on the current entry and affects + * default destination. Current filename is used as default. */ int panel_operate (void *source_panel, FileOperation operation, - char *thedefault, int ask_user) + int force_single) { WPanel *panel = source_panel; #ifdef WITH_FULL_PATHS @@ -1799,8 +1807,8 @@ panel_operate (void *source_panel, FileOperation operation, char *dest = NULL; char *temp = NULL; char *save_cwd = NULL, *save_dest = NULL; - int only_one = (get_current_type () == view_tree) - || (panel->marked <= 1); + int single_entry = (get_current_type () == view_tree) + || (panel->marked <= 1) || force_single; struct stat src_stat, dst_stat; int i, value; FileOpContext *ctx; @@ -1809,67 +1817,64 @@ panel_operate (void *source_panel, FileOperation operation, double bytes = 0; int dst_result; - int do_bg; /* do background operation? */ + int do_bg = 0; /* do background operation? */ - ctx = file_op_context_new (); - - do_bg = 0; free_linklist (&linklist); free_linklist (&dest_dirs); - if (get_current_type () == view_listing) - if (!panel->marked && !strcmp (selection (panel)->fname, "..")) { - message (1, MSG_ERROR, _(" Cannot operate on \"..\"! ")); - file_op_context_destroy (ctx); - return 0; + + if (single_entry) { + if (force_single) { + source = selection (panel)->fname; + src_stat = selection (panel)->st; + } else { + source = panel_get_file (panel, &src_stat); } + if (!strcmp (source, "..")) { + message (1, MSG_ERROR, _(" Cannot operate on \"..\"! ")); + return 0; + } + } + /* Generate confirmation prompt */ - source = - panel_operate_generate_prompt (panel, operation, only_one, - &src_stat); + panel_operate_generate_prompt (panel, operation, source, &src_stat); + + ctx = file_op_context_new (); /* Show confirmation dialog */ if (operation == OP_DELETE && confirm_delete) { if (safe_delete) query_set_sel (1); - i = query_dialog (_(op_names[operation]), cmd_buf, - D_ERROR, 2, _("&Yes"), _("&No")); + i = query_dialog (_(op_names[operation]), cmd_buf, D_ERROR, 2, + _("&Yes"), _("&No")); if (i != 0) { file_op_context_destroy (ctx); return 0; } } else if (operation != OP_DELETE) { - if (ask_user) { - char *dest_dir; + char *dest_dir; - if (thedefault != NULL) - dest_dir = thedefault; - else if (get_other_type () == view_listing) - dest_dir = opanel->cwd; - else - dest_dir = panel->cwd; + /* Forced single operations default to the original name */ + if (force_single) + dest_dir = source; + else if (get_other_type () == view_listing) + dest_dir = opanel->cwd; + else + dest_dir = panel->cwd; - dest = - file_mask_dialog (ctx, operation, cmd_buf, dest_dir, - only_one, &do_bg); - if (!dest) { - file_op_context_destroy (ctx); - return 0; - } - if (!*dest) { - file_op_context_destroy (ctx); - g_free (dest); - return 0; - } - } else { - char *all = "^\\(.*\\)$"; - - re_compile_pattern (all, strlen (all), &ctx->rx); - ctx->dest_mask = g_strdup ("*"); - do_bg = FALSE; - dest = g_strdup (thedefault); + dest = + file_mask_dialog (ctx, operation, cmd_buf, dest_dir, + single_entry, &do_bg); + if (!dest) { + file_op_context_destroy (ctx); + return 0; + } + if (!*dest) { + file_op_context_destroy (ctx); + g_free (dest); + return 0; } } #ifdef WITH_BACKGROUND @@ -1916,7 +1921,7 @@ panel_operate (void *source_panel, FileOperation operation, file_op_context_create_ui (ctx, operation, 1); /* This code is only called by the tree and panel code */ - if (only_one) { + if (single_entry) { /* We now have ETA in all cases */ /* One file: FIXME mc_chdir will take user out of any vfs */ @@ -1980,7 +1985,7 @@ panel_operate (void *source_panel, FileOperation operation, } } /* Copy or move operation */ - if (value == FILE_CONT) + if ((value == FILE_CONT) && !force_single) unmark_files (panel); } else { /* Many files */ @@ -2043,7 +2048,7 @@ panel_operate (void *source_panel, FileOperation operation, switch (operation) { case OP_COPY: /* - * we use file_mask_op_follow_links only with OP_COPY, + * we use file_mask_op_follow_links only with OP_COPY */ (*ctx->stat_func) (source_with_path, &src_stat); if (S_ISDIR (src_stat.st_mode)) @@ -2098,7 +2103,7 @@ panel_operate (void *source_panel, FileOperation operation, mc_refresh (); } /* Loop for every file */ - } /* Many files */ + } /* Many entries */ clean_up: /* Clean up */ diff --git a/src/file.h b/src/file.h index 7c060b377..3555f3b74 100644 --- a/src/file.h +++ b/src/file.h @@ -8,35 +8,37 @@ extern int safe_delete; struct link; -int copy_file_file (FileOpContext *ctx, char *s, char *d, int ask_overwrite, - off_t *progress_count, double *progress_bytes, - int is_toplevel_file); -int move_file_file (FileOpContext *ctx, char *s, char *d, - off_t *progress_count, double *progress_bytes); -int move_dir_dir (FileOpContext *ctx, char *s, char *d, - off_t *progress_count, double *progress_bytes); -int copy_dir_dir (FileOpContext *ctx, char *s, char *d, int toplevel, int move_over, - int delete, struct link *parent_dirs, - off_t *progress_count, double *progress_bytes); -int erase_dir (FileOpContext *ctx, char *s, off_t *progress_count, double *progress_bytes); -int erase_file (FileOpContext *ctx, char *s, off_t *progress_count, double *progress_bytes, - int is_toplevel_file); +int copy_file_file (FileOpContext *ctx, char *s, char *d, + int ask_overwrite, off_t *progress_count, + double *progress_bytes, int is_toplevel_file); +int move_file_file (FileOpContext *ctx, char *s, char *d, + off_t *progress_count, double *progress_bytes); +int move_dir_dir (FileOpContext *ctx, char *s, char *d, + off_t *progress_count, double *progress_bytes); +int copy_dir_dir (FileOpContext *ctx, char *s, char *d, int toplevel, + int move_over, int delete, struct link *parent_dirs, + off_t *progress_count, double *progress_bytes); +int erase_dir (FileOpContext *ctx, char *s, off_t *progress_count, + double *progress_bytes); +int erase_file (FileOpContext *ctx, char *s, off_t *progress_count, + double *progress_bytes, int is_toplevel_file); int erase_dir_iff_empty (FileOpContext *ctx, char *s); -int panel_operate (void *source_panel, FileOperation op, - char *thedefault, int ask_user); +int panel_operate (void *source_panel, FileOperation op, int force_single); extern int file_op_compute_totals; /* Error reporting routines */ - /* Report error with one file */ - int file_error (char *format, char *file); - /* Report error with two files */ - int files_error (char *format, char *file1, char *file2); +/* Report error with one file */ +int file_error (char *format, char *file); + +/* Report error with two files */ +int files_error (char *format, char *file1, char *file2); /* Query routines */ -void compute_dir_size (char *dirname, off_t *ret_marked, double *ret_total); +void compute_dir_size (char *dirname, off_t *ret_marked, + double *ret_total); -#endif /* !__FILE_H */ +#endif /* !__FILE_H */