keymap: store a pointer to the type in xkb_group instead of index
[platform/upstream/libxkbcommon.git] / src / keymap.c
index 43e43dd..77afda7 100644 (file)
@@ -83,27 +83,30 @@ xkb_keymap_ref(struct xkb_keymap *keymap)
 XKB_EXPORT void
 xkb_keymap_unref(struct xkb_keymap *keymap)
 {
-    unsigned int i;
+    unsigned int i, j;
     struct xkb_key *key;
 
     if (!keymap || --keymap->refcnt > 0)
         return;
 
+    darray_foreach(key, keymap->keys) {
+        for (i = 0; i < key->num_groups; i++) {
+            for (j = 0; j < XkbKeyGroupWidth(key, i); j++)
+                if (key->groups[i].levels[j].num_syms > 1)
+                    free(key->groups[i].levels[j].u.syms);
+            free(key->groups[i].levels);
+        }
+        free(key->groups);
+    }
+    darray_free(keymap->keys);
     for (i = 0; i < keymap->num_types; i++) {
         free(keymap->types[i].map);
         free(keymap->types[i].level_names);
     }
     free(keymap->types);
-    darray_foreach(key, keymap->keys) {
-        free(key->sym_index);
-        free(key->num_syms);
-        free(key->syms);
-        free(key->actions);
-        free(key->kt_index);
-    }
-    darray_free(keymap->keys);
     darray_free(keymap->sym_interpret);
     darray_free(keymap->key_aliases);
+    darray_free(keymap->group_names);
     free(keymap->keycodes_section_name);
     free(keymap->symbols_section_name);
     free(keymap->types_section_name);
@@ -192,10 +195,11 @@ xkb_keymap_num_layouts(struct xkb_keymap *keymap)
 XKB_EXPORT const char *
 xkb_keymap_layout_get_name(struct xkb_keymap *keymap, xkb_layout_index_t idx)
 {
-    if (idx >= xkb_keymap_num_layouts(keymap))
+    if (idx >= xkb_keymap_num_layouts(keymap) ||
+        idx >= darray_size(keymap->group_names))
         return NULL;
 
-    return xkb_atom_text(keymap->ctx, keymap->group_names[idx]);
+    return xkb_atom_text(keymap->ctx, darray_item(keymap->group_names, idx));
 }
 
 /**
@@ -204,15 +208,15 @@ xkb_keymap_layout_get_name(struct xkb_keymap *keymap, xkb_layout_index_t idx)
 XKB_EXPORT xkb_layout_index_t
 xkb_keymap_layout_get_index(struct xkb_keymap *keymap, const char *name)
 {
-    xkb_layout_index_t num_groups = xkb_keymap_num_layouts(keymap);
     xkb_atom_t atom = xkb_atom_lookup(keymap->ctx, name);
+    xkb_atom_t *group_name;
     xkb_layout_index_t i;
 
     if (atom == XKB_ATOM_NONE)
         return XKB_LAYOUT_INVALID;
 
-    for (i = 0; i < num_groups; i++)
-        if (keymap->group_names[i] == atom)
+    darray_enumerate(i, group_name, keymap->group_names)
+        if (*group_name == atom)
             return i;
 
     return XKB_LAYOUT_INVALID;
@@ -244,7 +248,7 @@ xkb_keymap_num_levels_for_key(struct xkb_keymap *keymap, xkb_keycode_t kc,
     if (!key)
         return 0;
 
-    return XkbKeyGroupWidth(keymap, key, layout);
+    return XkbKeyGroupWidth(key, layout);
 }
 
 /**
@@ -314,7 +318,7 @@ xkb_keymap_key_get_syms_by_level(struct xkb_keymap *keymap,
         goto err;
     if (layout >= key->num_groups)
         goto err;
-    if (level >= XkbKeyGroupWidth(keymap, key, layout))
+    if (level >= XkbKeyGroupWidth(key, layout))
         goto err;
 
     num_syms = XkbKeyNumSyms(key, layout, level);