Commit e811743ff2f28085be74a28b57dfe684a320936e

Pierre Le Marre 2023-07-04T09:23:23

Add XKB_KEYSYM_MIN and XKB_KEYSYM_MAX Keysyms are 32-bit integers with the 3 most significant bits always set to zero. See: Appendix A “KEYSYM Encoding” of the X Window System Protocol at https://www.x.org/releases/current/doc/xproto/x11protocol.html#keysym_encoding. Add a new constants XKB_KEYSYM_MIN and XKB_KEYSYM_MAX to make the interval of valid keysyms more obvious in the code.

diff --git a/include/xkbcommon/xkbcommon.h b/include/xkbcommon/xkbcommon.h
index a7148f3..8ad3dcc 100644
--- a/include/xkbcommon/xkbcommon.h
+++ b/include/xkbcommon/xkbcommon.h
@@ -304,6 +304,15 @@ typedef uint32_t xkb_led_mask_t;
 #define XKB_KEYCODE_MAX     (0xffffffff - 1)
 
 /**
+ * Maximum keysym value
+ *
+ * @since 1.6.0
+ * @sa xkb_keysym_t
+ * @ingroup keysyms
+ */
+#define XKB_KEYSYM_MAX      0x1fffffff
+
+/**
  * Test whether a value is a valid extended keycode.
  * @sa xkb_keycode_t
  **/
diff --git a/src/keysym.c b/src/keysym.c
index 989ae7c..788b7a2 100644
--- a/src/keysym.c
+++ b/src/keysym.c
@@ -64,7 +64,7 @@ get_name(const struct name_keysym *entry)
 XKB_EXPORT int
 xkb_keysym_get_name(xkb_keysym_t ks, char *buffer, size_t size)
 {
-    if ((ks & ((unsigned long) ~0x1fffffff)) != 0) {
+    if (ks > XKB_KEYSYM_MAX) {
         snprintf(buffer, size, "Invalid");
         return -1;
     }
diff --git a/src/keysym.h b/src/keysym.h
index 2633963..e636746 100644
--- a/src/keysym.h
+++ b/src/keysym.h
@@ -50,6 +50,14 @@
 #ifndef KEYSYM_H
 #define KEYSYM_H
 
+/*
+ * NOTE: this is not defined in xkbcommon.h, because if we did, it may add
+ * overhead for library user: when handling keysyms they would also need to
+ * check min keysym when previously there was no reason to.
+ */
+/** Minimum keysym value */
+#define XKB_KEYSYM_MIN      0x00000000
+
 bool
 xkb_keysym_is_lower(xkb_keysym_t keysym);