dix: lookup function for WindowPtr by XID

This new lookup function retrieves a pointer to WindowRec structure by
associated XID. Unlike dixLookupWindow(), this one works globally, instead
of just on one specific client, and it doesn't do any XACE calls.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-09-04 18:42:15 +02:00
parent f6d9a1328a
commit b2b0f689f3
3 changed files with 54 additions and 0 deletions

View File

@ -306,4 +306,15 @@ void dixScreenRaiseClose(ScreenPtr pScreen);
*/ */
void dixScreenRaisePixmapDestroy(PixmapPtr pPixmap); void dixScreenRaisePixmapDestroy(PixmapPtr pPixmap);
/*
* @brief lookup window by XID
*
* This globally looks for Window with given XID (all screens, all clients)
* and returns a pointer to it. If not found, returns NULL.
*
* Unlike ::dixLookupWindow() it doesn't scan only one given client, nor does
* it do any XACE calls.
*/
WindowPtr dixLookupWindowByXID(Window window);
#endif /* _XSERVER_DIX_PRIV_H */ #endif /* _XSERVER_DIX_PRIV_H */

42
dix/lookup.c Normal file
View File

@ -0,0 +1,42 @@
/* SPDX-License-Identifier: MIT OR X11
*
* Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net>
*
* @brief DIX lookup functions
*/
#include <dix-config.h>
#include "dix/dix_priv.h"
#include "include/windowstr.h"
struct window_xid_match {
WindowPtr pWin;
Window id;
};
static int dix_match_window_xid(WindowPtr pWin, void *ptr)
{
struct window_xid_match *walk = (struct window_xid_match*) ptr;
if (walk->id == pWin->drawable.id) {
walk->pWin = pWin;
return WT_STOPWALKING;
}
else
return WT_WALKCHILDREN;
}
WindowPtr dixLookupWindowByXID(Window window)
{
struct window_xid_match walk = {
.id = window,
};
for (int i = 0; i < screenInfo.numScreens; i++) {
WalkTree(screenInfo.screens[i], dix_match_window_xid, &walk);
if (walk.pWin)
break;
}
return walk.pWin;
}

View File

@ -20,6 +20,7 @@ srcs_dix = [
'glyphcurs.c', 'glyphcurs.c',
'grabs.c', 'grabs.c',
'inpututils.c', 'inpututils.c',
'lookup.c',
'pixmap.c', 'pixmap.c',
'privates.c', 'privates.c',
'property.c', 'property.c',