mirror of
https://github.com/X11Libre/xserver.git
synced 2026-10-22 01:20:26 +00:00
xace: drop map-window checking hook, add new hooks for controlling the
delivery of events to windows and clients. This is tentative. It's likely that an additional last-resort hook will be necessary for code that calls TryClientEvents or WriteEventsToClient directly. It's also possible that new xace machinery will be necessary to classify events and pull useful resource ID's out of them. The failure case also needs some thinking through. Should event delivery "succeed" or should it report undeliverable? Finally, XKB appears to call WriteToClient to pass events. Sigh.
This commit is contained in:
parent
41355a53c2
commit
e39694789e
5 changed files with 75 additions and 25 deletions
35
dix/events.c
35
dix/events.c
|
|
@ -1753,8 +1753,10 @@ DeliverEventsToWindow(WindowPtr pWin, xEvent *pEvents, int count,
|
|||
if (filter != CantBeFiltered &&
|
||||
!((wOtherEventMasks(pWin)|pWin->eventMask) & filter))
|
||||
return 0;
|
||||
if ( (attempt = TryClientEvents(wClient(pWin), pEvents, count,
|
||||
pWin->eventMask, filter, grab)) )
|
||||
if (XaceHook(XACE_RECEIVE_ACCESS, wClient(pWin), pWin, pEvents, count))
|
||||
nondeliveries--;
|
||||
else if ( (attempt = TryClientEvents(wClient(pWin), pEvents, count,
|
||||
pWin->eventMask, filter, grab)) )
|
||||
{
|
||||
if (attempt > 0)
|
||||
{
|
||||
|
|
@ -1781,7 +1783,10 @@ DeliverEventsToWindow(WindowPtr pWin, xEvent *pEvents, int count,
|
|||
other = (InputClients *)wOtherClients(pWin);
|
||||
for (; other; other = other->next)
|
||||
{
|
||||
if ( (attempt = TryClientEvents(rClient(other), pEvents, count,
|
||||
if (XaceHook(XACE_RECEIVE_ACCESS, rClient(other), pWin, pEvents,
|
||||
count))
|
||||
nondeliveries--;
|
||||
else if ( (attempt = TryClientEvents(rClient(other), pEvents, count,
|
||||
other->mask[mskidx], filter, grab)) )
|
||||
{
|
||||
if (attempt > 0)
|
||||
|
|
@ -1878,6 +1883,8 @@ MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents,
|
|||
return XineramaTryClientEventsResult(
|
||||
wClient(pWin), NullGrab, pWin->eventMask, filter);
|
||||
#endif
|
||||
if (XaceHook(XACE_RECEIVE_ACCESS, wClient(pWin), pWin, pEvents, count))
|
||||
return 0;
|
||||
return TryClientEvents(wClient(pWin), pEvents, count,
|
||||
pWin->eventMask, filter, NullGrab);
|
||||
}
|
||||
|
|
@ -1892,6 +1899,9 @@ MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents,
|
|||
return XineramaTryClientEventsResult(
|
||||
rClient(other), NullGrab, other->mask, filter);
|
||||
#endif
|
||||
if (XaceHook(XACE_RECEIVE_ACCESS, rClient(other), pWin, pEvents,
|
||||
count))
|
||||
return 0;
|
||||
return TryClientEvents(rClient(other), pEvents, count,
|
||||
other->mask, filter, NullGrab);
|
||||
}
|
||||
|
|
@ -1986,6 +1996,9 @@ DeliverDeviceEvents(WindowPtr pWin, xEvent *xE, GrabPtr grab,
|
|||
Mask filter = filters[type];
|
||||
int deliveries = 0;
|
||||
|
||||
if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count))
|
||||
return 0;
|
||||
|
||||
if (type & EXTENSION_EVENT_BASE)
|
||||
{
|
||||
OtherInputMasks *inputMasks;
|
||||
|
|
@ -2829,6 +2842,8 @@ DeliverFocusedEvent(DeviceIntPtr keybd, xEvent *xE, WindowPtr window, int count)
|
|||
return;
|
||||
}
|
||||
/* just deliver it to the focus window */
|
||||
if (XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, xE, count))
|
||||
return;
|
||||
FixUpEventFromWindow(xE, focus, None, FALSE);
|
||||
if (xE->u.u.type & EXTENSION_EVENT_BASE)
|
||||
mskidx = keybd->id;
|
||||
|
|
@ -2877,9 +2892,12 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev,
|
|||
if (!deliveries)
|
||||
{
|
||||
FixUpEventFromWindow(xE, grab->window, None, TRUE);
|
||||
deliveries = TryClientEvents(rClient(grab), xE, count,
|
||||
(Mask)grab->eventMask,
|
||||
filters[xE->u.u.type], grab);
|
||||
if (!XaceHook(XACE_SEND_ACCESS, thisDev, grab->window, xE, count) &&
|
||||
!XaceHook(XACE_RECEIVE_ACCESS, rClient(grab), grab->window, xE,
|
||||
count))
|
||||
deliveries = TryClientEvents(rClient(grab), xE, count,
|
||||
(Mask)grab->eventMask,
|
||||
filters[xE->u.u.type], grab);
|
||||
if (deliveries && (xE->u.u.type == MotionNotify
|
||||
#ifdef XINPUT
|
||||
|| xE->u.u.type == DeviceMotionNotify
|
||||
|
|
@ -4530,6 +4548,9 @@ ProcSendEvent(ClientPtr client)
|
|||
{
|
||||
for (;pWin; pWin = pWin->parent)
|
||||
{
|
||||
if (XaceHook(XACE_SEND_ACCESS, client, NULL, pWin,
|
||||
&stuff->event, 1))
|
||||
return Success;
|
||||
if (DeliverEventsToWindow(pWin, &stuff->event, 1, stuff->eventMask,
|
||||
NullGrab, 0))
|
||||
return Success;
|
||||
|
|
@ -4540,7 +4561,7 @@ ProcSendEvent(ClientPtr client)
|
|||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (!XaceHook(XACE_SEND_ACCESS, client, NULL, pWin, &stuff->event, 1))
|
||||
(void)DeliverEventsToWindow(pWin, &stuff->event, 1, stuff->eventMask,
|
||||
NullGrab, 0);
|
||||
return Success;
|
||||
|
|
|
|||
Loading…
Reference in a new issue