dix: split core grab interference check into helper function

No functional changes.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
Peter Hutterer 2011-12-07 13:57:25 +10:00
parent 97d79dd740
commit d253a262c2

View File

@ -3727,6 +3727,30 @@ ActivatePassiveGrab(DeviceIntPtr device, GrabPtr grab, InternalEvent *event)
return TRUE; return TRUE;
} }
static BOOL
CoreGrabInterferes(DeviceIntPtr device, GrabPtr grab)
{
DeviceIntPtr other;
BOOL interfering = FALSE;
for (other = inputInfo.devices; other; other = other->next)
{
GrabPtr othergrab = other->deviceGrab.grab;
if (othergrab && othergrab->grabtype == GRABTYPE_CORE &&
SameClient(grab, rClient(othergrab)) &&
((IsPointerDevice(grab->device) &&
IsPointerDevice(othergrab->device)) ||
(IsKeyboardDevice(grab->device) &&
IsKeyboardDevice(othergrab->device))))
{
interfering = TRUE;
break;
}
}
return interfering;
}
/** /**
* Check an individual grab against an event to determine if a passive grab * Check an individual grab against an event to determine if a passive grab
* should be activated. * should be activated.
@ -3806,9 +3830,6 @@ CheckPassiveGrab(DeviceIntPtr device, GrabPtr grab, InternalEvent *event,
if (grab->grabtype == GRABTYPE_CORE) if (grab->grabtype == GRABTYPE_CORE)
{ {
DeviceIntPtr other;
BOOL interfering = FALSE;
/* A passive grab may have been created for a different device /* A passive grab may have been created for a different device
than it is assigned to at this point in time. than it is assigned to at this point in time.
Update the grab's device and modifier device to reflect the Update the grab's device and modifier device to reflect the
@ -3822,21 +3843,7 @@ CheckPassiveGrab(DeviceIntPtr device, GrabPtr grab, InternalEvent *event,
grab->modifierDevice = GetMaster(device, MASTER_KEYBOARD); grab->modifierDevice = GetMaster(device, MASTER_KEYBOARD);
} }
for (other = inputInfo.devices; other; other = other->next) if (CoreGrabInterferes(device, grab))
{
GrabPtr othergrab = other->deviceGrab.grab;
if (othergrab && othergrab->grabtype == GRABTYPE_CORE &&
SameClient(grab, rClient(othergrab)) &&
((IsPointerDevice(grab->device) &&
IsPointerDevice(othergrab->device)) ||
(IsKeyboardDevice(grab->device) &&
IsKeyboardDevice(othergrab->device))))
{
interfering = TRUE;
break;
}
}
if (interfering)
return FALSE; return FALSE;
} }