* Ran Benita <ran234@gmail.com>
*/
+#include "config.h"
+
#include "xkbcomp-priv.h"
#include "text.h"
#include "expr.h"
typedef struct {
enum merge_mode merge;
bool haveSymbol;
+ // NOTE: Can also be XKB_MOD_NONE, meaning
+ // “don’t add a modifier to the modmap”.
xkb_mod_index_t modifier;
union {
xkb_atom_t keyName;
}
static bool
-LevelsSameSyms(const struct xkb_level *a, const struct xkb_level *b)
-{
- if (a->num_syms != b->num_syms)
- return false;
- if (a->num_syms <= 1)
- return a->u.sym == b->u.sym;
- else
- return memcmp(a->u.syms, b->u.syms,
- sizeof(*a->u.syms) * a->num_syms) == 0;
-
-}
-
-static bool
MergeGroups(SymbolsInfo *info, GroupInfo *into, GroupInfo *from, bool clobber,
bool report, xkb_layout_index_t group, xkb_atom_t key_name)
{
/* First find the type of the merged group. */
if (into->type != from->type) {
if (from->type == XKB_ATOM_NONE) {
+ /* it's empty for consistency with other comparisons */
}
else if (into->type == XKB_ATOM_NONE) {
into->type = from->type;
struct xkb_level *fromLevel = &darray_item(from->levels, i);
if (fromLevel->action.type == ACTION_TYPE_NONE) {
+ /* it's empty for consistency with other comparisons */
}
else if (intoLevel->action.type == ACTION_TYPE_NONE) {
intoLevel->action = fromLevel->action;
}
if (fromLevel->num_syms == 0) {
+ /* it's empty for consistency with other comparisons */
}
else if (intoLevel->num_syms == 0) {
intoLevel->num_syms = fromLevel->num_syms;
intoLevel->u.sym = fromLevel->u.sym;
fromLevel->num_syms = 0;
}
- else if (!LevelsSameSyms(fromLevel, intoLevel)) {
+ else if (!XkbLevelsSameSyms(fromLevel, intoLevel)) {
if (report)
log_warn(info->ctx,
"Multiple symbols for level %d/group %u on key %s; "
ignore = (clobber ? old->modifier : new->modifier);
if (new->haveSymbol)
- log_err(info->ctx,
- "Symbol \"%s\" added to modifier map for multiple modifiers; "
- "Using %s, ignoring %s\n",
- KeysymText(info->ctx, new->u.keySym),
- ModIndexText(info->ctx, &info->mods, use),
- ModIndexText(info->ctx, &info->mods, ignore));
+ log_warn(info->ctx,
+ "Symbol \"%s\" added to modifier map for multiple modifiers; "
+ "Using %s, ignoring %s\n",
+ KeysymText(info->ctx, new->u.keySym),
+ 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->mods, use),
- ModIndexText(info->ctx, &info->mods, ignore));
+ log_warn(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->mods, use),
+ ModIndexText(info->ctx, &info->mods, ignore));
old->modifier = use;
return true;
MergeIncludedSymbols(SymbolsInfo *into, SymbolsInfo *from,
enum merge_mode merge)
{
- KeyInfo *keyi;
- ModMapEntry *mm;
xkb_atom_t *group_name;
xkb_layout_index_t group_names_in_both;
darray_init(from->keys);
}
else {
+ KeyInfo *keyi;
darray_foreach(keyi, from->keys) {
keyi->merge = (merge == MERGE_DEFAULT ? keyi->merge : merge);
if (!AddKeySymbols(into, keyi, false))
darray_init(from->modmaps);
}
else {
+ ModMapEntry *mm;
darray_foreach(mm, from->modmaps) {
mm->merge = (merge == MERGE_DEFAULT ? mm->merge : merge);
if (!AddModMapEntry(into, mm))
}
nActs = 0;
- for (act = value->unary.child; act; act = (ExprDef *) act->common.next)
+ for (act = value->actions.actions; act; act = (ExprDef *) act->common.next)
nActs++;
if (darray_size(groupi->levels) < nActs)
groupi->defined |= GROUP_FIELD_ACTS;
- act = value->unary.child;
+ act = value->actions.actions;
for (unsigned i = 0; i < nActs; i++) {
union xkb_action *toAct = &darray_item(groupi->levels, i).action;
xkb_mod_index_t ndx;
bool ok;
struct xkb_context *ctx = info->ctx;
-
- ndx = XkbModNameToIndex(&info->mods, def->modifier, MOD_REAL);
- if (ndx == XKB_MOD_INVALID) {
- log_err(info->ctx,
- "Illegal modifier map definition; "
- "Ignoring map for non-modifier \"%s\"\n",
- xkb_atom_text(ctx, def->modifier));
- return false;
+ const char *modifier_name = xkb_atom_text(ctx, def->modifier);
+
+ if (istreq(modifier_name, "none")) {
+ // Handle special "None" entry
+ ndx = XKB_MOD_NONE;
+ } else {
+ // Handle normal entry
+ ndx = XkbModNameToIndex(&info->mods, def->modifier, MOD_REAL);
+ if (ndx == XKB_MOD_INVALID) {
+ log_err(info->ctx,
+ "Illegal modifier map definition; "
+ "Ignoring map for non-modifier \"%s\"\n",
+ xkb_atom_text(ctx, def->modifier));
+ return false;
+ }
}
ok = true;
if (info->errorCount > 10) {
log_err(info->ctx, "Abandoning symbols file \"%s\"\n",
- file->topName);
+ file->name);
break;
}
}
{
struct xkb_key *key;
xkb_layout_index_t group;
- xkb_level_index_t level;
bool got_one_group, got_one_level;
group = 0;
do {
+ xkb_level_index_t level = 0;
got_one_group = false;
- level = 0;
do {
got_one_level = false;
xkb_keys_foreach(key, keymap) {
static xkb_atom_t
FindAutomaticType(struct xkb_context *ctx, GroupInfo *groupi)
{
- xkb_keysym_t sym0, sym1, sym2, sym3;
- xkb_level_index_t width = darray_size(groupi->levels);
+ xkb_keysym_t sym0, sym1;
+ const xkb_level_index_t width = darray_size(groupi->levels);
#define GET_SYM(level) \
(darray_item(groupi->levels, level).num_syms == 0 ? \
if (width <= 4) {
if (xkb_keysym_is_lower(sym0) && xkb_keysym_is_upper(sym1)) {
+ xkb_keysym_t sym2, sym3;
sym2 = GET_SYM(2);
sym3 = (width == 4 ? GET_SYM(3) : XKB_KEY_NoSymbol);
}
}
- key->modmap |= (1u << entry->modifier);
+ // Handle modMap None
+ if (entry->modifier != XKB_MOD_NONE) {
+ // Convert modifier index to modifier mask
+ key->modmap |= (1u << entry->modifier);
+ }
+
return true;
}