Remove the XKB_NUM_VIRTUAL_MODIFIERS limit
[platform/upstream/libxkbcommon.git] / src / text.c
index 2422e02..118820b 100644 (file)
@@ -24,6 +24,7 @@
  *
  ********************************************************/
 
+#include "keymap.h"
 #include "text.h"
 
 bool
@@ -58,20 +59,20 @@ LookupValue(const LookupEntry tab[], unsigned int value)
 }
 
 const LookupEntry ctrlMaskNames[] = {
-    { "RepeatKeys", XkbRepeatKeysMask },
-    { "Repeat", XkbRepeatKeysMask },
-    { "AutoRepeat", XkbRepeatKeysMask },
-    { "SlowKeys", XkbSlowKeysMask },
-    { "BounceKeys", XkbBounceKeysMask },
-    { "StickyKeys", XkbStickyKeysMask },
-    { "MouseKeys", XkbMouseKeysMask },
-    { "MouseKeysAccel", XkbMouseKeysAccelMask },
-    { "AccessXKeys", XkbAccessXKeysMask },
-    { "AccessXTimeout", XkbAccessXTimeoutMask },
-    { "AccessXFeedback", XkbAccessXFeedbackMask },
-    { "AudibleBell", XkbAudibleBellMask },
-    { "IgnoreGroupLock", XkbIgnoreGroupLockMask },
-    { "all", XkbAllBooleanCtrlsMask },
+    { "RepeatKeys", CONTROL_REPEAT },
+    { "Repeat", CONTROL_REPEAT },
+    { "AutoRepeat", CONTROL_REPEAT },
+    { "SlowKeys", CONTROL_SLOW },
+    { "BounceKeys", CONTROL_DEBOUNCE },
+    { "StickyKeys", CONTROL_STICKY },
+    { "MouseKeys", CONTROL_MOUSEKEYS },
+    { "MouseKeysAccel", CONTROL_MOUSEKEYS_ACCEL },
+    { "AccessXKeys", CONTROL_AX },
+    { "AccessXTimeout", CONTROL_AX_TIMEOUT },
+    { "AccessXFeedback", CONTROL_AX_FEEDBACK },
+    { "AudibleBell", CONTROL_BELL },
+    { "IgnoreGroupLock", CONTROL_IGNORE_GROUP_LOCK },
+    { "all", CONTROL_ALL },
     { "none", 0 },
     { "Overlay1", 0 },
     { "Overlay2", 0 },
@@ -202,11 +203,11 @@ const LookupEntry actionTypeNames[] = {
 };
 
 const LookupEntry symInterpretMatchMaskNames[] = {
-    { "NoneOf", XkbSI_NoneOf },
-    { "AnyOfOrNone", XkbSI_AnyOfOrNone },
-    { "AnyOf", XkbSI_AnyOf },
-    { "AllOf", XkbSI_AllOf },
-    { "Exactly", XkbSI_Exactly },
+    { "NoneOf", MATCH_NONE },
+    { "AnyOfOrNone", MATCH_ANY_OR_NONE },
+    { "AnyOf", MATCH_ANY },
+    { "AllOf", MATCH_ALL },
+    { "Exactly", MATCH_EXACTLY },
 };
 
 #define BUFFER_SIZE 1024
@@ -230,36 +231,14 @@ GetBuffer(size_t size)
     return rtrn;
 }
 
-/*
- * Get a vmod name's text, where the vmod index is zero based
- * (0..XKB_NUM_VIRTUAL_MODS-1).
- */
+/* Get a vmod name's text, where the vmod index is zero based. */
 static const char *
 VModIndexText(struct xkb_keymap *keymap, xkb_mod_index_t ndx)
 {
-    int len;
-    char *rtrn;
-    const char *tmp = NULL;
-    char buf[20];
-
-    if (ndx >= XKB_NUM_VIRTUAL_MODS)
-         tmp = "illegal";
-    else
-         tmp = xkb_atom_text(keymap->ctx, keymap->vmod_names[ndx]);
-
-    if (!tmp) {
-        snprintf(buf, sizeof(buf) - 1, "%d", ndx);
-        tmp = buf;
-    }
-
-    len = strlen(tmp) + 1;
-    if (len >= BUFFER_SIZE)
-        len = BUFFER_SIZE - 1;
-
-    rtrn = GetBuffer(len);
-    strncpy(rtrn, tmp, len);
-
-    return rtrn;
+    if (ndx >= darray_size(keymap->vmods))
+        return "illegal";
+    return xkb_atom_text(keymap->ctx,
+                         darray_item(keymap->vmods, ndx).name);
 }
 
 /* Get a mod mask's text, where the mask is in rmods+vmods format. */
@@ -267,7 +246,6 @@ const char *
 VModMaskText(struct xkb_keymap *keymap, xkb_mod_mask_t cmask)
 {
     xkb_mod_index_t i;
-    xkb_mod_mask_t bit;
     xkb_mod_mask_t rmask, vmask;
     int len, rem;
     const char *mm = NULL;
@@ -288,9 +266,8 @@ VModMaskText(struct xkb_keymap *keymap, xkb_mod_mask_t cmask)
     rem = BUFFER_SIZE;
 
     if (vmask != 0) {
-        for (i = 0, bit = 1; i < XKB_NUM_VIRTUAL_MODS && rem > 1; i++, bit <<=
-                 1) {
-            if (!(vmask & bit))
+        for (i = 0; i < darray_size(keymap->vmods) && rem > 1; i++) {
+            if (!(vmask & (1 << i)))
                 continue;
 
             len = snprintf(str, rem, "%s%s",
@@ -427,35 +404,28 @@ KeysymText(xkb_keysym_t sym)
 }
 
 const char *
-KeyNameText(const char name[XKB_KEY_NAME_LENGTH])
+KeyNameText(struct xkb_context *ctx, xkb_atom_t name)
 {
-    char *buf;
-    int len;
-
-    buf = GetBuffer(7);
-    buf[0] = '<';
-    strncpy(&buf[1], name, 4);
-    buf[5] = '\0';
-    len = strlen(buf);
-    buf[len++] = '>';
-    buf[len] = '\0';
-
+    const char *sname = xkb_atom_text(ctx, name);
+    size_t len = strlen(sname) + 3;
+    char *buf = GetBuffer(len);
+    snprintf(buf, len, "<%s>", sname);
     return buf;
 }
 
 const char *
-SIMatchText(unsigned type)
+SIMatchText(enum xkb_match_operation type)
 {
     const char *name;
     char *buf;
 
-    type &= XkbSI_OpMask;
+    type &= MATCH_OP_MASK;
 
     name = LookupValue(symInterpretMatchMaskNames, type);
     if (name)
         return name;
 
     buf = GetBuffer(40);
-    snprintf(buf, 40, "0x%x", type & XkbSI_OpMask);
+    snprintf(buf, 40, "0x%x", type);
     return buf;
 }