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; }
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; }
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; }
/*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; }
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; }
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; }