diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2021-04-13 06:25:59 +0100 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2021-04-13 06:25:59 +0100 |
commit | c2048c5c65aea99f2b79290b87635cb1d90863a6 (patch) | |
tree | 8aafdf588893ccdd65c8db53f5188f83f020675b /tty-keys.c | |
parent | 46cbbe3d4566885b8ad4235598389936f63c2c01 (diff) | |
parent | bedf2bd4372c60a525c22e6309f329cfd0bd07bc (diff) | |
download | rtmux-c2048c5c65aea99f2b79290b87635cb1d90863a6.tar.gz rtmux-c2048c5c65aea99f2b79290b87635cb1d90863a6.tar.bz2 rtmux-c2048c5c65aea99f2b79290b87635cb1d90863a6.zip |
Merge branch 'master' into 3.2-rc
Diffstat (limited to 'tty-keys.c')
-rw-r--r-- | tty-keys.c | 61 |
1 files changed, 47 insertions, 14 deletions
@@ -61,7 +61,7 @@ static int tty_keys_extended_device_attributes(struct tty *, const char *, /* Default raw keys. */ struct tty_default_key_raw { const char *string; - key_code key; + key_code key; }; static const struct tty_default_key_raw tty_default_raw_keys[] = { /* Application escape. */ @@ -262,7 +262,7 @@ static const key_code tty_default_xterm_modifiers[] = { */ struct tty_default_key_code { enum tty_code_code code; - key_code key; + key_code key; }; static const struct tty_default_key_code tty_default_code_keys[] = { /* Function keys. */ @@ -420,7 +420,7 @@ tty_keys_add(struct tty *tty, const char *s, key_code key) { struct tty_key *tk; size_t size; - const char *keystr; + const char *keystr; keystr = key_string_lookup_key(key, 1); if ((tk = tty_keys_find(tty, s, strlen(s), &size)) == NULL) { @@ -477,7 +477,7 @@ tty_keys_build(struct tty *tty) const struct tty_default_key_raw *tdkr; const struct tty_default_key_xterm *tdkx; const struct tty_default_key_code *tdkc; - u_int i, j; + u_int i, j; const char *s; struct options_entry *o; struct options_array_item *a; @@ -869,6 +869,9 @@ tty_keys_extended_key(struct tty *tty, const char *buf, size_t len, size_t end; u_int number, modifiers; char tmp[64]; + cc_t bspace; + key_code nkey; + key_code onlykey; *size = 0; @@ -911,38 +914,68 @@ tty_keys_extended_key(struct tty *tty, const char *buf, size_t len, } *size = end + 1; - /* Store the key and modifiers. */ - *key = number; + /* Store the key. */ + bspace = tty->tio.c_cc[VERASE]; + if (bspace != _POSIX_VDISABLE && number == bspace) + nkey = KEYC_BSPACE; + else + nkey = number; + + /* Update the modifiers. */ switch (modifiers) { case 2: - (*key) |= KEYC_SHIFT; + nkey |= KEYC_SHIFT; break; case 3: - (*key) |= (KEYC_META|KEYC_IMPLIED_META); + nkey |= (KEYC_META|KEYC_IMPLIED_META); break; case 4: - (*key) |= (KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META); + nkey |= (KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META); break; case 5: - (*key) |= KEYC_CTRL; + nkey |= KEYC_CTRL; break; case 6: - (*key) |= (KEYC_SHIFT|KEYC_CTRL); + nkey |= (KEYC_SHIFT|KEYC_CTRL); break; case 7: - (*key) |= (KEYC_META|KEYC_CTRL); + nkey |= (KEYC_META|KEYC_CTRL); break; case 8: - (*key) |= (KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL); + nkey |= (KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL); break; default: *key = KEYC_NONE; break; } + + /* + * Don't allow both KEYC_CTRL and as an implied modifier. Also convert + * C-X into C-x and so on. + */ + if (nkey & KEYC_CTRL){ + onlykey = (nkey & KEYC_MASK_KEY); + if (onlykey < 32) + onlykey = (nkey & ~KEYC_CTRL); + else { + if (onlykey >= 97 && onlykey <= 122) + onlykey -= 96; + else if (onlykey >= 64 && onlykey <= 95) + onlykey -= 64; + else if (onlykey == 32) + onlykey = 0; + else if (onlykey == 63) + onlykey = 127; + onlykey |= ((nkey & KEYC_MASK_MODIFIERS) & ~KEYC_CTRL); + } + nkey = onlykey; + } + if (log_get_level() != 0) { log_debug("%s: extended key %.*s is %llx (%s)", c->name, - (int)*size, buf, *key, key_string_lookup_key(*key, 1)); + (int)*size, buf, nkey, key_string_lookup_key(nkey, 1)); } + *key = nkey; return (0); } |