CheckModifierField(struct xkb_keymap *keymap, unsigned action, ExprDef *value,
unsigned *flags_inout, xkb_mod_mask_t *mods_rtrn)
{
- ExprResult rtrn;
if (value->op == EXPR_IDENT) {
const char *valStr;
valStr = xkb_atom_text(keymap->ctx, value->value.str);
}
}
- if (!ExprResolveVModMask(keymap, value, &rtrn))
+ if (!ExprResolveVModMask(keymap, value, mods_rtrn))
return ReportMismatch(keymap, action, F_Modifiers, "modifier mask");
- *mods_rtrn = (xkb_mod_mask_t) rtrn.ival;
*flags_inout &= ~XkbSA_UseModMapMods;
return true;
}
HandleISOLock(struct xkb_keymap *keymap, struct xkb_any_action *action,
unsigned field, ExprDef *array_ndx, ExprDef *value)
{
- ExprResult rtrn;
struct xkb_iso_action *act;
- unsigned flags;
- xkb_mod_mask_t mods;
- xkb_group_index_t group;
act = (struct xkb_iso_action *) action;
- switch (field) {
- case F_Modifiers:
- if (array_ndx != NULL)
+ if (field == F_Modifiers) {
+ unsigned flags;
+ xkb_mod_mask_t mods;
+
+ if (array_ndx)
return ReportActionNotArray(keymap, action->type, field);
+
flags = act->flags;
- if (CheckModifierField(keymap, action->type, value, &flags, &mods)) {
- act->flags = flags & (~XkbSA_ISODfltIsGroup);
- act->real_mods = mods & 0xff;
- act->vmods = (mods >> 8) & 0xff;
- return true;
- }
- return false;
+ if (!CheckModifierField(keymap, action->type, value, &flags, &mods))
+ return false;
- case F_Group:
- if (array_ndx != NULL)
+ act->flags = flags & (~XkbSA_ISODfltIsGroup);
+ act->real_mods = mods & 0xff;
+ act->vmods = (mods >> 8) & 0xff;
+ return true;
+ }
+ else if (field == F_Group) {
+ xkb_group_index_t group;
+ unsigned flags;
+
+ if (array_ndx)
return ReportActionNotArray(keymap, action->type, field);
+
flags = act->flags;
- if (CheckGroupField(keymap, action->type, value, &flags, &group)) {
- act->flags = flags | XkbSA_ISODfltIsGroup;
- act->group = group;
- return true;
- }
- return false;
+ if (!CheckGroupField(keymap, action->type, value, &flags, &group))
+ return false;
- case F_Affect:
- if (array_ndx != NULL)
+ act->flags = flags | XkbSA_ISODfltIsGroup;
+ act->group = group;
+ return true;
+ } else if (F_Affect) {
+ xkb_mod_mask_t mask;
+
+ if (array_ndx)
return ReportActionNotArray(keymap, action->type, field);
- if (!ExprResolveMask(keymap->ctx, value, &rtrn, isoNames))
+
+ if (!ExprResolveMask(keymap->ctx, value, &mask, isoNames))
return ReportMismatch(keymap, action->type, field,
"keyboard component");
- act->affect = (~rtrn.uval) & XkbSA_ISOAffectMask;
+
+ act->affect = (~mask) & XkbSA_ISOAffectMask;
return true;
}
+
return ReportIllegal(keymap, action->type, field);
}
unsigned field, ExprDef *array_ndx,
ExprDef *value)
{
- ExprResult rtrn;
struct xkb_controls_action *act;
act = (struct xkb_controls_action *) action;
if (field == F_Controls) {
- if (array_ndx != NULL)
+ unsigned int mask;
+
+ if (array_ndx)
return ReportActionNotArray(keymap, action->type, field);
- if (!ExprResolveMask(keymap->ctx, value, &rtrn, ctrlNames))
+
+ if (!ExprResolveMask(keymap->ctx, value, &mask, ctrlNames))
return ReportMismatch(keymap, action->type, field,
"controls mask");
- act->ctrls = rtrn.uval;
+
+ act->ctrls = mask;
return true;
}
+
return ReportIllegal(keymap, action->type, field);
}
HandleActionMessage(struct xkb_keymap *keymap, struct xkb_any_action *action,
unsigned field, ExprDef *array_ndx, ExprDef *value)
{
- ExprResult rtrn;
- const char *str;
- bool set;
struct xkb_message_action *act;
act = (struct xkb_message_action *) action;
- switch (field) {
- case F_Report:
- if (array_ndx != NULL)
+ if (field == F_Report) {
+ unsigned int mask;
+
+ if (array_ndx)
return ReportActionNotArray(keymap, action->type, field);
- if (!ExprResolveMask(keymap->ctx, value, &rtrn, evNames))
+
+ if (!ExprResolveMask(keymap->ctx, value, &mask, evNames))
return ReportMismatch(keymap, action->type, field,
"key event mask");
+
+ /* FIXME: Something seems wrong here... */
act->flags &= ~(XkbSA_MessageOnPress | XkbSA_MessageOnRelease);
- act->flags =
- rtrn.uval & (XkbSA_MessageOnPress | XkbSA_MessageOnRelease);
+ act->flags = mask & (XkbSA_MessageOnPress | XkbSA_MessageOnRelease);
return true;
+ }
+ else if (field == F_GenKeyEvent) {
+ bool set;
- case F_GenKeyEvent:
if (array_ndx)
return ReportActionNotArray(keymap, action->type, field);
act->flags &= ~XkbSA_MessageGenKeyEvent;
return true;
-
- case F_Data:
- if (array_ndx == NULL) {
- int len;
-
- if (!ExprResolveString(keymap->ctx, value, &str))
- return ReportMismatch(keymap, action->type, field, "string");
-
- len = strlen(str);
- if (len < 1 || len > 6) {
- log_warn(keymap->ctx,
- "An action message can hold only 6 bytes; "
- "Extra %d bytes ignored\n", len - 6);
- }
-
- strncpy((char *) act->message, str, 6);
- return true;
+ }
+ else if (field == F_Data && !array_ndx) {
+ const char *str;
+ int len;
+
+ if (!ExprResolveString(keymap->ctx, value, &str))
+ return ReportMismatch(keymap, action->type, field, "string");
+
+ len = strlen(str);
+ if (len < 1 || len > 6) {
+ log_warn(keymap->ctx,
+ "An action message can hold only 6 bytes; "
+ "Extra %d bytes ignored\n", len - 6);
}
- else {
- int ndx, datum;
- if (!ExprResolveInteger(keymap->ctx, array_ndx, &ndx)) {
- log_err(keymap->ctx,
- "Array subscript must be integer; "
- "Illegal subscript ignored\n");
- return false;
- }
+ strncpy((char *) act->message, str, 6);
+ return true;
+ }
+ else if (field == F_Data && array_ndx) {
+ int ndx, datum;
- if (ndx < 0 || ndx > 5) {
- log_err(keymap->ctx,
- "An action message is at most 6 bytes long; "
- "Attempt to use data[%d] ignored\n", ndx);
- return false;
- }
+ if (!ExprResolveInteger(keymap->ctx, array_ndx, &ndx)) {
+ log_err(keymap->ctx,
+ "Array subscript must be integer; "
+ "Illegal subscript ignored\n");
+ return false;
+ }
- if (!ExprResolveInteger(keymap->ctx, value, &datum))
- return ReportMismatch(keymap, action->type, field, "integer");
+ if (ndx < 0 || ndx > 5) {
+ log_err(keymap->ctx,
+ "An action message is at most 6 bytes long; "
+ "Attempt to use data[%d] ignored\n", ndx);
+ return false;
+ }
- if (datum < 0 || datum > 255) {
- log_err(keymap->ctx,
- "Message data must be in the range 0..255; "
- "Illegal datum %d ignored\n", datum);
- return false;
- }
+ if (!ExprResolveInteger(keymap->ctx, value, &datum))
+ return ReportMismatch(keymap, action->type, field, "integer");
- act->message[ndx] = (uint8_t) datum;
+ if (datum < 0 || datum > 255) {
+ log_err(keymap->ctx,
+ "Message data must be in the range 0..255; "
+ "Illegal datum %d ignored\n", datum);
+ return false;
}
+ act->message[ndx] = (uint8_t) datum;
return true;
}