Beispiel #1
0
static Status
XkbInitControls(DeviceIntPtr pXDev,XkbSrvInfoPtr xkbi)
{
XkbDescPtr	xkb;
XkbControlsPtr	ctrls;

    xkb= xkbi->desc;
    /* 12/31/94 (ef) -- XXX! Should check if controls loaded from file */
    if (XkbAllocControls(xkb,XkbAllControlsMask)!=Success)
	FatalError("Couldn't allocate keyboard controls\n");
    ctrls= xkb->ctrls;
    if (!(xkb->defined & XkmSymbolsMask))
        ctrls->num_groups = 1;
    ctrls->groups_wrap = XkbSetGroupInfo(1,XkbWrapIntoRange,0);
    ctrls->internal.mask = 0;
    ctrls->internal.real_mods = 0;
    ctrls->internal.vmods = 0;
    ctrls->ignore_lock.mask = 0;
    ctrls->ignore_lock.real_mods = 0;
    ctrls->ignore_lock.vmods = 0;
    ctrls->enabled_ctrls = XkbAccessXTimeoutMask|XkbRepeatKeysMask|
				XkbMouseKeysAccelMask|XkbAudibleBellMask|
				XkbIgnoreGroupLockMask;
    if (XkbWantAccessX)
	ctrls->enabled_ctrls|= XkbAccessXKeysMask;
    AccessXInit(pXDev);
    return Success;
}
Beispiel #2
0
/*ARGSUSED*/
static Bool
DefaultParser(FILE *             file,
              XkbConfigFieldsPtr fields,
              XkbConfigFieldPtr  field,
              XkbDescPtr         xkb,
              XkbConfigRtrnPtr   rtrn)
{
    int tok;
    XkbCFScanResultRec val;
    char **str;
    int merge;
    unsigned long *ctrls, ctrls_mask;
    unsigned short *opts, opts_mask;
    int *pival, sign;
    int onoff;
    XkbConfigUnboundModPtr last;
    unsigned what;

    tok = XkbCFScan(file, &val, rtrn);
    str = NULL;
    onoff = 0;
    pival = NULL;
    switch (field->field_id) {
    case _XkbCF_RulesFile:      if (!str) str = &rtrn->rules_file;
    case _XkbCF_Model:          if (!str) str = &rtrn->model;
    case _XkbCF_Layout:         if (!str) str = &rtrn->layout;
    case _XkbCF_Variant:        if (!str) str = &rtrn->variant;
    case _XkbCF_Options:        if (!str) str = &rtrn->options;
    case _XkbCF_Keymap:         if (!str) str = &rtrn->keymap;
    case _XkbCF_Keycodes:       if (!str) str = &rtrn->keycodes;
    case _XkbCF_Geometry:       if (!str) str = &rtrn->geometry;
    case _XkbCF_PhysSymbols:    if (!str) str = &rtrn->phys_symbols;
    case _XkbCF_Symbols:        if (!str) str = &rtrn->symbols;
    case _XkbCF_Types:          if (!str) str = &rtrn->types;
    case _XkbCF_CompatMap:      if (!str) str = &rtrn->compat;
        if (tok != XkbCF_Equals) {
            rtrn->error = XkbCF_MissingEquals;
            goto BAILOUT;
        }
        tok = XkbCFScan(file, &val, rtrn);
        if ((tok != XkbCF_String) && (tok != XkbCF_Ident)) {
            rtrn->error = XkbCF_ExpectedString;
            return False;
        }
        tok = XkbCFScan(file, &val, rtrn);
        if ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) {
            rtrn->error = XkbCF_ExpectedEOS;
            return False;
        }
        if (*str != NULL)
            _XkbFree(*str);
        *str = _XkbDupString(val.str);
        break;
    case _XkbCF_InitialMods:
    case _XkbCF_IgnoreLockMods:
    case _XkbCF_InternalMods:
        what = XkbCF_InitialMods;
        if (field->field_id == _XkbCF_InitialMods)
            rtrn->defined |= (what = XkbCF_InitialMods);
        else if (field->field_id == _XkbCF_InternalMods)
            rtrn->defined |= (what = XkbCF_InternalMods);
        else if (field->field_id == _XkbCF_IgnoreLockMods)
            rtrn->defined |= (what = XkbCF_IgnoreLockMods);
        if (tok == XkbCF_Equals)
            merge = XkbCF_MergeSet;
        else if (tok == XkbCF_MinusEquals)
            merge = XkbCF_MergeRemove;
        else if (tok == XkbCF_PlusEquals)
            merge = XkbCF_MergeAdd;
        else {
            rtrn->error = XkbCF_MissingEquals;
            goto BAILOUT;
        }
        tok = XkbCFScan(file, &val, rtrn);
        if ((tok == XkbCF_EOL) || (tok == XkbCF_Semi) || (tok == XkbCF_EOF)) {
            rtrn->error = XkbCF_ExpectedModifier;
            return False;
        }
        last = NULL;
        while ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) {
            if ((tok != XkbCF_Ident) && (tok != XkbCF_String)) {
                rtrn->error = XkbCF_ExpectedModifier;
                return False;
            }
            last = XkbCFAddModByName(rtrn, what, val.str, merge, last);
            if (last == NULL)
                return False;
            if (merge == XkbCF_MergeSet)
                merge = XkbCF_MergeAdd;
            tok = XkbCFScan(file, &val, rtrn);
            if ((tok != XkbCF_EOL) && (tok != XkbCF_EOF) && (tok != XkbCF_Semi)) {
                if (tok != XkbCF_Plus) {
                    rtrn->error = XkbCF_ExpectedOperator;
                    return False;
                }
                tok = XkbCFScan(file, &val, rtrn);
            }
        }
        break;
    case _XkbCF_InitialCtrls:
        rtrn->defined |= XkbCF_InitialCtrls;
        ctrls = NULL;
        if (tok == XkbCF_PlusEquals)
            ctrls = &rtrn->initial_ctrls;
        else if (tok == XkbCF_MinusEquals)
            ctrls = &rtrn->initial_ctrls_clear;
        else if (tok == XkbCF_Equals) {
            ctrls = &rtrn->initial_ctrls;
            rtrn->replace_initial_ctrls = True;
            *ctrls = 0;
        }
        else {
            rtrn->error = XkbCF_MissingEquals;
            goto BAILOUT;
        }
        tok = XkbCFScan(file, &val, rtrn);
        if ((tok == XkbCF_EOL) || (tok == XkbCF_Semi) || (tok == XkbCF_EOF)) {
            rtrn->error = XkbCF_ExpectedControl;
            return False;
        }
        while ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) {
            if ((tok != XkbCF_Ident) && (tok != XkbCF_String)) {
                rtrn->error = XkbCF_ExpectedControl;
                return False;
            }
            if (!AddCtrlByName(rtrn, val.str, &ctrls_mask)) {
                return False;
            }
            *ctrls |= ctrls_mask;
            tok = XkbCFScan(file, &val, rtrn);
            if ((tok != XkbCF_EOL) && (tok != XkbCF_EOF) && (tok != XkbCF_Semi)) {
                if (tok != XkbCF_Plus) {
                    rtrn->error = XkbCF_ExpectedOperator;
                    return False;
                }
                tok = XkbCFScan(file, &val, rtrn);
            }
        }
        break;
    case _XkbCF_AccessXTimeoutCtrlsOn:
    case _XkbCF_AccessXTimeoutCtrlsOff:
        opts = NULL;
        if (tok == XkbCF_MinusEquals) {
            ctrls = &rtrn->axt_ctrls_ignore;
            opts = &rtrn->axt_opts_ignore;
        }
        else if ((tok == XkbCF_PlusEquals) || (tok == XkbCF_Equals)) {
            if (field->field_id == _XkbCF_AccessXTimeoutCtrlsOff) {
                ctrls = &rtrn->axt_ctrls_off;
                opts = &rtrn->axt_opts_off;
                if (tok == XkbCF_Equals)
                    rtrn->replace_axt_ctrls_off = True;
            }
            else {
                ctrls = &rtrn->axt_ctrls_on;
                opts = &rtrn->axt_opts_on;
                if (tok == XkbCF_Equals)
                    rtrn->replace_axt_ctrls_on = True;
            }
            *ctrls = 0;
        }
        else {
            rtrn->error = XkbCF_MissingEquals;
            goto BAILOUT;
        }
        tok = XkbCFScan(file, &val, rtrn);
        if ((tok == XkbCF_EOL) || (tok == XkbCF_Semi) || (tok == XkbCF_EOF)) {
            rtrn->error = XkbCF_ExpectedControl;
            return False;
        }
        while ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) {
            if ((tok != XkbCF_Ident) && (tok != XkbCF_String)) {
                rtrn->error = XkbCF_ExpectedControl;
                return False;
            }
            if (!AddCtrlByName(rtrn, val.str, &ctrls_mask)) {
                if (!AddAXTimeoutOptByName(rtrn, val.str, &opts_mask))
                    return False;
                *opts |= opts_mask;
                if (field->field_id == _XkbCF_AccessXTimeoutCtrlsOff) {
                    rtrn->defined |= XkbCF_AccessXTimeoutOptsOff;
                    if (rtrn->replace_axt_ctrls_off)
                        rtrn->replace_axt_opts_off = True;
                }
                else {
                    rtrn->defined |= XkbCF_AccessXTimeoutOptsOn;
                    if (rtrn->replace_axt_ctrls_on)
                        rtrn->replace_axt_opts_on = True;
                }
            }
            else
                *ctrls |= ctrls_mask;
            tok = XkbCFScan(file, &val, rtrn);
            if ((tok != XkbCF_EOL) && (tok != XkbCF_EOF) && (tok != XkbCF_Semi)) {
                if (tok != XkbCF_Plus) {
                    rtrn->error = XkbCF_ExpectedOperator;
                    return False;
                }
                tok = XkbCFScan(file, &val, rtrn);
            }
        }
        break;
    case _XkbCF_InitialFeedback:
        rtrn->defined |= XkbCF_InitialOpts;
        opts = NULL;
        if (tok == XkbCF_PlusEquals)
            opts = &rtrn->initial_opts;
        else if (tok == XkbCF_MinusEquals)
            opts = &rtrn->initial_opts_clear;
        else if (tok == XkbCF_Equals) {
            opts = &rtrn->initial_opts;
            rtrn->replace_initial_opts = True;
            *opts = 0;
        }
        else {
            rtrn->error = XkbCF_MissingEquals;
            goto BAILOUT;
        }
        tok = XkbCFScan(file, &val, rtrn);
        if ((tok == XkbCF_EOL) || (tok == XkbCF_Semi) || (tok == XkbCF_EOF)) {
            rtrn->error = XkbCF_ExpectedAXOption;
            return False;
        }
        while ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) {
            if ((tok != XkbCF_Ident) && (tok != XkbCF_String)) {
                rtrn->error = XkbCF_ExpectedAXOption;
                return False;
            }
            if (!AddAXTimeoutOptByName(rtrn, val.str, &opts_mask)) {
                return False;
            }
            *opts |= opts_mask;
            tok = XkbCFScan(file, &val, rtrn);
            if ((tok != XkbCF_EOL) && (tok != XkbCF_EOF) && (tok != XkbCF_Semi)) {
                if (tok != XkbCF_Plus) {
                    rtrn->error = XkbCF_ExpectedOperator;
                    return False;
                }
                tok = XkbCFScan(file, &val, rtrn);
            }
        }
        break;
    case _XkbCF_AccessXTimeoutOptsOff:
    case _XkbCF_AccessXTimeoutOptsOn:
        opts = NULL;
        if (tok == XkbCF_MinusEquals)
            opts = &rtrn->axt_opts_ignore;
        else if ((tok == XkbCF_PlusEquals) || (tok == XkbCF_Equals)) {
            if (field->field_id == _XkbCF_AccessXTimeoutOptsOff) {
                opts = &rtrn->axt_opts_off;
                if (tok == XkbCF_Equals)
                    rtrn->replace_axt_opts_off = True;
            }
            else {
                opts = &rtrn->axt_opts_on;
                if (tok == XkbCF_Equals)
                    rtrn->replace_axt_opts_on = True;
            }
            *opts = 0;
        }
        else {
            rtrn->error = XkbCF_MissingEquals;
            goto BAILOUT;
        }
        tok = XkbCFScan(file, &val, rtrn);
        if ((tok == XkbCF_EOL) || (tok == XkbCF_Semi) || (tok == XkbCF_EOF)) {
            rtrn->error = XkbCF_ExpectedControl;
            return False;
        }
        while ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) {
            if ((tok != XkbCF_Ident) && (tok != XkbCF_String)) {
                rtrn->error = XkbCF_ExpectedControl;
                return False;
            }
            if (!AddAXTimeoutOptByName(rtrn, val.str, &opts_mask))
                return False;
            *opts |= opts_mask;

            tok = XkbCFScan(file, &val, rtrn);
            if ((tok != XkbCF_EOL) && (tok != XkbCF_EOF) && (tok != XkbCF_Semi)) {
                if (tok != XkbCF_Plus) {
                    rtrn->error = XkbCF_ExpectedOperator;
                    return False;
                }
                tok = XkbCFScan(file, &val, rtrn);
            }
        }
        break;
    case _XkbCF_ClickVolume:
        if (!pival) {
            pival = &rtrn->click_volume;
            onoff = 100;
        }
    case _XkbCF_BellVolume:
        if (!pival) {
            pival = &rtrn->bell_volume;
            onoff = 100;
        }
    case _XkbCF_BellPitch:          if (!pival) pival = &rtrn->bell_pitch;
    case _XkbCF_BellDuration:       if (!pival) pival = &rtrn->bell_duration;
    case _XkbCF_RepeatDelay:        if (!pival) pival = &rtrn->repeat_delay;
    case _XkbCF_RepeatInterval:     if (!pival) pival = &rtrn->repeat_interval;
    case _XkbCF_SlowKeysDelay:      if (!pival) pival = &rtrn->slow_keys_delay;
    case _XkbCF_DebounceDelay:      if (!pival) pival = &rtrn->debounce_delay;
    case _XkbCF_MouseKeysDelay:     if (!pival) pival = &rtrn->mk_delay;
    case _XkbCF_MouseKeysInterval:  if (!pival) pival = &rtrn->mk_interval;
    case _XkbCF_MouseKeysTimeToMax: if (!pival) pival = &rtrn->mk_time_to_max;
    case _XkbCF_MouseKeysMaxSpeed:  if (!pival) pival = &rtrn->mk_max_speed;
    case _XkbCF_MouseKeysCurve:     if (!pival) pival = &rtrn->mk_curve;
    case _XkbCF_AccessXTimeout:     if (!pival) pival = &rtrn->ax_timeout;
        if (tok != XkbCF_Equals) {
            rtrn->error = XkbCF_MissingEquals;
            goto BAILOUT;
        }
        tok = XkbCFScan(file, &val, rtrn);
        if (tok == XkbCF_Minus && field->field_id == _XkbCF_MouseKeysCurve) {
            /* This can be a negative value */
            tok = XkbCFScan(file, &val, rtrn);
            sign = -1;
        }
        else
            sign = 1;
        if (tok != XkbCF_Integer) {
            Bool ok = False;

            if ((onoff) && (tok == XkbCF_Ident) && (val.str != NULL)) {
                if (_XkbStrCaseCmp(val.str, "on")) {
                    val.ival = onoff;
                    ok = True;
                }
                else if (_XkbStrCaseCmp(val.str, "off")) {
                    val.ival = 0;
                    ok = True;
                }
            }
            if (!ok) {
                rtrn->error = XkbCF_ExpectedInteger;
                goto BAILOUT;
            }
        }
        *pival = val.ival * sign;
        if (field->field_id == _XkbCF_AccessXTimeout)
            rtrn->defined |= XkbCF_AccessXTimeout;
        tok = XkbCFScan(file, &val, rtrn);
        if ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) {
            rtrn->error = XkbCF_ExpectedEOS;
            return False;
        }
        break;
    case _XkbCF_GroupsWrap:
        if (tok != XkbCF_Equals) {
            rtrn->error = XkbCF_MissingEquals;
            goto BAILOUT;
        }
        tok = XkbCFScan(file, &val, rtrn);
        if (tok == XkbCF_Ident) {
            if (_XkbStrCaseCmp(val.str, "wrap") == 0) {
                rtrn->groups_wrap = XkbSetGroupInfo(0, XkbWrapIntoRange, 0);
            }
            else if (_XkbStrCaseCmp(val.str, "clamp") == 0) {
                rtrn->groups_wrap = XkbSetGroupInfo(0, XkbClampIntoRange, 0);
            }
            else {
                rtrn->error = XkbCF_ExpectedOORGroupBehavior;
                return False;
            }
        }
        else if ((tok == XkbCF_Integer) && (XkbIsLegalGroup(val.ival - 1))) {
            rtrn->groups_wrap = XkbSetGroupInfo(0, XkbRedirectIntoRange,
                                                val.ival - 1);
        }
        else {
            rtrn->error = XkbCF_ExpectedOORGroupBehavior;
            return False;
        }
        rtrn->defined |= XkbCF_GroupsWrap;
        tok = XkbCFScan(file, &val, rtrn);
        if ((tok != XkbCF_EOL) && (tok != XkbCF_Semi) && (tok != XkbCF_EOF)) {
            rtrn->error = XkbCF_ExpectedEOS;
            return False;
        }
        break;
    default:
        rtrn->error = XkbCF_ExpectedInteger;
        goto BAILOUT;

    }
    return True;
 BAILOUT:
    return False;
}