diff --git a/nx-X11/programs/Xserver/dix/events.c b/nx-X11/programs/Xserver/dix/events.c index b296888578..3b364046fc 100644 --- a/nx-X11/programs/Xserver/dix/events.c +++ b/nx-X11/programs/Xserver/dix/events.c @@ -2970,7 +2970,11 @@ OtherClientGone(void * value, XID id) } int +#ifdef NXAGENT_SERVER +Xorg_EventSelectForWindow(register WindowPtr pWin, register ClientPtr client, Mask mask) +#else EventSelectForWindow(register WindowPtr pWin, register ClientPtr client, Mask mask) +#endif { Mask check; OtherClients * others; diff --git a/nx-X11/programs/Xserver/hw/nxagent/NXevents.c b/nx-X11/programs/Xserver/hw/nxagent/NXevents.c index fccc718b02..57a4d45dbf 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/NXevents.c +++ b/nx-X11/programs/Xserver/hw/nxagent/NXevents.c @@ -416,6 +416,37 @@ DefineInitialRootWindow(register WindowPtr win) } } +#ifdef NXAGENT_SERVER +extern Bool nxagentWMIsRunning; + +int +EventSelectForWindow(register WindowPtr pWin, register ClientPtr client, Mask mask) +{ + int res = Xorg_EventSelectForWindow(pWin, client, mask); + + /* + * intercept SelectInput calls for SubStructureRedirect. The + * standard way of checking for a Window Manager is trying to + * SelectInput on SubStructureRedirect. If it fails it can be + * deduced there's a Window Manager running since + * SubStructureRedirect is only allowed for ONE client. In a + * rootless session there is (and should be) no Window Manager so + * we report the WM state we found on the real X server. This + * also helps for nesting rootless nxagents. + */ + + if ((mask & SubstructureRedirectMask) && (nxagentOption(Rootless) == 1)) + { + #ifdef DEBUG + fprintf(stderr, "%s: WM check detected\n", __func__); + #endif + if (nxagentWMIsRunning) + return BadAccess; + } + return res; +} +#endif + int ProcSendEvent(ClientPtr client) {