diff options
author | nicm <nicm> | 2019-03-12 11:16:49 +0000 |
---|---|---|
committer | nicm <nicm> | 2019-03-12 11:16:49 +0000 |
commit | 3f6bfbaf2babcc7f08f628a82ff31b0b52014e58 (patch) | |
tree | ce4bf0c954cdfede0c2e86905bd85a9f565ed370 /cmd-send-keys.c | |
parent | ff4c80d53df96bb46eaa64107673e42d402f0d49 (diff) | |
download | rtmux-3f6bfbaf2babcc7f08f628a82ff31b0b52014e58.tar.gz rtmux-3f6bfbaf2babcc7f08f628a82ff31b0b52014e58.tar.bz2 rtmux-3f6bfbaf2babcc7f08f628a82ff31b0b52014e58.zip |
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.c | 12 |
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')) { |