diff options
Diffstat (limited to 'src/xkbcomp/keycodes.c')
-rw-r--r-- | src/xkbcomp/keycodes.c | 531 |
1 files changed, 221 insertions, 310 deletions
diff --git a/src/xkbcomp/keycodes.c b/src/xkbcomp/keycodes.c index c05f799..edc54c9 100644 --- a/src/xkbcomp/keycodes.c +++ b/src/xkbcomp/keycodes.c @@ -27,7 +27,6 @@ #include "xkbcomp-priv.h" #include "text.h" #include "expr.h" -#include "keycodes.h" #include "include.h" /* @@ -74,16 +73,15 @@ * Allows to refer to a previously defined key (here <COMP>) by another * name (here <MENU>). Conflicts are handled similarly. * - * Indicator name statements + * LED name statements * ------------------------- * Statements of the form: * indicator 1 = "Caps Lock"; * indicator 2 = "Num Lock"; * indicator 3 = "Scroll Lock"; * - * Assigns a name the indicator (i.e. keyboard LED) with the given index. - * The amount of possible indicators is predetermined (XKB_NUM_INDICATORS). - * The indicator may be referred by this name later in the compat section + * Assigns a name to the keyboard LED (a.k.a indicator) with the given index. + * The led may be referred by this name later in the compat section * and by the user. * * Effect on the keymap @@ -92,10 +90,11 @@ * following members of struct xkb_keymap are finalized: * xkb_keycode_t min_key_code; * xkb_keycode_t max_key_code; - * darray(struct xkb_key_alias) key_aliases; + * unsigned int num_aliases; + * struct xkb_key_alias *key_aliases; * char *keycodes_section_name; - * The 'name' field of indicators declared in xkb_keycodes: - * darray(struct xkb_indicator_map) indicators; + * The 'name' field of leds declared in xkb_keycodes: + * darray(struct xkb_led) leds; * Further, the array of keys: * struct xkb_key *keys; * had been resized to its final size (i.e. all of the xkb_key objects are @@ -105,61 +104,53 @@ typedef struct { enum merge_mode merge; - unsigned file_id; xkb_atom_t alias; xkb_atom_t real; } AliasInfo; typedef struct { - unsigned int file_id; - xkb_atom_t name; -} KeyNameInfo; - -typedef struct { enum merge_mode merge; - unsigned file_id; xkb_atom_t name; -} IndicatorNameInfo; +} LedNameInfo; typedef struct { - char *name; /* e.g. evdev+aliases(qwerty) */ + char *name; int errorCount; - unsigned file_id; - enum merge_mode merge; xkb_keycode_t min_key_code; xkb_keycode_t max_key_code; - darray(KeyNameInfo) key_names; - darray(IndicatorNameInfo) indicator_names; + darray(xkb_atom_t) key_names; + darray(LedNameInfo) led_names; darray(AliasInfo) aliases; struct xkb_context *ctx; } KeyNamesInfo; +/***====================================================================***/ + static void -InitAliasInfo(AliasInfo *info, enum merge_mode merge, unsigned file_id, +InitAliasInfo(AliasInfo *info, enum merge_mode merge, xkb_atom_t alias, xkb_atom_t real) { memset(info, 0, sizeof(*info)); info->merge = merge; - info->file_id = file_id; info->alias = alias; info->real = real; } -static IndicatorNameInfo * -FindIndicatorByName(KeyNamesInfo *info, xkb_atom_t name, - xkb_led_index_t *idx_out) +static LedNameInfo * +FindLedByName(KeyNamesInfo *info, xkb_atom_t name, + xkb_led_index_t *idx_out) { - IndicatorNameInfo *led; + LedNameInfo *ledi; xkb_led_index_t idx; - darray_enumerate(idx, led, info->indicator_names) { - if (led->name == name) { + darray_enumerate(idx, ledi, info->led_names) { + if (ledi->name == name) { *idx_out = idx; - return led; + return ledi; } } @@ -167,22 +158,18 @@ FindIndicatorByName(KeyNamesInfo *info, xkb_atom_t name, } static bool -AddIndicatorName(KeyNamesInfo *info, enum merge_mode merge, - IndicatorNameInfo *new, xkb_led_index_t new_idx) +AddLedName(KeyNamesInfo *info, enum merge_mode merge, bool same_file, + LedNameInfo *new, xkb_led_index_t new_idx) { xkb_led_index_t old_idx; - IndicatorNameInfo *old; - bool replace; - int verbosity = xkb_context_get_log_verbosity(info->ctx); - - replace = (merge == MERGE_REPLACE || merge == MERGE_OVERRIDE); + LedNameInfo *old; + const int verbosity = xkb_context_get_log_verbosity(info->ctx); + const bool report = (same_file && verbosity > 0) || verbosity > 9; + const bool replace = (merge == MERGE_REPLACE || merge == MERGE_OVERRIDE); - /* Inidicator with the same name already exists. */ - old = FindIndicatorByName(info, new->name, &old_idx); + /* LED with the same name already exists. */ + old = FindLedByName(info, new->name, &old_idx); if (old) { - bool report = ((old->file_id == new->file_id && verbosity > 0) || - verbosity > 9); - if (old_idx == new_idx) { log_warn(info->ctx, "Multiple indicators named \"%s\"; " @@ -194,8 +181,8 @@ AddIndicatorName(KeyNamesInfo *info, enum merge_mode merge, if (report) { xkb_led_index_t use = (replace ? new_idx + 1 : old_idx + 1); xkb_led_index_t ignore = (replace ? old_idx + 1 : new_idx + 1); - log_warn(info->ctx, "Multiple indicators named %s; " - "Using %d, ignoring %d\n", + log_warn(info->ctx, + "Multiple indicators named %s; Using %d, ignoring %d\n", xkb_atom_text(info->ctx, new->name), use, ignore); } @@ -205,20 +192,15 @@ AddIndicatorName(KeyNamesInfo *info, enum merge_mode merge, return true; } - if (new_idx >= darray_size(info->indicator_names)) - darray_resize0(info->indicator_names, new_idx + 1); + if (new_idx >= darray_size(info->led_names)) + darray_resize0(info->led_names, new_idx + 1); - /* Inidicator with the same index already exists. */ - old = &darray_item(info->indicator_names, new_idx); + /* LED with the same index already exists. */ + old = &darray_item(info->led_names, new_idx); if (old->name != XKB_ATOM_NONE) { - bool report = ((old->file_id == new->file_id && verbosity > 0) || - verbosity > 9); - - /* Same name case already handled above. */ - if (report) { - xkb_atom_t use = (replace ? new->name : old->name); - xkb_atom_t ignore = (replace ? old->name : new->name); + const xkb_atom_t use = (replace ? new->name : old->name); + const xkb_atom_t ignore = (replace ? old->name : new->name); log_warn(info->ctx, "Multiple names for indicator %d; " "Using %s, ignoring %s\n", new_idx + 1, xkb_atom_text(info->ctx, use), @@ -231,7 +213,7 @@ AddIndicatorName(KeyNamesInfo *info, enum merge_mode merge, return true; } - darray_item(info->indicator_names, new_idx) = *new; + darray_item(info->led_names, new_idx) = *new; return true; } @@ -241,27 +223,24 @@ ClearKeyNamesInfo(KeyNamesInfo *info) free(info->name); darray_free(info->key_names); darray_free(info->aliases); - darray_free(info->indicator_names); + darray_free(info->led_names); } static void -InitKeyNamesInfo(KeyNamesInfo *info, struct xkb_context *ctx, - unsigned file_id) +InitKeyNamesInfo(KeyNamesInfo *info, struct xkb_context *ctx) { memset(info, 0, sizeof(*info)); info->ctx = ctx; - info->merge = MERGE_DEFAULT; - info->file_id = file_id; info->min_key_code = XKB_KEYCODE_MAX; } static xkb_keycode_t -FindKeyByName(KeyNamesInfo * info, xkb_atom_t name) +FindKeyByName(KeyNamesInfo *info, xkb_atom_t name) { xkb_keycode_t i; for (i = info->min_key_code; i <= info->max_key_code; i++) - if (darray_item(info->key_names, i).name == name) + if (darray_item(info->key_names, i) == name) return i; return XKB_KEYCODE_INVALID; @@ -269,11 +248,13 @@ FindKeyByName(KeyNamesInfo * info, xkb_atom_t name) static bool AddKeyName(KeyNamesInfo *info, xkb_keycode_t kc, xkb_atom_t name, - enum merge_mode merge, unsigned file_id, bool report) + enum merge_mode merge, bool same_file, bool report) { - KeyNameInfo *namei; - xkb_keycode_t old; - int verbosity = xkb_context_get_log_verbosity(info->ctx); + xkb_atom_t old_name; + xkb_keycode_t old_kc; + const int verbosity = xkb_context_get_log_verbosity(info->ctx); + + report = report && ((same_file && verbosity > 0) || verbosity > 7); if (kc >= darray_size(info->key_names)) darray_resize0(info->key_names, kc + 1); @@ -281,20 +262,17 @@ AddKeyName(KeyNamesInfo *info, xkb_keycode_t kc, xkb_atom_t name, info->min_key_code = MIN(info->min_key_code, kc); info->max_key_code = MAX(info->max_key_code, kc); - namei = &darray_item(info->key_names, kc); - - report = report && ((verbosity > 0 && file_id == namei->file_id) || - verbosity > 7); - - if (namei->name != 0) { - const char *lname = KeyNameText(info->ctx, namei->name); + /* There's already a key with this keycode. */ + old_name = darray_item(info->key_names, kc); + if (old_name != XKB_ATOM_NONE) { + const char *lname = KeyNameText(info->ctx, old_name); const char *kname = KeyNameText(info->ctx, name); - if (namei->name == name) { + if (old_name == name) { if (report) log_warn(info->ctx, "Multiple identical key name definitions; " - "Later occurences of \"%s = %d\" ignored\n", + "Later occurrences of \"%s = %d\" ignored\n", lname, kc); return true; } @@ -310,80 +288,44 @@ AddKeyName(KeyNamesInfo *info, xkb_keycode_t kc, xkb_atom_t name, log_warn(info->ctx, "Multiple names for keycode %d; " "Using %s, ignoring %s\n", kc, kname, lname); - namei->name = 0; - namei->file_id = 0; + darray_item(info->key_names, kc) = XKB_ATOM_NONE; } } - old = FindKeyByName(info, name); - if (old != XKB_KEYCODE_INVALID && old != kc) { + /* There's already a key with this name. */ + old_kc = FindKeyByName(info, name); + if (old_kc != XKB_KEYCODE_INVALID && old_kc != kc) { const char *kname = KeyNameText(info->ctx, name); if (merge == MERGE_OVERRIDE) { - darray_item(info->key_names, old).name = 0; - darray_item(info->key_names, old).file_id = 0; + darray_item(info->key_names, old_kc) = XKB_ATOM_NONE; if (report) log_warn(info->ctx, "Key name %s assigned to multiple keys; " - "Using %d, ignoring %d\n", kname, kc, old); + "Using %d, ignoring %d\n", kname, kc, old_kc); } else { if (report) log_vrb(info->ctx, 3, "Key name %s assigned to multiple keys; " - "Using %d, ignoring %d\n", kname, old, kc); + "Using %d, ignoring %d\n", kname, old_kc, kc); return true; } } - namei->name = name; - namei->file_id = file_id; + darray_item(info->key_names, kc) = name; return true; } /***====================================================================***/ static int -HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge, - unsigned file_id); - -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, alias->file_id)) - return false; - } - - return true; -} +HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge); static void MergeIncludedKeycodes(KeyNamesInfo *into, KeyNamesInfo *from, enum merge_mode merge) { - xkb_keycode_t i; - xkb_led_index_t idx; - IndicatorNameInfo *led; - if (from->errorCount > 0) { into->errorCount += from->errorCount; return; @@ -394,67 +336,101 @@ 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); + if (name == XKB_ATOM_NONE) + continue; - if (!AddKeyName(into, i, name, merge, from->file_id, false)) - into->errorCount++; + if (!AddKeyName(into, i, name, merge, true, false)) + into->errorCount++; + } } - darray_enumerate(idx, led, from->indicator_names) { - if (led->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; - led->merge = (merge == MERGE_DEFAULT ? led->merge : merge); - if (!AddIndicatorName(into, led->merge, led, idx)) - into->errorCount++; + if (!HandleAliasDef(into, &def, def.merge)) + 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; - if (!MergeAliases(into, from, merge)) - into->errorCount++; + darray_enumerate(idx, ledi, from->led_names) { + if (ledi->name == XKB_ATOM_NONE) + continue; + + ledi->merge = (merge == MERGE_DEFAULT ? ledi->merge : merge); + if (!AddLedName(into, ledi->merge, false, ledi, idx)) + into->errorCount++; + } + } } static void HandleKeycodesFile(KeyNamesInfo *info, XkbFile *file, enum merge_mode merge); static bool -HandleIncludeKeycodes(KeyNamesInfo *info, IncludeStmt *stmt) +HandleIncludeKeycodes(KeyNamesInfo *info, IncludeStmt *include) { - enum merge_mode merge = MERGE_DEFAULT; - XkbFile *rtrn; - KeyNamesInfo included, next_incl; - - InitKeyNamesInfo(&included, info->ctx, info->file_id); - if (stmt->stmt) { - free(included.name); - included.name = stmt->stmt; - stmt->stmt = NULL; - } + KeyNamesInfo included; - for (; stmt; stmt = stmt->next_incl) { - if (!ProcessIncludeFile(info->ctx, stmt, FILE_TYPE_KEYCODES, - &rtrn, &merge)) { + InitKeyNamesInfo(&included, info->ctx); + included.name = include->stmt; + include->stmt = NULL; + + for (IncludeStmt *stmt = include; stmt; stmt = stmt->next_incl) { + KeyNamesInfo next_incl; + XkbFile *file; + + file = ProcessIncludeFile(info->ctx, stmt, FILE_TYPE_KEYCODES); + if (!file) { info->errorCount += 10; ClearKeyNamesInfo(&included); return false; } - InitKeyNamesInfo(&next_incl, info->ctx, rtrn->id); + InitKeyNamesInfo(&next_incl, info->ctx); - HandleKeycodesFile(&next_incl, rtrn, MERGE_OVERRIDE); + HandleKeycodesFile(&next_incl, file, MERGE_OVERRIDE); - MergeIncludedKeycodes(&included, &next_incl, merge); + MergeIncludedKeycodes(&included, &next_incl, stmt->merge); ClearKeyNamesInfo(&next_incl); - FreeXkbFile(rtrn); + FreeXkbFile(file); } - MergeIncludedKeycodes(info, &included, merge); + MergeIncludedKeycodes(info, &included, include->merge); ClearKeyNamesInfo(&included); return (info->errorCount == 0); @@ -477,59 +453,45 @@ HandleKeycodeDef(KeyNamesInfo *info, KeycodeDef *stmt, enum merge_mode merge) return false; } - return AddKeyName(info, stmt->value, stmt->name, merge, - info->file_id, true); + return AddKeyName(info, stmt->value, stmt->name, merge, false, true); } -static void -HandleAliasCollision(KeyNamesInfo *info, AliasInfo *old, AliasInfo *new) +static int +HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge) { - int verbosity = xkb_context_get_log_verbosity(info->ctx); - bool report = ((new->file_id == old->file_id && verbosity > 0) || - verbosity > 9); - - if (new->real == old->real) { - if (report) - log_warn(info->ctx, "Alias of %s for %s declared more than once; " - "First definition ignored\n", - KeyNameText(info->ctx, new->alias), - KeyNameText(info->ctx, new->real)); - } - else { - xkb_atom_t use, ignore; - - use = (new->merge == MERGE_AUGMENT ? old->real : new->real); - ignore = (new->merge == MERGE_AUGMENT ? new->real : old->real); - - if (report) - log_warn(info->ctx, "Multiple definitions for alias %s; " - "Using %s, ignoring %s\n", - KeyNameText(info->ctx, old->alias), - KeyNameText(info->ctx, use), - KeyNameText(info->ctx, ignore)); + AliasInfo *old, new; + + darray_foreach(old, info->aliases) { + if (old->alias == def->alias) { + if (def->real == old->real) { + log_vrb(info->ctx, 1, + "Alias of %s for %s declared more than once; " + "First definition ignored\n", + KeyNameText(info->ctx, def->alias), + KeyNameText(info->ctx, def->real)); + } + else { + xkb_atom_t use, ignore; + + use = (merge == MERGE_AUGMENT ? old->real : def->real); + ignore = (merge == MERGE_AUGMENT ? def->real : old->real); - old->real = use; - } - - old->file_id = new->file_id; - old->merge = new->merge; -} + log_warn(info->ctx, + "Multiple definitions for alias %s; " + "Using %s, ignoring %s\n", + KeyNameText(info->ctx, old->alias), + KeyNameText(info->ctx, use), + KeyNameText(info->ctx, ignore)); -static int -HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge, - unsigned file_id) -{ - AliasInfo *alias, new; + old->real = use; + } - darray_foreach(alias, info->aliases) { - if (alias->alias == def->alias) { - InitAliasInfo(&new, merge, file_id, def->alias, def->real); - HandleAliasCollision(info, alias, &new); + old->merge = merge; return true; } } - InitAliasInfo(&new, merge, file_id, def->alias, def->real); + InitAliasInfo(&new, merge, def->alias, def->real); darray_append(info->aliases, new); return true; } @@ -551,7 +513,7 @@ HandleKeyNameVar(KeyNamesInfo *info, VarDef *stmt) if (!istreq(field, "minimum") && !istreq(field, "maximum")) { log_err(info->ctx, "Unknown field encountered; " - "Assigment to field %s ignored\n", field); + "Assignment to field %s ignored\n", field); return false; } @@ -560,10 +522,10 @@ HandleKeyNameVar(KeyNamesInfo *info, VarDef *stmt) } static int -HandleIndicatorNameDef(KeyNamesInfo *info, IndicatorNameDef *def, - enum merge_mode merge) +HandleLedNameDef(KeyNamesInfo *info, LedNameDef *def, + enum merge_mode merge) { - IndicatorNameInfo ii; + LedNameInfo ledi; xkb_atom_t name; if (def->ndx < 1 || def->ndx > XKB_MAX_LEDS) { @@ -578,26 +540,23 @@ HandleIndicatorNameDef(KeyNamesInfo *info, IndicatorNameDef *def, char buf[20]; snprintf(buf, sizeof(buf), "%d", def->ndx); info->errorCount++; - return ReportBadType(info->ctx, "indicator", "name", buf, - "string"); + return ReportBadType(info->ctx, "indicator", "name", buf, "string"); } - ii.merge = info->merge; - ii.file_id = info->file_id; - ii.name = name; - return AddIndicatorName(info, merge, &ii, def->ndx - 1); + ledi.merge = merge; + ledi.name = name; + return AddLedName(info, merge, true, &ledi, def->ndx - 1); } static void HandleKeycodesFile(KeyNamesInfo *info, XkbFile *file, enum merge_mode merge) { - ParseCommon *stmt; bool ok; free(info->name); info->name = strdup_safe(file->name); - for (stmt = file->defs; stmt; stmt = stmt->next) { + for (ParseCommon *stmt = file->defs; stmt; stmt = stmt->next) { switch (stmt->type) { case STMT_INCLUDE: ok = HandleIncludeKeycodes(info, (IncludeStmt *) stmt); @@ -606,15 +565,13 @@ HandleKeycodesFile(KeyNamesInfo *info, XkbFile *file, enum merge_mode merge) ok = HandleKeycodeDef(info, (KeycodeDef *) stmt, merge); break; case STMT_ALIAS: - ok = HandleAliasDef(info, (KeyAliasDef *) stmt, merge, - info->file_id); + ok = HandleAliasDef(info, (KeyAliasDef *) stmt, merge); break; case STMT_VAR: ok = HandleKeyNameVar(info, (VarDef *) stmt); break; - case STMT_INDICATOR_NAME: - ok = HandleIndicatorNameDef(info, (IndicatorNameDef *) stmt, - merge); + case STMT_LED_NAME: + ok = HandleLedNameDef(info, (LedNameDef *) stmt, merge); break; default: log_err(info->ctx, @@ -635,101 +592,89 @@ HandleKeycodesFile(KeyNamesInfo *info, XkbFile *file, enum merge_mode merge) } } -static void -ApplyAliases(KeyNamesInfo *info, struct xkb_keymap *keymap) +/***====================================================================***/ + +static bool +CopyKeyNamesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) { - struct xkb_key *key; - struct xkb_key_alias *a, new; + xkb_keycode_t kc; + xkb_led_index_t idx; + LedNameInfo *ledi; AliasInfo *alias; + unsigned i; + + keymap->keycodes_section_name = strdup_safe(info->name); + + keymap->min_key_code = info->min_key_code; + keymap->max_key_code = info->max_key_code; + + /* Copy key names. */ + keymap->keys = calloc(info->max_key_code + 1, sizeof(*keymap->keys)); + for (kc = info->min_key_code; kc <= info->max_key_code; kc++) { + keymap->keys[kc].keycode = kc; + keymap->keys[kc].name = darray_item(info->key_names, kc); + } + /* + * Do some sanity checking on the aliases. We can't do it before + * because keys and their aliases may be added out-of-order. + */ + keymap->num_key_aliases = 0; darray_foreach(alias, info->aliases) { /* Check that ->real is a key. */ - key = FindNamedKey(keymap, alias->real, false); - if (!key) { + if (!XkbKeyByName(keymap, alias->real, false)) { log_vrb(info->ctx, 5, "Attempt to alias %s to non-existent key %s; Ignored\n", KeyNameText(info->ctx, alias->alias), KeyNameText(info->ctx, alias->real)); + alias->real = XKB_ATOM_NONE; continue; } /* Check that ->alias is not a key. */ - key = FindNamedKey(keymap, alias->alias, false); - if (key) { + if (XkbKeyByName(keymap, alias->alias, false)) { log_vrb(info->ctx, 5, "Attempt to create alias with the name of a real key; " "Alias \"%s = %s\" ignored\n", KeyNameText(info->ctx, alias->alias), KeyNameText(info->ctx, alias->real)); + alias->real = XKB_ATOM_NONE; continue; } - /* Check that ->alias in not already an alias, and if so handle it. */ - darray_foreach(a, keymap->key_aliases) { - AliasInfo old_alias; - - if (a->alias != alias->alias) - continue; - - InitAliasInfo(&old_alias, MERGE_AUGMENT, 0, a->alias, a->real); - HandleAliasCollision(info, &old_alias, alias); - a->alias = old_alias.alias; - a->real = old_alias.real; - alias->alias = 0; - } - if (alias->alias == 0) - continue; - - /* Add the alias. */ - new.alias = alias->alias; - new.real = alias->real; - darray_append(keymap->key_aliases, new); + keymap->num_key_aliases++; } - darray_free(info->aliases); -} - -static bool -CopyKeyNamesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) -{ - xkb_keycode_t kc; - xkb_led_index_t idx; - IndicatorNameInfo *led; - - 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; - - for (kc = info->min_key_code; kc <= info->max_key_code; kc++) { - keymap->keys[kc].keycode = kc; - keymap->keys[kc].name = darray_item(info->key_names, kc).name; - } - - keymap->keycodes_section_name = strdup_safe(info->name); - - darray_resize0(keymap->indicators, darray_size(info->indicator_names)); - darray_enumerate(idx, led, info->indicator_names) { - if (led->name == XKB_ATOM_NONE) - continue; - - darray_item(keymap->indicators, idx).name = led->name; + /* Copy key aliases. */ + keymap->key_aliases = calloc(keymap->num_key_aliases, + sizeof(*keymap->key_aliases)); + i = 0; + darray_foreach(alias, info->aliases) { + if (alias->real != XKB_ATOM_NONE) { + keymap->key_aliases[i].alias = alias->alias; + keymap->key_aliases[i].real = alias->real; + i++; + } } - ApplyAliases(info, keymap); + /* Copy LED names. */ + darray_resize0(keymap->leds, darray_size(info->led_names)); + darray_enumerate(idx, ledi, info->led_names) + if (ledi->name != XKB_ATOM_NONE) + darray_item(keymap->leds, idx).name = ledi->name; return true; } +/***====================================================================***/ + bool CompileKeycodes(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge) { KeyNamesInfo info; - InitKeyNamesInfo(&info, keymap->ctx, file->id); + InitKeyNamesInfo(&info, keymap->ctx); HandleKeycodesFile(&info, file, merge); if (info.errorCount != 0) @@ -745,37 +690,3 @@ err_info: ClearKeyNamesInfo(&info); return false; } - -struct xkb_key * -FindNamedKey(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases) -{ - struct xkb_key *key; - - xkb_foreach_key(key, keymap) - if (key->name == name) - return key; - - if (use_aliases) { - xkb_atom_t new_name; - if (FindKeyNameForAlias(keymap, name, &new_name)) - return FindNamedKey(keymap, new_name, false); - } - - return NULL; -} - -bool -FindKeyNameForAlias(struct xkb_keymap *keymap, xkb_atom_t name, - xkb_atom_t *real_name) -{ - struct xkb_key_alias *a; - - darray_foreach(a, keymap->key_aliases) { - if (name == a->alias) { - *real_name = a->real; - return true; - } - } - - return false; -} |