summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-09-08 16:30:36 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-09-13 10:30:14 +1000
commit4da59f478686fa7e80a3837bf9fa61672c13c50b (patch)
tree33b6fea26b7b52869c981a881b754b6fa1ead3f9
parent8fb3fa28a5a1b36cdaad38055a607400828b9e1c (diff)
xkb: split effectiveGroup calculation into separate utility function.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--include/xkbsrv.h5
-rw-r--r--xkb/xkbActions.c29
-rw-r--r--xkb/xkbUtils.c35
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;
+}