unsigned field, ExprDef * value, unsigned *flags_inout)
{
unsigned tmp;
- ExprResult result;
+ bool result;
if (field == F_ClearLocks)
tmp = XkbSA_ClearLocks;
tmp = XkbSA_LatchToLock;
else
return false; /* WSGO! */
+
if (!ExprResolveBoolean(keymap->ctx, value, &result))
return ReportMismatch(keymap, action, field, "boolean");
- if (result.uval)
+
+ if (result)
*flags_inout |= tmp;
else
*flags_inout &= ~tmp;
+
return true;
}
return true;
}
else if (field == F_Accel) {
- if (!ExprResolveBoolean(keymap->ctx, value, &rtrn))
+ bool set;
+
+ if (!ExprResolveBoolean(keymap->ctx, value, &set))
return ReportMismatch(keymap, action->type, field, "boolean");
- if (rtrn.uval)
+
+ if (set)
act->flags &= ~XkbSA_NoAcceleration;
else
act->flags |= XkbSA_NoAcceleration;
}
+
return ReportIllegal(keymap, action->type, field);
}
return true;
}
else if (field == F_Same) {
- if (array_ndx != NULL)
+ bool set;
+
+ if (array_ndx)
return ReportActionNotArray(keymap, action->type, field);
- if (!ExprResolveBoolean(keymap->ctx, value, &rtrn))
+
+ if (!ExprResolveBoolean(keymap->ctx, value, &set))
return ReportMismatch(keymap, action->type, field, "boolean");
- if (rtrn.uval)
+
+ if (set)
act->flags &= ~XkbSA_SwitchApplication;
else
act->flags |= XkbSA_SwitchApplication;
+
return true;
}
+
return ReportIllegal(keymap, action->type, field);
}
{
ExprResult rtrn;
const char *str;
+ bool set;
struct xkb_message_action *act;
act = (struct xkb_message_action *) action;
return true;
case F_GenKeyEvent:
- if (array_ndx != NULL)
+ if (array_ndx)
return ReportActionNotArray(keymap, action->type, field);
- if (!ExprResolveBoolean(keymap->ctx, value, &rtrn))
+
+ if (!ExprResolveBoolean(keymap->ctx, value, &set))
return ReportMismatch(keymap, action->type, field, "boolean");
- if (rtrn.uval)
+
+ if (set)
act->flags |= XkbSA_MessageGenKeyEvent;
else
act->flags &= ~XkbSA_MessageGenKeyEvent;
+
return true;
case F_Data:
return ReportSIBadType(info, si, field, "virtual modifier");
}
else if (istreq(field, "repeat")) {
- if (arrayNdx != NULL)
+ bool set;
+
+ if (arrayNdx)
return ReportSINotArray(info, si, field);
- ok = ExprResolveBoolean(keymap->ctx, value, &tmp);
- if (ok) {
- if (tmp.uval)
- si->interp.flags |= XkbSI_AutoRepeat;
- else
- si->interp.flags &= ~XkbSI_AutoRepeat;
- si->defined |= _SI_AutoRepeat;
- }
- else
+
+ if (!ExprResolveBoolean(keymap->ctx, value, &set))
return ReportSIBadType(info, si, field, "boolean");
+
+ if (set)
+ si->interp.flags |= XkbSI_AutoRepeat;
+ else
+ si->interp.flags &= ~XkbSI_AutoRepeat;
+
+ si->defined |= _SI_AutoRepeat;
}
else if (istreq(field, "locking")) {
- if (arrayNdx != NULL)
+ bool set;
+
+ if (arrayNdx)
return ReportSINotArray(info, si, field);
- ok = ExprResolveBoolean(keymap->ctx, value, &tmp);
- if (ok) {
- if (tmp.uval)
- si->interp.flags |= XkbSI_LockingKey;
- else
- si->interp.flags &= ~XkbSI_LockingKey;
- si->defined |= _SI_LockingKey;
- }
- else
+
+ if (!ExprResolveBoolean(keymap->ctx, value, &set))
return ReportSIBadType(info, si, field, "boolean");
+
+ if (set)
+ si->interp.flags |= XkbSI_LockingKey;
+ else
+ si->interp.flags &= ~XkbSI_LockingKey;
+
+ si->defined |= _SI_LockingKey;
}
else if (istreq(field, "usemodmap") ||
istreq(field, "usemodmapmods")) {
led->defined |= _LED_Ctrls;
}
else if (istreq(field, "allowexplicit")) {
- if (arrayNdx != NULL)
+ bool set;
+
+ if (arrayNdx)
return ReportIndicatorNotArray(info, led, field);
- if (!ExprResolveBoolean(keymap->ctx, value, &rtrn))
+ if (!ExprResolveBoolean(keymap->ctx, value, &set))
return ReportIndicatorBadType(info, led, field, "boolean");
- if (rtrn.uval)
+ if (set)
led->flags &= ~XkbIM_NoExplicit;
else
led->flags |= XkbIM_NoExplicit;
+
led->defined |= _LED_Explicit;
}
else if (istreq(field, "whichmodstate") ||
istreq(field, "leddriveskeyboard") ||
istreq(field, "indicatordriveskbd") ||
istreq(field, "indicatordriveskeyboard")) {
- if (arrayNdx != NULL)
+ bool set;
+
+ if (arrayNdx)
return ReportIndicatorNotArray(info, led, field);
- if (!ExprResolveBoolean(keymap->ctx, value, &rtrn))
+ if (!ExprResolveBoolean(keymap->ctx, value, &set))
return ReportIndicatorBadType(info, led, field, "boolean");
- if (rtrn.uval)
+ if (set)
led->flags |= XkbIM_LEDDrivesKB;
else
led->flags &= ~XkbIM_LEDDrivesKB;
+
led->defined |= _LED_DrivesKbd;
}
else if (istreq(field, "index")) {
return ret;
}
-int
-ExprResolveBoolean(struct xkb_context *ctx, ExprDef *expr,
- ExprResult *val_rtrn)
+bool
+ExprResolveBoolean(struct xkb_context *ctx, ExprDef *expr, bool *set_rtrn)
{
- int ok = 0;
+ bool ok = false;
const char *ident;
switch (expr->op) {
exprValueTypeText(expr->value_type));
return false;
}
- val_rtrn->ival = expr->value.ival;
+ *set_rtrn = !!expr->value.ival;
return true;
case EXPR_IDENT:
if (istreq(ident, "true") ||
istreq(ident, "yes") ||
istreq(ident, "on")) {
- val_rtrn->uval = 1;
+ *set_rtrn = true;
return true;
}
else if (istreq(ident, "false") ||
istreq(ident, "no") ||
istreq(ident, "off")) {
- val_rtrn->uval = 0;
+ *set_rtrn = false;
return true;
}
}
case EXPR_INVERT:
case EXPR_NOT:
- ok = ExprResolveBoolean(ctx, expr, val_rtrn);
+ ok = ExprResolveBoolean(ctx, expr, set_rtrn);
if (ok)
- val_rtrn->uval = !val_rtrn->uval;
+ *set_rtrn = !*set_rtrn;
return ok;
case EXPR_ADD:
case EXPR_SUBTRACT:
log_wsgo(ctx, "Unknown operator %d in ResolveBoolean\n", expr->op);
break;
}
+
return false;
}
ExprResolveVModMask(struct xkb_keymap *keymap, ExprDef *expr,
ExprResult *val_rtrn);
-extern int
-ExprResolveBoolean(struct xkb_context *ctx, ExprDef *expr,
- ExprResult *val_rtrn);
+bool
+ExprResolveBoolean(struct xkb_context *ctx, ExprDef *expr, bool *set_rtrn);
extern int
ExprResolveKeyCode(struct xkb_context *ctx, ExprDef *expr,
}
else if (istreq(field, "groupswrap") ||
istreq(field, "wrapgroups")) {
- if (!ExprResolveBoolean(ctx, value, &tmp)) {
+ bool set;
+
+ if (!ExprResolveBoolean(ctx, value, &set)) {
log_err(info->keymap->ctx,
"Illegal groupsWrap setting for %s; "
"Non-boolean value ignored\n",
longText(keyi->name));
return false;
}
- if (tmp.uval)
+
+ if (set)
keyi->out_of_range_group_action = XkbWrapIntoRange;
else
keyi->out_of_range_group_action = XkbClampIntoRange;
+
keyi->defined |= _Key_GroupInfo;
}
else if (istreq(field, "groupsclamp") ||
istreq(field, "clampgroups")) {
- if (!ExprResolveBoolean(ctx, value, &tmp)) {
+ bool set;
+
+ if (!ExprResolveBoolean(ctx, value, &set)) {
log_err(info->keymap->ctx,
"Illegal groupsClamp setting for %s; "
"Non-boolean value ignored\n",
longText(keyi->name));
return false;
}
- if (tmp.uval)
+
+ if (set)
keyi->out_of_range_group_action = XkbClampIntoRange;
else
keyi->out_of_range_group_action = XkbWrapIntoRange;
+
keyi->defined |= _Key_GroupInfo;
}
else if (istreq(field, "groupsredirect") ||