summaryrefslogtreecommitdiffstats
path: root/cmd-send-keys.c
diff options
context:
space:
mode:
authornicm <nicm>2019-03-12 11:16:49 +0000
committernicm <nicm>2019-03-12 11:16:49 +0000
commit3f6bfbaf2babcc7f08f628a82ff31b0b52014e58 (patch)
treece4bf0c954cdfede0c2e86905bd85a9f565ed370 /cmd-send-keys.c
parentff4c80d53df96bb46eaa64107673e42d402f0d49 (diff)
Allow multiple modes to be open in a pane. A stack of open modes is kept
and the previous restored when the top is exited. If a mode that is already on the stack is entered, the existing instance is moved to the top as the active mode rather than being opened new.
Diffstat (limited to 'cmd-send-keys.c')
-rw-r--r--cmd-send-keys.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/cmd-send-keys.c b/cmd-send-keys.c
index 80799c54..d9c39f63 100644
--- a/cmd-send-keys.c
+++ b/cmd-send-keys.c
@@ -61,10 +61,11 @@ 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 window_mode_entry *wme = wp->mode;
+ struct window_mode_entry *wme;
struct key_table *table;
struct key_binding *bd;
+ wme = TAILQ_FIRST(&wp->modes);
if (wme == NULL || wme->mode->key_table == NULL) {
if (options_get_number(wp->window->options, "xterm-keys"))
key |= KEYC_XTERM;
@@ -90,7 +91,7 @@ cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item)
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 window_mode_entry *wme = TAILQ_FIRST(&wp->modes);
struct utf8_data *ud, *uc;
wchar_t wc;
int i, literal;
@@ -105,8 +106,13 @@ cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item)
free(cause);
return (CMD_RETURN_ERROR);
}
- if (wme != NULL && (args_has(args, 'X') || args->argc == 0))
+ if (wme != NULL && (args_has(args, 'X') || args->argc == 0)) {
+ if (wme == NULL || wme->mode->command == NULL) {
+ cmdq_error(item, "not in a mode");
+ return (CMD_RETURN_ERROR);
+ }
wme->prefix = np;
+ }
}
if (args_has(args, 'X')) {