aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/Xserver/hw/nxagent/Client.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/programs/Xserver/hw/nxagent/Client.c')
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Client.c76
1 files changed, 75 insertions, 1 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Client.c b/nx-X11/programs/Xserver/hw/nxagent/Client.c
index 1e4182599..020f90c91 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Client.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Client.c
@@ -68,6 +68,10 @@
#undef TEST
#undef DEBUG
+void nxagentClientStateCallback(CallbackListPtr *callbacks, void *data, void *args);
+static void initClientPrivates(ClientPtr client);
+static void freeClientPrivates(ClientPtr client);
+
/*
* Returns the last signal delivered to the process.
*/
@@ -106,8 +110,78 @@ int nxagentClientPrivateIndex;
int nxagentShadowCounter = 0;
-void nxagentInitClientPrivates(ClientPtr client)
+/*
+ * called whenever the client state changes. See dixstruct.h for a
+ * list of known states.
+ */
+
+#ifdef DEBUG
+const char * getClientStateString(int state)
+{
+ switch (state)
+ {
+ case ClientStateInitial: { return "Initial"; break; };
+ case ClientStateAuthenticating: { return "Authenticating"; break; };
+ case ClientStateRunning: { return "Running"; break; };
+ case ClientStateRetained: { return "Retained"; break; };
+ case ClientStateGone: { return "Gone"; break; };
+ case ClientStateCheckingSecurity: { return "CheckingSecurity"; break; };
+ case ClientStateCheckedSecurity: { return "CheckedSecurity"; break; };
+ default: { return "UNKNOWN"; break; };
+ }
+}
+#endif
+
+void nxagentClientStateCallback(CallbackListPtr *callbacks, void *data, void *args)
+{
+ ClientPtr client = ((NewClientInfoRec *)args)->client;
+
+ #ifdef DEBUG
+ fprintf(stderr, "%s: client [%d] clientState [%s]\n", __func__, client->index,
+ getClientStateString(client->clientState));
+ #endif
+
+ switch(client->clientState)
+ {
+ case ClientStateInitial:
+ {
+ initClientPrivates(client);
+ break;
+ }
+ case ClientStateGone:
+ {
+ freeClientPrivates(client);
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+}
+
+static void initClientPrivates(ClientPtr client)
{
+ #ifdef DEBUG
+ fprintf(stderr, "%s: called\n", __func__);
+ #endif
+
+ if (nxagentClientPriv(client))
+ {
+ nxagentClientPriv(client) -> clientState = 0;
+#ifdef COUNT_CLIENT_BYTES
+ nxagentClientPriv(client) -> clientBytes = 0;
+#endif
+ nxagentClientPriv(client) -> clientHint = UNKNOWN;
+ }
+}
+
+static void freeClientPrivates(ClientPtr client)
+{
+ #ifdef DEBUG
+ fprintf(stderr, "%s: called\n", __func__);
+ #endif
+
if (nxagentClientPriv(client))
{
nxagentClientPriv(client) -> clientState = 0;