Xi: deliver barrier events as grabbed events where necessary

If the grab_window is the barrier window and the client owns the grab,
deliver as normal grabbed event (respecting owner_events). Otherwise,
deliver as usual.

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 15:09:27 +10:00
parent 3b16140170
commit 353aa51592
1 changed files with 15 additions and 3 deletions

View File

@ -1647,6 +1647,7 @@ ProcessBarrierEvent(InternalEvent *e, DeviceIntPtr dev)
BarrierEvent *be = &e->barrier_event;
xEvent *ev;
int rc;
GrabPtr grab = dev->deviceGrab.grab;
if (!IsMaster(dev))
return;
@ -1660,10 +1661,21 @@ ProcessBarrierEvent(InternalEvent *e, DeviceIntPtr dev)
return;
}
filter = GetEventFilter(dev, ev);
/* A client has a grab, deliver to this client if the grab_window is the
barrier window.
DeliverEventsToWindow(dev, pWin, ev, 1,
filter, NullGrab);
Otherwise, deliver normally to the client.
*/
if (grab &&
CLIENT_ID(be->barrierid) == CLIENT_ID(grab->resource) &&
grab->window->drawable.id == be->window) {
DeliverGrabbedEvent(e, dev, FALSE);
} else {
filter = GetEventFilter(dev, ev);
DeliverEventsToWindow(dev, pWin, ev, 1,
filter, NullGrab);
}
free(ev);
}