=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-send-keys.c,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- src/usr.bin/tmux/cmd-send-keys.c 2017/04/22 10:22:39 1.39 +++ src/usr.bin/tmux/cmd-send-keys.c 2017/05/09 17:56:55 1.40 @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-send-keys.c,v 1.39 2017/04/22 10:22:39 nicm Exp $ */ +/* $OpenBSD: cmd-send-keys.c,v 1.40 2017/05/09 17:56:55 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -55,6 +55,29 @@ .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 @@ 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 @@ 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 @@ 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); }