diff options
author | Ran Benita <ran234@gmail.com> | 2013-03-04 10:33:18 +0200 |
---|---|---|
committer | Daniel Stone <daniel@fooishbar.org> | 2013-03-18 22:20:05 +0000 |
commit | ea3cf26db5c6b71a7e3cb755c03db6757fd6634f (patch) | |
tree | 2561dddba5a9ea0a0f4ca9883590eb980957094a | |
parent | cd6a71fc63577004ebc8a0e43a6cac260b8ff60d (diff) | |
download | libxkbcommon-ea3cf26db5c6b71a7e3cb755c03db6757fd6634f.tar.gz libxkbcommon-ea3cf26db5c6b71a7e3cb755c03db6757fd6634f.tar.bz2 libxkbcommon-ea3cf26db5c6b71a7e3cb755c03db6757fd6634f.zip |
keycodes: don't do unnecessary copies while merging
If 'into' in empty we can just steal 'from'.
Also move the alias-merging into the big function, it's nicer this way.
Signed-off-by: Ran Benita <ran234@gmail.com>
-rw-r--r-- | src/xkbcomp/keycodes.c | 101 |
1 files changed, 52 insertions, 49 deletions
diff --git a/src/xkbcomp/keycodes.c b/src/xkbcomp/keycodes.c index e25d141..53e3fff 100644 --- a/src/xkbcomp/keycodes.c +++ b/src/xkbcomp/keycodes.c @@ -343,43 +343,10 @@ AddKeyName(KeyNamesInfo *info, xkb_keycode_t kc, xkb_atom_t name, static int HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge); -static bool -MergeAliases(KeyNamesInfo *into, KeyNamesInfo *from, enum merge_mode merge) -{ - AliasInfo *alias; - KeyAliasDef def; - - if (darray_empty(from->aliases)) - return true; - - if (darray_empty(into->aliases)) { - into->aliases = from->aliases; - darray_init(from->aliases); - return true; - } - - memset(&def, 0, sizeof(def)); - - darray_foreach(alias, from->aliases) { - def.merge = (merge == MERGE_DEFAULT) ? alias->merge : merge; - def.alias = alias->alias; - def.real = alias->real; - - if (!HandleAliasDef(into, &def, def.merge)) - return false; - } - - return true; -} - static void MergeIncludedKeycodes(KeyNamesInfo *into, KeyNamesInfo *from, enum merge_mode merge) { - xkb_keycode_t i; - xkb_led_index_t idx; - LedNameInfo *ledi; - if (from->errorCount > 0) { into->errorCount += from->errorCount; return; @@ -390,29 +357,65 @@ MergeIncludedKeycodes(KeyNamesInfo *into, KeyNamesInfo *from, from->name = NULL; } - if (darray_size(into->key_names) < darray_size(from->key_names)) - darray_resize0(into->key_names, darray_size(from->key_names)); + /* Merge key names. */ + if (darray_empty(into->key_names)) { + into->key_names = from->key_names; + darray_init(from->key_names); + into->min_key_code = from->min_key_code; + into->max_key_code = from->max_key_code; + } + else { + if (darray_size(into->key_names) < darray_size(from->key_names)) + darray_resize0(into->key_names, darray_size(from->key_names)); - for (i = from->min_key_code; i <= from->max_key_code; i++) { - xkb_atom_t name = darray_item(from->key_names, i).name; - if (name == XKB_ATOM_NONE) - continue; + for (unsigned i = from->min_key_code; i <= from->max_key_code; i++) { + xkb_atom_t name = darray_item(from->key_names, i).name; + if (name == XKB_ATOM_NONE) + continue; - if (!AddKeyName(into, i, name, merge, from->file_id, false)) - into->errorCount++; + if (!AddKeyName(into, i, name, merge, from->file_id, false)) + into->errorCount++; + } } - darray_enumerate(idx, ledi, from->led_names) { - if (ledi->name == XKB_ATOM_NONE) - continue; + /* Merge key aliases. */ + if (darray_empty(into->aliases)) { + into->aliases = from->aliases; + darray_init(from->aliases); + } + else { + AliasInfo *alias; + + darray_foreach(alias, from->aliases) { + KeyAliasDef def; + + def.merge = (merge == MERGE_DEFAULT ? alias->merge : merge); + def.alias = alias->alias; + def.real = alias->real; + + if (!HandleAliasDef(into, &def, def.merge)) + into->errorCount++; + } + } - ledi->merge = (merge == MERGE_DEFAULT ? ledi->merge : merge); - if (!AddLedName(into, ledi->merge, ledi, idx)) - into->errorCount++; + /* Merge LED names. */ + if (darray_empty(into->led_names)) { + into->led_names = from->led_names; + darray_init(from->led_names); } + else { + xkb_led_index_t idx; + LedNameInfo *ledi; + + darray_enumerate(idx, ledi, from->led_names) { + if (ledi->name == XKB_ATOM_NONE) + continue; - if (!MergeAliases(into, from, merge)) - into->errorCount++; + ledi->merge = (merge == MERGE_DEFAULT ? ledi->merge : merge); + if (!AddLedName(into, ledi->merge, ledi, idx)) + into->errorCount++; + } + } } static void |