diff options
-rw-r--r-- | cmd-capture-pane.c | 2 | ||||
-rw-r--r-- | cmd-copy-mode.c | 6 | ||||
-rw-r--r-- | cmd-send-keys.c | 53 | ||||
-rw-r--r-- | format.c | 6 | ||||
-rw-r--r-- | server-client.c | 7 | ||||
-rw-r--r-- | tmux.h | 32 | ||||
-rw-r--r-- | window-buffer.c | 28 | ||||
-rw-r--r-- | window-client.c | 28 | ||||
-rw-r--r-- | window-clock.c | 47 | ||||
-rw-r--r-- | window-copy.c | 936 | ||||
-rw-r--r-- | window-tree.c | 27 | ||||
-rw-r--r-- | window.c | 26 |
12 files changed, 639 insertions, 559 deletions
diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c index d3d7e8f8..cb01f502 100644 --- a/cmd-capture-pane.c +++ b/cmd-capture-pane.c @@ -199,7 +199,7 @@ cmd_capture_pane_exec(struct cmd *self, struct cmdq_item *item) size_t len; if (self->entry == &cmd_clear_history_entry) { - if (wp->mode == &window_copy_mode) + if (wp->mode != NULL && wp->mode->mode == &window_copy_mode) window_pane_reset_mode(wp); grid_clear_history(wp->base.grid); return (CMD_RETURN_NORMAL); diff --git a/cmd-copy-mode.c b/cmd-copy-mode.c index 699a868d..1668029c 100644 --- a/cmd-copy-mode.c +++ b/cmd-copy-mode.c @@ -74,18 +74,18 @@ cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item) return (CMD_RETURN_NORMAL); } - if (wp->mode != &window_copy_mode) { + if (wp->mode == NULL || wp->mode->mode != &window_copy_mode) { flag = window_pane_set_mode(wp, &window_copy_mode, NULL, NULL); if (flag != 0) return (CMD_RETURN_NORMAL); window_copy_init_from_pane(wp, args_has(self->args, 'e')); } if (args_has(args, 'M')) { - if (wp->mode != NULL && wp->mode != &window_copy_mode) + if (wp->mode != NULL && wp->mode->mode != &window_copy_mode) return (CMD_RETURN_NORMAL); window_copy_start_drag(c, &shared->mouse); } - if (wp->mode == &window_copy_mode && args_has(self->args, 'u')) + if (args_has(self->args, 'u')) window_copy_pageup(wp, 0); return (CMD_RETURN_NORMAL); diff --git a/cmd-send-keys.c b/cmd-send-keys.c index 8fc00023..80799c54 100644 --- a/cmd-send-keys.c +++ b/cmd-send-keys.c @@ -58,19 +58,20 @@ const struct cmd_entry cmd_send_prefix_entry = { static void cmd_send_keys_inject(struct client *c, struct cmdq_item *item, key_code key) { - struct window_pane *wp = item->target.wp; - struct session *s = item->target.s; - struct winlink *wl = item->target.wl; - struct key_table *table; - struct key_binding *bd; - - if (wp->mode == NULL || wp->mode->key_table == NULL) { + struct window_pane *wp = item->target.wp; + struct session *s = item->target.s; + struct winlink *wl = item->target.wl; + struct window_mode_entry *wme = wp->mode; + struct key_table *table; + struct key_binding *bd; + + if (wme == NULL || wme->mode->key_table == NULL) { if (options_get_number(wp->window->options, "xterm-keys")) key |= KEYC_XTERM; window_pane_key(wp, NULL, s, wl, key, NULL); return; } - table = key_bindings_get_table(wp->mode->key_table(wp), 1); + table = key_bindings_get_table(wme->mode->key_table(wme), 1); bd = key_bindings_get(table, key & ~KEYC_XTERM); if (bd != NULL) { @@ -83,18 +84,19 @@ cmd_send_keys_inject(struct client *c, struct cmdq_item *item, key_code key) static enum cmd_retval cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item) { - struct args *args = self->args; - struct client *c = cmd_find_client(item, NULL, 1); - struct window_pane *wp = item->target.wp; - struct session *s = item->target.s; - struct winlink *wl = item->target.wl; - struct mouse_event *m = &item->shared->mouse; - struct utf8_data *ud, *uc; - wchar_t wc; - int i, literal; - key_code key; - u_int np = 1; - char *cause = NULL; + struct args *args = self->args; + struct client *c = cmd_find_client(item, NULL, 1); + struct window_pane *wp = item->target.wp; + struct session *s = item->target.s; + struct winlink *wl = item->target.wl; + struct mouse_event *m = &item->shared->mouse; + struct window_mode_entry *wme = wp->mode; + struct utf8_data *ud, *uc; + wchar_t wc; + int i, literal; + key_code key; + u_int np = 1; + char *cause = NULL; if (args_has(args, 'N')) { np = args_strtonum(args, 'N', 1, UINT_MAX, &cause); @@ -103,19 +105,18 @@ cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item) free(cause); return (CMD_RETURN_ERROR); } - if (args_has(args, 'X') || args->argc == 0) - wp->modeprefix = np; + if (wme != NULL && (args_has(args, 'X') || args->argc == 0)) + wme->prefix = np; } if (args_has(args, 'X')) { - if (wp->mode == NULL || wp->mode->command == NULL) { + if (wme == NULL || wme->mode->command == NULL) { cmdq_error(item, "not in a mode"); return (CMD_RETURN_ERROR); } if (!m->valid) - wp->mode->command(wp, c, s, wl, args, NULL); - else - wp->mode->command(wp, c, s, wl, args, m); + m = NULL; + wme->mode->command(wme, c, s, wl, args, m); return (CMD_RETURN_NORMAL); } @@ -1551,7 +1551,7 @@ format_defaults_pane(struct format_tree *ft, struct window_pane *wp) format_add(ft, "pane_in_mode", "%d", wp->screen != &wp->base); if (wp->mode != NULL) - format_add(ft, "pane_mode", "%s", wp->mode->name); + format_add(ft, "pane_mode", "%s", wp->mode->mode->name); format_add(ft, "pane_synchronized", "%d", !!options_get_number(w->options, "synchronize-panes")); @@ -1569,8 +1569,8 @@ format_defaults_pane(struct format_tree *ft, struct window_pane *wp) format_add(ft, "scroll_region_upper", "%u", wp->base.rupper); format_add(ft, "scroll_region_lower", "%u", wp->base.rlower); - if (wp->mode != NULL && wp->mode->formats != NULL) - wp->mode->formats(wp, ft); + if (wp->mode != NULL && wp->mode->mode->formats != NULL) + wp->mode->mode->formats(wp->mode, ft); format_add(ft, "alternate_on", "%d", wp->saved_grid ? 1 : 0); format_add(ft, "alternate_saved_x", "%u", wp->saved_cx); diff --git a/server-client.c b/server-client.c index e461e249..df44a4a3 100644 --- a/server-client.c +++ b/server-client.c @@ -926,6 +926,7 @@ server_client_handle_key(struct client *c, key_code key) struct window_pane *wp; struct timeval tv; struct key_table *table, *first; + const char *tablename; struct key_binding *bd; int xtimeout, flags; struct cmd_find_state fs; @@ -1007,8 +1008,10 @@ server_client_handle_key(struct client *c, key_code key) if (server_client_is_default_key_table(c, c->keytable) && wp != NULL && wp->mode != NULL && - wp->mode->key_table != NULL) - table = key_bindings_get_table(wp->mode->key_table(wp), 1); + wp->mode->mode->key_table != NULL) { + tablename = wp->mode->mode->key_table(wp->mode); + table = key_bindings_get_table(tablename, 1); + } else table = c->keytable; first = table; @@ -695,25 +695,37 @@ struct screen_write_ctx { * Window mode. Windows can be in several modes and this is used to call the * right function to handle input and output. */ +struct window_mode_entry; struct window_mode { const char *name; - struct screen *(*init)(struct window_pane *, struct cmd_find_state *, - struct args *); - void (*free)(struct window_pane *); - void (*resize)(struct window_pane *, u_int, u_int); - void (*key)(struct window_pane *, struct client *, + struct screen *(*init)(struct window_mode_entry *, + struct cmd_find_state *, struct args *); + void (*free)(struct window_mode_entry *); + void (*resize)(struct window_mode_entry *, u_int, u_int); + void (*key)(struct window_mode_entry *, struct client *, struct session *, struct winlink *, key_code, struct mouse_event *); - const char *(*key_table)(struct window_pane *); - void (*command)(struct window_pane *, struct client *, + const char *(*key_table)(struct window_mode_entry *); + void (*command)(struct window_mode_entry *, struct client *, struct session *, struct winlink *, struct args *, struct mouse_event *); - void (*formats)(struct window_pane *, struct format_tree *); + void (*formats)(struct window_mode_entry *, + struct format_tree *); }; #define WINDOW_MODE_TIMEOUT 180 +/* Active window mode. */ +struct window_mode_entry { + struct window_pane *wp; + + const struct window_mode *mode; + void *data; + + u_int prefix; +}; + /* Child window structure. */ struct window_pane { u_int id; @@ -782,11 +794,9 @@ struct window_pane { struct grid *saved_grid; struct grid_cell saved_cell; - const struct window_mode *mode; - void *modedata; + struct window_mode_entry *mode; struct event modetimer; time_t modelast; - u_int modeprefix; char *searchstr; TAILQ_ENTRY(window_pane) entry; diff --git a/window-buffer.c b/window-buffer.c index f0281a27..ec1e95ad 100644 --- a/window-buffer.c +++ b/window-buffer.c @@ -24,12 +24,12 @@ #include "tmux.h" -static struct screen *window_buffer_init(struct window_pane *, +static struct screen *window_buffer_init(struct window_mode_entry *, struct cmd_find_state *, struct args *); -static void window_buffer_free(struct window_pane *); -static void window_buffer_resize(struct window_pane *, u_int, +static void window_buffer_free(struct window_mode_entry *); +static void window_buffer_resize(struct window_mode_entry *, u_int, u_int); -static void window_buffer_key(struct window_pane *, +static void window_buffer_key(struct window_mode_entry *, struct client *, struct session *, struct winlink *, key_code, struct mouse_event *); @@ -252,13 +252,14 @@ window_buffer_search(__unused void *modedata, void *itemdata, const char *ss) } static struct screen * -window_buffer_init(struct window_pane *wp, __unused struct cmd_find_state *fs, - struct args *args) +window_buffer_init(struct window_mode_entry *wme, + __unused struct cmd_find_state *fs, struct args *args) { + struct window_pane *wp = wme->wp; struct window_buffer_modedata *data; struct screen *s; - wp->modedata = data = xcalloc(1, sizeof *data); + wme->data = data = xcalloc(1, sizeof *data); if (args == NULL || !args_has(args, 'F')) data->format = xstrdup(WINDOW_BUFFER_DEFAULT_FORMAT); @@ -281,9 +282,9 @@ window_buffer_init(struct window_pane *wp, __unused struct cmd_find_state *fs, } static void -window_buffer_free(struct window_pane *wp) +window_buffer_free(struct window_mode_entry *wme) { - struct window_buffer_modedata *data = wp->modedata; + struct window_buffer_modedata *data = wme->data; u_int i; if (data == NULL) @@ -302,9 +303,9 @@ window_buffer_free(struct window_pane *wp) } static void -window_buffer_resize(struct window_pane *wp, u_int sx, u_int sy) +window_buffer_resize(struct window_mode_entry *wme, u_int sx, u_int sy) { - struct window_buffer_modedata *data = wp->modedata; + struct window_buffer_modedata *data = wme->data; mode_tree_resize(data->data, sx, sy); } @@ -336,11 +337,12 @@ window_buffer_do_paste(void* modedata, void *itemdata, struct client *c, } static void -window_buffer_key(struct window_pane *wp, struct client *c, +window_buffer_key(struct window_mode_entry *wme, struct client *c, __unused struct session *s, __unused struct winlink *wl, key_code key, struct mouse_event *m) { - struct window_buffer_modedata *data = wp->modedata; + struct window_pane *wp = wme->wp; + struct window_buffer_modedata *data = wme->data; struct mode_tree_data *mtd = data->data; struct window_buffer_itemdata *item; int finished; diff --git a/window-client.c b/window-client.c index 7ac13b0b..f0c81cf0 100644 --- a/window-client.c +++ b/window-client.c @@ -25,12 +25,12 @@ #include "tmux.h" -static struct screen *window_client_init(struct window_pane *, +static struct screen *window_client_init(struct window_mode_entry *, struct cmd_find_state *, struct args *); -static void window_client_free(struct window_pane *); -static void window_client_resize(struct window_pane *, u_int, +static void window_client_free(struct window_mode_entry *); +static void window_client_resize(struct window_mode_entry *, u_int, u_int); -static void window_client_key(struct window_pane *, +static void window_client_key(struct window_mode_entry *, struct client *, struct session *, struct winlink *, key_code, struct mouse_event *); @@ -236,13 +236,14 @@ window_client_draw(__unused void *modedata, void *itemdata, } static struct screen * -window_client_init(struct window_pane *wp, __unused struct cmd_find_state *fs, - struct args *args) +window_client_init(struct window_mode_entry *wme, + __unused struct cmd_find_state *fs, struct args *args) { + struct window_pane *wp = wme->wp; struct window_client_modedata *data; struct screen *s; - wp->modedata = data = xcalloc(1, sizeof *data); + wme->data = data = xcalloc(1, sizeof *data); if (args == NULL || !args_has(args, 'F')) data->format = xstrdup(WINDOW_CLIENT_DEFAULT_FORMAT); @@ -265,9 +266,9 @@ window_client_init(struct window_pane *wp, __unused struct cmd_find_state *fs, } static void -window_client_free(struct window_pane *wp) +window_client_free(struct window_mode_entry *wme) { - struct window_client_modedata *data = wp->modedata; + struct window_client_modedata *data = wme->data; u_int i; if (data == NULL) @@ -286,9 +287,9 @@ window_client_free(struct window_pane *wp) } static void -window_client_resize(struct window_pane *wp, u_int sx, u_int sy) +window_client_resize(struct window_mode_entry *wme, u_int sx, u_int sy) { - struct window_client_modedata *data = wp->modedata; + struct window_client_modedata *data = wme->data; mode_tree_resize(data->data, sx, sy); } @@ -311,11 +312,12 @@ window_client_do_detach(void* modedata, void *itemdata, } static void -window_client_key(struct window_pane *wp, struct client *c, +window_client_key(struct window_mode_entry *wme, struct client *c, __unused struct session *s, __unused struct winlink *wl, key_code key, struct mouse_event *m) { - struct window_client_modedata *data = wp->modedata; + struct window_pane *wp = wme->wp; + struct window_client_modedata *data = wme->data; struct mode_tree_data *mtd = data->data; struct window_client_itemdata *item; int finished; diff --git a/window-clock.c b/window-clock.c index 9642a141..c7074c0d 100644 --- a/window-clock.c +++ b/window-clock.c @@ -24,16 +24,16 @@ #include "tmux.h" -static struct screen *window_clock_init(struct window_pane *, +static struct screen *window_clock_init(struct window_mode_entry *, struct cmd_find_state *, struct args *); -static void window_clock_free(struct window_pane *); -static void window_clock_resize(struct window_pane *, u_int, u_int); -static void window_clock_key(struct window_pane *, struct client *, +static void window_clock_free(struct window_mode_entry *); +static void window_clock_resize(struct window_mode_entry *, u_int, u_int); +static void window_clock_key(struct window_mode_entry *, struct client *, struct session *, struct winlink *, key_code, struct mouse_event *); static void window_clock_timer_callback(int, short, void *); -static void window_clock_draw_screen(struct window_pane *); +static void window_clock_draw_screen(struct window_mode_entry *); const struct window_mode window_clock_mode = { .name = "clock-mode", @@ -126,8 +126,9 @@ const char window_clock_table[14][5][5] = { static void window_clock_timer_callback(__unused int fd, __unused short events, void *arg) { - struct window_pane *wp = arg; - struct window_clock_mode_data *data = wp->modedata; + struct window_mode_entry *wme = arg; + struct window_pane *wp = wme->wp; + struct window_clock_mode_data *data = wme->data; struct tm now, then; time_t t; struct timeval tv = { .tv_sec = 1 }; @@ -142,37 +143,38 @@ window_clock_timer_callback(__unused int fd, __unused short events, void *arg) return; data->tim = t; - window_clock_draw_screen(wp); + window_clock_draw_screen(wme); server_redraw_window(wp->window); } static struct screen * -window_clock_init(struct window_pane *wp, __unused struct cmd_find_state *fs, - __unused struct args *args) +window_clock_init(struct window_mode_entry *wme, + __unused struct cmd_find_state *fs, __unused struct args *args) { + struct window_pane *wp = wme->wp; struct window_clock_mode_data *data; struct screen *s; struct timeval tv = { .tv_sec = 1 }; - wp->modedata = data = xmalloc(sizeof *data); + wme->data = data = xmalloc(sizeof *data); data->tim = time(NULL); - evtimer_set(&data->timer, window_clock_timer_callback, wp); + evtimer_set(&data->timer, window_clock_timer_callback, wme); evtimer_add(&data->timer, &tv); s = &data->screen; screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0); s->mode &= ~MODE_CURSOR; - window_clock_draw_screen(wp); + window_clock_draw_screen(wme); return (s); } static void -window_clock_free(struct window_pane *wp) +window_clock_free(struct window_mode_entry *wme) { - struct window_clock_mode_data *data = wp->modedata; + struct window_clock_mode_data *data = wme->data; evtimer_del(&data->timer); screen_free(&data->screen); @@ -180,27 +182,28 @@ window_clock_free(struct window_pane *wp) } static void -window_clock_resize(struct window_pane *wp, u_int sx, u_int sy) +window_clock_resize(struct window_mode_entry *wme, u_int sx, u_int sy) { - struct window_clock_mode_data *data = wp->modedata; + struct window_clock_mode_data *data = wme->data; struct screen *s = &data->screen; screen_resize(s, sx, sy, 0); - window_clock_draw_screen(wp); + window_clock_draw_screen(wme); } static void -window_clock_key(struct window_pane *wp, __unused struct client *c, +window_clock_key(struct window_mode_entry *wme, __unused struct client *c, __unused struct session *s, __unused struct winlink *wl, __unused key_code key, __unused struct mouse_event *m) { - window_pane_reset_mode(wp); + window_pane_reset_mode(wme->wp); } static void -window_clock_draw_screen(struct window_pane *wp) +window_clock_draw_screen(struct window_mode_entry *wme) { - struct window_clock_mode_data *data = wp->modedata; + struct window_pane *wp = wme->wp; + struct window_clock_mode_data *data = wme->data; struct screen_write_ctx ctx; int colour, style; struct screen *s = &data->screen; diff --git a/window-copy.c b/window-copy.c index a79e3bf4..9efc6a46 100644 --- a/window-copy.c +++ b/window-copy.c @@ -24,85 +24,93 @@ #include "tmux.h" -static const char *window_copy_key_table(struct window_pane *); -static void window_copy_command(struct window_pane *, struct client *, +static const char *window_copy_key_table(struct window_mode_entry *); +static void window_copy_command(struct window_mode_entry *, struct client *, struct session *, struct winlink *, struct args *, struct mouse_event *); -static struct screen *window_copy_init(struct window_pane *, +static struct screen *window_copy_init(struct window_mode_entry *, struct cmd_find_state *, struct args *); -static void window_copy_free(struct window_pane *); -static void window_copy_resize(struct window_pane *, u_int, u_int); -static void window_copy_formats(struct window_pane *, struct format_tree *); -static int window_copy_pagedown(struct window_pane *, int, int); -static void window_copy_next_paragraph(struct window_pane *); -static void window_copy_previous_paragraph(struct window_pane *); - -static void window_copy_redraw_selection(struct window_pane *, u_int); -static void window_copy_redraw_lines(struct window_pane *, u_int, u_int); -static void window_copy_redraw_screen(struct window_pane *); -static void window_copy_write_line(struct window_pane *, +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 *, + struct format_tree *); +static void window_copy_pageup1(struct window_mode_entry *, int); +static int window_copy_pagedown(struct window_mode_entry *, int, int); +static void window_copy_next_paragraph(struct window_mode_entry *); +static void window_copy_previous_paragraph(struct window_mode_entry *); + +static void window_copy_redraw_selection(struct window_mode_entry *, u_int); +static void window_copy_redraw_lines(struct window_mode_entry *, u_int, + u_int); +static void window_copy_redraw_screen(struct window_mode_entry *); +static void window_copy_write_line(struct window_mode_entry *, struct screen_write_ctx *, u_int); -static void window_copy_write_lines(struct window_pane *, +static void window_copy_write_lines(struct window_mode_entry *, struct screen_write_ctx *, u_int, u_int); -static void window_copy_scroll_to(struct window_pane *, u_int, u_int); +static void window_copy_scroll_to(struct window_mode_entry *, u_int, u_int); static int window_copy_search_compare(struct grid *, u_int, u_int, struct grid *, u_int, int); static int window_copy_search_lr(struct grid *, struct grid *, u_int *, u_int, u_int, u_int, int); static int window_copy_search_rl(struct grid *, struct grid *, u_int *, u_int, u_int, u_int, int); -static int window_copy_search_marks(struct window_pane *, struct screen *); -static void window_copy_clear_marks(struct window_pane *); +static int window_copy_search_marks(struct window_mode_entry *, + struct screen *); +static void window_copy_clear_marks(struct window_mode_entry *); static void window_copy_move_left(struct screen *, u_int *, u_int *); static void window_copy_move_right(struct screen *, u_int *, u_int *); static int window_copy_is_lowercase(const char *); -static int window_copy_search_jump(struct window_pane *, struct grid *, - struct grid *, u_int, u_int, u_int, int, int, int); -static int window_copy_search(struct window_pane *, int); -static int window_copy_search_up(struct window_pane *); -static int window_copy_search_down(struct window_pane *); -static void window_copy_goto_line(struct window_pane *, const char *); -static void window_copy_update_cursor(struct window_pane *, u_int, u_int); -static void window_copy_start_selection(struct window_pane *); -static int window_copy_adjust_selection(struct window_pane *, u_int *, - u_int *); -static int window_copy_set_selection(struct window_pane *, int); -static int window_copy_update_selection(struct window_pane *, int); -static void window_copy_synchronize_cursor(struct window_pane *); -static void *window_copy_get_selection(struct window_pane *, size_t *); -static void window_copy_copy_buffer(struct window_pane *, void *, size_t); -static void window_copy_copy_pipe(struct window_pane *, struct session *, +static int window_copy_search_jump(struct window_mode_entry *, + struct grid *, struct grid *, u_int, u_int, u_int, int, int, + int); +static int window_copy_search(struct window_mode_entry *, int); +static int window_copy_search_up(struct window_mode_entry *); +static int window_copy_search_down(struct window_mode_entry *); +static void window_copy_goto_line(struct window_mode_entry *, const char *); +static void window_copy_update_cursor(struct window_mode_entry *, u_int, + u_int); +static void window_copy_start_selection(struct window_mode_entry *); +static int window_copy_adjust_selection(struct window_mode_entry *, + u_int *, u_int *); +static int window_copy_set_selection(struct window_mode_entry *, int); +static int window_copy_update_selection(struct window_mode_entry *, int); +static void window_copy_synchronize_cursor(struct window_mode_entry *); +static void *window_copy_get_selection(struct window_mode_entry *, size_t *); +static void window_copy_copy_buffer(struct window_mode_entry *, void *, + size_t); +static void window_copy_copy_pipe(struct window_mode_entry *, + struct session *, const char *); +static void window_copy_copy_selection(struct window_mode_entry *); +static void window_copy_append_selection(struct window_mode_entry *); +static void window_copy_clear_selection(struct window_mode_entry *); +static void window_copy_copy_line(struct window_mode_entry *, char **, + size_t *, u_int, u_int, u_int); +static int window_copy_in_set(struct window_mode_entry *, u_int, u_int, const char *); -static void window_copy_copy_selection(struct window_pane *); -static void window_copy_append_selection(struct window_pane *); -static void window_copy_clear_selection(struct window_pane *); -static void window_copy_copy_line(struct window_pane *, char **, size_t *, - u_int, u_int, u_int); -static int window_copy_in_set(struct window_pane *, u_int, u_int, +static u_int window_copy_find_length(struct window_mode_entry *, u_int); +static void window_copy_cursor_start_of_line(struct window_mode_entry *); +static void window_copy_cursor_back_to_indentation( + struct window_mode_entry *); +static void window_copy_cursor_end_of_line(struct window_mode_entry *); +static void window_copy_other_end(struct window_mode_entry *); +static void window_copy_cursor_left(struct window_mode_entry *); +static void window_copy_cursor_right(struct window_mode_entry *); +static void window_copy_cursor_up(struct window_mode_entry *, int); +static void window_copy_cursor_down(struct window_mode_entry *, int); +static void window_copy_cursor_jump(struct window_mode_entry *); +static void window_copy_cursor_jump_back(struct window_mode_entry *); +static void window_copy_cursor_jump_to(struct window_mode_entry *); +static void window_copy_cursor_jump_to_back(struct window_mode_entry *); +static void window_copy_cursor_next_word(struct window_mode_entry *, const char *); -static u_int window_copy_find_length(struct window_pane *, u_int); -static void window_copy_cursor_start_of_line(struct window_pane *); -static void window_copy_cursor_back_to_indentation(struct window_pane *); -static void window_copy_cursor_end_of_line(struct window_pane *); -static void window_copy_other_end(struct window_pane *); -static void window_copy_cursor_left(struct window_pane *); -static void window_copy_cursor_right(struct window_pane *); -static void window_copy_cursor_up(struct window_pane *, int); -static void window_copy_cursor_down(struct window_pane *, int); -static void window_copy_cursor_jump(struct window_pane *); -static void window_copy_cursor_jump_back(struct window_pane *); -static void window_copy_cursor_jump_to(struct window_pane *); -static void window_copy_cursor_jump_to_back(struct window_pane *); -static void window_copy_cursor_next_word(struct window_pane *, +static void window_copy_cursor_next_word_end(struct window_mode_entry *, const char *); -static void window_copy_cursor_next_word_end(struct window_pane *, +static void window_copy_cursor_previous_word(struct window_mode_entry *, const char *); -static void window_copy_cursor_previous_word(struct window_pane *, - const char *); -static void window_copy_scroll_up(struct window_pane *, u_int); -static void window_copy_scroll_down(struct window_pane *, u_int); -static void window_copy_rectangle_toggle(struct window_pane *); +static void window_copy_scroll_up(struct window_mode_entry *, u_int); +static void window_copy_scroll_down(struct window_mode_entry *, u_int); +static void window_copy_rectangle_toggle(struct window_mode_entry *); static void window_copy_move_mouse(struct mouse_event *); static void window_copy_drag_update(struct client *, struct mouse_event *); @@ -196,13 +204,14 @@ struct window_copy_mode_data { }; static struct screen * -window_copy_init(struct window_pane *wp, __unused struct cmd_find_state *fs, - __unused struct args *args) +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; - wp->modedata = data = xcalloc(1, sizeof *data); + wme->data = data = xcalloc(1, sizeof *data); data->cursordrag = CURSORDRAG_NONE; data->lineflag = LINE_SEL_NONE; @@ -235,12 +244,13 @@ window_copy_init(struct window_pane *wp, __unused struct cmd_find_state *fs, void window_copy_init_from_pane(struct window_pane *wp, int scroll_exit) { - struct window_copy_mode_data *data = wp->modedata; + 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 (wp->mode != &window_copy_mode) + if (wme == NULL || wme->mode != &window_copy_mode) fatalx("not in copy mode"); data->backing = &wp->base; @@ -253,7 +263,7 @@ window_copy_init_from_pane(struct window_pane *wp, int scroll_exit) screen_write_start(&ctx, NULL, s); for (i = 0; i < screen_size_y(s); i++) - window_copy_write_line(wp, &ctx, i); + window_copy_write_line(wme, &ctx, i); screen_write_cursormove(&ctx, data->cx, data->cy); screen_write_stop(&ctx); } @@ -261,23 +271,28 @@ window_copy_init_from_pane(struct window_pane *wp, int scroll_exit) void window_copy_init_for_output(struct window_pane *wp) { - struct window_copy_mode_data *data = wp->modedata; + struct window_copy_mode_data *data; - if (wp->mode == &window_copy_mode && data->backing != &wp->base) - return; + 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 = wp->modedata; data->backing = xmalloc(sizeof *data->backing); screen_init(data->backing, screen_size_x(&wp->base), screen_size_y(&wp->base), UINT_MAX); } static void -window_copy_free(struct window_pane *wp) +window_copy_free(struct window_mode_entry *wme) { - struct window_copy_mode_data *data = wp->modedata; + struct window_pane *wp = wme->wp; + struct window_copy_mode_data *data = wme->data; if (wp->fd != -1) bufferevent_enable(wp->event, EV_READ|EV_WRITE); @@ -307,7 +322,8 @@ window_copy_add(struct window_pane *wp, const char *fmt, ...) void window_copy_vadd(struct window_pane *wp, const char *fmt, va_list ap) { - struct window_copy_mode_data *data = wp->modedata; + struct window_mode_entry *wme = wp->mode; + struct window_copy_mode_data *data = wme->data; struct screen *backing = data->backing; struct screen_write_ctx back_ctx, ctx; struct grid_cell gc; @@ -342,10 +358,10 @@ window_copy_vadd(struct window_pane *wp, const char *fmt, va_list ap) * (If there's any history at all, it has changed.) */ if (screen_hsize(data->backing)) - window_copy_redraw_lines(wp, 0, 1); + window_copy_redraw_lines(wme, 0, 1); /* Write the new lines. */ - window_copy_redraw_lines(wp, old_cy, backing->cy - old_cy + 1); + window_copy_redraw_lines(wme, old_cy, backing->cy - old_cy + 1); screen_write_stop(&ctx); } @@ -353,12 +369,18 @@ window_copy_vadd(struct window_pane *wp, const char *fmt, va_list ap) void window_copy_pageup(struct window_pane *wp, int half_page) { - struct window_copy_mode_data *data = wp->modedata; + window_copy_pageup1(wp->mode, half_page); +} + +static void +window_copy_pageup1(struct window_mode_entry *wme, int half_page) +{ + struct window_copy_mode_data *data = wme->data; struct screen *s = &data->screen; u_int n, ox, oy, px, py; oy = screen_hsize(data->backing) + data->cy - data->oy; - ox = window_copy_find_length(wp, oy); + ox = window_copy_find_length(wme, oy); if (data->cx != ox) { data->lastcx = data->cx; @@ -385,25 +407,26 @@ window_copy_pageup(struct window_pane *wp, int half_page) if (data->screen.sel == NULL || !data->rectflag) { py = screen_hsize(data->backing) + data->cy - data->oy; - px = window_copy_find_length(wp, py); + px = window_copy_find_length(wme, py); if ((data->cx >= data->lastsx && data->cx != px) || data->cx > px) - window_copy_cursor_end_of_line(wp); + window_copy_cursor_end_of_line(wme); } - window_copy_update_selection(wp, 1); - window_copy_redraw_screen(wp); + window_copy_update_selection(wme, 1); + window_copy_redraw_screen(wme); } static int -window_copy_pagedown(struct window_pane *wp, int half_page, int scroll_exit) +window_copy_pagedown(struct window_mode_entry *wme, int half_page, + int scroll_exit) { - struct window_copy_mode_data *data = wp->modedata; + struct window_copy_mode_data *data = wme->data; struct screen *s = &data->screen; u_int n, ox, oy, px, py; oy = screen_hsize(data->backing) + data->cy - data->oy; - ox = window_copy_find_length(wp, oy); + ox = window_copy_find_length(wme, oy); if (data->cx != ox) { data->lastcx = data->cx; @@ -430,60 +453,60 @@ window_copy_pagedown(struct window_pane *wp, int half_page, int scroll_exit) if (data->screen.sel == NULL || !data->rectflag) { py = screen_hsize(data->backing) + data->cy - data->oy; - px = window_copy_find_length(wp, py); + px = window_copy_find_length(wme, py); if ((data->cx >= data->lastsx && data->cx != px) || data->cx > px) - window_copy_cursor_end_of_line(wp); + window_copy_cursor_end_of_line(wme); } if (scroll_exit && data->oy == 0) return (1); - window_copy_update_selection(wp, 1); - window_copy_redraw_screen(wp); + window_copy_update_selection(wme, 1); + window_copy_redraw_screen(wme); return (0); } static void -window_copy_previous_paragraph(struct window_pane *wp) +window_copy_previous_paragraph(struct window_mode_entry *wme) { - struct window_copy_mode_data *data = wp->modedata; + struct window_copy_mode_data *data = wme->data; u_int oy; oy = screen_hsize(data->backing) + data->cy - data->oy; - while (oy > 0 && window_copy_find_length(wp, oy) == 0) + while (oy > 0 && window_copy_find_length(wme, oy) == 0) oy--; - while (oy > 0 && window_copy_find_length(wp, oy) > 0) + while (oy > 0 && window_copy_find_length(wme, oy) > 0) oy--; - window_copy_scroll_to(wp, 0, oy); + window_copy_scroll_to(wme, 0, oy); } static void -window_copy_next_paragraph(struct window_pane *wp) +window_copy_next_paragraph(struct window_mode_entry *wme) { - struct window_copy_mode_data *data = wp->modedata; + struct window_copy_mode_data *data = wme->data; struct screen *s = &data->screen; u_int maxy, ox, oy; |