diff --git a/dix/dix_priv.h b/dix/dix_priv.h index 8afc6564d..aa946570e 100644 --- a/dix/dix_priv.h +++ b/dix/dix_priv.h @@ -306,4 +306,15 @@ void dixScreenRaiseClose(ScreenPtr pScreen); */ 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 */ diff --git a/dix/lookup.c b/dix/lookup.c new file mode 100644 index 000000000..0aca0a4fe --- /dev/null +++ b/dix/lookup.c @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: MIT OR X11 + * + * Copyright © 2024 Enrico Weigelt, metux IT consult + * + * @brief DIX lookup functions + */ +#include + +#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; +} diff --git a/dix/meson.build b/dix/meson.build index 1e47c32e3..2e748c5ce 100644 --- a/dix/meson.build +++ b/dix/meson.build @@ -20,6 +20,7 @@ srcs_dix = [ 'glyphcurs.c', 'grabs.c', 'inpututils.c', + 'lookup.c', 'pixmap.c', 'privates.c', 'property.c',