aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornicm <nicm>2021-06-10 07:38:28 +0000
committernicm <nicm>2021-06-10 07:38:28 +0000
commitf02a6c34e0e8bf2c50ee1dfe9cfacf54370a1405 (patch)
treee6feaf318a3434b1fdf46b4dd5ee50f4b3f70c72
parentf9f97c8145e97b0295f0792a643286126fe2d3f8 (diff)
downloadrtmux-f02a6c34e0e8bf2c50ee1dfe9cfacf54370a1405.tar.gz
rtmux-f02a6c34e0e8bf2c50ee1dfe9cfacf54370a1405.tar.bz2
rtmux-f02a6c34e0e8bf2c50ee1dfe9cfacf54370a1405.zip
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.
-rw-r--r--input-keys.c2
-rw-r--r--key-string.c6
-rw-r--r--status.c2
-rw-r--r--tmux.h33
4 files changed, 29 insertions, 14 deletions
diff --git a/input-keys.c b/input-keys.c
index ab7d2212..b975c1ed 100644
--- a/input-keys.c
+++ b/input-keys.c
@@ -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);
diff --git a/key-string.c b/key-string.c
index c24a33fc..406d26dd 100644
--- a/key-string.c
+++ b/key-string.c
@@ -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);
diff --git a/status.c b/status.c
index 271e1afa..f4418500 100644
--- a/status.c
+++ b/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);
diff --git a/tmux.h b/tmux.h
index 96d829fb..02dcdad0 100644
--- a/tmux.h
+++ b/tmux.h
@@ -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. */