summaryrefslogtreecommitdiff
path: root/src/keymap.c
diff options
context:
space:
mode:
authorRan Benita <ran234@gmail.com>2012-09-24 12:11:31 +0200
committerRan Benita <ran234@gmail.com>2012-09-24 12:46:51 +0200
commit01b00d75400fefc6f63e249b89b94d3a47368c96 (patch)
treecc26df90ced0052083b773c47a154588d4b8e0a0 /src/keymap.c
parente44cd2e93b608617bb8b9bfc3aaa1b5e738e9c6a (diff)
downloadxorg-lib-libxkbcommon-01b00d75400fefc6f63e249b89b94d3a47368c96.tar.gz
keymap, symbols: improve xkb_key memory layout
Add struct xkb_group and xkb_level for use in xkb_key, to mirror how it's done in KeyInfo, GroupInfo, LevelInfo in symbols.c. This corresponds more nicely to the logical data layout (i.e. a key has groups which have levels), and also removes a lot of copying and ugly code due to the index indirections and separate arrays which were used before. This uses more memory in some places (e.g. we alloc an action for every level even if the key doesn't have any) but less in other places (e.g. we no longer have to pad each group to ->width levels). The numbers say we use less overall. Signed-off-by: Ran Benita <ran234@gmail.com>
Diffstat (limited to 'src/keymap.c')
-rw-r--r--src/keymap.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/keymap.c b/src/keymap.c
index a36a404..daf3ab2 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -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(keymap, 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);