static void exec_extension_view (char *cmd, const vfs_path_t * filename_vpath, int start_line, vfs_path_t * temp_file_name_vpath) { int def_hex_mode = mcview_default_hex_mode, changed_hex_mode = 0; int def_nroff_flag = mcview_default_nroff_flag, changed_nroff_flag = 0; mcview_altered_hex_mode = 0; mcview_altered_nroff_flag = 0; if (def_hex_mode != mcview_default_hex_mode) changed_hex_mode = 1; if (def_nroff_flag != mcview_default_nroff_flag) changed_nroff_flag = 1; /* If we've written whitespace only, then just load filename * into view */ if (written_nonspace) { mcview_viewer (cmd, filename_vpath, start_line); mc_unlink (temp_file_name_vpath); } else mcview_viewer (NULL, filename_vpath, start_line); if (changed_hex_mode && !mcview_altered_hex_mode) mcview_default_hex_mode = def_hex_mode; if (changed_nroff_flag && !mcview_altered_nroff_flag) mcview_default_nroff_flag = def_nroff_flag; dialog_switch_process_pending (); }
static void exec_extension_view (void *target, char *cmd, const vfs_path_t * filename_vpath, int start_line) { int def_hex_mode = mcview_default_hex_mode, changed_hex_mode = 0; int def_nroff_flag = mcview_default_nroff_flag, changed_nroff_flag = 0; mcview_altered_hex_mode = 0; mcview_altered_nroff_flag = 0; if (def_hex_mode != mcview_default_hex_mode) changed_hex_mode = 1; if (def_nroff_flag != mcview_default_nroff_flag) changed_nroff_flag = 1; if (target == NULL) mcview_viewer (cmd, filename_vpath, start_line); else mcview_load ((mcview_t *) target, cmd, vfs_path_as_str (filename_vpath), start_line); if (changed_hex_mode && !mcview_altered_hex_mode) mcview_default_hex_mode = def_hex_mode; if (changed_nroff_flag && !mcview_altered_nroff_flag) mcview_default_nroff_flag = def_nroff_flag; dialog_switch_process_pending (); }
void view_filtered_cmd (void) { char *command; const char *initial_command; if (cmdline->buffer[0] == '\0') initial_command = selection (current_panel)->fname; else initial_command = cmdline->buffer; command = input_dialog (_("Filtered view"), _("Filter command and arguments:"), MC_HISTORY_FM_FILTERED_VIEW, initial_command); if (command != NULL) { mcview_viewer (command, "", 0); g_free (command); dialog_switch_process_pending (); } }
gboolean view_file_at_line (const vfs_path_t * filename_vpath, gboolean plain_view, gboolean internal, long start_line) { gboolean ret = TRUE; if (plain_view) { int changed_hex_mode = 0; int changed_nroff_flag = 0; int changed_magic_flag = 0; mcview_altered_hex_mode = 0; mcview_altered_nroff_flag = 0; mcview_altered_magic_flag = 0; if (mcview_default_hex_mode) changed_hex_mode = 1; if (mcview_default_nroff_flag) changed_nroff_flag = 1; if (mcview_default_magic_flag) changed_magic_flag = 1; mcview_default_hex_mode = 0; mcview_default_nroff_flag = 0; mcview_default_magic_flag = 0; ret = mcview_viewer (NULL, filename_vpath, start_line); if (changed_hex_mode && !mcview_altered_hex_mode) mcview_default_hex_mode = 1; if (changed_nroff_flag && !mcview_altered_nroff_flag) mcview_default_nroff_flag = 1; if (changed_magic_flag && !mcview_altered_magic_flag) mcview_default_magic_flag = 1; dialog_switch_process_pending (); } else if (internal) { char view_entry[BUF_TINY]; if (start_line > 0) g_snprintf (view_entry, sizeof (view_entry), "View:%ld", start_line); else strcpy (view_entry, "View"); ret = (regex_command (filename_vpath, view_entry) == 0); if (ret) { ret = mcview_viewer (NULL, filename_vpath, start_line); dialog_switch_process_pending (); } } else { static const char *viewer = NULL; if (viewer == NULL) { viewer = getenv ("VIEWER"); if (viewer == NULL) viewer = getenv ("PAGER"); if (viewer == NULL) viewer = "view"; } execute_external_editor_or_viewer (viewer, filename_vpath, start_line); } return ret; }
static void execute_menu_command (WEdit * edit_widget, const char *commands, gboolean show_prompt) { FILE *cmd_file; int cmd_file_fd; int expand_prefix_found = 0; char *parameter = 0; gboolean do_quote = FALSE; char lc_prompt[80]; int col; vfs_path_t *file_name_vpath; int run_view = 0; /* Skip menu entry title line */ commands = strchr (commands, '\n'); if (!commands) { return; } cmd_file_fd = mc_mkstemps (&file_name_vpath, "mcusr", SCRIPT_SUFFIX); if (cmd_file_fd == -1) { message (D_ERROR, MSG_ERROR, _("Cannot create temporary command file\n%s"), unix_error_string (errno)); vfs_path_free (file_name_vpath); return; } cmd_file = fdopen (cmd_file_fd, "w"); fputs ("#! /bin/sh\n", cmd_file); commands++; for (col = 0; *commands; commands++) { if (col == 0) { if (*commands != ' ' && *commands != '\t') break; while (*commands == ' ' || *commands == '\t') commands++; if (*commands == 0) break; } col++; if (*commands == '\n') col = 0; if (parameter) { if (*commands == '}') { *parameter = 0; parameter = input_dialog (_("Parameter"), lc_prompt, MC_HISTORY_FM_MENU_EXEC_PARAM, "", INPUT_COMPLETE_FILENAMES | INPUT_COMPLETE_CD | INPUT_COMPLETE_HOSTNAMES | INPUT_COMPLETE_VARIABLES | INPUT_COMPLETE_USERNAMES); if (!parameter || !*parameter) { /* User canceled */ fclose (cmd_file); mc_unlink (file_name_vpath); vfs_path_free (file_name_vpath); return; } if (do_quote) { char *tmp; tmp = name_quote (parameter, 0); fputs (tmp, cmd_file); g_free (tmp); } else fputs (parameter, cmd_file); g_free (parameter); parameter = 0; } else { if (parameter < &lc_prompt[sizeof (lc_prompt) - 1]) { *parameter++ = *commands; } } } else if (expand_prefix_found) { expand_prefix_found = 0; if (g_ascii_isdigit ((gchar) * commands)) { do_quote = (atoi (commands) != 0); while (g_ascii_isdigit ((gchar) * commands)) commands++; } if (*commands == '{') parameter = lc_prompt; else { char *text = expand_format (edit_widget, *commands, do_quote); fputs (text, cmd_file); g_free (text); } } else { if (*commands == '%') { int i = check_format_view (commands + 1); if (i) { commands += i; run_view = 1; } else { do_quote = TRUE; /* Default: Quote expanded macro */ expand_prefix_found = 1; } } else fputc (*commands, cmd_file); } } fclose (cmd_file); mc_chmod (file_name_vpath, S_IRWXU); if (run_view) { mcview_viewer (vfs_path_as_str (file_name_vpath), NULL, 0); dialog_switch_process_pending (); } else { /* execute the command indirectly to allow execution even * on no-exec filesystems. */ char *cmd; cmd = g_strconcat ("/bin/sh ", vfs_path_as_str (file_name_vpath), (char *) NULL); if (!show_prompt) { if (system (cmd) == -1) message (D_ERROR, MSG_ERROR, "%s", _("Error calling program")); } else { shell_execute (cmd, EXECUTE_HIDE); } g_free (cmd); } mc_unlink (file_name_vpath); vfs_path_free (file_name_vpath); }
int view_file_at_line (const char *filename, int plain_view, int internal, int start_line) { static const char *viewer = NULL; int move_dir = 0; if (plain_view) { int changed_hex_mode = 0; int changed_nroff_flag = 0; int changed_magic_flag = 0; mcview_altered_hex_mode = 0; mcview_altered_nroff_flag = 0; mcview_altered_magic_flag = 0; if (mcview_default_hex_mode) changed_hex_mode = 1; if (mcview_default_nroff_flag) changed_nroff_flag = 1; if (mcview_default_magic_flag) changed_magic_flag = 1; mcview_default_hex_mode = 0; mcview_default_nroff_flag = 0; mcview_default_magic_flag = 0; switch (mcview_viewer (NULL, filename, start_line)) { case MCVIEW_WANT_NEXT: move_dir = 1; break; case MCVIEW_WANT_PREV: move_dir = -1; break; default: move_dir = 0; } if (changed_hex_mode && !mcview_altered_hex_mode) mcview_default_hex_mode = 1; if (changed_nroff_flag && !mcview_altered_nroff_flag) mcview_default_nroff_flag = 1; if (changed_magic_flag && !mcview_altered_magic_flag) mcview_default_magic_flag = 1; dialog_switch_process_pending (); } else if (internal) { char view_entry[BUF_TINY]; if (start_line != 0) g_snprintf (view_entry, sizeof (view_entry), "View:%d", start_line); else strcpy (view_entry, "View"); if (regex_command (filename, view_entry, &move_dir) == 0) { switch (mcview_viewer (NULL, filename, start_line)) { case MCVIEW_WANT_NEXT: move_dir = 1; break; case MCVIEW_WANT_PREV: move_dir = -1; break; default: move_dir = 0; } dialog_switch_process_pending (); } } else { if (viewer == NULL) { viewer = getenv ("VIEWER"); if (viewer == NULL) viewer = getenv ("PAGER"); if (viewer == NULL) viewer = "view"; } execute_with_vfs_arg (viewer, filename); } return move_dir; }