xkb: split effectiveGroup calculation into separate utility function.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
8fb3fa28a5
commit
4da59f4786
|
@ -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"
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user