diff --git a/dix/dispatch.c b/dix/dispatch.c index 176c7a0dd..ce84e6c8c 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -148,6 +148,7 @@ xConnSetupPrefix connSetupPrefix; PaddingInfo PixmapWidthPaddingInfo[33]; static ClientPtr grabClient; +static ClientPtr currentClient; /* Client for the request currently being dispatched */ #define GrabNone 0 #define GrabActive 1 @@ -176,6 +177,23 @@ volatile char isItTimeToYield; #define SAME_SCREENS(a, b) (\ (a.pScreen == b.pScreen)) +ClientPtr +GetCurrentClient(void) +{ + if (in_input_thread()) { + static Bool warned; + + if (!warned) { + ErrorF("[dix] Error GetCurrentClient called from input-thread\n"); + warned = TRUE; + } + + return NULL; + } + + return currentClient; +} + void SetInputCheck(HWEventQueuePtr c0, HWEventQueuePtr c1) { @@ -474,9 +492,12 @@ Dispatch(void) result = BadLength; else { result = XaceHookDispatch(client, client->majorOp); - if (result == Success) + if (result == Success) { + currentClient = client; result = (*client->requestVector[client->majorOp]) (client); + currentClient = NULL; + } } if (!SmartScheduleSignalEnable) SmartScheduleTime = GetTimeInMillis(); diff --git a/include/dix.h b/include/dix.h index f2516187f..146679b58 100644 --- a/include/dix.h +++ b/include/dix.h @@ -148,6 +148,7 @@ typedef struct _TimeStamp { } TimeStamp; /* dispatch.c */ +extern _X_EXPORT ClientPtr GetCurrentClient(void); extern _X_EXPORT void SetInputCheck(HWEventQueuePtr /*c0 */ , HWEventQueuePtr /*c1 */ );