summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd-capture-pane.c2
-rw-r--r--cmd-copy-mode.c6
-rw-r--r--cmd-send-keys.c53
-rw-r--r--format.c6
-rw-r--r--server-client.c7
-rw-r--r--tmux.h32
-rw-r--r--window-buffer.c28
-rw-r--r--window-client.c28
-rw-r--r--window-clock.c47
-rw-r--r--window-copy.c936
-rw-r--r--window-tree.c27
-rw-r--r--window.c26
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);
}
diff --git a/format.c b/format.c
index 7bb6ea3c..29f8d47e 100644
--- a/format.c
+++ b/format.c
@@ -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;
diff --git a/tmux.h b/tmux.h
index a428bec6..7d96c246 100644
--- a/tmux.h
+++ b/tmux.h
@@ -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;