keymap: store a pointer to the type in xkb_group instead of index
[platform/upstream/libxkbcommon.git] / src / keymap.c
index a36a404..77afda7 100644 (file)
@@ -83,25 +83,27 @@ 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);
@@ -246,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);
 }
 
 /**
@@ -316,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);