aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2017-05-09 22:34:15 +0100
committerNicholas Marriott <nicholas.marriott@gmail.com>2017-05-09 22:34:15 +0100
commit71bc255e6f75d78a5cf5284cfa59c75d4f67ba4c (patch)
tree1a08847be9d6169336df9ee96b0219450536acff
parent8f990c573cf61a8953cec648e261e909d375793d (diff)
parent3f1d6102f3942cf5c76f8b5cfc2d9b6db22ecae4 (diff)
downloadrtmux-71bc255e6f75d78a5cf5284cfa59c75d4f67ba4c.tar.gz
rtmux-71bc255e6f75d78a5cf5284cfa59c75d4f67ba4c.tar.bz2
rtmux-71bc255e6f75d78a5cf5284cfa59c75d4f67ba4c.zip
Merge branch 'master' of github.com:tmux/tmux
-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);
}