version 1.265, 2020/04/03 05:18:02 |
version 1.266, 2020/04/06 17:51:34 |
|
|
static void window_copy_move_mouse(struct mouse_event *); |
static void window_copy_move_mouse(struct mouse_event *); |
static void window_copy_drag_update(struct client *, struct mouse_event *); |
static void window_copy_drag_update(struct client *, struct mouse_event *); |
static void window_copy_drag_release(struct client *, struct mouse_event *); |
static void window_copy_drag_release(struct client *, struct mouse_event *); |
|
static struct screen* window_copy_clone_screen(struct screen *src); |
|
|
const struct window_mode window_copy_mode = { |
const struct window_mode window_copy_mode = { |
.name = "copy-mode", |
.name = "copy-mode", |
|
|
struct screen *backing; |
struct screen *backing; |
int backing_written; /* backing display started */ |
int backing_written; /* backing display started */ |
|
|
|
int viewmode; /* view mode entered */ |
|
|
u_int oy; /* number of lines scrolled up */ |
u_int oy; /* number of lines scrolled up */ |
|
|
u_int selx; /* beginning of selection */ |
u_int selx; /* beginning of selection */ |
|
|
} |
} |
} |
} |
|
|
|
static struct screen * |
|
window_copy_clone_screen(struct screen *src) |
|
{ |
|
struct screen *dst; |
|
struct screen_write_ctx ctx; |
|
|
|
dst = xcalloc(1, sizeof *dst); |
|
screen_init(dst, screen_size_x(src), |
|
screen_hsize(src) + screen_size_y(src), src->grid->hlimit); |
|
grid_duplicate_lines(dst->grid, 0, src->grid, 0, |
|
screen_hsize(src) + screen_size_y(src)); |
|
dst->grid->sy = screen_size_y(src); |
|
dst->grid->hsize = screen_hsize(src); |
|
|
|
screen_write_start(&ctx, NULL, dst); |
|
screen_write_cursormove(&ctx, src->cx, src->cy, 0); |
|
screen_write_stop(&ctx); |
|
|
|
return (dst); |
|
} |
|
|
static struct window_copy_mode_data * |
static struct window_copy_mode_data * |
window_copy_common_init(struct window_mode_entry *wme) |
window_copy_common_init(struct window_mode_entry *wme) |
{ |
{ |
|
|
data->searchmark = NULL; |
data->searchmark = NULL; |
data->searchx = data->searchy = data->searcho = -1; |
data->searchx = data->searchy = data->searcho = -1; |
data->timeout = 0; |
data->timeout = 0; |
|
data->viewmode = 0; |
|
|
data->jumptype = WINDOW_COPY_OFF; |
data->jumptype = WINDOW_COPY_OFF; |
data->jumpchar = '\0'; |
data->jumpchar = '\0'; |
|
|
|
|
data = window_copy_common_init(wme); |
data = window_copy_common_init(wme); |
|
|
if (wp->fd != -1 && wp->disabled++ == 0) |
data->backing = window_copy_clone_screen(&wp->base); |
bufferevent_disable(wp->event, EV_READ|EV_WRITE); |
|
|
|
data->backing = &wp->base; |
|
data->cx = data->backing->cx; |
data->cx = data->backing->cx; |
data->cy = data->backing->cy; |
data->cy = data->backing->cy; |
|
|
|
|
struct screen *s; |
struct screen *s; |
|
|
data = window_copy_common_init(wme); |
data = window_copy_common_init(wme); |
|
data->viewmode = 1; |
|
|
data->backing = s = xmalloc(sizeof *data->backing); |
data->backing = s = xmalloc(sizeof *data->backing); |
screen_init(s, screen_size_x(base), screen_size_y(base), UINT_MAX); |
screen_init(s, screen_size_x(base), screen_size_y(base), UINT_MAX); |
|
|
static void |
static void |
window_copy_free(struct window_mode_entry *wme) |
window_copy_free(struct window_mode_entry *wme) |
{ |
{ |
struct window_pane *wp = wme->wp; |
|
struct window_copy_mode_data *data = wme->data; |
struct window_copy_mode_data *data = wme->data; |
|
|
evtimer_del(&data->dragtimer); |
evtimer_del(&data->dragtimer); |
|
|
if (wp->fd != -1 && --wp->disabled == 0) |
|
bufferevent_enable(wp->event, EV_READ|EV_WRITE); |
|
|
|
free(data->searchmark); |
free(data->searchmark); |
free(data->searchstr); |
free(data->searchstr); |
|
|
if (data->backing != &wp->base) { |
screen_free(data->backing); |
screen_free(data->backing); |
free(data->backing); |
free(data->backing); |
|
} |
|
screen_free(&data->screen); |
|
|
|
|
screen_free(&data->screen); |
free(data); |
free(data); |
} |
} |
|
|
|
|
struct grid_cell gc; |
struct grid_cell gc; |
u_int old_hsize, old_cy; |
u_int old_hsize, old_cy; |
|
|
if (backing == &wp->base) |
|
return; |
|
|
|
memcpy(&gc, &grid_default_cell, sizeof gc); |
memcpy(&gc, &grid_default_cell, sizeof gc); |
|
|
old_hsize = screen_hsize(data->backing); |
old_hsize = screen_hsize(data->backing); |
|
|
static void |
static void |
window_copy_resize(struct window_mode_entry *wme, u_int sx, u_int sy) |
window_copy_resize(struct window_mode_entry *wme, u_int sx, u_int sy) |
{ |
{ |
struct window_pane *wp = wme->wp; |
|
struct window_copy_mode_data *data = wme->data; |
struct window_copy_mode_data *data = wme->data; |
struct screen *s = &data->screen; |
struct screen *s = &data->screen; |
struct screen_write_ctx ctx; |
struct screen_write_ctx ctx; |
int search; |
int search; |
|
|
screen_resize(s, sx, sy, 1); |
screen_resize(s, sx, sy, 1); |
if (data->backing != &wp->base) |
screen_resize(data->backing, sx, sy, 1); |
screen_resize(data->backing, sx, sy, 1); |
|
|
|
if (data->cy > sy - 1) |
if (data->cy > sy - 1) |
data->cy = sy - 1; |
data->cy = sy - 1; |
|
|
return (action); |
return (action); |
} |
} |
|
|
|
static enum window_copy_cmd_action |
|
window_copy_cmd_refresh_from_pane(struct window_copy_cmd_state *cs) |
|
{ |
|
struct window_mode_entry *wme = cs->wme; |
|
struct window_pane *wp = wme->wp; |
|
struct window_copy_mode_data *data = wme->data; |
|
|
|
if (data->viewmode) |
|
return (WINDOW_COPY_CMD_NOTHING); |
|
|
|
screen_free(data->backing); |
|
free(data->backing); |
|
data->backing = window_copy_clone_screen(&wp->base); |
|
|
|
return (WINDOW_COPY_CMD_REDRAW); |
|
} |
|
|
static const struct { |
static const struct { |
const char *command; |
const char *command; |
int minargs; |
int minargs; |
|
|
window_copy_cmd_previous_word }, |
window_copy_cmd_previous_word }, |
{ "rectangle-toggle", 0, 0, 0, |
{ "rectangle-toggle", 0, 0, 0, |
window_copy_cmd_rectangle_toggle }, |
window_copy_cmd_rectangle_toggle }, |
|
{ "refresh-from-pane", 0, 0, 0, |
|
window_copy_cmd_refresh_from_pane }, |
{ "scroll-down", 0, 0, 1, |
{ "scroll-down", 0, 0, 1, |
window_copy_cmd_scroll_down }, |
window_copy_cmd_scroll_down }, |
{ "scroll-down-and-cancel", 0, 0, 0, |
{ "scroll-down-and-cancel", 0, 0, 0, |