}
}
- if (!ExprResolveVModMask(keymap, value, mods_rtrn))
+ if (!ExprResolveModMask(keymap, value, MOD_BOTH, mods_rtrn))
return ReportMismatch(keymap, action,
ACTION_FIELD_MODIFIERS, "modifier mask");
}
}
- return ExprResolveModMask(info->keymap, expr, mods_rtrn);
+ return ExprResolveModMask(info->keymap, expr, MOD_REAL, mods_rtrn);
}
/***====================================================================***/
if (arrayNdx)
return ReportSINotArray(info, si, field);
- if (!ExprResolveVMod(keymap, value, &ndx))
+ if (!ExprResolveMod(keymap, value, MOD_VIRT, &ndx))
return ReportSIBadType(info, si, field, "virtual modifier");
si->interp.virtual_mod = ndx;
if (arrayNdx)
return ReportIndicatorNotArray(info, led, field);
- if (!ExprResolveVModMask(keymap, value, &led->im.mods.mods))
+ if (!ExprResolveModMask(keymap, value, MOD_BOTH, &led->im.mods.mods))
return ReportIndicatorBadType(info, led, field, "modifier mask");
led->defined |= LED_FIELD_MODS;
return false;
}
+/* Data passed in the *priv argument for LookupModMask. */
+typedef struct {
+ const struct xkb_keymap *keymap;
+ enum mod_type mod_type;
+} LookupModMaskPriv;
+
static bool
-lookup_mod_mask(struct xkb_context *ctx, const void *priv, xkb_atom_t field,
- enum expr_value_type type, enum mod_type mod_type,
- xkb_mod_mask_t *val_rtrn)
+LookupModMask(struct xkb_context *ctx, const void *priv, xkb_atom_t field,
+ enum expr_value_type type, xkb_mod_mask_t *val_rtrn)
{
const char *str;
xkb_mod_index_t ndx;
- const struct xkb_keymap *keymap = priv;
+ const LookupModMaskPriv *arg = priv;
+ const struct xkb_keymap *keymap = arg->keymap;
+ enum mod_type mod_type = arg->mod_type;
if (type != EXPR_TYPE_INT)
return false;
return true;
}
-static bool
-LookupModMask(struct xkb_context *ctx, const void *priv, xkb_atom_t field,
- enum expr_value_type type, xkb_mod_mask_t *val_rtrn)
-{
- return lookup_mod_mask(ctx, priv, field, type, MOD_REAL, val_rtrn);
-}
-
-static bool
-LookupVModMask(struct xkb_context *ctx, const void *priv, xkb_atom_t field,
- enum expr_value_type type, xkb_mod_mask_t *val_rtrn)
-{
- return lookup_mod_mask(ctx, priv, field, type, MOD_BOTH, val_rtrn);
-}
-
bool
ExprResolveBoolean(struct xkb_context *ctx, const ExprDef *expr,
bool *set_rtrn)
bool
ExprResolveModMask(struct xkb_keymap *keymap, const ExprDef *expr,
- xkb_mod_mask_t *mask_rtrn)
+ enum mod_type mod_type, xkb_mod_mask_t *mask_rtrn)
{
+ LookupModMaskPriv priv = { .keymap = keymap, .mod_type = mod_type };
return ExprResolveMaskLookup(keymap->ctx, expr, mask_rtrn, LookupModMask,
- keymap);
-}
-
-bool
-ExprResolveVModMask(struct xkb_keymap *keymap, const ExprDef *expr,
- xkb_mod_mask_t *mask_rtrn)
-{
- return ExprResolveMaskLookup(keymap->ctx, expr, mask_rtrn, LookupVModMask,
- keymap);
+ &priv);
}
bool
}
bool
-ExprResolveVMod(struct xkb_keymap *keymap, const ExprDef *def,
- xkb_mod_index_t *ndx_rtrn)
+ExprResolveMod(struct xkb_keymap *keymap, const ExprDef *def,
+ enum mod_type mod_type, xkb_mod_index_t *ndx_rtrn)
{
xkb_mod_index_t ndx;
xkb_atom_t name = def->value.str;
return false;
}
- ndx = ModNameToIndex(keymap, name, MOD_VIRT);
+ ndx = ModNameToIndex(keymap, name, mod_type);
if (ndx == XKB_MOD_INVALID) {
log_err(keymap->ctx,
"Cannot resolve virtual modifier: "
bool
ExprResolveModMask(struct xkb_keymap *keymap, const ExprDef *expr,
- xkb_mod_mask_t *mask_rtrn);
+ enum mod_type mod_type, xkb_mod_mask_t *mask_rtrn);
bool
-ExprResolveVModMask(struct xkb_keymap *keymap, const ExprDef *expr,
- xkb_mod_mask_t *mask_rtrn);
-
-bool
-ExprResolveVMod(struct xkb_keymap *keymap, const ExprDef *def,
- xkb_mod_index_t *ndx_rtrn);
+ExprResolveMod(struct xkb_keymap *keymap, const ExprDef *def,
+ enum mod_type mod_type, xkb_mod_index_t *ndx_rtrn);
bool
ExprResolveBoolean(struct xkb_context *ctx, const ExprDef *expr,
istreq(field, "virtualmodifiers")) {
xkb_mod_mask_t mask;
- ok = ExprResolveVModMask(info->keymap, value, &mask);
+ ok = ExprResolveModMask(info->keymap, value, MOD_VIRT, &mask);
if (ok) {
- keyi->vmodmap = mask & (~0xff);
+ keyi->vmodmap = mask;
keyi->defined |= KEY_FIELD_VMODMAP;
}
else {
"The modifiers field of a key type is not an array; "
"Illegal array subscript ignored\n");
- if (!ExprResolveVModMask(info->keymap, value, &mods)) {
+ if (!ExprResolveModMask(info->keymap, value, MOD_BOTH, &mods)) {
log_err(info->keymap->ctx,
"Key type mask field must be a modifier mask; "
"Key type definition ignored\n");
if (arrayNdx == NULL)
return ReportTypeShouldBeArray(info, type, "map entry");
- if (!ExprResolveVModMask(info->keymap, arrayNdx, &entry.mods.mods))
+ if (!ExprResolveModMask(info->keymap, arrayNdx, MOD_BOTH, &entry.mods.mods))
return ReportTypeBadType(info, type, "map entry", "modifier mask");
if (entry.mods.mods & (~type->mods)) {
if (arrayNdx == NULL)
return ReportTypeShouldBeArray(info, type, "preserve entry");
- if (!ExprResolveVModMask(info->keymap, arrayNdx, &mods))
+ if (!ExprResolveModMask(info->keymap, arrayNdx, MOD_BOTH, &mods))
return ReportTypeBadType(info, type, "preserve entry",
"modifier mask");
TypeTxt(info, type), before, after);
}
- if (!ExprResolveVModMask(info->keymap, value, &preserve_mods)) {
+ if (!ExprResolveModMask(info->keymap, value, MOD_BOTH, &preserve_mods)) {
log_err(info->keymap->ctx,
"Preserve value in a key type is not a modifier mask; "
"Ignoring preserve[%s] in type %s\n",