Move "special" keys into the Unicode PUA rather than making them top bit
authornicm <nicm@openbsd.org>
Thu, 10 Jun 2021 07:38:28 +0000 (07:38 +0000)
committernicm <nicm@openbsd.org>
Thu, 10 Jun 2021 07:38:28 +0000 (07:38 +0000)
set, some compilers do not allow enums that are larger than int. GitHub
issue 2673.

usr.bin/tmux/input-keys.c
usr.bin/tmux/key-string.c
usr.bin/tmux/status.c
usr.bin/tmux/tmux.h

index 93865e7..bb605a2 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: input-keys.c,v 1.83 2021/04/09 07:02:00 nicm Exp $ */
+/* $OpenBSD: input-keys.c,v 1.84 2021/06/10 07:38:28 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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);
index 017b829..ccf4022 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: key-string.c,v 1.66 2021/06/10 07:21:09 nicm Exp $ */
+/* $OpenBSD: key-string.c,v 1.67 2021/06/10 07:38:28 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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);
index 7e3a22f..2e7b21a 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: status.c,v 1.222 2021/06/10 07:24:45 nicm Exp $ */
+/* $OpenBSD: status.c,v 1.223 2021/06/10 07:38:28 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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);
index 67f7d0e..9399217 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.1106 2021/06/10 07:36:47 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.1107 2021/06/10 07:38:28 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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. */