diff options
author | marha <marha@users.sourceforge.net> | 2009-09-15 15:05:16 +0000 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2009-09-15 15:05:16 +0000 |
commit | 1915b018a54e991c9289ee0c03488294e890caea (patch) | |
tree | 0eccc8afdcbcee10f91cfe418fc8c7cdcd4b0163 /xorg-server/xkb/xkbUtils.c | |
parent | 8bfa2f879ea38340a633c29120758a390b63667e (diff) | |
parent | 4db64b701ca08687df5932321d48f2ef29b99fed (diff) | |
download | vcxsrv-1915b018a54e991c9289ee0c03488294e890caea.tar.gz vcxsrv-1915b018a54e991c9289ee0c03488294e890caea.tar.bz2 vcxsrv-1915b018a54e991c9289ee0c03488294e890caea.zip |
svn merge https://vcxsrv.svn.sourceforge.net/svnroot/vcxsrv/branches/released .
Diffstat (limited to 'xorg-server/xkb/xkbUtils.c')
-rw-r--r-- | xorg-server/xkb/xkbUtils.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/xorg-server/xkb/xkbUtils.c b/xorg-server/xkb/xkbUtils.c index 63b1e31c7..75e243ca5 100644 --- a/xorg-server/xkb/xkbUtils.c +++ b/xorg-server/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; +} |