input: add support for XIAnyModifier in passive XI2 grabs.

This commit is contained in:
Peter Hutterer 2009-06-01 12:14:52 +10:00
parent 80ea32ad4f
commit ff1d6244eb
2 changed files with 35 additions and 14 deletions

View File

@ -1406,10 +1406,13 @@ CheckGrabValues(ClientPtr client, GrabParameters* param)
client->errorValue = param->other_devices_mode; client->errorValue = param->other_devices_mode;
return BadValue; return BadValue;
} }
if ((param->modifiers != AnyModifier) && (param->modifiers & ~AllModifiersMask)) {
if (param->grabtype != GRABTYPE_XI2 && (param->modifiers != AnyModifier) &&
(param->modifiers & ~AllModifiersMask)) {
client->errorValue = param->modifiers; client->errorValue = param->modifiers;
return BadValue; return BadValue;
} }
if ((param->ownerEvents != xFalse) && (param->ownerEvents != xTrue)) { if ((param->ownerEvents != xFalse) && (param->ownerEvents != xTrue)) {
client->errorValue = param->ownerEvents; client->errorValue = param->ownerEvents;
return BadValue; return BadValue;

View File

@ -229,9 +229,12 @@ DetailSupersedesSecond(
static Bool static Bool
GrabSupersedesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab) GrabSupersedesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
{ {
unsigned int any_modifier = (pFirstGrab->grabtype == GRABTYPE_XI2) ?
(unsigned int)XIAnyModifier :
(unsigned int)AnyModifier;
if (!DetailSupersedesSecond(pFirstGrab->modifiersDetail, if (!DetailSupersedesSecond(pFirstGrab->modifiersDetail,
pSecondGrab->modifiersDetail, pSecondGrab->modifiersDetail,
(unsigned int)AnyModifier)) any_modifier))
return FALSE; return FALSE;
if (DetailSupersedesSecond(pFirstGrab->detail, if (DetailSupersedesSecond(pFirstGrab->detail,
@ -257,6 +260,9 @@ GrabSupersedesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
Bool Bool
GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice) GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
{ {
unsigned int any_modifier = (pFirstGrab->grabtype == GRABTYPE_XI2) ?
(unsigned int)XIAnyModifier :
(unsigned int)AnyModifier;
if (pFirstGrab->grabtype != pSecondGrab->grabtype) if (pFirstGrab->grabtype != pSecondGrab->grabtype)
return FALSE; return FALSE;
@ -278,7 +284,7 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
&& &&
DetailSupersedesSecond(pFirstGrab->modifiersDetail, DetailSupersedesSecond(pFirstGrab->modifiersDetail,
pSecondGrab->modifiersDetail, pSecondGrab->modifiersDetail,
(unsigned int)AnyModifier)) any_modifier))
return TRUE; return TRUE;
if (DetailSupersedesSecond(pFirstGrab->detail, pSecondGrab->detail, if (DetailSupersedesSecond(pFirstGrab->detail, pSecondGrab->detail,
@ -286,7 +292,7 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
&& &&
DetailSupersedesSecond(pSecondGrab->modifiersDetail, DetailSupersedesSecond(pSecondGrab->modifiersDetail,
pFirstGrab->modifiersDetail, pFirstGrab->modifiersDetail,
(unsigned int)AnyModifier)) any_modifier))
return TRUE; return TRUE;
return FALSE; return FALSE;
@ -295,6 +301,10 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
static Bool static Bool
GrabsAreIdentical(GrabPtr pFirstGrab, GrabPtr pSecondGrab) GrabsAreIdentical(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
{ {
unsigned int any_modifier = (pFirstGrab->grabtype == GRABTYPE_XI2) ?
(unsigned int)XIAnyModifier :
(unsigned int)AnyModifier;
if (pFirstGrab->grabtype != pSecondGrab->grabtype) if (pFirstGrab->grabtype != pSecondGrab->grabtype)
return FALSE; return FALSE;
@ -311,12 +321,13 @@ GrabsAreIdentical(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
(unsigned int)AnyKey))) (unsigned int)AnyKey)))
return FALSE; return FALSE;
if (!(DetailSupersedesSecond(pFirstGrab->modifiersDetail, if (!(DetailSupersedesSecond(pFirstGrab->modifiersDetail,
pSecondGrab->modifiersDetail, pSecondGrab->modifiersDetail,
(unsigned int)AnyModifier) && any_modifier) &&
DetailSupersedesSecond(pSecondGrab->modifiersDetail, DetailSupersedesSecond(pSecondGrab->modifiersDetail,
pFirstGrab->modifiersDetail, pFirstGrab->modifiersDetail,
(unsigned int)AnyModifier))) any_modifier)))
return FALSE; return FALSE;
return TRUE; return TRUE;
@ -391,6 +402,8 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
Mask ***updates, **details; Mask ***updates, **details;
int i, ndels, nadds, nups; int i, ndels, nadds, nups;
Bool ok; Bool ok;
unsigned int any_modifier;
unsigned int any_key;
#define UPDATE(mask,exact) \ #define UPDATE(mask,exact) \
if (!(details[nups] = DeleteDetailFromMask(mask, exact))) \ if (!(details[nups] = DeleteDetailFromMask(mask, exact))) \
@ -415,6 +428,11 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
if (deletes) xfree(deletes); if (deletes) xfree(deletes);
return FALSE; return FALSE;
} }
any_modifier = (pMinuendGrab->grabtype == GRABTYPE_XI2) ?
(unsigned int)XIAnyModifier : (unsigned int)AnyModifier;
any_key = (pMinuendGrab->grabtype == GRABTYPE_XI2) ?
(unsigned int)XIAnyKeysym : (unsigned int)AnyKey;
ndels = nadds = nups = 0; ndels = nadds = nups = 0;
ok = TRUE; ok = TRUE;
for (grab = wPassiveGrabs(pMinuendGrab->window); for (grab = wPassiveGrabs(pMinuendGrab->window);
@ -429,19 +447,19 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
{ {
deletes[ndels++] = grab; deletes[ndels++] = grab;
} }
else if ((grab->detail.exact == AnyKey) else if ((grab->detail.exact == any_key)
&& (grab->modifiersDetail.exact != AnyModifier)) && (grab->modifiersDetail.exact != any_modifier))
{ {
UPDATE(grab->detail.pMask, pMinuendGrab->detail.exact); UPDATE(grab->detail.pMask, pMinuendGrab->detail.exact);
} }
else if ((grab->modifiersDetail.exact == AnyModifier) else if ((grab->modifiersDetail.exact == any_modifier)
&& (grab->detail.exact != AnyKey)) && (grab->detail.exact != any_key))
{ {
UPDATE(grab->modifiersDetail.pMask, UPDATE(grab->modifiersDetail.pMask,
pMinuendGrab->modifiersDetail.exact); pMinuendGrab->modifiersDetail.exact);
} }
else if ((pMinuendGrab->detail.exact != AnyKey) else if ((pMinuendGrab->detail.exact != any_key)
&& (pMinuendGrab->modifiersDetail.exact != AnyModifier)) && (pMinuendGrab->modifiersDetail.exact != any_modifier))
{ {
GrabPtr pNewGrab; GrabPtr pNewGrab;
GrabParameters param; GrabParameters param;
@ -452,7 +470,7 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
param.ownerEvents = grab->ownerEvents; param.ownerEvents = grab->ownerEvents;
param.this_device_mode = grab->keyboardMode; param.this_device_mode = grab->keyboardMode;
param.other_devices_mode = grab->pointerMode; param.other_devices_mode = grab->pointerMode;
param.modifiers = AnyModifier; param.modifiers = any_modifier;
pNewGrab = CreateGrab(CLIENT_ID(grab->resource), grab->device, pNewGrab = CreateGrab(CLIENT_ID(grab->resource), grab->device,
grab->modifierDevice, grab->window, grab->modifierDevice, grab->window,
@ -479,7 +497,7 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
else else
adds[nadds++] = pNewGrab; adds[nadds++] = pNewGrab;
} }
else if (pMinuendGrab->detail.exact == AnyKey) else if (pMinuendGrab->detail.exact == any_key)
{ {
UPDATE(grab->modifiersDetail.pMask, UPDATE(grab->modifiersDetail.pMask,
pMinuendGrab->modifiersDetail.exact); pMinuendGrab->modifiersDetail.exact);