Move "special" keys into the Unicode PUA rather than making them top bit

set, some compilers do not allow enums that are larger than int. GitHub
issue 2673.
This commit is contained in:
nicm 2021-06-10 07:38:28 +00:00
parent f9f97c8145
commit f02a6c34e0
4 changed files with 29 additions and 14 deletions

View File

@ -477,7 +477,7 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key)
input_key_write(__func__, bev, &ud.data[0], 1);
return (0);
}
if (justkey > 0x7f && justkey < KEYC_BASE) {
if (KEYC_IS_UNICODE(justkey)) {
if (key & KEYC_META)
input_key_write(__func__, bev, "\033", 1);
utf8_to_data(justkey, &ud);

View File

@ -238,7 +238,7 @@ key_string_lookup_string(const char *string)
}
/* Convert the standard control keys. */
if (key < KEYC_BASE &&
if (key <= 127 &&
(modifiers & KEYC_CTRL) &&
strchr(other, key) == NULL &&
key != 9 &&
@ -368,8 +368,8 @@ key_string_lookup_key(key_code key, int with_flags)
goto out;
}
/* Is this a UTF-8 key? */
if (key > 127 && key < KEYC_BASE) {
/* Is this a Unicode key? */
if (KEYC_IS_UNICODE(key)) {
utf8_to_data(key, &ud);
off = strlen(out);
memcpy(out + off, ud.data, ud.size);

View File

@ -1300,7 +1300,7 @@ process_key:
return (0);
append_key:
if (key <= 0x1f || key >= KEYC_BASE)
if (key <= 0x1f || (key >= KEYC_BASE && key < KEYC_BASE_END))
return (0);
if (key <= 0x7f)
utf8_set(&tmp, key);

33
tmux.h
View File

@ -108,11 +108,16 @@ struct winlink;
#define VISUAL_ON 1
#define VISUAL_BOTH 2
/* Special key codes. */
#define KEYC_NONE 0x00ff000000000ULL
#define KEYC_UNKNOWN 0x00fe000000000ULL
#define KEYC_BASE 0x0001000000000ULL
#define KEYC_USER 0x0002000000000ULL
/* No key or unknown key. */
#define KEYC_NONE 0x000ff000000000ULL
#define KEYC_UNKNOWN 0x000fe000000000ULL
/*
* Base for special (that is, not Unicode) keys. An enum must be at most a
* signed int, so these are based in the highest Unicode PUA.
*/
#define KEYC_BASE 0x0000000010e000ULL
#define KEYC_USER 0x0000000010f000ULL
/* Key modifier bits. */
#define KEYC_META 0x00100000000000ULL
@ -135,8 +140,15 @@ struct winlink;
#define KEYC_NUSER 1000
/* Is this a mouse key? */
#define KEYC_IS_MOUSE(key) (((key) & KEYC_MASK_KEY) >= KEYC_MOUSE && \
((key) & KEYC_MASK_KEY) < KEYC_BSPACE)
#define KEYC_IS_MOUSE(key) \
(((key) & KEYC_MASK_KEY) >= KEYC_MOUSE && \
((key) & KEYC_MASK_KEY) < KEYC_BSPACE)
/* Is this a Unicode key? */
#define KEYC_IS_UNICODE(key) \
(((key) & KEYC_MASK_KEY) > 0x7f && \
(((key) & KEYC_MASK_KEY) < KEYC_BASE || \
((key) & KEYC_MASK_KEY) >= KEYC_BASE_END))
/* Multiple click timeout. */
#define KEYC_CLICK_TIMEOUT 300
@ -158,8 +170,8 @@ struct winlink;
{ #s "Border", KEYC_ ## name ## _BORDER }
/*
* A single key. This can be ASCII or Unicode or one of the keys starting at
* KEYC_BASE.
* A single key. This can be ASCII or Unicode or one of the keys between
* KEYC_BASE and KEYC_BASE_END.
*/
typedef unsigned long long key_code;
@ -252,6 +264,9 @@ enum {
KEYC_KP_ENTER,
KEYC_KP_ZERO,
KEYC_KP_PERIOD,
/* End of special keys. */
KEYC_BASE_END
};
/* Termcap codes. */