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

set, some compilers cannot handle enums that are larger than int. GitHub issue
2673.
This commit is contained in:
Nicholas Marriott 2021-04-28 09:18:04 +01:00
parent 589d3eb48f
commit e2d01795d2
4 changed files with 29 additions and 14 deletions

View File

@ -476,7 +476,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 (KEYC_IS_UNICODE(key) &&
(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);

31
tmux.h
View File

@ -109,11 +109,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
@ -136,9 +141,16 @@ struct winlink;
#define KEYC_NUSER 1000
/* Is this a mouse key? */
#define KEYC_IS_MOUSE(key) (((key) & KEYC_MASK_KEY) >= KEYC_MOUSE && \
#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
@ -159,8 +171,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;
@ -253,6 +265,9 @@ enum {
KEYC_KP_ENTER,
KEYC_KP_ZERO,
KEYC_KP_PERIOD,
/* End of special keys. */
KEYC_BASE_END
};
/* Termcap codes. */