diff -Naur mc-4.7.0-pre1~/src/view.c mc-4.7.0-pre1/src/view.c
old
|
new
|
|
194 | 194 | gboolean text_nroff_mode; /* Nroff-style highlighting */ |
195 | 195 | gboolean text_wrap_mode; /* Wrap text lines to fit them on the screen */ |
196 | 196 | gboolean magic_mode; /* Preprocess the file using external programs */ |
| 197 | gboolean monitor_mode; /* Monitor mode a la "tail -f" */ |
| 198 | offset_type monitor_size; /* Last known size */ |
197 | 199 | |
198 | 200 | /* Additional editor state */ |
199 | 201 | gboolean hexedit_lownibble; /* Are we editing the last significant nibble? */ |
… |
… |
|
1149 | 1151 | do { |
1150 | 1152 | nread = mc_read (view->ds_vfs_pipe, p, bytesfree); |
1151 | 1153 | } while (nread == -1 && errno == EINTR); |
| 1154 | if (nread == 0 && view->monitor_mode) { |
| 1155 | return; |
| 1156 | } |
1152 | 1157 | if (nread == -1 || nread == 0) { |
1153 | 1158 | view->growbuf_finished = TRUE; |
1154 | 1159 | (void) mc_close (view->ds_vfs_pipe); |
… |
… |
|
1515 | 1520 | struct cache_line *line; |
1516 | 1521 | |
1517 | 1522 | if (view->growbuf_in_use) |
1518 | | view_growbuf_read_until (view, OFFSETTYPE_MAX); |
| 1523 | view_growbuf_read_until (view, view->monitor_mode ? view_get_filesize(view) + 1024 * 1024 : OFFSETTYPE_MAX); |
1519 | 1524 | |
1520 | 1525 | filesize = view_get_filesize (view); |
1521 | 1526 | last_offset = offset_doz(filesize, 1); |
… |
… |
|
1527 | 1532 | view_move_up (view, lines_up); |
1528 | 1533 | view->hex_cursor = last_offset; |
1529 | 1534 | } else { |
| 1535 | if (view->monitor_mode && view->monitor_size != filesize) { |
| 1536 | view->monitor_size = filesize; |
| 1537 | #if 0 |
| 1538 | /* XXX way too heavy */ |
| 1539 | view_reset_cache_lines (view); |
| 1540 | #else |
| 1541 | /* XXX dangerous trick */ |
| 1542 | view->lines_end = NULL; |
| 1543 | view->nroff_lines_end = NULL; |
| 1544 | if (view->first_showed_line != NULL) { |
| 1545 | view_load_cache_line (view, view->first_showed_line); |
| 1546 | } |
| 1547 | #endif |
| 1548 | } |
1530 | 1549 | line = view_get_last_line (view); |
1531 | 1550 | if (!view->text_wrap_mode) |
1532 | 1551 | line = view_get_start_of_whole_line (view, line); |
… |
… |
|
1858 | 1877 | view->dirty++; |
1859 | 1878 | } |
1860 | 1879 | |
| 1880 | static void |
| 1881 | view_toggle_monitor_mode (WView *view) |
| 1882 | { |
| 1883 | char *filename, *command; |
| 1884 | |
| 1885 | int line_number = 0; |
| 1886 | struct cache_line *line = view_get_first_showed_line (view); |
| 1887 | if (line != NULL) { |
| 1888 | line_number = line->number + 1; |
| 1889 | } |
| 1890 | |
| 1891 | view->monitor_size = 0; |
| 1892 | view->monitor_mode = !view->monitor_mode; |
| 1893 | filename = g_strdup (view->filename); |
| 1894 | command = g_strdup (view->command); |
| 1895 | |
| 1896 | view_done (view); |
| 1897 | view_load (view, command, filename, line_number); |
| 1898 | g_free (filename); |
| 1899 | g_free (command); |
| 1900 | view->dpy_bbar_dirty = TRUE; |
| 1901 | view->dirty++; |
| 1902 | |
| 1903 | set_idle_proc(view->widget.parent, view->monitor_mode); |
| 1904 | } |
| 1905 | |
1861 | 1906 | /* {{{ Miscellaneous functions }}} */ |
1862 | 1907 | |
1863 | 1908 | static void |
… |
… |
|
2016 | 2061 | goto finish; |
2017 | 2062 | } |
2018 | 2063 | |
2019 | | if (st.st_size == 0 || mc_lseek (fd, 0, SEEK_SET) == -1) { |
| 2064 | if (view->monitor_mode || st.st_size == 0 || mc_lseek (fd, 0, SEEK_SET) == -1) { |
2020 | 2065 | /* Must be one of those nice files that grow (/proc) */ |
2021 | 2066 | view_set_datasource_vfs_pipe (view, fd); |
2022 | 2067 | } else { |
… |
… |
|
2103 | 2148 | |
2104 | 2149 | if (height < 1 || right < 4) |
2105 | 2150 | return; |
| 2151 | if (view->monitor_mode) { |
| 2152 | widget_move (view, top, right - 4); |
| 2153 | tty_print_string("tail"); |
| 2154 | return; |
| 2155 | } |
2106 | 2156 | if (view_may_still_grow (view)) |
2107 | 2157 | return; |
2108 | 2158 | filesize = view_get_filesize (view); |
… |
… |
|
3668 | 3718 | view->dirty++; |
3669 | 3719 | return MSG_HANDLED; |
3670 | 3720 | |
| 3721 | case 'F': |
| 3722 | if (!view_is_in_panel(view)) { |
| 3723 | view_toggle_monitor_mode(view); |
| 3724 | } |
| 3725 | return MSG_HANDLED; |
| 3726 | |
3671 | 3727 | /* Use to indicate parent that we want to see the next/previous file */ |
3672 | 3728 | /* Does not work in panel mode */ |
3673 | 3729 | case XCTRL ('f'): |
… |
… |
|
3799 | 3855 | case DLG_RESIZE: |
3800 | 3856 | view_adjust_size (h); |
3801 | 3857 | return MSG_HANDLED; |
| 3858 | case DLG_IDLE: { |
| 3859 | int c; |
| 3860 | Gpm_Event event; |
| 3861 | WView *view = (WView *)find_widget_type(h, view_callback); |
| 3862 | /* XXX can't handle file truncations */ |
| 3863 | view_moveto_bottom(view); |
| 3864 | view_update(view); |
| 3865 | event.x = -1; |
| 3866 | c = get_event (&event, h->mouse_status == MOU_REPEAT, 0); |
| 3867 | if (c != EV_NONE) { |
| 3868 | dlg_process_event (h, c, &event); |
| 3869 | if (!h->running) { |
| 3870 | set_idle_proc(h, 0); |
| 3871 | } |
| 3872 | } else { |
| 3873 | sleep(1); |
| 3874 | } |
| 3875 | return MSG_HANDLED; |
| 3876 | } |
3802 | 3877 | |
3803 | 3878 | default: |
3804 | 3879 | return default_dlg_callback (h, msg, parm); |