summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2017-02-03 11:57:27 +0000
committernicm <nicm>2017-02-03 11:57:27 +0000
commit7d23d019c0df197d724ced7fec21dc2047634c9b (patch)
tree7f07df20858bf10aef7db907bf4998b53fedd7db
parentdd0c8147795c518de443c33895c614e52b42677f (diff)
Add a window or pane id "tag" to each format tree and use it to separate
jobs, this means that if the same job is used for different windows or panes (for example in pane-border-format), it will be run separately for each pane.
-rw-r--r--cfg.c2
-rw-r--r--cmd-attach-session.c2
-rw-r--r--cmd-break-pane.c2
-rw-r--r--cmd-display-message.c2
-rw-r--r--cmd-if-shell.c2
-rw-r--r--cmd-list-buffers.c2
-rw-r--r--cmd-list-clients.c2
-rw-r--r--cmd-list-keys.c44
-rw-r--r--cmd-list-panes.c2
-rw-r--r--cmd-list-sessions.c2
-rw-r--r--cmd-list-windows.c2
-rw-r--r--cmd-new-session.c4
-rw-r--r--cmd-new-window.c4
-rw-r--r--cmd-pipe-pane.c2
-rw-r--r--cmd-queue.c2
-rw-r--r--cmd-run-shell.c2
-rw-r--r--cmd-split-window.c4
-rw-r--r--control-notify.c2
-rw-r--r--format.c12
-rw-r--r--names.c2
-rw-r--r--screen-redraw.c2
-rw-r--r--server-client.c2
-rw-r--r--status.c13
-rw-r--r--tmux.h5
-rw-r--r--window-choose.c218
-rw-r--r--window-copy.c2
26 files changed, 204 insertions, 136 deletions
diff --git a/cfg.c b/cfg.c
index 2be34fda..c55a5dd4 100644
--- a/cfg.c
+++ b/cfg.c
@@ -123,7 +123,7 @@ load_cfg(const char *path, struct client *c, struct cmdq_item *item, int quiet)
line);
continue;
}
- ft = format_create(NULL, FORMAT_NOJOBS);
+ ft = format_create(NULL, FORMAT_NONE, FORMAT_NOJOBS);
s = p + 3;
while (isspace((u_char)*s))
diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index f39c0e31..d29c4dd1 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -77,7 +77,7 @@ cmd_attach_session(struct cmdq_item *item, int dflag, int rflag,
}
if (cflag != NULL) {
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, c, s, wl, wp);
cwd = format_expand(ft, cflag);
format_free(ft);
diff --git a/cmd-break-pane.c b/cmd-break-pane.c
index c949fe8a..fdefeb17 100644
--- a/cmd-break-pane.c
+++ b/cmd-break-pane.c
@@ -107,7 +107,7 @@ cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item)
if ((template = args_get(args, 'F')) == NULL)
template = BREAK_PANE_TEMPLATE;
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, item->state.c, dst_s, wl, wp);
cp = format_expand(ft, template);
diff --git a/cmd-display-message.c b/cmd-display-message.c
index c57db579..3bb5f9ac 100644
--- a/cmd-display-message.c
+++ b/cmd-display-message.c
@@ -73,7 +73,7 @@ cmd_display_message_exec(struct cmd *self, struct cmdq_item *item)
if (template == NULL)
template = DISPLAY_MESSAGE_TEMPLATE;
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, c, s, wl, wp);
msg = format_expand_time(ft, template, time(NULL));
diff --git a/cmd-if-shell.c b/cmd-if-shell.c
index 93910f34..ec4bf68e 100644
--- a/cmd-if-shell.c
+++ b/cmd-if-shell.c
@@ -82,7 +82,7 @@ cmd_if_shell_exec(struct cmd *self, struct cmdq_item *item)
else
cwd = NULL;
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, item->state.c, s, wl, wp);
shellcmd = format_expand(ft, args->argv[0]);
format_free(ft);
diff --git a/cmd-list-buffers.c b/cmd-list-buffers.c
index c67c3524..cc3ffbfb 100644
--- a/cmd-list-buffers.c
+++ b/cmd-list-buffers.c
@@ -57,7 +57,7 @@ cmd_list_buffers_exec(struct cmd *self, struct cmdq_item *item)
pb = NULL;
while ((pb = paste_walk(pb)) != NULL) {
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults_paste_buffer(ft, pb);
line = format_expand(ft, template);
diff --git a/cmd-list-clients.c b/cmd-list-clients.c
index f07cd45e..faf39931 100644
--- a/cmd-list-clients.c
+++ b/cmd-list-clients.c
@@ -72,7 +72,7 @@ cmd_list_clients_exec(struct cmd *self, struct cmdq_item *item)
if (c->session == NULL || (s != NULL && s != c->session))
continue;
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_add(ft, "line", "%u", idx);
format_defaults(ft, c, NULL, NULL, NULL);
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index f3462a10..ebc221e5 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -29,7 +29,6 @@
static enum cmd_retval cmd_list_keys_exec(struct cmd *, struct cmdq_item *);
-static enum cmd_retval cmd_list_keys_table(struct cmd *, struct cmdq_item *);
static enum cmd_retval cmd_list_keys_commands(struct cmd *,
struct cmdq_item *);
@@ -37,8 +36,8 @@ const struct cmd_entry cmd_list_keys_entry = {
.name = "list-keys",
.alias = "lsk",
- .args = { "t:T:", 0, 0 },
- .usage = "[-t mode-table] [-T key-table]",
+ .args = { "T:", 0, 0 },
+ .usage = "[-T key-table]",
.flags = CMD_STARTSERVER|CMD_AFTERHOOK,
.exec = cmd_list_keys_exec
@@ -68,9 +67,6 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item)
if (self->entry == &cmd_list_commands_entry)
return (cmd_list_keys_commands(self, item));
- if (args_has(args, 't'))
- return (cmd_list_keys_table(self, item));
-
tablename = args_get(args, 'T');
if (tablename != NULL && key_bindings_get_table(tablename, 0) == NULL) {
cmdq_error(item, "table %s doesn't exist", tablename);
@@ -133,40 +129,6 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item)
}
static enum cmd_retval
-cmd_list_keys_table(struct cmd *self, struct cmdq_item *item)
-{
- struct args *args = self->args;
- const char *tablename, *cmdstr;
- const struct mode_key_table *mtab;
- struct mode_key_binding *mbind;
- int width, keywidth;
-
- tablename = args_get(args, 't');
- if ((mtab = mode_key_findtable(tablename)) == NULL) {
- cmdq_error(item, "unknown key table: %s", tablename);
- return (CMD_RETURN_ERROR);
- }
-
- keywidth = 0;
- RB_FOREACH(mbind, mode_key_tree, mtab->tree) {
- width = strlen(key_string_lookup_key(mbind->key));
- if (width > keywidth)
- keywidth = width;
- }
-
- RB_FOREACH(mbind, mode_key_tree, mtab->tree) {
- cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd);
- if (cmdstr != NULL) {
- cmdq_print(item, "bind-key -t %s %*s %s",
- mtab->name, (int)keywidth,
- key_string_lookup_key(mbind->key), cmdstr);
- }
- }
-
- return (CMD_RETURN_NORMAL);
-}
-
-static enum cmd_retval
cmd_list_keys_commands(struct cmd *self, struct cmdq_item *item)
{
struct args *args = self->args;
@@ -182,7 +144,7 @@ cmd_list_keys_commands(struct cmd *self, struct cmdq_item *item)
"#{command_list_usage}";
}
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, NULL, NULL, NULL, NULL);
for (entryp = cmd_table; *entryp != NULL; entryp++) {
diff --git a/cmd-list-panes.c b/cmd-list-panes.c
index 341bdd68..d8ca2a93 100644
--- a/cmd-list-panes.c
+++ b/cmd-list-panes.c
@@ -123,7 +123,7 @@ cmd_list_panes_window(struct cmd *self, struct session *s, struct winlink *wl,
n = 0;
TAILQ_FOREACH(wp, &wl->window->panes, entry) {
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_add(ft, "line", "%u", n);
format_defaults(ft, NULL, s, wl, wp);
diff --git a/cmd-list-sessions.c b/cmd-list-sessions.c
index d90c8970..7d3e8c10 100644
--- a/cmd-list-sessions.c
+++ b/cmd-list-sessions.c
@@ -65,7 +65,7 @@ cmd_list_sessions_exec(struct cmd *self, struct cmdq_item *item)
n = 0;
RB_FOREACH(s, sessions, &sessions) {
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_add(ft, "line", "%u", n);
format_defaults(ft, NULL, s, NULL, NULL);
diff --git a/cmd-list-windows.c b/cmd-list-windows.c
index cd7498f0..52a8d562 100644
--- a/cmd-list-windows.c
+++ b/cmd-list-windows.c
@@ -105,7 +105,7 @@ cmd_list_windows_session(struct cmd *self, struct session *s,
n = 0;
RB_FOREACH(wl, winlinks, &s->windows) {
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_add(ft, "line", "%u", n);
format_defaults(ft, NULL, s, wl, NULL);
diff --git a/cmd-new-session.c b/cmd-new-session.c
index a39522ac..4e7b413b 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -139,7 +139,7 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
/* Get the new session working directory. */
if (args_has(args, 'c')) {
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, c, NULL, NULL, NULL);
to_free = cwd = format_expand(ft, args_get(args, 'c'));
format_free(ft);
@@ -298,7 +298,7 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
if ((template = args_get(args, 'F')) == NULL)
template = NEW_SESSION_TEMPLATE;
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, c, s, NULL, NULL);
cp = format_expand(ft, template);
diff --git a/cmd-new-window.c b/cmd-new-window.c
index 2e032c40..082b7443 100644
--- a/cmd-new-window.c
+++ b/cmd-new-window.c
@@ -95,7 +95,7 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
to_free = NULL;
if (args_has(args, 'c')) {
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, c, s, NULL, NULL);
cwd = to_free = format_expand(ft, args_get(args, 'c'));
format_free(ft);
@@ -143,7 +143,7 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
if ((template = args_get(args, 'F')) == NULL)
template = NEW_WINDOW_TEMPLATE;
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, c, s, wl, NULL);
cp = format_expand(ft, template);
diff --git a/cmd-pipe-pane.c b/cmd-pipe-pane.c
index ac9c0479..e43f4a9b 100644
--- a/cmd-pipe-pane.c
+++ b/cmd-pipe-pane.c
@@ -90,7 +90,7 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmdq_item *item)
}
/* Expand the command. */
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, c, s, wl, wp);
cmd = format_expand_time(ft, args->argv[0], time(NULL));
format_free(ft);
diff --git a/cmd-queue.c b/cmd-queue.c
index d1875717..8e3b0bf3 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -268,7 +268,7 @@ cmdq_format(struct cmdq_item *item, const char *key, const char *fmt, ...)
for (loop = item; loop != NULL; loop = item->next) {
if (loop->formats == NULL)
- loop->formats = format_create(NULL, 0);
+ loop->formats = format_create(NULL, FORMAT_NONE, 0);
format_add(loop->formats, key, "%s", value);
}
diff --git a/cmd-run-shell.c b/cmd-run-shell.c
index e5726b26..29375428 100644
--- a/cmd-run-shell.c
+++ b/cmd-run-shell.c
@@ -100,7 +100,7 @@ cmd_run_shell_exec(struct cmd *self, struct cmdq_item *item)
else
cwd = NULL;
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, item->state.c, s, wl, wp);
shellcmd = format_expand(ft, args->argv[0]);
format_free(ft);
diff --git a/cmd-split-window.c b/cmd-split-window.c
index 0d4af51e..3c49ef9e 100644
--- a/cmd-split-window.c
+++ b/cmd-split-window.c
@@ -92,7 +92,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
to_free = NULL;
if (args_has(args, 'c')) {
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, item->state.c, s, NULL, NULL);
to_free = cwd = format_expand(ft, args_get(args, 'c'));
format_free(ft);
@@ -169,7 +169,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
if ((template = args_get(args, 'F')) == NULL)
template = SPLIT_WINDOW_TEMPLATE;
- ft = format_create(item, 0);
+ ft = format_create(item, FORMAT_NONE, 0);
format_defaults(ft, item->state.c, s, wl, new_wp);
cp = format_expand(ft, template);
diff --git a/control-notify.c b/control-notify.c
index 9158ce2c..3b2d32eb 100644
--- a/control-notify.c
+++ b/control-notify.c
@@ -88,7 +88,7 @@ control_notify_window_layout_changed(struct window *w)
if (w->layout_root == NULL)
continue;
- ft = format_create(NULL, 0);
+ ft = format_create(NULL, FORMAT_NONE, 0);
wl = winlink_find_by_window(&s->windows, w);
if (wl != NULL) {
format_defaults(ft, c, NULL, wl, NULL);
diff --git a/format.c b/format.c
index be03932b..d8118513 100644
--- a/format.c
+++ b/format.c
@@ -77,6 +77,7 @@ static void format_defaults_winlink(struct format_tree *, struct session *,
/* Entry in format job tree. */
struct format_job {
+ u_int tag;
const char *cmd;
const char *expanded;
@@ -99,6 +100,10 @@ RB_GENERATE_STATIC(format_job_tree, format_job, entry, format_job_cmp);
static int
format_job_cmp(struct format_job *fj1, struct format_job *fj2)
{
+ if (fj1->tag < fj2->tag)
+ return (-1);
+ if (fj1->tag > fj2->tag)
+ return (1);
return (strcmp(fj1->cmd, fj2->cmd));
}
@@ -123,6 +128,7 @@ struct format_tree {
struct session *s;
struct window_pane *wp;
+ u_int tag;
int flags;
RB_HEAD(format_entry_tree, format_entry) tree;
@@ -238,9 +244,11 @@ format_job_get(struct format_tree *ft, const char *cmd)
char *expanded;
int force;
+ fj0.tag = ft->tag;
fj0.cmd = cmd;
if ((fj = RB_FIND(format_job_tree, &format_jobs, &fj0)) == NULL) {
fj = xcalloc(1, sizeof *fj);
+ fj->tag = ft->tag;
fj->cmd = xstrdup(cmd);
fj->expanded = NULL;
@@ -497,7 +505,7 @@ format_merge(struct format_tree *ft, struct format_tree *from)
/* Create a new tree. */
struct format_tree *
-format_create(struct cmdq_item *item, int flags)
+format_create(struct cmdq_item *item, int tag, int flags)
{
struct format_tree *ft;
@@ -508,6 +516,8 @@ format_create(struct cmdq_item *item, int flags)
ft = xcalloc(1, sizeof *ft);
RB_INIT(&ft->tree);
+
+ ft->tag = tag;
ft->flags = flags;
format_add_cb(ft, "host", format_cb_host);
diff --git a/names.c b/names.c
index 877b2504..e5fd2611 100644
--- a/names.c
+++ b/names.c
@@ -124,7 +124,7 @@ format_window_name(struct window *w)
const char *fmt;
char *name;
- ft = format_create(NULL, 0);
+ ft = format_create(NULL, FORMAT_WINDOW|w->id, 0);
format_defaults_window(ft, w);
format_defaults_pane(ft, w->active);
diff --git a/screen-redraw.c b/screen-redraw.c
index b7833716..ae2948aa 100644
--- a/screen-redraw.c
+++ b/screen-redraw.c
@@ -280,7 +280,7 @@ screen_redraw_make_pane_status(struct client *c, struct window *w,
fmt = options_get_string(w->options, "pane-border-format");
- ft = format_create(NULL, 0);
+ ft = format_create(NULL, FORMAT_PANE|wp->id, 0);
format_defaults(ft, c, NULL, NULL, wp);
memcpy(&old, &wp->status_screen, sizeof old);
diff --git a/server-client.c b/server-client.c
index 7f47602a..b304234d 100644
--- a/server-client.c
+++ b/server-client.c
@@ -1222,7 +1222,7 @@ server_client_set_title(struct client *c)
template = options_get_string(s->options, "set-titles-string");
- ft = format_create(NULL, 0);
+ ft = format_create(NULL, FORMAT_NONE, 0);
format_defaults(ft, c, NULL, NULL, NULL);
title = format_expand_time(ft, template, time(NULL));
diff --git a/status.c b/status.c
index 9fc9a502..c4f79050 100644
--- a/status.c
+++ b/status.c
@@ -500,14 +500,19 @@ status_replace(struct client *c, struct winlink *wl, const char *fmt, time_t t)
{
struct format_tree *ft;
char *expanded;
+ u_int tag;
if (fmt == NULL)
return (xstrdup(""));
+ if (wl != NULL)
+ tag = FORMAT_WINDOW|wl->window->id;
+ else
+ tag = FORMAT_NONE;
if (c->flags & CLIENT_STATUSFORCE)
- ft = format_create(NULL, FORMAT_STATUS|FORMAT_FORCE);
+ ft = format_create(NULL, tag, FORMAT_STATUS|FORMAT_FORCE);
else
- ft = format_create(NULL, FORMAT_STATUS);
+ ft = format_create(NULL, tag, FORMAT_STATUS);
format_defaults(ft, c, NULL, wl, NULL);
expanded = format_expand_time(ft, fmt, t);
@@ -665,7 +670,7 @@ status_prompt_set(struct client *c, const char *msg, const char *input,
time_t t;
char *tmp;
- ft = format_create(NULL, 0);
+ ft = format_create(NULL, FORMAT_NONE, 0);
format_defaults(ft, c, NULL, NULL, NULL);
t = time(NULL);
@@ -726,7 +731,7 @@ status_prompt_update(struct client *c, const char *msg, const char *input)
time_t t;
char *tmp;
- ft = format_create(NULL, 0);
+ ft = format_create(NULL, FORMAT_NONE, 0);
format_defaults(ft, c, NULL, NULL, NULL);
t = time(NULL);
diff --git a/tmux.h b/tmux.h
index 164a9d10..533a5476 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1503,8 +1503,11 @@ char *paste_make_sample(struct paste_buffer *);
#define FORMAT_STATUS 0x1
#define FORMAT_FORCE 0x2
#define FORMAT_NOJOBS 0x4
+#define FORMAT_NONE 0
+#define FORMAT_PANE 0x80000000U
+#define FORMAT_WINDOW 0x40000000U
struct format_tree;
-struct format_tree *format_create(struct cmdq_item *, int);
+struct format_tree *format_create(struct cmdq_item *, int, int);
void format_free(struct format_tree *);
void printflike(3, 4) format_add(struct format_tree *, const char *,
const char *, ...);
diff --git a/window-choose.c b/window-choose.c
index edfc9916..b7647d2a 100644
--- a/window-choose.c
+++ b/window-choose.c
@@ -74,8 +74,6 @@ struct window_choose_mode_item {
struct window_choose_mode_data {
struct screen screen;
- struct mode_key_data mdata;
-
struct window_choose_mode_item *list;
u_int list_size;
struct window_choose_mode_item *old_list;
@@ -91,11 +89,16 @@ struct window_choose_mode_data {
void (*callbackfn)(struct window_choose_data *);
};
+static const char window_choose_keys_emacs[] = "0123456789"
+ "abcdefghijklmnoprstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+static const char window_choose_keys_vi[] = "0123456789"
+ "abcdefhilmnoprstuvwxyz"
+ "ABCDEFIJKMNOPQRSTUVWXYZ";
+
static void window_choose_free1(struct window_choose_mode_data *);
-static int window_choose_key_index(struct window_choose_mode_data *,
- u_int);
-static int window_choose_index_key(struct window_choose_mode_data *,
- key_code);
+static int window_choose_key_index(struct window_pane *, u_int);
+static int window_choose_index_key(struct window_pane *, key_code);
static void window_choose_prompt_input(enum window_choose_input_type,
const char *, struct window_pane *, key_code);
static void window_choose_reset_top(struct window_pane *, u_int);
@@ -168,7 +171,6 @@ window_choose_init(struct window_pane *wp)
{
struct window_choose_mode_data *data;
struct screen *s;
- int keys;
wp->modedata = data = xcalloc(1, sizeof *data);
@@ -189,12 +191,6 @@ window_choose_init(struct window_pane *wp)
screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
s->mode &= ~MODE_CURSOR;
- keys = options_get_number(wp->window->options, "mode-keys");
- if (keys == MODEKEY_EMACS)
- mode_key_init(&data->mdata, &mode_key_tree_emacs_choice);
- else
- mode_key_init(&data->mdata, &mode_key_tree_vi_choice);
-
return (s);
}
@@ -206,7 +202,7 @@ window_choose_data_create(int type, struct client *c, struct session *s)
wcd = xmalloc(sizeof *wcd);
wcd->type = type;
- wcd->ft = format_create(NULL, 0);
+ wcd->ft = format_create(NULL, FORMAT_NONE, 0);
wcd->ft_template = NULL;
wcd->command = NULL;
@@ -547,9 +543,74 @@ window_choose_get_item(struct window_pane *wp, key_code key,
return (&data->list[idx]);
}
+static key_code
+window_choose_translate_key(key_code key)
+{
+ switch (key) {
+ case '0'|KEYC_ESCAPE:
+ case '1'|KEYC_ESCAPE:
+ case '2'|KEYC_ESCAPE:
+ case '3'|KEYC_ESCAPE:
+ case '4'|KEYC_ESCAPE:
+ case '5'|KEYC_ESCAPE:
+ case '6'|KEYC_ESCAPE:
+ case '7'|KEYC_ESCAPE:
+ case '8'|KEYC_ESCAPE:
+ case '9'|KEYC_ESCAPE:
+ case '\003': /* C-c */
+ case 'q':
+ case '\n':
+ case '\r':
+ case KEYC_BSPACE:
+ case ' ':
+ case KEYC_LEFT:
+ case KEYC_RIGHT:
+ case KEYC_LEFT|KEYC_CTRL:
+ case KEYC_RIGHT|KEYC_CTRL:
+ case KEYC_MOUSEDOWN1_PANE:
+ case KEYC_MOUSEDOWN3_PANE:
+ case KEYC_WHEELUP_PANE:
+ case KEYC_WHEELDOWN_PANE:
+ return (key);
+ case '\031': /* C-y */
+ case KEYC_UP|KEYC_CTRL:
+ return (KEYC_UP|KEYC_CTRL);
+ case '\002': /* C-b */
+ case KEYC_PPAGE:
+ return (KEYC_PPAGE);
+ case '\005': /* C-e */
+ case KEYC_DOWN|KEYC_CTRL:
+ return (KEYC_DOWN|KEYC_CTRL);
+ case '\006': /* C-f */
+ case KEYC_NPAGE:
+ return (KEYC_NPAGE);
+ case 'j':
+ case KEYC_DOWN:
+ return (KEYC_DOWN);
+ case 'k':
+ case KEYC_UP:
+ return (KEYC_UP);
+ case 'g':
+ case KEYC_HOME:
+ return (KEYC_HOME);
+ case 'G':
+ case KEYC_END:
+ return (KEYC_END);
+ case 'H':
+ return ('R'|KEYC_ESCAPE);
+ case 'L':
+ return ('r'|KEYC_ESCAPE);
+ }
+ if ((key >= '0' && key <= '9') ||
+ (key >= 'a' && key <= 'z') ||
+ (key >= 'A' && key <= 'Z'))
+ return (key);
+ return (KEYC_NONE);
+}
+
static void
window_choose_key(struct window_pane *wp, __unused struct client *c,
- __unused struct session *sess, key_code key, struct mouse_event *m)
+ __unused struct session *sp, key_code key, struct mouse_event *m)
{
struct window_choose_mode_data *data = wp->modedata;
struct screen *s = &data->screen;
@@ -557,17 +618,26 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
struct window_choose_mode_item *item;
size_t input_len;
u_int items, n;
- int idx;
+ int idx, keys;
+ keys = options_get_number(wp->window->options, "mode-keys");
+ if (keys == MODEKEY_VI) {
+ key = window_choose_translate_key(key);
+ if (key == KEYC_NONE)
+ return;
+ }
items = data->list_size;
if (data->input_type == WINDOW_CHOOSE_GOTO_ITEM) {
- switch (mode_key_lookup(&data->mdata, key)) {
- case MODEKEYCHOICE_CANCEL:
+ switch (key) {
+ case '\003': /* C-c */
+ case '\033': /* Escape */
+ case 'q':
data->input_type = WINDOW_CHOOSE_NORMAL;
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_CHOOSE:
+ case '\n':
+ case '\r':
n = strtonum(data->input_str, 0, INT_MAX, NULL);
if (n > items - 1) {
data->input_type = WINDOW_CHOOSE_NORMAL;
@@ -576,7 +646,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
}
window_choose_fire_callback(wp, data->list[n].wcd);
break;
- case MODEKEYCHOICE_BACKSPACE:
+ case KEYC_BSPACE:
input_len = strlen(data->input_str);
if (input_len > 0)
data->input_str[input_len - 1] = '\0';
@@ -592,16 +662,21 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
return;
}
- switch (mode_key_lookup(&data->mdata, key)) {
- case MODEKEYCHOICE_CANCEL:
+ switch (key) {
+ case '\003': /* C-c */
+ case '\033': /* Escape */
+ case 'q':
window_choose_fire_callback(wp, NULL);
break;
- case MODEKEYCHOICE_CHOOSE:
+ case '\n':
+ case '\r':
+ case KEYC_MOUSEDOWN1_PANE:
if ((item = window_choose_get_item(wp, key, m)) == NULL)
break;
window_choose_fire_callback(wp, item->wcd);
break;
- case MODEKEYCHOICE_TREE_TOGGLE:
+ case ' ':
+ case KEYC_MOUSEDOWN3_PANE:
if ((item = window_choose_get_item(wp, key, m)) == NULL)
break;
if (item->state & TREE_EXPANDED) {
@@ -613,7 +688,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
}
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_TREE_COLLAPSE:
+ case KEYC_LEFT:
if ((item = window_choose_get_item(wp, key, m)) == NULL)
break;
if (item->state & TREE_EXPANDED) {
@@ -622,10 +697,10 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
window_choose_redraw_screen(wp);
}
break;
- case MODEKEYCHOICE_TREE_COLLAPSE_ALL:
+ case KEYC_LEFT|KEYC_CTRL:
window_choose_collapse_all(wp);
break;
- case MODEKEYCHOICE_TREE_EXPAND:
+ case KEYC_RIGHT:
if ((item = window_choose_get_item(wp, key, m)) == NULL)
break;
if (!(item->state & TREE_EXPANDED)) {
@@ -634,10 +709,12 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
window_choose_redraw_screen(wp);
}
break;
- case MODEKEYCHOICE_TREE_EXPAND_ALL:
+ case KEYC_RIGHT|KEYC_CTRL:
window_choose_expand_all(wp);
break;
- case MODEKEYCHOICE_UP:
+ case '\020': /* C-p */
+ case KEYC_UP:
+ case KEYC_WHEELUP_PANE:
if (items == 0)
break;
if (data->selected == 0) {
@@ -659,7 +736,9 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
screen_write_stop(&ctx);
}
break;
- case MODEKEYCHOICE_DOWN:
+ case '\016': /* C-n */
+ case KEYC_DOWN:
+ case KEYC_WHEELDOWN_PANE:
if (items == 0)
break;
if (data->selected == items - 1) {
@@ -680,7 +759,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
} else
window_choose_scroll_down(wp);
break;
- case MODEKEYCHOICE_SCROLLUP:
+ case KEYC_UP|KEYC_CTRL:
if (items == 0 || data->top == 0)
break;
if (data->selected == data->top + screen_size_y(s) - 1) {
@@ -693,7 +772,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
} else
window_choose_scroll_up(wp);
break;
- case MODEKEYCHOICE_SCROLLDOWN:
+ case KEYC_DOWN|KEYC_CTRL:
if (items == 0 ||
data->top + screen_size_y(&data->screen) >= items)
break;
@@ -706,7 +785,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
} else
window_choose_scroll_down(wp);
break;
- case MODEKEYCHOICE_PAGEUP:
+ case KEYC_PPAGE:
if (data->selected < screen_size_y(s)) {
data->selected = 0;
data->top = 0;
@@ -719,7 +798,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
}
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_PAGEDOWN:
+ case KEYC_NPAGE:
data->selected += screen_size_y(s);
if (data->selected > items - 1)
data->selected = items - 1;
@@ -733,35 +812,46 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
data->top = data->selected;
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_BACKSPACE:
+ case KEYC_BSPACE:
input_len = strlen(data->input_str);
if (input_len > 0)
data->input_str[input_len - 1] = '\0';
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_STARTNUMBERPREFIX:
+ case '0'|KEYC_ESCAPE:
+ case '1'|KEYC_ESCAPE:
+ case '2'|KEYC_ESCAPE:
+ case '3'|KEYC_ESCAPE:
+ case '4'|KEYC_ESCAPE:
+ case '5'|KEYC_ESCAPE:
+ case '6'|KEYC_ESCAPE:
+ case '7'|KEYC_ESCAPE:
+ case '8'|KEYC_ESCAPE:
+ case '9'|KEYC_ESCAPE:
key &= KEYC_MASK_KEY;
if (key < '0' || key > '9')
break;
window_choose_prompt_input(WINDOW_CHOOSE_GOTO_ITEM,
"Goto Item", wp, key);
break;
- case MODEKEYCHOICE_STARTOFLIST:
+ case KEYC_HOME:
+ case '<'|KEYC_ESCAPE:
data->selected = 0;
data->top = 0;
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_TOPLINE:
+ case 'R'|KEYC_ESCAPE:
data->selected = data->top;
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_BOTTOMLINE:
+ case 'r'|KEYC_ESCAPE:
data->selected = data->top + screen_size_y(s) - 1;
if (data->selected > items - 1)
data->selected = items - 1;
window_choose_redraw_screen(wp);
break;
- case MODEKEYCHOICE_ENDOFLIST:
+ case KEYC_END:
+ case '>'|KEYC_ESCAPE:
data->selected = items - 1;
if (screen_size_y(s) < items)
data->top = items - screen_size_y(s);
@@ -770,7 +860,7 @@ window_choose_key(struct window_pane *wp, __unused struct client *c,
window_choose_redraw_screen(wp);
break;
default:
- idx = window_choose_index_key(data, key);
+ idx = window_choose_index_key(wp, key);
if (idx < 0 || (u_int) idx >= data->list_size)
break;
data->selected = idx;
@@ -808,7 +898,7 @@ window_choose_write_line(struct window_pane *wp, struct screen_write_ctx *ctx,
item->wcd->wl->flags & WINLINK_ALERTFLAGS)
gc.attr |= GRID_ATTR_BRIGHT;
- key = window_choose_key_index(data, data->top + py);
+ key = window_choose_key_index(wp, data->top + py);
if (key != -1)
xsnprintf(label, sizeof label, "(%c)", key);
else
@@ -839,18 +929,17 @@ window_choose_write_line(struct windo