diff --git a/Xext/namespace/hook-property.c b/Xext/namespace/hook-property.c new file mode 100644 index 000000000..9af5b524a --- /dev/null +++ b/Xext/namespace/hook-property.c @@ -0,0 +1,47 @@ +#define HOOK_NAME "property" + +#include + +#include + +#include "dix/dix_priv.h" +#include "dix/registry_priv.h" +#include "include/propertyst.h" +#include "Xext/xacestr.h" + +#include "namespace.h" +#include "hooks.h" + +static inline Bool winIsRoot(WindowPtr pWin) { + if (!pWin) + return FALSE; + if (pWin->drawable.pScreen->root == pWin) + return TRUE; + return FALSE; +} + +void hookPropertyAccess(CallbackListPtr *pcbl, void *unused, void *calldata) +{ + XNS_HOOK_HEAD(XacePropertyAccessRec); + struct XnamespaceClientPriv *obj = XnsClientPriv(dixClientForWindow(param->pWin)); + + ATOM name = (*param->ppProp)->propertyName; + + if (XnsClientSameNS(subj, obj)) + return; + + if (param->pWin == subj->ns->rootWindow) + return; + + if (winIsRoot(param->pWin)) { + XNS_HOOK_LOG("window is the screen's root window\n"); + } else { + XNS_HOOK_LOG("not a root window\n"); + } + + XNS_HOOK_LOG("access to property %s (atom 0x%x) window 0x%lx of client %d\n", + NameForAtom(name), + name, + (unsigned long)param->pWin->drawable.id, + dixClientForWindow(param->pWin)->index); +} diff --git a/Xext/namespace/hooks.h b/Xext/namespace/hooks.h index 8848a5087..3e747da49 100644 --- a/Xext/namespace/hooks.h +++ b/Xext/namespace/hooks.h @@ -30,6 +30,7 @@ void hookDevice(CallbackListPtr *pcbl, void *unused, void *calldata); void hookExtAccess(CallbackListPtr *pcbl, void *unused, void *calldata); void hookExtDispatch(CallbackListPtr *pcbl, void *unused, void *calldata); void hookInitRootWindow(CallbackListPtr *pcbl, void *unused, void *calldata); +void hookPropertyAccess(CallbackListPtr *pcbl, void *unused, void *calldata); void hookReceive(CallbackListPtr *pcbl, void *unused, void *calldata); void hookResourceAccess(CallbackListPtr *pcbl, void *unused, void *calldata); void hookSelectionFilter(CallbackListPtr *pcbl, void *unused, void *calldata); diff --git a/Xext/namespace/meson.build b/Xext/namespace/meson.build index efff71ec4..ad9fb029c 100644 --- a/Xext/namespace/meson.build +++ b/Xext/namespace/meson.build @@ -8,6 +8,7 @@ libxserver_namespace = static_library( 'hook-ext-access.c', 'hook-ext-dispatch.c', 'hook-init-rootwindow.c', + 'hook-property.c', 'hook-receive.c', 'hook-resource.c', 'hook-selection.c', diff --git a/Xext/namespace/namespace.c b/Xext/namespace/namespace.c index eb9cc92b2..77bd92198 100644 --- a/Xext/namespace/namespace.c +++ b/Xext/namespace/namespace.c @@ -38,6 +38,7 @@ NamespaceExtensionInit(void) XaceRegisterCallback(XACE_DEVICE_ACCESS, hookDevice, NULL) && XaceRegisterCallback(XACE_EXT_DISPATCH, hookExtDispatch, NULL) && XaceRegisterCallback(XACE_EXT_ACCESS, hookExtAccess, NULL) && + XaceRegisterCallback(XACE_PROPERTY_ACCESS, hookPropertyAccess, NULL) && XaceRegisterCallback(XACE_RECEIVE_ACCESS, hookReceive, NULL) && XaceRegisterCallback(XACE_RESOURCE_ACCESS, hookResourceAccess, NULL) && XaceRegisterCallback(XACE_SEND_ACCESS, hookSend, NULL) &&