diff options
author | Ran Benita <ran234@gmail.com> | 2012-09-24 12:11:31 +0200 |
---|---|---|
committer | Ran Benita <ran234@gmail.com> | 2012-09-24 12:46:51 +0200 |
commit | 01b00d75400fefc6f63e249b89b94d3a47368c96 (patch) | |
tree | cc26df90ced0052083b773c47a154588d4b8e0a0 /src/keymap.c | |
parent | e44cd2e93b608617bb8b9bfc3aaa1b5e738e9c6a (diff) | |
download | xorg-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.c | 20 |
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); |