Beispiel #1
0
static bool
CheckGroupField(struct xkb_keymap *keymap, unsigned action,
                const ExprDef *value, enum xkb_action_flags *flags_inout,
                xkb_layout_index_t *grp_rtrn)
{
    const ExprDef *spec;

    if (value->expr.op == EXPR_NEGATE || value->expr.op == EXPR_UNARY_PLUS) {
        *flags_inout &= ~ACTION_ABSOLUTE_SWITCH;
        spec = value->unary.child;
    }
    else {
        *flags_inout |= ACTION_ABSOLUTE_SWITCH;
        spec = value;
    }

    if (!ExprResolveGroup(keymap->ctx, spec, grp_rtrn))
        return ReportMismatch(keymap, action, ACTION_FIELD_GROUP,
                              "integer (range 1..8)");

    if (value->expr.op == EXPR_NEGATE)
        *grp_rtrn = -*grp_rtrn;
    else if (value->expr.op != EXPR_UNARY_PLUS)
        (*grp_rtrn)--;

    return true;
}
Beispiel #2
0
static bool
CheckGroupField(struct xkb_context *ctx, enum xkb_action_type action,
                const ExprDef *array_ndx, const ExprDef *value,
                enum xkb_action_flags *flags_inout, int32_t *group_rtrn)
{
    const ExprDef *spec;
    xkb_layout_index_t idx;
    enum xkb_action_flags flags = *flags_inout;

    if (array_ndx)
        return ReportActionNotArray(ctx, action, ACTION_FIELD_GROUP);

    if (value->expr.op == EXPR_NEGATE || value->expr.op == EXPR_UNARY_PLUS) {
        flags &= ~ACTION_ABSOLUTE_SWITCH;
        spec = value->unary.child;
    }
    else {
        flags |= ACTION_ABSOLUTE_SWITCH;
        spec = value;
    }

    if (!ExprResolveGroup(ctx, spec, &idx))
        return ReportMismatch(ctx, action, ACTION_FIELD_GROUP,
                              "integer (range 1..8)");

    /* +n, -n are relative, n is absolute. */
    if (value->expr.op == EXPR_NEGATE || value->expr.op == EXPR_UNARY_PLUS) {
        *group_rtrn = (int32_t) idx;
        if (value->expr.op == EXPR_NEGATE)
            *group_rtrn = -*group_rtrn;
    }
    else {
        *group_rtrn = (int32_t) (idx - 1);
    }
    *flags_inout = flags;
    return true;
}