From 45af07aa96cd64848379f0ad5c611cb66a357d23 Mon Sep 17 00:00:00 2001 From: Andreas Wettstein Date: Sun, 7 Aug 2011 09:58:09 +0200 Subject: [PATCH] xkb: Support noLock and noUnlock flags for LockMods Use the same syntax as mouse button emulation. Signed-off-by: Andreas Wettstein --- action.c | 25 ++++++++++++++++--------- 1 files changed, 16 insertions(+), 9 deletions(-) diff --git a/action.c b/action.c index 3b82e64..785c92d 100644 --- a/action.c +++ b/action.c @@ -436,19 +436,34 @@ HandleSetLatchMods(XkbDescPtr xkb, return ReportIllegal(action->type, field); } +static LookupEntry lockWhich[] = { + {"both", 0}, + {"lock", XkbSA_LockNoUnlock}, + {"neither", (XkbSA_LockNoLock | XkbSA_LockNoUnlock)}, + {"unlock", XkbSA_LockNoLock}, + {NULL, 0} +}; + static Bool HandleLockMods(XkbDescPtr xkb, XkbAnyAction * action, unsigned field, ExprDef * array_ndx, ExprDef * value) { + ExprResult rtrn; XkbModAction *act; unsigned t1, t2; act = (XkbModAction *) action; - if ((array_ndx != NULL) && (field == F_Modifiers)) + 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)) @@ -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, -- 1.7.6