Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nxagent: Pass down if window manager has been detected #830

Open
wants to merge 1 commit into
base: 3.6.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions nx-X11/programs/Xserver/dix/events.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't like this one. EventSelectForWindow is called from within ChangeWindowAttributes (in dix/window.c). ChangeWindowAttribute is a method set in the pScreen struct. We do define pScreen->ChangeWindowAttributes in Screen.c and assign nxagentChangeWindowAttributes (Window.c) to it. In nxagentChangeWindowAttributes we call XChangeWindowAttributes after doing some nxagent magic.

So, on what code path is the above EventSelectForWindow function really called insider nxagent? I feel that we should handle this a bit more object oriented, that is: define an nxagentEventSelectForWindow and have that called from whereever. Also, I'd prefer to see dix/events.c patched in a way, that ChangeWindowAttributes calls nxagentEventSelectForWindow if NXAGENT_SERVER is defined, EventSelectForWindow (from X.Org), if not defined.

{
Mask check;
OtherClients * others;
Expand Down
31 changes: 31 additions & 0 deletions nx-X11/programs/Xserver/hw/nxagent/NXevents.c
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,37 @@ DefineInitialRootWindow(register WindowPtr win)
}
}

#ifdef NXAGENT_SERVER
extern Bool nxagentWMIsRunning;

int
EventSelectForWindow(register WindowPtr pWin, register ClientPtr client, Mask mask)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please rename to nxagentEventSelectForWindow and let it be called from whereever needed.

{
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)
{
Expand Down