Test: Catch SIGUSR1 from Xvfb for X11 tests
[platform/upstream/libxkbcommon.git] / src / keymap-priv.c
index 9f42040..8fdaf5b 100644 (file)
  * Author: Daniel Stone <daniel@fooishbar.org>
  */
 
+#include "config.h"
+
 #include "keymap.h"
 
 static void
 update_builtin_keymap_fields(struct xkb_keymap *keymap)
 {
-    struct xkb_context *ctx = keymap->ctx;
+    /* Predefined (AKA real, core, X11) modifiers. The order is important! */
+    static const char *const builtin_mods[] = {
+        [0] = "Shift",
+        [1] = "Lock",
+        [2] = "Control",
+        [3] = "Mod1",
+        [4] = "Mod2",
+        [5] = "Mod3",
+        [6] = "Mod4",
+        [7] = "Mod5"
+    };
 
-    /*
-     * Add predefined (AKA real, core, X11) modifiers.
-     * The order is important!
-     */
-    darray_appends_t(keymap->mods, struct xkb_mod,
-        { .name = xkb_atom_intern_literal(ctx, "Shift"),   .type = MOD_REAL },
-        { .name = xkb_atom_intern_literal(ctx, "Lock"),    .type = MOD_REAL },
-        { .name = xkb_atom_intern_literal(ctx, "Control"), .type = MOD_REAL },
-        { .name = xkb_atom_intern_literal(ctx, "Mod1"),    .type = MOD_REAL },
-        { .name = xkb_atom_intern_literal(ctx, "Mod2"),    .type = MOD_REAL },
-        { .name = xkb_atom_intern_literal(ctx, "Mod3"),    .type = MOD_REAL },
-        { .name = xkb_atom_intern_literal(ctx, "Mod4"),    .type = MOD_REAL },
-        { .name = xkb_atom_intern_literal(ctx, "Mod5"),    .type = MOD_REAL });
+    for (unsigned i = 0; i < ARRAY_SIZE(builtin_mods); i++) {
+        keymap->mods.mods[i].name = xkb_atom_intern(keymap->ctx,
+                                                    builtin_mods[i],
+                                                    strlen(builtin_mods[i]));
+        keymap->mods.mods[i].type = MOD_REAL;
+    }
+    keymap->mods.num_mods = ARRAY_SIZE(builtin_mods);
 }
 
 struct xkb_keymap *
@@ -73,7 +79,7 @@ XkbKeyByName(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases)
 {
     struct xkb_key *key;
 
-    xkb_foreach_key(key, keymap)
+    xkb_keys_foreach(key, keymap)
         if (key->name == name)
             return key;
 
@@ -87,7 +93,7 @@ XkbKeyByName(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases)
 }
 
 xkb_atom_t
-XkbResolveKeyAlias(struct xkb_keymap *keymap, xkb_atom_t name)
+XkbResolveKeyAlias(const struct xkb_keymap *keymap, xkb_atom_t name)
 {
     for (unsigned i = 0; i < keymap->num_key_aliases; i++)
         if (keymap->key_aliases[i].alias == name)
@@ -114,8 +120,33 @@ XkbEscapeMapName(char *name)
         return;
 
     while (*name) {
-        if (!(legal[*name / 8] & (1 << (*name % 8))))
+        unsigned char c = *name;
+        if (!(legal[c / 8] & (1 << (c % 8))))
             *name = '_';
         name++;
     }
 }
+
+xkb_mod_index_t
+XkbModNameToIndex(const struct xkb_mod_set *mods, xkb_atom_t name,
+                  enum mod_type type)
+{
+    xkb_mod_index_t i;
+    const struct xkb_mod *mod;
+
+    xkb_mods_enumerate(i, mod, mods)
+        if ((mod->type & type) && name == mod->name)
+            return i;
+
+    return XKB_MOD_INVALID;
+}
+
+bool
+XkbLevelsSameSyms(const struct xkb_level *a, const struct xkb_level *b)
+{
+    if (a->num_syms != b->num_syms)
+        return false;
+    if (a->num_syms <= 1)
+        return a->u.sym == b->u.sym;
+    return memcmp(a->u.syms, b->u.syms, sizeof(*a->u.syms) * a->num_syms) == 0;
+}