keymap: don't use darray for keymap->keys It's never resized. Signed-off-by: Ran Benita <ran234@gmail.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
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);