summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/keymap-priv.c2
-rw-r--r--src/keymap.h2
-rw-r--r--src/xkbcomp/symbols.c68
3 files changed, 40 insertions, 32 deletions
diff --git a/src/keymap-priv.c b/src/keymap-priv.c
index 2dd2e7b..15d2534 100644
--- a/src/keymap-priv.c
+++ b/src/keymap-priv.c
@@ -90,7 +90,7 @@ XkbKeyByName(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases)
}
xkb_atom_t
-XkbResolveKeyAlias(struct xkb_keymap *keymap, xkb_atom_t name)
+XkbResolveKeyAlias(const struct xkb_keymap *keymap, xkb_atom_t name)
{
for (unsigned i = 0; i < keymap->num_key_aliases; i++)
if (keymap->key_aliases[i].alias == name)
diff --git a/src/keymap.h b/src/keymap.h
index 76c4923..71d5ca0 100644
--- a/src/keymap.h
+++ b/src/keymap.h
@@ -425,7 +425,7 @@ struct xkb_key *
XkbKeyByName(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases);
xkb_atom_t
-XkbResolveKeyAlias(struct xkb_keymap *keymap, xkb_atom_t name);
+XkbResolveKeyAlias(const struct xkb_keymap *keymap, xkb_atom_t name);
void
XkbEscapeMapName(char *name);
diff --git a/src/xkbcomp/symbols.c b/src/xkbcomp/symbols.c
index f259c74..dd9af4a 100644
--- a/src/xkbcomp/symbols.c
+++ b/src/xkbcomp/symbols.c
@@ -177,14 +177,16 @@ typedef struct {
ActionsInfo *actions;
darray(xkb_atom_t) group_names;
darray(ModMapEntry) modmaps;
+ struct xkb_mod_set mods;
struct xkb_context *ctx;
- struct xkb_keymap *keymap;
+ /* Needed for AddKeySymbols. */
+ const struct xkb_keymap *keymap;
} SymbolsInfo;
static void
-InitSymbolsInfo(SymbolsInfo *info, struct xkb_keymap *keymap,
- ActionsInfo *actions)
+InitSymbolsInfo(SymbolsInfo *info, const struct xkb_keymap *keymap,
+ ActionsInfo *actions, const struct xkb_mod_set *mods)
{
memset(info, 0, sizeof(*info));
info->ctx = keymap->ctx;
@@ -192,6 +194,7 @@ InitSymbolsInfo(SymbolsInfo *info, struct xkb_keymap *keymap,
info->merge = MERGE_OVERRIDE;
InitKeyInfo(keymap->ctx, &info->default_key);
info->actions = actions;
+ CopyModSet(&info->mods, mods);
info->explicit_group = XKB_LAYOUT_INVALID;
}
@@ -200,6 +203,7 @@ ClearSymbolsInfo(SymbolsInfo *info)
{
KeyInfo *keyi;
free(info->name);
+ ClearModSet(&info->mods);
darray_foreach(keyi, info->keys)
ClearKeyInfo(keyi);
darray_free(info->keys);
@@ -407,6 +411,7 @@ MergeKeys(SymbolsInfo *info, KeyInfo *into, KeyInfo *from, bool same_file)
return true;
}
+/* TODO: Make it so this function doesn't need the entire keymap. */
static bool
AddKeySymbols(SymbolsInfo *info, KeyInfo *keyi, bool same_file)
{
@@ -457,15 +462,15 @@ AddModMapEntry(SymbolsInfo *info, ModMapEntry *new)
"Symbol \"%s\" added to modifier map for multiple modifiers; "
"Using %s, ignoring %s\n",
KeysymText(info->ctx, new->u.keySym),
- ModIndexText(info->ctx, &info->keymap->mods, use),
- ModIndexText(info->ctx, &info->keymap->mods, ignore));
+ ModIndexText(info->ctx, &info->mods, use),
+ ModIndexText(info->ctx, &info->mods, ignore));
else
log_err(info->ctx,
"Key \"%s\" added to modifier map for multiple modifiers; "
"Using %s, ignoring %s\n",
KeyNameText(info->ctx, new->u.keyName),
- ModIndexText(info->ctx, &info->keymap->mods, use),
- ModIndexText(info->ctx, &info->keymap->mods, ignore));
+ ModIndexText(info->ctx, &info->mods, use),
+ ModIndexText(info->ctx, &info->mods, ignore));
old->modifier = use;
return true;
@@ -491,6 +496,8 @@ MergeIncludedSymbols(SymbolsInfo *into, SymbolsInfo *from,
return;
}
+ MoveModSet(&into->mods, &from->mods);
+
if (into->name == NULL) {
into->name = from->name;
from->name = NULL;
@@ -544,7 +551,7 @@ HandleIncludeSymbols(SymbolsInfo *info, IncludeStmt *include)
{
SymbolsInfo included;
- InitSymbolsInfo(&included, info->keymap, info->actions);
+ InitSymbolsInfo(&included, info->keymap, info->actions, &info->mods);
included.name = include->stmt;
include->stmt = NULL;
@@ -559,7 +566,8 @@ HandleIncludeSymbols(SymbolsInfo *info, IncludeStmt *include)
return false;
}
- InitSymbolsInfo(&next_incl, info->keymap, info->actions);
+ InitSymbolsInfo(&next_incl, info->keymap, info->actions,
+ &included.mods);
if (stmt->modifier) {
next_incl.explicit_group = atoi(stmt->modifier) - 1;
if (next_incl.explicit_group >= XKB_MAX_GROUPS) {
@@ -754,8 +762,7 @@ AddActionsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx,
for (unsigned i = 0; i < nActs; i++) {
union xkb_action *toAct = &darray_item(groupi->levels, i).action;
- if (!HandleActionDef(info->ctx, info->actions, &info->keymap->mods,
- act, toAct))
+ if (!HandleActionDef(info->ctx, info->actions, &info->mods, act, toAct))
log_err(info->ctx,
"Illegal action definition for %s; "
"Action for group %u/level %u ignored\n",
@@ -823,8 +830,8 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field,
istreq(field, "virtualmodifiers")) {
xkb_mod_mask_t mask;
- if (!ExprResolveModMask(info->ctx, value, MOD_VIRT,
- &info->keymap->mods, &mask)) {
+ if (!ExprResolveModMask(info->ctx, value, MOD_VIRT, &info->mods,
+ &mask)) {
log_err(info->ctx,
"Expected a virtual modifier mask, found %s; "
"Ignoring virtual modifiers definition for key %s\n",
@@ -1025,7 +1032,7 @@ HandleGlobalVar(SymbolsInfo *info, VarDef *stmt)
ret = true;
}
else {
- ret = SetActionField(info->ctx, info->actions, &info->keymap->mods,
+ ret = SetActionField(info->ctx, info->actions, &info->mods,
elem, field, arrayNdx, stmt->value);
}
@@ -1141,7 +1148,7 @@ HandleModMapDef(SymbolsInfo *info, ModMapDef *def)
bool ok;
struct xkb_context *ctx = info->ctx;
- ndx = XkbModNameToIndex(&info->keymap->mods, def->modifier, MOD_REAL);
+ ndx = XkbModNameToIndex(&info->mods, def->modifier, MOD_REAL);
if (ndx == XKB_MOD_INVALID) {
log_err(info->ctx,
"Illegal modifier map definition; "
@@ -1170,7 +1177,7 @@ HandleModMapDef(SymbolsInfo *info, ModMapDef *def)
log_err(info->ctx,
"Modmap entries may contain only key names or keysyms; "
"Illegal definition for %s modifier ignored\n",
- ModIndexText(info->ctx, &info->keymap->mods, tmp.modifier));
+ ModIndexText(info->ctx, &info->mods, tmp.modifier));
continue;
}
@@ -1199,8 +1206,7 @@ HandleSymbolsFile(SymbolsInfo *info, XkbFile *file, enum merge_mode merge)
ok = HandleGlobalVar(info, (VarDef *) stmt);
break;
case STMT_VMOD:
- ok = HandleVModDef(info->ctx, &info->keymap->mods,
- (VModDef *) stmt, merge);
+ ok = HandleVModDef(info->ctx, &info->mods, (VModDef *) stmt, merge);
break;
case STMT_MODMAP:
ok = HandleModMapDef(info, (ModMapDef *) stmt);
@@ -1389,9 +1395,9 @@ use_default:
}
static bool
-CopySymbolsDef(SymbolsInfo *info, KeyInfo *keyi)
+CopySymbolsDefToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info,
+ KeyInfo *keyi)
{
- struct xkb_keymap *keymap = info->keymap;
struct xkb_key *key;
GroupInfo *groupi;
const GroupInfo *group0;
@@ -1492,10 +1498,10 @@ CopySymbolsDef(SymbolsInfo *info, KeyInfo *keyi)
}
static bool
-CopyModMapDef(SymbolsInfo *info, ModMapEntry *entry)
+CopyModMapDefToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info,
+ ModMapEntry *entry)
{
struct xkb_key *key;
- struct xkb_keymap *keymap = info->keymap;
if (!entry->haveSymbol) {
key = XkbKeyByName(keymap, entry->u.keyName, true);
@@ -1503,8 +1509,8 @@ CopyModMapDef(SymbolsInfo *info, ModMapEntry *entry)
log_vrb(info->ctx, 5,
"Key %s not found in keycodes; "
"Modifier map entry for %s not updated\n",
- KeyNameText(keymap->ctx, entry->u.keyName),
- ModIndexText(info->ctx, &info->keymap->mods, entry->modifier));
+ KeyNameText(info->ctx, entry->u.keyName),
+ ModIndexText(info->ctx, &info->mods, entry->modifier));
return false;
}
}
@@ -1515,7 +1521,7 @@ CopyModMapDef(SymbolsInfo *info, ModMapEntry *entry)
"Key \"%s\" not found in symbol map; "
"Modifier map entry for %s not updated\n",
KeysymText(info->ctx, entry->u.keySym),
- ModIndexText(info->ctx, &info->keymap->mods, entry->modifier));
+ ModIndexText(info->ctx, &info->mods, entry->modifier));
return false;
}
}
@@ -1533,12 +1539,14 @@ CopySymbolsToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info)
keymap->symbols_section_name = strdup_safe(info->name);
XkbEscapeMapName(keymap->symbols_section_name);
+ MoveModSet(&keymap->mods, &info->mods);
+
keymap->num_group_names = darray_size(info->group_names);
keymap->group_names = darray_mem(info->group_names, 0);
darray_init(info->group_names);
darray_foreach(keyi, info->keys)
- if (!CopySymbolsDef(info, keyi))
+ if (!CopySymbolsDefToKeymap(keymap, info, keyi))
info->errorCount++;
if (xkb_context_get_log_verbosity(keymap->ctx) > 3) {
@@ -1549,14 +1557,14 @@ CopySymbolsToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info)
continue;
if (key->num_groups < 1)
- log_info(keymap->ctx,
+ log_info(info->ctx,
"No symbols defined for %s\n",
- KeyNameText(keymap->ctx, key->name));
+ KeyNameText(info->ctx, key->name));
}
}
darray_foreach(mm, info->modmaps)
- if (!CopyModMapDef(info, mm))
+ if (!CopyModMapDefToKeymap(keymap, info, mm))
info->errorCount++;
/* XXX: If we don't ignore errorCount, things break. */
@@ -1574,7 +1582,7 @@ CompileSymbols(XkbFile *file, struct xkb_keymap *keymap,
if (!actions)
return false;
- InitSymbolsInfo(&info, keymap, actions);
+ InitSymbolsInfo(&info, keymap, actions, &keymap->mods);
info.default_key.merge = merge;
HandleSymbolsFile(&info, file, merge);