diff --git a/Xext/namespace/hook-clientstate.c b/Xext/namespace/hook-clientstate.c index ead262dba5..bf33aca3a7 100644 --- a/Xext/namespace/hook-clientstate.c +++ b/Xext/namespace/hook-clientstate.c @@ -33,13 +33,23 @@ void hookClientState(CallbackListPtr *pcbl, void *unused, void *calldata) break; case ClientStateRetained: - XnamespaceAssignClient(subj, NULL); break; case ClientStateGone: - XnamespaceAssignClient(subj, NULL); break; default: XNS_HOOK_LOG("unknown state =%d\n", client->clientState); break; } } + +void hookClientDestroy(CallbackListPtr *pcbl, void *unused, void *calldata) +{ + ClientPtr client = calldata; + struct XnamespaceClientPriv *subj = XnsClientPriv(client); + + if (!subj) + return; /* no XNS devprivate assigned ? */ + + XnamespaceAssignClient(subj, NULL); + /* the devprivate is embedded, so no free() necessary */ +} diff --git a/Xext/namespace/hooks.h b/Xext/namespace/hooks.h index 3e747da494..2ca1a2fa34 100644 --- a/Xext/namespace/hooks.h +++ b/Xext/namespace/hooks.h @@ -26,6 +26,7 @@ void hookClient(CallbackListPtr *pcbl, void *unused, void *calldata); void hookClientState(CallbackListPtr *pcbl, void *unused, void *calldata); +void hookClientDestroy(CallbackListPtr *pcbl, void *unused, void *calldata); void hookDevice(CallbackListPtr *pcbl, void *unused, void *calldata); void hookExtAccess(CallbackListPtr *pcbl, void *unused, void *calldata); void hookExtDispatch(CallbackListPtr *pcbl, void *unused, void *calldata); diff --git a/Xext/namespace/namespace.c b/Xext/namespace/namespace.c index df0c1e87ba..6e6224fd68 100644 --- a/Xext/namespace/namespace.c +++ b/Xext/namespace/namespace.c @@ -3,6 +3,7 @@ #include #include +#include "dix/client_priv.h" #include "dix/dix_priv.h" #include "dix/extension_priv.h" #include "dix/property_priv.h" @@ -39,6 +40,7 @@ NamespaceExtensionInit(void) AddCallback(&ExtensionAccessCallback, hookExtAccess, NULL) && AddCallback(&ExtensionDispatchCallback, hookExtDispatch, NULL) && AddCallback(&ServerAccessCallback, hookServerAccess, NULL) && + AddCallback(&ClientDestroyCallback, hookClientDestroy, NULL) && XaceRegisterCallback(XACE_CLIENT_ACCESS, hookClient, NULL) && XaceRegisterCallback(XACE_DEVICE_ACCESS, hookDevice, NULL) && XaceRegisterCallback(XACE_PROPERTY_ACCESS, hookPropertyAccess, NULL) &&