Signed-off-by: Ran Benita <ran234@gmail.com>
ExprResolveLevel(struct xkb_context *ctx, ExprDef *expr,
ExprResolveLevel(struct xkb_context *ctx, ExprDef *expr,
+ unsigned int *level_rtrn)
+ bool ok;
+ ExprResult result;
static const LookupEntry level_names[] = {
{ "level1", 1 },
{ "level2", 2 },
static const LookupEntry level_names[] = {
{ "level1", 1 },
{ "level2", 2 },
- ret = ExprResolveIntegerLookup(ctx, expr, val_rtrn, SimpleLookup,
- level_names);
- if (ret == false)
- return ret;
+ ok = ExprResolveIntegerLookup(ctx, expr, &result, SimpleLookup,
+ level_names);
+ if (!ok)
+ return false;
- if (val_rtrn->ival < 1 || val_rtrn->ival > XkbMaxShiftLevel) {
+ if (result.uval < 1 || result.uval > XkbMaxShiftLevel) {
log_err(ctx, "Shift level %d is out of range (1..%d)\n",
log_err(ctx, "Shift level %d is out of range (1..%d)\n",
- val_rtrn->ival, XkbMaxShiftLevel);
+ result.uval, XkbMaxShiftLevel);
+ *level_rtrn = result.uval;
ExprResolveInteger(struct xkb_context *ctx, ExprDef *expr,
ExprResult *val_rtrn);
ExprResolveInteger(struct xkb_context *ctx, ExprDef *expr,
ExprResult *val_rtrn);
-extern int
-ExprResolveLevel(struct xkb_context *ctx, ExprDef *expr, ExprResult *val_rtrn);
+bool
+ExprResolveLevel(struct xkb_context *ctx, ExprDef *expr,
+ unsigned int *level_rtrn);
bool
ExprResolveGroup(struct xkb_context *ctx, ExprDef *expr,
bool
ExprResolveGroup(struct xkb_context *ctx, ExprDef *expr,
ExprDef *value)
{
ExprResult rtrn;
ExprDef *value)
{
ExprResult rtrn;
struct xkb_kt_map_entry entry;
if (arrayNdx == NULL)
struct xkb_kt_map_entry entry;
if (arrayNdx == NULL)
entry.mods.vmods &= type->vmask;
}
entry.mods.vmods &= type->vmask;
}
- if (!ExprResolveLevel(info->keymap->ctx, value, &rtrn)) {
+ if (!ExprResolveLevel(info->keymap->ctx, value, &level)) {
log_err(info->keymap->ctx,
"Level specifications in a key type must be integer; "
"Ignoring malformed level specification\n");
return false;
}
log_err(info->keymap->ctx,
"Level specifications in a key type must be integer; "
"Ignoring malformed level specification\n");
return false;
}
- entry.level = rtrn.ival - 1;
+ /* level is always >= 1 */
+ entry.level = level - 1;
return AddMapEntry(info, type, &entry, true, true);
}
return AddMapEntry(info, type, &entry, true, true);
}
SetLevelName(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
ExprDef *value)
{
SetLevelName(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
ExprDef *value)
{
unsigned level;
xkb_atom_t level_name;
struct xkb_context *ctx = info->keymap->ctx;
unsigned level;
xkb_atom_t level_name;
struct xkb_context *ctx = info->keymap->ctx;
if (arrayNdx == NULL)
return ReportTypeShouldBeArray(info, type, "level name");
if (arrayNdx == NULL)
return ReportTypeShouldBeArray(info, type, "level name");
- if (!ExprResolveLevel(ctx, arrayNdx, &rtrn))
+ if (!ExprResolveLevel(ctx, arrayNdx, &level))
return ReportTypeBadType(info, type, "level name", "integer");
return ReportTypeBadType(info, type, "level name", "integer");
if (!ExprResolveString(ctx, value, &str)) {
log_err(info->keymap->ctx,
if (!ExprResolveString(ctx, value, &str)) {
log_err(info->keymap->ctx,