From f3732d8349556e8615cb704fa9643712e954fee6 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Wed, 10 Oct 2012 17:51:06 +0200 Subject: keymap: don't use darray for keymap->keys It's never resized. Signed-off-by: Ran Benita --- src/keymap.c | 18 ++++++++++-------- src/keymap.h | 9 +++++---- src/xkbcomp/keycodes.c | 12 +++++++----- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/keymap.c b/src/keymap.c index fb63639..7761858 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -89,16 +89,18 @@ xkb_keymap_unref(struct xkb_keymap *keymap) 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); + if (keymap->keys) { + xkb_foreach_key(key, keymap) { + 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); } - free(key->groups); + free(keymap->keys); } - darray_free(keymap->keys); for (i = 0; i < keymap->num_types; i++) { free(keymap->types[i].map); free(keymap->types[i].level_names); diff --git a/src/keymap.h b/src/keymap.h index 5bc2a13..74efe78 100644 --- a/src/keymap.h +++ b/src/keymap.h @@ -382,8 +382,7 @@ struct xkb_keymap { xkb_keycode_t min_key_code; xkb_keycode_t max_key_code; - - darray(struct xkb_key) keys; + struct xkb_key *keys; /* aliases in no particular order */ darray(struct xkb_key_alias) key_aliases; @@ -412,11 +411,13 @@ XkbKey(struct xkb_keymap *keymap, xkb_keycode_t kc) { if (kc < keymap->min_key_code || kc > keymap->max_key_code) return NULL; - return &darray_item(keymap->keys, kc); + return &keymap->keys[kc]; } #define xkb_foreach_key(iter, keymap) \ - darray_foreach(iter, keymap->keys) + for (iter = keymap->keys + keymap->min_key_code; \ + iter <= keymap->keys + keymap->max_key_code; \ + iter++) static inline xkb_level_index_t XkbKeyGroupWidth(const struct xkb_key *key, xkb_layout_index_t layout) diff --git a/src/xkbcomp/keycodes.c b/src/xkbcomp/keycodes.c index a1e75d1..89a2524 100644 --- a/src/xkbcomp/keycodes.c +++ b/src/xkbcomp/keycodes.c @@ -97,7 +97,7 @@ * The 'name' field of indicators declared in xkb_keycodes: * struct xkb_indicator_map indicators[XKB_NUM_INDICATORS]; * Further, the array of keys: - * darray(struct xkb_key) keys; + * struct xkb_key *keys; * had been resized to its final size (i.e. all of the xkb_key objects are * referable by their keycode). However the objects themselves do not * contain any useful information besides the key name at this point. @@ -690,14 +690,16 @@ CopyKeyNamesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) xkb_keycode_t kc; xkb_led_index_t idx; + keymap->keys = calloc(info->max_key_code + 1, sizeof(*keymap->keys)); + if (!keymap->keys) + return false; + keymap->min_key_code = info->min_key_code; keymap->max_key_code = info->max_key_code; - darray_resize0(keymap->keys, keymap->max_key_code + 1); for (kc = info->min_key_code; kc <= info->max_key_code; kc++) { - struct xkb_key *key = &darray_item(keymap->keys, kc); - key->keycode = kc; - key->name = darray_item(info->key_names, kc).name; + keymap->keys[kc].keycode = kc; + keymap->keys[kc].name = darray_item(info->key_names, kc).name; } keymap->keycodes_section_name = strdup_safe(info->name); -- cgit v1.2.1