1
0
mirror of https://github.com/tmux/tmux.git synced 2025-04-10 11:08:49 +00:00

Try without cursor/keypad flags if a key doesn't exist, and limit ctrl

key translation to ASCII keys. Fixes send-keys, GitHub issue 2247.
This commit is contained in:
nicm 2020-06-01 16:09:35 +00:00
parent a54a88edd6
commit 674ec410b7

View File

@ -487,9 +487,13 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key)
ike = input_key_get(key); ike = input_key_get(key);
if (ike == NULL && (key & KEYC_META) && (~key & KEYC_IMPLIED_META)) if (ike == NULL && (key & KEYC_META) && (~key & KEYC_IMPLIED_META))
ike = input_key_get(key & ~KEYC_META); ike = input_key_get(key & ~KEYC_META);
if (ike == NULL && (key & KEYC_CURSOR))
ike = input_key_get(key & ~KEYC_CURSOR);
if (ike == NULL && (key & KEYC_KEYPAD))
ike = input_key_get(key & ~KEYC_KEYPAD);
if (ike != NULL) { if (ike != NULL) {
log_debug("found key 0x%llx: \"%s\"", key, ike->data); log_debug("found key 0x%llx: \"%s\"", key, ike->data);
if (key & KEYC_META && (~key & KEYC_IMPLIED_META)) if ((key & KEYC_META) && (~key & KEYC_IMPLIED_META))
bufferevent_write(bev, "\033", 1); bufferevent_write(bev, "\033", 1);
bufferevent_write(bev, ike->data, strlen(ike->data)); bufferevent_write(bev, ike->data, strlen(ike->data));
return (0); return (0);
@ -497,13 +501,13 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key)
/* No builtin key sequence; construct an extended key sequence. */ /* No builtin key sequence; construct an extended key sequence. */
if (~s->mode & MODE_KEXTENDED) { if (~s->mode & MODE_KEXTENDED) {
justkey = (key & KEYC_MASK_KEY);
if ((key & KEYC_MASK_MODIFIERS) != KEYC_CTRL) if ((key & KEYC_MASK_MODIFIERS) != KEYC_CTRL)
goto missing; goto missing;
justkey = (key & KEYC_MASK_KEY);
switch (justkey) { switch (justkey) {
case ' ': case ' ':
case '2': case '2':
key = 0||(key & ~KEYC_MASK_KEY); key = 0|(key & ~KEYC_MASK_KEY);
break; break;
case '|': case '|':
key = 28|(key & ~KEYC_MASK_KEY); key = 28|(key & ~KEYC_MASK_KEY);
@ -523,6 +527,8 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key)
key = (justkey - 'A')|(key & ~KEYC_MASK_KEY); key = (justkey - 'A')|(key & ~KEYC_MASK_KEY);
else if (justkey >= 'a' && justkey <= '~') else if (justkey >= 'a' && justkey <= '~')
key = (justkey - 96)|(key & ~KEYC_MASK_KEY); key = (justkey - 96)|(key & ~KEYC_MASK_KEY);
else
return (0);
break; break;
} }
return (input_key(s, bev, key & ~KEYC_CTRL)); return (input_key(s, bev, key & ~KEYC_CTRL));