=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window-copy.c,v retrieving revision 1.209 retrieving revision 1.210 diff -c -r1.209 -r1.210 *** src/usr.bin/tmux/window-copy.c 2019/03/08 10:29:25 1.209 --- src/usr.bin/tmux/window-copy.c 2019/03/08 10:34:20 1.210 *************** *** 1,4 **** ! /* $OpenBSD: window-copy.c,v 1.209 2019/03/08 10:29:25 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: window-copy.c,v 1.210 2019/03/08 10:34:20 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 30,35 **** --- 30,37 ---- struct mouse_event *); static struct screen *window_copy_init(struct window_mode_entry *, struct cmd_find_state *, struct args *); + static struct screen *window_copy_view_init(struct window_mode_entry *, + struct cmd_find_state *, struct args *); static void window_copy_free(struct window_mode_entry *); static void window_copy_resize(struct window_mode_entry *, u_int, u_int); static void window_copy_formats(struct window_mode_entry *, *************** *** 125,130 **** --- 127,143 ---- .formats = window_copy_formats, }; + const struct window_mode window_view_mode = { + .name = "view-mode", + + .init = window_copy_view_init, + .free = window_copy_free, + .resize = window_copy_resize, + .key_table = window_copy_key_table, + .command = window_copy_command, + .formats = window_copy_formats, + }; + enum { WINDOW_COPY_OFF, WINDOW_COPY_SEARCHUP, *************** *** 203,215 **** char jumpchar; }; ! static struct screen * ! window_copy_init(struct window_mode_entry *wme, ! __unused struct cmd_find_state *fs, __unused struct args *args) { struct window_pane *wp = wme->wp; struct window_copy_mode_data *data; ! struct screen *s; wme->data = data = xcalloc(1, sizeof *data); --- 216,227 ---- char jumpchar; }; ! static struct window_copy_mode_data * ! window_copy_common_init(struct window_mode_entry *wme) { struct window_pane *wp = wme->wp; struct window_copy_mode_data *data; ! struct screen *base = &wp->base; wme->data = data = xcalloc(1, sizeof *data); *************** *** 226,291 **** data->searchmark = NULL; data->searchx = data->searchy = data->searcho = -1; - if (wp->fd != -1) - bufferevent_disable(wp->event, EV_READ|EV_WRITE); - data->jumptype = WINDOW_COPY_OFF; data->jumpchar = '\0'; ! s = &data->screen; ! screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0); data->modekeys = options_get_number(wp->window->options, "mode-keys"); ! data->backing = NULL; ! ! return (s); } ! void ! window_copy_init_from_pane(struct window_pane *wp, int scroll_exit) { ! struct window_mode_entry *wme = wp->mode; ! struct window_copy_mode_data *data = wme->data; ! struct screen *s = &data->screen; ! struct screen_write_ctx ctx; u_int i; ! if (wme == NULL || wme->mode != &window_copy_mode) ! fatalx("not in copy mode"); data->backing = &wp->base; data->cx = data->backing->cx; data->cy = data->backing->cy; - data->scroll_exit = scroll_exit; ! s->cx = data->cx; ! s->cy = data->cy; ! screen_write_start(&ctx, NULL, s); ! for (i = 0; i < screen_size_y(s); i++) window_copy_write_line(wme, &ctx, i); screen_write_cursormove(&ctx, data->cx, data->cy); screen_write_stop(&ctx); } ! void ! window_copy_init_for_output(struct window_pane *wp) { struct window_copy_mode_data *data; ! if (wp->mode != NULL && wp->mode->mode == &window_copy_mode) { ! data = wp->mode->data; ! if (data->backing != &wp->base) ! return; ! } ! window_pane_reset_mode(wp); ! window_pane_set_mode(wp, &window_copy_mode, NULL, NULL); ! data = wp->mode->data; ! data->backing = xmalloc(sizeof *data->backing); ! screen_init(data->backing, screen_size_x(&wp->base), ! screen_size_y(&wp->base), UINT_MAX); } static void --- 238,299 ---- data->searchmark = NULL; data->searchx = data->searchy = data->searcho = -1; data->jumptype = WINDOW_COPY_OFF; data->jumpchar = '\0'; ! screen_init(&data->screen, screen_size_x(base), screen_size_y(base), 0); data->modekeys = options_get_number(wp->window->options, "mode-keys"); ! return (data); } ! static struct screen * ! window_copy_init(struct window_mode_entry *wme, ! __unused struct cmd_find_state *fs, struct args *args) { ! struct window_pane *wp = wme->wp; ! struct window_copy_mode_data *data; ! struct screen_write_ctx ctx; u_int i; ! data = window_copy_common_init(wme); + if (wp->fd != -1) + bufferevent_disable(wp->event, EV_READ|EV_WRITE); + data->backing = &wp->base; data->cx = data->backing->cx; data->cy = data->backing->cy; ! data->scroll_exit = args_has(args, 'e'); ! data->screen.cx = data->cx; ! data->screen.cy = data->cy; ! ! screen_write_start(&ctx, NULL, &data->screen); ! for (i = 0; i < screen_size_y(&data->screen); i++) window_copy_write_line(wme, &ctx, i); screen_write_cursormove(&ctx, data->cx, data->cy); screen_write_stop(&ctx); + + return (&data->screen); } ! static struct screen * ! window_copy_view_init(struct window_mode_entry *wme, ! __unused struct cmd_find_state *fs, __unused struct args *args) { + struct window_pane *wp = wme->wp; struct window_copy_mode_data *data; + struct screen *base = &wp->base; + struct screen *s; ! data = window_copy_common_init(wme); ! data->backing = s = xmalloc(sizeof *data->backing); ! screen_init(s, screen_size_x(base), screen_size_y(base), UINT_MAX); ! return (&data->screen); } static void