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