diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2009-09-08 16:30:36 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-09-13 10:30:14 +1000 |
commit | 4da59f478686fa7e80a3837bf9fa61672c13c50b (patch) | |
tree | 33b6fea26b7b52869c981a881b754b6fa1ead3f9 | |
parent | 8fb3fa28a5a1b36cdaad38055a607400828b9e1c (diff) |
xkb: split effectiveGroup calculation into separate utility function.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | include/xkbsrv.h | 5 | ||||
-rw-r--r-- | xkb/xkbActions.c | 29 | ||||
-rw-r--r-- | xkb/xkbUtils.c | 35 |
3 files changed, 45 insertions, 24 deletions
diff --git a/include/xkbsrv.h b/include/xkbsrv.h index 2c7d86aaa..ebc7cdbb8 100644 --- a/include/xkbsrv.h +++ b/include/xkbsrv.h @@ -945,6 +945,11 @@ extern void XkbFilterEvents( int /* nEvents */, xEvent* /* xE */); +extern int XkbGetEffectiveGroup( + XkbSrvInfoPtr /* xkbi */, + XkbStatePtr /* xkbstate */, + CARD8 /* keycode */); + #include "xkbfile.h" #include "xkbrules.h" diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c index 9c3184a83..b0ab427b6 100644 --- a/xkb/xkbActions.c +++ b/xkb/xkbActions.c @@ -124,30 +124,11 @@ static XkbAction fake; } pActs= XkbKeyActionsPtr(xkb,key); col= 0; - effectiveGroup= xkbState->group; - if (effectiveGroup!=XkbGroup1Index) { - if (XkbKeyNumGroups(xkb,key)>(unsigned)1) { - if (effectiveGroup>=XkbKeyNumGroups(xkb,key)) { - unsigned gi= XkbKeyGroupInfo(xkb,key); - switch (XkbOutOfRangeGroupAction(gi)) { - default: - case XkbWrapIntoRange: - effectiveGroup %= XkbKeyNumGroups(xkb,key); - break; - case XkbClampIntoRange: - effectiveGroup = XkbKeyNumGroups(xkb,key)-1; - break; - case XkbRedirectIntoRange: - effectiveGroup= XkbOutOfRangeGroupInfo(gi); - if (effectiveGroup>=XkbKeyNumGroups(xkb,key)) - effectiveGroup= 0; - break; - } - } - } - else effectiveGroup= XkbGroup1Index; - col+= (effectiveGroup*XkbKeyGroupsWidth(xkb,key)); - } + + effectiveGroup = XkbGetEffectiveGroup(xkbi, xkbState, key); + if (effectiveGroup != XkbGroup1Index) + col += (effectiveGroup * XkbKeyGroupsWidth(xkb, key)); + type= XkbKeyKeyType(xkb,key,effectiveGroup); if (type->map!=NULL) { register unsigned i,mods; diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c index 63b1e31c7..75e243ca5 100644 --- a/xkb/xkbUtils.c +++ b/xkb/xkbUtils.c @@ -2118,3 +2118,38 @@ XkbCopyDeviceKeymap(DeviceIntPtr dst, DeviceIntPtr src) return ret; } +int +XkbGetEffectiveGroup(XkbSrvInfoPtr xkbi, XkbStatePtr xkbState, CARD8 keycode) +{ + XkbDescPtr xkb = xkbi->desc; + int effectiveGroup = xkbState->group; + + if (!XkbKeycodeInRange(xkb, keycode)) + return -1; + + if (effectiveGroup == XkbGroup1Index) + return effectiveGroup; + + if (XkbKeyNumGroups(xkb,keycode) > 1U) { + if (effectiveGroup >= XkbKeyNumGroups(xkb,keycode)) { + unsigned int gi = XkbKeyGroupInfo(xkb,keycode); + switch (XkbOutOfRangeGroupAction(gi)) { + default: + case XkbWrapIntoRange: + effectiveGroup %= XkbKeyNumGroups(xkb, keycode); + break; + case XkbClampIntoRange: + effectiveGroup = XkbKeyNumGroups(xkb, keycode) - 1; + break; + case XkbRedirectIntoRange: + effectiveGroup = XkbOutOfRangeGroupInfo(gi); + if (effectiveGroup >= XkbKeyNumGroups(xkb, keycode)) + effectiveGroup = 0; + break; + } + } + } + else effectiveGroup = XkbGroup1Index; + + return effectiveGroup; +} |