dix: skip delivery if it's not the right pointer barrier client

Only deliver to the client that created the barrier, not to other clients.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
This commit is contained in:
Peter Hutterer 2012-12-06 12:39:04 +10:00
parent c50db6faba
commit 1b83775f67

View File

@ -219,6 +219,9 @@ static void CheckVirtualMotion(DeviceIntPtr pDev, QdEventPtr qe,
static void CheckPhysLimits(DeviceIntPtr pDev, CursorPtr cursor,
Bool generateEvents, Bool confineToScreen,
ScreenPtr pScreen);
static Bool IsWrongPointerBarrierClient(ClientPtr client,
DeviceIntPtr dev,
xEvent *event);
/** Key repeat hack. Do not use but in TryClientEvents */
extern BOOL EventIsKeyRepeat(xEvent *event);
@ -2076,6 +2079,9 @@ DeliverEventToInputClients(DeviceIntPtr dev, InputClients * inputclients,
if (IsInterferingGrab(client, dev, events))
continue;
if (IsWrongPointerBarrierClient(client, dev, events))
continue;
mask = GetEventMask(dev, events, inputclients);
if (XaceHook(XACE_RECEIVE_ACCESS, client, win, events, count))
@ -6064,3 +6070,19 @@ IsInterferingGrab(ClientPtr client, DeviceIntPtr dev, xEvent *event)
return FALSE;
}
/* PointerBarrier events are only delivered to the client that created that
* barrier */
static Bool
IsWrongPointerBarrierClient(ClientPtr client, DeviceIntPtr dev, xEvent *event)
{
xXIBarrierEvent *ev = (xXIBarrierEvent*)event;
if (ev->type != GenericEvent || ev->extension != IReqCode)
return FALSE;
if (ev->evtype != XI_BarrierHit && ev->evtype != XI_BarrierLeave)
return FALSE;
return client->index != CLIENT_ID(ev->barrier);
}