コード例 #1
0
ファイル: xkbconfig.c プロジェクト: Magister/x11rdp_xorg71
XkbConfigUnboundModPtr
XkbCFAddModByName(	XkbConfigRtrnPtr	rtrn,
			int			what,
			char *			name,
			Bool			merge,
			XkbConfigUnboundModPtr	last)
{
    if (rtrn->num_unbound_mods>=rtrn->sz_unbound_mods) {
	rtrn->sz_unbound_mods+= 5;
	rtrn->unbound_mods= _XkbTypedRealloc(rtrn->unbound_mods,
						  rtrn->sz_unbound_mods,
						  XkbConfigUnboundModRec);
	if (rtrn->unbound_mods==NULL) {
	    rtrn->error= XkbCF_BadAlloc;
	    return False;
	}
    }
    if (last==NULL) {
	last= &rtrn->unbound_mods[rtrn->num_unbound_mods++];
	last->what= what;
	last->mods= 0;
	last->vmods= 0;
	last->merge= merge;
	last->name= NULL;
    }
    if (_XkbStrCaseCmp(name,"shift")==0)
	last->mods|= ShiftMask;
    else if (_XkbStrCaseCmp(name,"lock")==0)
	last->mods|= LockMask;
    else if ((_XkbStrCaseCmp(name,"control")==0)||
		(_XkbStrCaseCmp(name,"ctrl")==0))
	last->mods|= ControlMask;
    else if (_XkbStrCaseCmp(name,"mod1")==0)
	last->mods|= Mod1Mask;
    else if (_XkbStrCaseCmp(name,"mod2")==0)
	last->mods|= Mod2Mask;
    else if (_XkbStrCaseCmp(name,"mod3")==0)
	last->mods|= Mod3Mask;
    else if (_XkbStrCaseCmp(name,"mod4")==0)
	last->mods|= Mod4Mask;
    else if (_XkbStrCaseCmp(name,"mod5")==0)
	last->mods|= Mod5Mask;
    else {
	if (last->name!=NULL) {
	    last= &rtrn->unbound_mods[rtrn->num_unbound_mods++];
	    last->what= what;
	    last->mods= 0;
	    last->vmods= 0;
	    last->merge= merge;
	    last->name= NULL;
	}
	last->name= _XkbDupString(name);
    }
    return last;
}
コード例 #2
0
ファイル: xkbconfig.c プロジェクト: Distrotech/libxkbfile
Bool
XkbCFParse(FILE *file, XkbConfigFieldsPtr fields,
           XkbDescPtr xkb, XkbConfigRtrnPtr rtrn)
{
    int tok;
    XkbCFScanResultRec val;
    XkbConfigFieldsPtr tmp;

    if ((file == NULL) || (fields == NULL) || (rtrn == NULL))
        return False;
    for (tok = 0, tmp = fields; tmp != NULL; tmp = tmp->next, tok++) {
        fields->cfg_id = tok;
    }
    bzero((char *) rtrn, sizeof(XkbConfigRtrnRec));
    rtrn->line = 1;
    rtrn->click_volume = -1;
    rtrn->bell_volume = -1;
    while ((tok = XkbCFScan(file, &val, rtrn)) != XkbCF_EOF) {
        if (tok == XkbCF_Ident) {
            Bool done;

            for (tmp = fields, done = False; (tmp != NULL) && (!done);
                 tmp = tmp->next) {
                register int i;

                XkbConfigFieldPtr f;

                for (i = 0, f = tmp->fields; (i < tmp->num_fields) && (!done);
                     i++, f++) {
                    if (_XkbStrCaseCmp(val.str, f->field) != 0)
                        continue;
                    if ((*tmp->parser) (file, tmp, f, xkb, rtrn))
                        done = True;
                    else
                        goto BAILOUT;
                }
            }
        }
        else if ((tok != XkbCF_EOL) && (tok != XkbCF_Semi)) {
            rtrn->error = XkbCF_MissingIdent;
            goto BAILOUT;
        }
    }
    for (tmp = fields; tmp != NULL; tmp = tmp->next) {
        if ((tmp->finish) && (!(*tmp->finish) (tmp, xkb, rtrn, XkbCF_Check)))
            goto BAILOUT;
    }
    return True;
 BAILOUT:
    for (tmp = fields; tmp != NULL; tmp = tmp->next) {
        if (tmp->finish)
            (*tmp->finish) (tmp, xkb, rtrn, XkbCF_CleanUp);
    }
    return False;
}
コード例 #3
0
ファイル: ddxPrivate.c プロジェクト: narenas/nx-libs
int
XkbDDXPrivate(DeviceIntPtr dev,KeyCode key,XkbAction *act)
{
#ifdef XF86DDXACTIONS
    XkbAnyAction *xf86act = &(act->any);
    char msgbuf[XkbAnyActionDataSize+1];

    if (xf86act->type == XkbSA_XFree86Private) {
	memcpy(msgbuf, xf86act->data, XkbAnyActionDataSize);
	msgbuf[XkbAnyActionDataSize]= '\0';
	if (_XkbStrCaseCmp(msgbuf, "-vmode")==0)
	    xf86ProcessActionEvent(ACTION_PREV_MODE, NULL);
	else if (_XkbStrCaseCmp(msgbuf, "+vmode")==0)
	    xf86ProcessActionEvent(ACTION_NEXT_MODE, NULL);
	else if (_XkbStrCaseCmp(msgbuf, "ungrab")==0)
	    xf86ProcessActionEvent(ACTION_DISABLEGRAB, NULL);
	else if (_XkbStrCaseCmp(msgbuf, "clsgrb")==0)
	    xf86ProcessActionEvent(ACTION_CLOSECLIENT, NULL);
	else
	    xf86ProcessActionEvent(ACTION_MESSAGE, (void *) msgbuf);
    }
#endif
    return 0;
}
コード例 #4
0
ファイル: xkbconfig.c プロジェクト: Distrotech/libxkbfile
/*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;
}
コード例 #5
0
ファイル: xkbconfig.c プロジェクト: Distrotech/libxkbfile
static Bool
AddAXTimeoutOptByName(XkbConfigRtrnPtr rtrn,
                      char *name,
                      unsigned short *opts_rtrn)
{
    if (_XkbStrCaseCmp(name, "slowkeyspress") == 0)
        *opts_rtrn = XkbAX_SKPressFBMask;
    else if (_XkbStrCaseCmp(name, "slowkeysaccept") == 0)
        *opts_rtrn = XkbAX_SKAcceptFBMask;
    else if (_XkbStrCaseCmp(name, "feature") == 0)
        *opts_rtrn = XkbAX_FeatureFBMask;
    else if (_XkbStrCaseCmp(name, "slowwarn") == 0)
        *opts_rtrn = XkbAX_SlowWarnFBMask;
    else if (_XkbStrCaseCmp(name, "indicator") == 0)
        *opts_rtrn = XkbAX_IndicatorFBMask;
    else if (_XkbStrCaseCmp(name, "stickykeys") == 0)
        *opts_rtrn = XkbAX_StickyKeysFBMask;
    else if (_XkbStrCaseCmp(name, "twokeys") == 0)
        *opts_rtrn = XkbAX_TwoKeysMask;
    else if (_XkbStrCaseCmp(name, "latchtolock") == 0)
        *opts_rtrn = XkbAX_LatchToLockMask;
    else if (_XkbStrCaseCmp(name, "slowkeysrelease") == 0)
        *opts_rtrn = XkbAX_SKReleaseFBMask;
    else if (_XkbStrCaseCmp(name, "slowkeysreject") == 0)
        *opts_rtrn = XkbAX_SKRejectFBMask;
    else if (_XkbStrCaseCmp(name, "bouncekeysreject") == 0)
        *opts_rtrn = XkbAX_BKRejectFBMask;
    else if (_XkbStrCaseCmp(name, "dumbbell") == 0)
        *opts_rtrn = XkbAX_DumbBellFBMask;
    else {
        rtrn->error = XkbCF_ExpectedControl;
        return False;
    }
    return True;
}
コード例 #6
0
ファイル: xkbconfig.c プロジェクト: Distrotech/libxkbfile
static Bool
AddCtrlByName(XkbConfigRtrnPtr rtrn, char *name, unsigned long *ctrls_rtrn)
{
    if ((_XkbStrCaseCmp(name, "repeat") == 0) ||
        (_XkbStrCaseCmp(name, "repeatkeys") == 0))
        *ctrls_rtrn = XkbRepeatKeysMask;
    else if (_XkbStrCaseCmp(name, "slowkeys") == 0)
        *ctrls_rtrn = XkbSlowKeysMask;
    else if (_XkbStrCaseCmp(name, "bouncekeys") == 0)
        *ctrls_rtrn = XkbBounceKeysMask;
    else if (_XkbStrCaseCmp(name, "stickykeys") == 0)
        *ctrls_rtrn = XkbStickyKeysMask;
    else if (_XkbStrCaseCmp(name, "mousekeys") == 0)
        *ctrls_rtrn = XkbMouseKeysMask;
    else if (_XkbStrCaseCmp(name, "mousekeysaccel") == 0)
        *ctrls_rtrn = XkbMouseKeysAccelMask;
    else if (_XkbStrCaseCmp(name, "accessxkeys") == 0)
        *ctrls_rtrn = XkbAccessXKeysMask;
    else if (_XkbStrCaseCmp(name, "accessxtimeout") == 0)
        *ctrls_rtrn = XkbAccessXTimeoutMask;
    else if (_XkbStrCaseCmp(name, "accessxfeedback") == 0)
        *ctrls_rtrn = XkbAccessXFeedbackMask;
    else if (_XkbStrCaseCmp(name, "audiblebell") == 0)
        *ctrls_rtrn = XkbAudibleBellMask;
    else if (_XkbStrCaseCmp(name, "overlay1") == 0)
        *ctrls_rtrn = XkbOverlay1Mask;
    else if (_XkbStrCaseCmp(name, "overlay2") == 0)
        *ctrls_rtrn = XkbOverlay2Mask;
    else if (_XkbStrCaseCmp(name, "ignoregrouplock") == 0)
        *ctrls_rtrn = XkbIgnoreGroupLockMask;
    else {
        rtrn->error = XkbCF_ExpectedControl;
        return False;
    }
    return True;
}