dix: add dixClientForGrab()

Helper function for retrieving the owning client of a grab.

It's an actual function, so callers don't need access to internal
knowledge (definition of GrabRec, clients[] array, ...)

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult
2025-03-06 12:37:59 +01:00
committed by Enrico Weigelt, metux IT consult .
parent 8acb734370
commit 51b4c8b767
4 changed files with 35 additions and 14 deletions

View File

@@ -3827,7 +3827,7 @@ ActivatePassiveGrab(DeviceIntPtr device, GrabPtr grab, InternalEvent *event,
FixUpEventFromWindow(pSprite, xE, grab->window, None, TRUE);
/* XXX: XACE? */
TryClientEvents(rClient(grab), device, xE, count,
TryClientEvents(dixClientForGrab(grab), device, xE, count,
GetEventFilter(device, xE),
GetEventFilter(device, xE), grab);
}
@@ -3867,7 +3867,7 @@ CoreGrabInterferes(DeviceIntPtr device, GrabPtr grab)
GrabPtr othergrab = other->deviceGrab.grab;
if (othergrab && othergrab->grabtype == CORE &&
SameClient(grab, rClient(othergrab)) &&
SameClient(grab, dixClientForGrab(othergrab)) &&
((IsPointerDevice(grab->device) &&
IsPointerDevice(othergrab->device)) ||
(IsKeyboardDevice(grab->device) &&
@@ -4326,10 +4326,10 @@ DeliverOneGrabbedEvent(InternalEvent *event, DeviceIntPtr dev,
if (rc == Success) {
FixUpEventFromWindow(pSprite, xE, grab->window, None, TRUE);
if (XaceHookSendAccess(0, dev, grab->window, xE, count) ||
XaceHookReceiveAccess(rClient(grab), grab->window, xE, count))
XaceHookReceiveAccess(dixClientForGrab(grab), grab->window, xE, count))
deliveries = 1; /* don't send, but pretend we did */
else if (level != CORE || !IsInterferingGrab(rClient(grab), dev, xE)) {
deliveries = TryClientEvents(rClient(grab), dev,
else if (level != CORE || !IsInterferingGrab(dixClientForGrab(grab), dev, xE)) {
deliveries = TryClientEvents(dixClientForGrab(grab), dev,
xE, count, mask, filter, grab);
}
}
@@ -4684,7 +4684,7 @@ CoreEnterLeaveEvent(DeviceIntPtr mouse,
if (grab) {
mask = (pWin == grab->window) ? grab->eventMask : 0;
if (grab->ownerEvents)
mask |= EventMaskForClient(pWin, rClient(grab));
mask |= EventMaskForClient(pWin, dixClientForGrab(grab));
}
else {
mask = pWin->eventMask | wOtherEventMasks(pWin);
@@ -4712,7 +4712,7 @@ CoreEnterLeaveEvent(DeviceIntPtr mouse,
if ((mask & GetEventFilter(mouse, &event))) {
if (grab)
TryClientEvents(rClient(grab), mouse, &event, 1, mask,
TryClientEvents(dixClientForGrab(grab), mouse, &event, 1, mask,
GetEventFilter(mouse, &event), grab);
else
DeliverEventsToWindow(mouse, pWin, &event, 1,
@@ -4723,7 +4723,7 @@ CoreEnterLeaveEvent(DeviceIntPtr mouse,
xKeymapEvent ke = {
.type = KeymapNotify
};
ClientPtr client = grab ? rClient(grab) : dixClientForWindow(pWin);
ClientPtr client = grab ? dixClientForGrab(grab) : dixClientForWindow(pWin);
int rc;
rc = XaceHookDeviceAccess(client, keybd, DixReadAccess);
@@ -4731,7 +4731,7 @@ CoreEnterLeaveEvent(DeviceIntPtr mouse,
memcpy((char *) &ke.map[0], (char *) &keybd->key->down[1], 31);
if (grab)
TryClientEvents(rClient(grab), keybd, (xEvent *) &ke, 1,
TryClientEvents(dixClientForGrab(grab), keybd, (xEvent *) &ke, 1,
mask, KeymapStateMask, grab);
else
DeliverEventsToWindow(mouse, pWin, (xEvent *) &ke, 1,
@@ -4803,7 +4803,7 @@ DeviceEnterLeaveEvent(DeviceIntPtr mouse,
Mask mask;
mask = xi2mask_isset(grab->xi2mask, mouse, type);
TryClientEvents(rClient(grab), mouse, (xEvent *) event, 1, mask, 1,
TryClientEvents(dixClientForGrab(grab), mouse, (xEvent *) event, 1, mask, 1,
grab);
}
else {

View File

@@ -7,6 +7,9 @@
#include <dix-config.h>
#include "dix/dix_priv.h"
#include "dix/resource_priv.h"
#include "include/input.h"
#include "include/inputstr.h"
#include "include/windowstr.h"
ClientPtr dixClientForWindow(WindowPtr pWin) {
@@ -15,3 +18,10 @@ ClientPtr dixClientForWindow(WindowPtr pWin) {
return clients[CLIENT_ID(pWin->drawable.id)];
}
ClientPtr dixClientForGrab(GrabPtr pGrab) {
if (!pGrab)
return NullClient;
return clients[CLIENT_ID(pGrab->resource)];
}

View File

@@ -18,4 +18,15 @@
*/
ClientPtr dixClientForWindow(WindowPtr pWin);
/*
* @brief retrieve client that owns given grab
*
* XIDs carry the ID of the client who created/owns the resource in upper bits.
* (every client so is assigned a range of XIDs it may use for resource creation)
*
* @param GrabPtr to the grab whose owning client shall be retrieved
* @return pointer to ClientRec structure or NullClient (NULL)
*/
ClientPtr dixClientForGrab(GrabPtr pGrab);
#endif /* _XSERVER_DIX_RESOURCE_PRIV_H */