From 2d08235987efa1e2f9c932c4a5c8a0200b4804c1 Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 1 Nov 2022 09:54:13 +0000 Subject: [PATCH] Add modified Tab key sequences, from Aaron Jensen, GitHub issue 3368. --- input-keys.c | 18 ++++++++++++++++++ key-string.c | 2 ++ tmux.h | 1 + tty-keys.c | 5 ++++- 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/input-keys.c b/input-keys.c index 038003df..5c4d3e1b 100644 --- a/input-keys.c +++ b/input-keys.c @@ -307,6 +307,20 @@ static struct input_key_entry input_key_defaults[] = { }, { .key = KEYC_DC|KEYC_BUILD_MODIFIERS, .data = "\033[3;_~" + }, + + /* Tab and modifiers. */ + { .key = '\011'|KEYC_CTRL, + .data = "\011" + }, + { .key = '\011'|KEYC_CTRL|KEYC_EXTENDED, + .data = "\033[9;5u" + }, + { .key = '\011'|KEYC_CTRL|KEYC_SHIFT, + .data = "\011" + }, + { .key = '\011'|KEYC_CTRL|KEYC_SHIFT|KEYC_EXTENDED, + .data = "\033[1;5Z" } }; static const key_code input_key_modifiers[] = { @@ -469,6 +483,8 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key) key &= ~KEYC_KEYPAD; if (~s->mode & MODE_KCURSOR) key &= ~KEYC_CURSOR; + if (~s->mode & MODE_KEXTENDED) + key &= ~KEYC_EXTENDED; ike = input_key_get(key); if (ike == NULL && (key & KEYC_META) && (~key & KEYC_IMPLIED_META)) ike = input_key_get(key & ~KEYC_META); @@ -476,6 +492,8 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key) ike = input_key_get(key & ~KEYC_CURSOR); if (ike == NULL && (key & KEYC_KEYPAD)) ike = input_key_get(key & ~KEYC_KEYPAD); + if (ike == NULL && (key & KEYC_EXTENDED)) + ike = input_key_get(key & ~KEYC_EXTENDED); if (ike != NULL) { log_debug("found key 0x%llx: \"%s\"", key, ike->data); if ((key & KEYC_META) && (~key & KEYC_IMPLIED_META)) diff --git a/key-string.c b/key-string.c index 0ca91306..086c3ac4 100644 --- a/key-string.c +++ b/key-string.c @@ -460,6 +460,8 @@ out: strlcat(out, "I", sizeof out); if (saved & KEYC_BUILD_MODIFIERS) strlcat(out, "B", sizeof out); + if (saved & KEYC_EXTENDED) + strlcat(out, "E", sizeof out); strlcat(out, "]", sizeof out); } return (out); diff --git a/tmux.h b/tmux.h index a0f9f461..6cb6cc96 100644 --- a/tmux.h +++ b/tmux.h @@ -137,6 +137,7 @@ struct winlink; #define KEYC_IMPLIED_META 0x08000000000000ULL #define KEYC_BUILD_MODIFIERS 0x10000000000000ULL #define KEYC_VI 0x20000000000000ULL +#define KEYC_EXTENDED 0x40000000000000ULL /* Masks for key bits. */ #define KEYC_MASK_MODIFIERS 0x00f00000000000ULL diff --git a/tty-keys.c b/tty-keys.c index bb9ec231..db82754f 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -208,6 +208,9 @@ static const struct tty_default_key_raw tty_default_raw_keys[] = { /* Paste keys. */ { "\033[200~", KEYC_PASTE_START }, { "\033[201~", KEYC_PASTE_END }, + + /* Extended keys. */ + { "\033[1;5Z", '\011'|KEYC_CTRL|KEYC_SHIFT|KEYC_EXTENDED }, }; /* Default xterm keys. */ @@ -974,7 +977,7 @@ tty_keys_extended_key(struct tty *tty, const char *buf, size_t len, log_debug("%s: extended key %.*s is %llx (%s)", c->name, (int)*size, buf, nkey, key_string_lookup_key(nkey, 1)); } - *key = nkey; + *key = nkey|KEYC_EXTENDED; return (0); }