/* Returns non-zero if selection doesn't mix files and directories, otherwise * zero is returned. */ static int selection_is_consistent(FileView *view) { int files = 0, dirs = 0; dir_entry_t *entry; if(view->selected_files < 2) { return 1; } entry = NULL; while(iter_selected_entries(view, &entry)) { char full[PATH_MAX]; get_full_path_of(entry, sizeof(full), full); if(is_dir_entry(full, entry->type)) { ++dirs; } else { ++files; } } return (dirs == 0 || files == 0); }
TSTATIC char * append_selected_files(FileView *view, char expanded[], int under_cursor, int quotes, const char mod[], int for_shell) { const PathType type = (view == other_view) ? PT_FULL : (flist_custom_active(view) ? PT_REL : PT_NAME); #ifdef _WIN32 size_t old_len = strlen(expanded); #endif if(view->selected_files && !under_cursor) { int n = 0; dir_entry_t *entry = NULL; while(iter_selected_entries(view, &entry)) { expanded = append_entry(view, expanded, type, entry, quotes, mod, for_shell); if(++n != view->selected_files) { expanded = append_to_expanded(expanded, " "); } } } else { expanded = append_entry(view, expanded, type, get_current_entry(view), quotes, mod, for_shell); } #ifdef _WIN32 if(for_shell && curr_stats.shell_type == ST_CMD) { to_back_slash(expanded + old_len); } #endif return expanded; }
/* Runs each of selected file entries of the view individually. */ static void run_selection_separately(FileView *view, int dont_execute) { dir_entry_t *entry; const int pos = view->list_pos; entry = NULL; while(iter_selected_entries(view, &entry)) { char *typed_fname; const char *entry_prog_cmd; typed_fname = get_typed_entry_fpath(entry); entry_prog_cmd = ft_get_program(typed_fname); free(typed_fname); view->list_pos = entry_to_pos(view, entry); run_using_prog(view, entry_prog_cmd, dont_execute, 0); } view->list_pos = pos; }
static void run_file(FileView *view, int dont_execute) { /* TODO: refactor this function run_file() */ char *typed_fname; const char *multi_prog_cmd; int undef; int same; dir_entry_t *entry; int no_multi_run; if(!view->dir_entry[view->list_pos].selected) { clean_selected_files(view); } typed_fname = get_typed_entry_fpath(get_current_entry(view)); multi_prog_cmd = ft_get_program(typed_fname); free(typed_fname); no_multi_run = !is_multi_run_compat(view, multi_prog_cmd); undef = 0; same = 1; entry = NULL; while(iter_selected_entries(view, &entry)) { char *typed_fname; const char *entry_prog_cmd; if(!path_exists_at(entry->origin, entry->name, DEREF)) { show_error_msgf("Broken Link", "Destination of \"%s\" link doesn't exist", entry->name); return; } typed_fname = get_typed_entry_fpath(entry); entry_prog_cmd = ft_get_program(typed_fname); free(typed_fname); if(entry_prog_cmd == NULL) { ++undef; continue; } no_multi_run += !is_multi_run_compat(view, entry_prog_cmd); if(multi_prog_cmd == NULL) { multi_prog_cmd = entry_prog_cmd; } else if(strcmp(entry_prog_cmd, multi_prog_cmd) != 0) { same = 0; } } if(!same && undef == 0 && no_multi_run) { show_error_msg("Run error", "Handlers of selected files are incompatible."); return; } if(undef > 0) { multi_prog_cmd = NULL; } /* Check for a filetype */ /* vi is set as the default for any extension without a program */ if(multi_prog_cmd == NULL) { run_with_defaults(view); return; } if(no_multi_run) { run_using_prog(view, multi_prog_cmd, dont_execute, 0); } else { run_selection_separately(view, dont_execute); } }