summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-06-01 12:14:52 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-06-02 10:40:59 +1000
commitff1d6244eba8367a8d50601ca393e951c60c94b6 (patch)
tree16f3d737c439cbd16353d262dfae69955f310455
parent80ea32ad4f1440d068e18db65830f45498703b09 (diff)
input: add support for XIAnyModifier in passive XI2 grabs.
-rw-r--r--Xi/exevents.c5
-rw-r--r--dix/grabs.c44
2 files changed, 35 insertions, 14 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 5aca521c6..b19c8e214 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1406,10 +1406,13 @@ CheckGrabValues(ClientPtr client, GrabParameters* param)
client->errorValue = param->other_devices_mode;
return BadValue;
}
- if ((param->modifiers != AnyModifier) && (param->modifiers & ~AllModifiersMask)) {
+
+ if (param->grabtype != GRABTYPE_XI2 && (param->modifiers != AnyModifier) &&
+ (param->modifiers & ~AllModifiersMask)) {
client->errorValue = param->modifiers;
return BadValue;
}
+
if ((param->ownerEvents != xFalse) && (param->ownerEvents != xTrue)) {
client->errorValue = param->ownerEvents;
return BadValue;
diff --git a/dix/grabs.c b/dix/grabs.c
index cd90526ca..02f63f9b4 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -229,9 +229,12 @@ DetailSupersedesSecond(
static Bool
GrabSupersedesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
{
+ unsigned int any_modifier = (pFirstGrab->grabtype == GRABTYPE_XI2) ?
+ (unsigned int)XIAnyModifier :
+ (unsigned int)AnyModifier;
if (!DetailSupersedesSecond(pFirstGrab->modifiersDetail,
pSecondGrab->modifiersDetail,
- (unsigned int)AnyModifier))
+ any_modifier))
return FALSE;
if (DetailSupersedesSecond(pFirstGrab->detail,
@@ -257,6 +260,9 @@ GrabSupersedesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
Bool
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)
return FALSE;
@@ -278,7 +284,7 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
&&
DetailSupersedesSecond(pFirstGrab->modifiersDetail,
pSecondGrab->modifiersDetail,
- (unsigned int)AnyModifier))
+ any_modifier))
return TRUE;
if (DetailSupersedesSecond(pFirstGrab->detail, pSecondGrab->detail,
@@ -286,7 +292,7 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
&&
DetailSupersedesSecond(pSecondGrab->modifiersDetail,
pFirstGrab->modifiersDetail,
- (unsigned int)AnyModifier))
+ any_modifier))
return TRUE;
return FALSE;
@@ -295,6 +301,10 @@ GrabMatchesSecond(GrabPtr pFirstGrab, GrabPtr pSecondGrab, Bool ignoreDevice)
static Bool
GrabsAreIdentical(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
{
+ unsigned int any_modifier = (pFirstGrab->grabtype == GRABTYPE_XI2) ?
+ (unsigned int)XIAnyModifier :
+ (unsigned int)AnyModifier;
+
if (pFirstGrab->grabtype != pSecondGrab->grabtype)
return FALSE;
@@ -311,12 +321,13 @@ GrabsAreIdentical(GrabPtr pFirstGrab, GrabPtr pSecondGrab)
(unsigned int)AnyKey)))
return FALSE;
+
if (!(DetailSupersedesSecond(pFirstGrab->modifiersDetail,
pSecondGrab->modifiersDetail,
- (unsigned int)AnyModifier) &&
+ any_modifier) &&
DetailSupersedesSecond(pSecondGrab->modifiersDetail,
pFirstGrab->modifiersDetail,
- (unsigned int)AnyModifier)))
+ any_modifier)))
return FALSE;
return TRUE;
@@ -391,6 +402,8 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
Mask ***updates, **details;
int i, ndels, nadds, nups;
Bool ok;
+ unsigned int any_modifier;
+ unsigned int any_key;
#define UPDATE(mask,exact) \
if (!(details[nups] = DeleteDetailFromMask(mask, exact))) \
@@ -415,6 +428,11 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
if (deletes) xfree(deletes);
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;
ok = TRUE;
for (grab = wPassiveGrabs(pMinuendGrab->window);
@@ -429,19 +447,19 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
{
deletes[ndels++] = grab;
}
- else if ((grab->detail.exact == AnyKey)
- && (grab->modifiersDetail.exact != AnyModifier))
+ else if ((grab->detail.exact == any_key)
+ && (grab->modifiersDetail.exact != any_modifier))
{
UPDATE(grab->detail.pMask, pMinuendGrab->detail.exact);
}
- else if ((grab->modifiersDetail.exact == AnyModifier)
- && (grab->detail.exact != AnyKey))
+ else if ((grab->modifiersDetail.exact == any_modifier)
+ && (grab->detail.exact != any_key))
{
UPDATE(grab->modifiersDetail.pMask,
pMinuendGrab->modifiersDetail.exact);
}
- else if ((pMinuendGrab->detail.exact != AnyKey)
- && (pMinuendGrab->modifiersDetail.exact != AnyModifier))
+ else if ((pMinuendGrab->detail.exact != any_key)
+ && (pMinuendGrab->modifiersDetail.exact != any_modifier))
{
GrabPtr pNewGrab;
GrabParameters param;
@@ -452,7 +470,7 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
param.ownerEvents = grab->ownerEvents;
param.this_device_mode = grab->keyboardMode;
param.other_devices_mode = grab->pointerMode;
- param.modifiers = AnyModifier;
+ param.modifiers = any_modifier;
pNewGrab = CreateGrab(CLIENT_ID(grab->resource), grab->device,
grab->modifierDevice, grab->window,
@@ -479,7 +497,7 @@ DeletePassiveGrabFromList(GrabPtr pMinuendGrab)
else
adds[nadds++] = pNewGrab;
}
- else if (pMinuendGrab->detail.exact == AnyKey)
+ else if (pMinuendGrab->detail.exact == any_key)
{
UPDATE(grab->modifiersDetail.pMask,
pMinuendGrab->modifiersDetail.exact);