Add missing support for "affect" flag to selectively affect locking or unlocking for for modifier locking, control locking, and ISOLock. Fix some incorrect masking and modifier handling for ISOLock.
Signed-off-by: Andreas Wettstein <[email protected]> --- action.c | 102 ++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 62 insertions(+), 40 deletions(-) diff --git a/action.c b/action.c index 4623c0c..7188d6b 100644 --- a/action.c +++ b/action.c @@ -436,33 +436,13 @@ HandleSetLatchMods(XkbDescPtr xkb, return ReportIllegal(action->type, field); } -static Bool -HandleLockMods(XkbDescPtr xkb, - XkbAnyAction * action, - unsigned field, ExprDef * array_ndx, ExprDef * value) -{ - XkbModAction *act; - unsigned t1, t2; - - act = (XkbModAction *) action; - if ((array_ndx != NULL) && (field == F_Modifiers)) - return ReportActionNotArray(action->type, field); - switch (field) - { - case F_Modifiers: - t1 = act->flags; - if (CheckModifierField(xkb, action->type, value, &t1, &t2)) - { - act->flags = t1; - act->real_mods = act->mask = (t2 & 0xff); - t2 = (t2 >> 8) & 0xffff; - XkbSetModActionVMods(act, t2); - return True; - } - return False; - } - return ReportIllegal(action->type, field); -} +static LookupEntry lockWhich[] = { + {"both", 0}, + {"lock", XkbSA_LockNoUnlock}, + {"neither", (XkbSA_LockNoLock | XkbSA_LockNoUnlock)}, + {"unlock", XkbSA_LockNoLock}, + {NULL, 0} +}; static LookupEntry groupNames[] = { {"group1", 1}, @@ -514,6 +494,41 @@ CheckGroupField(unsigned action, } static Bool +HandleLockMods(XkbDescPtr xkb, + XkbAnyAction * action, + unsigned field, ExprDef * array_ndx, ExprDef * value) +{ + XkbModAction *act; + unsigned t1, t2; + ExprResult rtrn; + + act = (XkbModAction *) action; + if ((array_ndx != NULL) && (field == F_Modifiers || field == F_Affect)) + return ReportActionNotArray(action->type, field); + switch (field) + { + case F_Affect: + if (!ExprResolveEnum(value, &rtrn, lockWhich)) + return ReportMismatch(action->type, field, "lock or unlock"); + act->flags &= ~(XkbSA_LockNoLock | XkbSA_LockNoUnlock); + act->flags |= rtrn.ival; + return True; + case F_Modifiers: + t1 = act->flags; + if (CheckModifierField(xkb, action->type, value, &t1, &t2)) + { + act->flags = t1; + act->real_mods = act->mask = (t2 & 0xff); + t2 = (t2 >> 8) & 0xffff; + XkbSetModActionVMods(act, t2); + return True; + } + return False; + } + return ReportIllegal(action->type, field); +} + +static Bool HandleSetLatchGroup(XkbDescPtr xkb, XkbAnyAction * action, unsigned field, ExprDef * array_ndx, ExprDef * value) @@ -641,14 +656,6 @@ static LookupEntry btnNames[] = { {NULL, 0} }; -static LookupEntry lockWhich[] = { - {"both", 0}, - {"lock", XkbSA_LockNoUnlock}, - {"neither", (XkbSA_LockNoLock | XkbSA_LockNoUnlock)}, - {"unlock", XkbSA_LockNoLock}, - {NULL, 0} -}; - static Bool HandlePtrBtn(XkbDescPtr xkb, XkbAnyAction * action, @@ -779,8 +786,12 @@ static LookupEntry isoNames[] = { {"pointer", XkbSA_ISONoAffectPtr}, {"ctrls", XkbSA_ISONoAffectCtrls}, {"controls", XkbSA_ISONoAffectCtrls}, - {"all", ~((unsigned) 0)}, + {"all", XkbSA_ISOAffectMask}, {"none", 0}, + {"both", 0}, + {"lock", XkbSA_LockNoUnlock}, + {"neither", (XkbSA_LockNoLock | XkbSA_LockNoUnlock)}, + {"unlock", XkbSA_LockNoLock}, {NULL, 0}, }; @@ -804,8 +815,8 @@ HandleISOLock(XkbDescPtr xkb, if (CheckModifierField(xkb, action->type, value, &flags, &mods)) { act->flags = flags & (~XkbSA_ISODfltIsGroup); - act->real_mods = mods & 0xff; - mods = (mods >> 8) & 0xff; + act->real_mods = act->mask = (mods & 0xff); + mods = (mods >> 8) & 0xffff; XkbSetModActionVMods(act, mods); return True; } @@ -826,7 +837,9 @@ HandleISOLock(XkbDescPtr xkb, return ReportActionNotArray(action->type, field); if (!ExprResolveMask(value, &rtrn, SimpleLookup, (XPointer) isoNames)) return ReportMismatch(action->type, field, "keyboard component"); - act->affect = (~rtrn.uval) & XkbSA_ISOAffectMask; + act->affect = (~rtrn.uval) & XkbSA_ISOAffectMask; + act->flags &= ~(XkbSA_LockNoLock | XkbSA_LockNoUnlock); + act->flags |= rtrn.ival & (XkbSA_LockNoLock | XkbSA_LockNoUnlock); return True; } return ReportIllegal(action->type, field); @@ -943,6 +956,15 @@ HandleSetLockControls(XkbDescPtr xkb, XkbActionSetCtrls(act, rtrn.uval); return True; } + else if (field == F_Affect && action->type == XkbSA_LockControls) { + if (array_ndx != NULL) + return ReportActionNotArray(action->type, field); + if (!ExprResolveEnum(value, &rtrn, lockWhich)) + return ReportMismatch(action->type, field, "lock or unlock"); + act->flags &= ~(XkbSA_LockNoLock | XkbSA_LockNoUnlock); + act->flags |= rtrn.ival; + return True; + } return ReportIllegal(action->type, field); } @@ -1289,7 +1311,7 @@ ApplyActionFactoryDefaults(XkbAction * action) } else if (action->type == XkbSA_ISOLock) { - action->iso.real_mods = LockMask; + action->iso.real_mods = action->iso.mask = LockMask; } return; } -- 1.8.3.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
