mirror of
https://github.com/tmux/tmux.git
synced 2024-12-04 19:58:48 +00:00
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:
parent
cb2943faab
commit
059580e0f7
@ -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);
|
||||
|
@ -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);
|
||||
|
2
status.c
2
status.c
@ -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
33
tmux.h
@ -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,8 +141,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
|
||||
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user