diff options
author | nicm <nicm> | 2017-05-09 17:56:55 +0000 |
---|---|---|
committer | nicm <nicm> | 2017-05-09 17:56:55 +0000 |
commit | 3712b41abaff3dcf676d2b3da916fde7b456eb42 (patch) | |
tree | 6c345a5375357e2b772842d63d97840ed9f6bdc3 | |
parent | 3b35daacf734dc824b6101e54d62067fde6016b8 (diff) | |
download | rtmux-3712b41abaff3dcf676d2b3da916fde7b456eb42.tar.gz rtmux-3712b41abaff3dcf676d2b3da916fde7b456eb42.tar.bz2 rtmux-3712b41abaff3dcf676d2b3da916fde7b456eb42.zip |
If the target pane for send-keys in in a mode with a key table (that is,
copy mode), then look the key up in the table and fire any command
instead of delivering the key to the pane directly where it will be
ignored. This makes C-b C-b (send-prefix) work in copy mode again.
-rw-r--r-- | cmd-send-keys.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/cmd-send-keys.c b/cmd-send-keys.c index 3c61b25b..e54574fe 100644 --- a/cmd-send-keys.c +++ b/cmd-send-keys.c @@ -55,6 +55,29 @@ const struct cmd_entry cmd_send_prefix_entry = { .exec = cmd_send_keys_exec }; +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 key_table *table; + struct key_binding *bd, bd_find; + + if (wp->mode == NULL || wp->mode->key_table == NULL) { + window_pane_key(wp, NULL, s, key, NULL); + return; + } + table = key_bindings_get_table(wp->mode->key_table(wp), 1); + + bd_find.key = (key & ~KEYC_XTERM); + bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find); + if (bd != NULL) { + table->references++; + key_bindings_dispatch(bd, c, NULL, &item->target); + key_bindings_unref_table(table); + } +} + static enum cmd_retval cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item) { @@ -108,7 +131,7 @@ cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item) key = options_get_number(s->options, "prefix2"); else key = options_get_number(s->options, "prefix"); - window_pane_key(wp, NULL, s, key, NULL); + cmd_send_keys_inject(c, item, key); return (CMD_RETURN_NORMAL); } @@ -123,7 +146,7 @@ cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item) if (!literal) { key = key_string_lookup_string(args->argv[i]); if (key != KEYC_NONE && key != KEYC_UNKNOWN) - window_pane_key(wp, NULL, s, key, NULL); + cmd_send_keys_inject(c, item, key); else literal = 1; } @@ -132,7 +155,7 @@ cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item) for (uc = ud; uc->size != 0; uc++) { if (utf8_combine(uc, &wc) != UTF8_DONE) continue; - window_pane_key(wp, NULL, s, wc, NULL); + cmd_send_keys_inject(c, item, wc); } free(ud); } |