summaryrefslogtreecommitdiffstats
path: root/cmd-send-keys.c
diff options
context:
space:
mode:
authornicm <nicm>2017-05-09 17:56:55 +0000
committernicm <nicm>2017-05-09 17:56:55 +0000
commit3712b41abaff3dcf676d2b3da916fde7b456eb42 (patch)
tree6c345a5375357e2b772842d63d97840ed9f6bdc3 /cmd-send-keys.c
parent3b35daacf734dc824b6101e54d62067fde6016b8 (diff)
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.
Diffstat (limited to 'cmd-send-keys.c')
-rw-r--r--cmd-send-keys.c29
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);
}