From 33a66a7810e54244cc1104a39101bf9f960a4d7b Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Thu, 25 Jan 2024 16:38:10 +0100 Subject: [PATCH] Xnamespace: add per-client private data Signed-off-by: Enrico Weigelt, metux IT consult --- Xext/namespace/namespace.c | 33 +++++++++++++++++++++++++++++++++ Xext/namespace/namespace.h | 26 ++++++++++++++++++++++++++ dix/privates.c | 1 + include/privates.h | 1 + 4 files changed, 61 insertions(+) diff --git a/Xext/namespace/namespace.c b/Xext/namespace/namespace.c index 82c4db3db..8631cf93f 100644 --- a/Xext/namespace/namespace.c +++ b/Xext/namespace/namespace.c @@ -3,6 +3,7 @@ #include #include +#include "dix/dix_priv.h" #include "include/extinit_priv.h" #include "include/os.h" @@ -10,6 +11,8 @@ Bool noNamespaceExtension = TRUE; +DevPrivateKeyRec namespaceClientPrivKeyRec = { 0 }; + void NamespaceExtensionInit(void) { @@ -20,4 +23,34 @@ NamespaceExtensionInit(void) XNS_LOG("No config file. disabling Xns extension\n"); return; } + + if (!dixRegisterPrivateKey + (&namespaceClientPrivKeyRec, PRIVATE_CLIENT, sizeof(struct XnamespaceClientPriv))) + FatalError("NamespaceExtensionInit: allocation failure\n"); + + /* Do the serverClient */ + struct XnamespaceClientPriv *srv = XnsClientPriv(serverClient); + *srv = (struct XnamespaceClientPriv) { .isServer = TRUE }; + XnamespaceAssignClient(srv, &ns_root); +} + +void XnamespaceAssignClient(struct XnamespaceClientPriv *priv, struct Xnamespace *newns) +{ + if (priv->ns != NULL) + priv->ns->refcnt--; + + priv->ns = newns; + + if (newns != NULL) + newns->refcnt++; +} + +void XnamespaceAssignClientByName(struct XnamespaceClientPriv *priv, const char *name) +{ + struct Xnamespace *newns = XnsFindByName(name); + + if (newns == NULL) + newns = &ns_anon; + + XnamespaceAssignClient(priv, newns); } diff --git a/Xext/namespace/namespace.h b/Xext/namespace/namespace.h index 8100ad139..93549eb31 100644 --- a/Xext/namespace/namespace.h +++ b/Xext/namespace/namespace.h @@ -4,7 +4,9 @@ #include #include +#include "include/dixstruct.h" #include "include/list.h" +#include "include/privates.h" #include "include/window.h" struct Xnamespace { @@ -19,11 +21,35 @@ extern struct xorg_list ns_list; extern struct Xnamespace ns_root; extern struct Xnamespace ns_anon; +struct XnamespaceClientPriv { + Bool isServer; + XID authId; + struct Xnamespace* ns; +}; + #define NS_NAME_ROOT "root" #define NS_NAME_ANONYMOUS "anon" +extern DevPrivateKeyRec namespaceClientPrivKeyRec; + Bool XnsLoadConfig(void); struct Xnamespace *XnsFindByName(const char* name); +void XnamespaceAssignClient(struct XnamespaceClientPriv *priv, struct Xnamespace *ns); +void XnamespaceAssignClientByName(struct XnamespaceClientPriv *priv, const char *name); + +static inline struct XnamespaceClientPriv *XnsClientPriv(ClientPtr client) { + if (client == NULL) return NULL; + return dixLookupPrivate(&client->devPrivates, &namespaceClientPrivKeyRec); +} + +static inline Bool XnsClientSameNS(struct XnamespaceClientPriv *p1, struct XnamespaceClientPriv *p2) +{ + if (!p1 && !p2) + return TRUE; + if (!p1 || !p2) + return FALSE; + return (p1->ns == p2->ns); +} #define XNS_LOG(...) do { printf("XNS "); printf(__VA_ARGS__); } while (0) diff --git a/dix/privates.c b/dix/privates.c index 16b37fbd5..5bfca0ff2 100644 --- a/dix/privates.c +++ b/dix/privates.c @@ -107,6 +107,7 @@ static const char *key_names[PRIVATE_LAST] = { [PRIVATE_GLYPHSET] = "GLYPHSET", [PRIVATE_PICTURE] = "PICTURE", [PRIVATE_SYNC_FENCE] = "SYNC_FENCE", + [PRIVATE_NAMESPACE] = "NAMESPACE", }; static const Bool screen_specific_private[PRIVATE_LAST] = { diff --git a/include/privates.h b/include/privates.h index 6e1cfa02e..6db491d86 100644 --- a/include/privates.h +++ b/include/privates.h @@ -51,6 +51,7 @@ typedef enum { PRIVATE_GLYPHSET, PRIVATE_PICTURE, PRIVATE_SYNC_FENCE, + PRIVATE_NAMESPACE, /* last private type */ PRIVATE_LAST,