void mcview_show_error (mcview_t * view, const char *msg) { if (mcview_is_in_panel (view)) mcview_set_datasource_string (view, msg); else message (D_ERROR, MSG_ERROR, "%s", msg); }
gboolean mcview_load_command_output (mcview_t * view, const char *command) { FILE *fp; mcview_close_datasource (view); open_error_pipe (); fp = popen (command, "r"); if (fp == NULL) { /* Avoid two messages. Message from stderr has priority. */ mcview_display (view); if (!close_error_pipe (mcview_is_in_panel (view) ? -1 : D_ERROR, NULL)) mcview_show_error (view, _("Cannot spawn child process")); return FALSE; } /* First, check if filter produced any output */ mcview_set_datasource_stdio_pipe (view, fp); if (!mcview_get_byte (view, 0, NULL)) { mcview_close_datasource (view); /* Avoid two messages. Message from stderr has priority. */ mcview_display (view); if (!close_error_pipe (mcview_is_in_panel (view) ? -1 : D_ERROR, NULL)) mcview_show_error (view, _("Empty output from child filter")); return FALSE; } else { /* * At least something was read correctly. Close stderr and let * program die if it will try to write something there. * * Ideally stderr should be read asynchronously to prevent programs * from blocking (poll/select multiplexor). */ close_error_pipe (D_NORMAL, NULL); } return TRUE; }
static void mcview_set_buttonbar (mcview_t * view) { Dlg_head *h = view->widget.owner; WButtonBar *b = find_buttonbar (h); const global_keymap_t *keymap = view->hex_mode ? viewer_hex_map : viewer_map; buttonbar_set_label (b, 1, Q_ ("ButtonBar|Help"), keymap, (Widget *) view); if (view->hex_mode) { if (view->hexedit_mode) buttonbar_set_label (b, 2, Q_ ("ButtonBar|View"), keymap, (Widget *) view); else if (view->datasource == DS_FILE) buttonbar_set_label (b, 2, Q_ ("ButtonBar|Edit"), keymap, (Widget *) view); else buttonbar_set_label (b, 2, "", keymap, (Widget *) view); buttonbar_set_label (b, 4, Q_ ("ButtonBar|Ascii"), keymap, (Widget *) view); buttonbar_set_label (b, 6, Q_ ("ButtonBar|Save"), keymap, (Widget *) view); buttonbar_set_label (b, 7, Q_ ("ButtonBar|HxSrch"), keymap, (Widget *) view); } else { buttonbar_set_label (b, 2, view->text_wrap_mode ? Q_ ("ButtonBar|UnWrap") : Q_ ("ButtonBar|Wrap"), keymap, (Widget *) view); buttonbar_set_label (b, 4, Q_ ("ButtonBar|Hex"), keymap, (Widget *) view); buttonbar_set_label (b, 6, "", keymap, (Widget *) view); buttonbar_set_label (b, 7, Q_ ("ButtonBar|Search"), keymap, (Widget *) view); } buttonbar_set_label (b, 5, Q_ ("ButtonBar|Goto"), keymap, (Widget *) view); buttonbar_set_label (b, 8, view->magic_mode ? Q_ ("ButtonBar|Raw") : Q_ ("ButtonBar|Parse"), keymap, (Widget *) view); if (mcview_is_in_panel (view)) buttonbar_set_label (b, 10, "", keymap, (Widget *) view); else { /* don't override some panel buttonbar keys */ buttonbar_set_label (b, 3, Q_ ("ButtonBar|Quit"), keymap, (Widget *) view); buttonbar_set_label (b, 9, view->text_nroff_mode ? Q_ ("ButtonBar|Unform") : Q_ ("ButtonBar|Format"), keymap, (Widget *) view); buttonbar_set_label (b, 10, Q_ ("ButtonBar|Quit"), keymap, (Widget *) view); } }
/** Both views */ static gboolean do_mcview_event (mcview_t * view, Gpm_Event * event, int *result) { screen_dimen y, x; Gpm_Event local; Widget *w = WIDGET (view); /* rest of the upper frame - call menu */ if (mcview_is_in_panel (view) && (event->type & GPM_DOWN) != 0 && event->y == WIDGET (w->owner)->y + 1) { *result = MOU_UNHANDLED; return FALSE; /* don't draw viewer over menu */ } *result = MOU_NORMAL; local = mouse_get_local (event, w); /* We are not interested in the release events */ if ((local.type & (GPM_DOWN | GPM_DRAG)) == 0) return FALSE; /* Wheel events */ if ((local.buttons & GPM_B_UP) != 0 && (local.type & GPM_DOWN) != 0) { mcview_move_up (view, 2); return TRUE; } if ((local.buttons & GPM_B_DOWN) != 0 && (local.type & GPM_DOWN) != 0) { mcview_move_down (view, 2); return TRUE; } x = local.x; y = local.y; /* Scrolling left and right */ if (!view->text_wrap_mode) { if (x < view->data_area.width * 1 / 4) { mcview_move_left (view, 1); goto processed; } if (x < view->data_area.width * 3 / 4) { /* ignore the click */ } else { mcview_move_right (view, 1); goto processed; } } /* Scrolling up and down */ if (y < view->data_area.top + view->data_area.height * 1 / 3) { if (mcview_mouse_move_pages) mcview_move_up (view, view->data_area.height / 2); else mcview_move_up (view, 1); goto processed; } else if (y < view->data_area.top + view->data_area.height * 2 / 3) { /* ignore the click */ } else { if (mcview_mouse_move_pages) mcview_move_down (view, view->data_area.height / 2); else mcview_move_down (view, 1); goto processed; } return FALSE; processed: *result = MOU_REPEAT; return TRUE; }
gboolean mcview_load (mcview_t * view, const char *command, const char *file, int start_line) { gboolean retval = FALSE; vfs_path_t *vpath = NULL; #ifdef HAVE_ASSERT_H assert (view->bytes_per_line != 0); #endif view->filename_vpath = vfs_path_from_str (file); /* get working dir */ if (file != NULL && file[0] != '\0') { vfs_path_free (view->workdir_vpath); if (!g_path_is_absolute (file)) { vfs_path_t *p; p = vfs_path_clone (vfs_get_raw_current_dir ()); view->workdir_vpath = vfs_path_append_new (p, file, (char *) NULL); vfs_path_free (p); } else { /* try extract path form filename */ const char *fname; char *dir; fname = x_basename (file); dir = g_strndup (file, (size_t) (fname - file)); view->workdir_vpath = vfs_path_from_str (dir); g_free (dir); } } if (!mcview_is_in_panel (view)) view->dpy_text_column = 0; mcview_set_codeset (view); if (command != NULL && (view->magic_mode || file == NULL || file[0] == '\0')) retval = mcview_load_command_output (view, command); else if (file != NULL && file[0] != '\0') { int fd; char tmp[BUF_MEDIUM]; struct stat st; /* Open the file */ vpath = vfs_path_from_str (file); fd = mc_open (vpath, O_RDONLY | O_NONBLOCK); if (fd == -1) { g_snprintf (tmp, sizeof (tmp), _("Cannot open \"%s\"\n%s"), file, unix_error_string (errno)); mcview_show_error (view, tmp); vfs_path_free (view->filename_vpath); view->filename_vpath = NULL; vfs_path_free (view->workdir_vpath); view->workdir_vpath = NULL; goto finish; } /* Make sure we are working with a regular file */ if (mc_fstat (fd, &st) == -1) { mc_close (fd); g_snprintf (tmp, sizeof (tmp), _("Cannot stat \"%s\"\n%s"), file, unix_error_string (errno)); mcview_show_error (view, tmp); vfs_path_free (view->filename_vpath); view->filename_vpath = NULL; vfs_path_free (view->workdir_vpath); view->workdir_vpath = NULL; goto finish; } if (!S_ISREG (st.st_mode)) { mc_close (fd); mcview_show_error (view, _("Cannot view: not a regular file")); vfs_path_free (view->filename_vpath); view->filename_vpath = NULL; vfs_path_free (view->workdir_vpath); view->workdir_vpath = NULL; goto finish; } if (st.st_size == 0 || mc_lseek (fd, 0, SEEK_SET) == -1) { /* Must be one of those nice files that grow (/proc) */ mcview_set_datasource_vfs_pipe (view, fd); } else { int type; type = get_compression_type (fd, file); if (view->magic_mode && (type != COMPRESSION_NONE)) { char *tmp_filename; vfs_path_t *vpath1; int fd1; tmp_filename = g_strconcat (file, decompress_extension (type), (char *) NULL); vpath1 = vfs_path_from_str (tmp_filename); fd1 = mc_open (vpath1, O_RDONLY | O_NONBLOCK); if (fd1 == -1) { g_snprintf (tmp, sizeof (tmp), _("Cannot open \"%s\" in parse mode\n%s"), file, unix_error_string (errno)); mcview_show_error (view, tmp); } else { mc_close (fd); fd = fd1; mc_fstat (fd, &st); } vfs_path_free (vpath1); g_free (tmp_filename); } mcview_set_datasource_file (view, fd, &st); } retval = TRUE; } finish: view->command = g_strdup (command); view->dpy_start = 0; view->search_start = 0; view->search_end = 0; view->dpy_text_column = 0; mcview_compute_areas (view); mcview_update_bytes_per_line (view); if (mcview_remember_file_position && view->filename_vpath != NULL && start_line == 0) { long line, col; off_t new_offset, max_offset; load_file_position (view->filename_vpath, &line, &col, &new_offset, &view->saved_bookmarks); max_offset = mcview_get_filesize (view) - 1; if (max_offset < 0) new_offset = 0; else new_offset = min (new_offset, max_offset); if (!view->hex_mode) view->dpy_start = mcview_bol (view, new_offset, 0); else { view->dpy_start = new_offset - new_offset % view->bytes_per_line; view->hex_cursor = new_offset; } } else if (start_line > 0) mcview_moveto (view, start_line - 1, 0); view->hexedit_lownibble = FALSE; view->hexview_in_text = FALSE; view->change_list = NULL; vfs_path_free (vpath); return retval; }
static void mcview_mouse_callback (Widget * w, mouse_msg_t msg, mouse_event_t * event) { WView *view = (WView *) w; gboolean ok = TRUE; switch (msg) { case MSG_MOUSE_DOWN: if (mcview_is_in_panel (view)) { if (event->y == WIDGET (w->owner)->y) { /* return MOU_UNHANDLED */ event->result.abort = TRUE; /* don't draw viewer over menu */ ok = FALSE; break; } if (!view->active) { /* Grab focus */ change_panel (); } } /* fall throught */ case MSG_MOUSE_CLICK: if (!view->text_wrap_mode) { /* Scrolling left and right */ screen_dimen x; x = event->x + 1; /* FIXME */ if (x < view->data_area.width * 1 / 4) { mcview_move_left (view, 1); event->result.repeat = msg == MSG_MOUSE_DOWN; } else if (x < view->data_area.width * 3 / 4) { /* ignore the click */ ok = FALSE; } else { mcview_move_right (view, 1); event->result.repeat = msg == MSG_MOUSE_DOWN; } } else { /* Scrolling up and down */ screen_dimen y; y = event->y + 1; /* FIXME */ if (y < view->data_area.top + view->data_area.height * 1 / 3) { if (mcview_mouse_move_pages) mcview_move_up (view, view->data_area.height / 2); else mcview_move_up (view, 1); event->result.repeat = msg == MSG_MOUSE_DOWN; } else if (y < view->data_area.top + view->data_area.height * 2 / 3) { /* ignore the click */ ok = FALSE; } else { if (mcview_mouse_move_pages) mcview_move_down (view, view->data_area.height / 2); else mcview_move_down (view, 1); event->result.repeat = msg == MSG_MOUSE_DOWN; } } break; case MSG_MOUSE_SCROLL_UP: mcview_move_up (view, 2); break; case MSG_MOUSE_SCROLL_DOWN: mcview_move_down (view, 2); break; default: ok = FALSE; break; } if (ok) mcview_update (view); }