dix: split out window owner event delivery from DeliverEventsToWindow
No functional changes, just for readability. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jamey Sharp <jamey@minilop.net>
This commit is contained in:
parent
a311a03135
commit
536ca28f1b
75
dix/events.c
75
dix/events.c
|
@ -1987,6 +1987,43 @@ ActivateImplicitGrab(DeviceIntPtr dev, ClientPtr client, WindowPtr win,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum EventDeliveryState {
|
||||||
|
EVENT_DELIVERED, /**< Event has been delivered to a client */
|
||||||
|
EVENT_NOT_DELIVERED, /**< Event was not delivered to any client */
|
||||||
|
EVENT_SKIP, /**< Event can be discarded by the caller */
|
||||||
|
EVENT_REJECTED, /**< Event was rejected for delivery to the client */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt event delivery to the client owning the window.
|
||||||
|
*/
|
||||||
|
static enum EventDeliveryState
|
||||||
|
DeliverToWindowOwner(DeviceIntPtr dev, WindowPtr win,
|
||||||
|
xEvent *events, int count, Mask filter,
|
||||||
|
GrabPtr grab)
|
||||||
|
{
|
||||||
|
/* if nobody ever wants to see this event, skip some work */
|
||||||
|
if (filter != CantBeFiltered &&
|
||||||
|
!((wOtherEventMasks(win)|win->eventMask) & filter))
|
||||||
|
return EVENT_SKIP;
|
||||||
|
|
||||||
|
if (IsInterferingGrab(wClient(win), dev, events))
|
||||||
|
return EVENT_SKIP;
|
||||||
|
|
||||||
|
if (!XaceHook(XACE_RECEIVE_ACCESS, wClient(win), win, events, count))
|
||||||
|
{
|
||||||
|
int attempt = TryClientEvents(wClient(win), dev, events,
|
||||||
|
count, win->eventMask,
|
||||||
|
filter, grab);
|
||||||
|
if (attempt > 0)
|
||||||
|
return EVENT_DELIVERED;
|
||||||
|
if (attempt < 0)
|
||||||
|
return EVENT_REJECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EVENT_NOT_DELIVERED;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deliver events to a window. At this point, we do not yet know if the event
|
* Deliver events to a window. At this point, we do not yet know if the event
|
||||||
* actually needs to be delivered. May activate a grab if the event is a
|
* actually needs to be delivered. May activate a grab if the event is a
|
||||||
|
@ -2023,28 +2060,26 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
|
||||||
/* Deliver to window owner */
|
/* Deliver to window owner */
|
||||||
if ((filter == CantBeFiltered) || CORE_EVENT(pEvents))
|
if ((filter == CantBeFiltered) || CORE_EVENT(pEvents))
|
||||||
{
|
{
|
||||||
/* if nobody ever wants to see this event, skip some work */
|
enum EventDeliveryState rc;
|
||||||
if (filter != CantBeFiltered &&
|
|
||||||
!((wOtherEventMasks(pWin)|pWin->eventMask) & filter))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (IsInterferingGrab(wClient(pWin), pDev, pEvents))
|
rc = DeliverToWindowOwner(pDev, pWin, pEvents, count, filter, grab);
|
||||||
|
|
||||||
|
switch(rc)
|
||||||
|
{
|
||||||
|
case EVENT_SKIP:
|
||||||
return 0;
|
return 0;
|
||||||
|
case EVENT_REJECTED:
|
||||||
if (XaceHook(XACE_RECEIVE_ACCESS, wClient(pWin), pWin, pEvents, count))
|
nondeliveries--;
|
||||||
/* do nothing */;
|
break;
|
||||||
else if ( (attempt = TryClientEvents(wClient(pWin), pDev, pEvents,
|
case EVENT_DELIVERED:
|
||||||
count, pWin->eventMask,
|
/* We delivered to the owner, with our event mask */
|
||||||
filter, grab)) )
|
deliveries++;
|
||||||
{
|
client = wClient(pWin);
|
||||||
if (attempt > 0)
|
deliveryMask = pWin->eventMask;
|
||||||
{
|
break;
|
||||||
deliveries++;
|
case EVENT_NOT_DELIVERED:
|
||||||
client = wClient(pWin);
|
break;
|
||||||
deliveryMask = pWin->eventMask;
|
}
|
||||||
} else
|
|
||||||
nondeliveries--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* CantBeFiltered means only window owner gets the event */
|
/* CantBeFiltered means only window owner gets the event */
|
||||||
|
|
Loading…
Reference in New Issue