[X2Go-Commits] [nx-libs] 271/429: Forward ClientMessages to nxproxy side
git-admin at x2go.org
git-admin at x2go.org
Mon Oct 18 09:36:47 CEST 2021
This is an automated email from the git hooks/post-receive script.
x2go pushed a commit to branch 3.6.x
in repository nx-libs.
commit 36f804e549121fb56aa71979b7da5d75f2cc7cbe
Author: Ulrich Sibiller <uli42 at gmx.de>
Date: Sun May 2 18:42:44 2021 +0200
Forward ClientMessages to nxproxy side
This should help with clients requesting window manager actions like
maximizing or minimizing. This is a first version as it only handles
messages of type WM_STATE_CHANGE and _NET_WM_STATE. But ICCCM and EWMH
know some more.
The other direction, setting of properties by the WM, is already
implemented in Rootless.c.
Fixes ArcticaProject/nx-libs#1015
---
nx-X11/programs/Xserver/hw/nxagent/Events.c | 64 +++++++++++++++++++++++++++
nx-X11/programs/Xserver/hw/nxagent/Events.h | 2 +
nx-X11/programs/Xserver/hw/nxagent/NXevents.c | 6 +++
3 files changed, 72 insertions(+)
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.c b/nx-X11/programs/Xserver/hw/nxagent/Events.c
index a342cdee1..2a3654731 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Events.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Events.c
@@ -4505,6 +4505,70 @@ int nxagentWaitEvents(Display *dpy, useconds_t msec)
return 1;
}
+void ForwardClientMessage(ClientPtr client, xSendEventReq *stuff)
+{
+ Atom netwmstate = MakeAtom("_NET_WM_STATE", strlen("_NET_WM_STATE"), False);
+ Atom wmchangestate = MakeAtom("WM_CHANGE_STATE", strlen("WM_CHANGE_STATE"), False);
+ WindowPtr pWin = (WindowPtr)SecurityLookupWindow(stuff->destination, client,
+ DixReadAccess);
+
+ if (stuff->event.u.clientMessage.u.l.type == netwmstate || stuff->event.u.clientMessage.u.l.type == wmchangestate)
+ {
+ if (pWin->drawable.id == pWin->drawable.pScreen->root->drawable.id)
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "%s: dest [0x%x] window [0x%x] clmsg.type [%d]->[%d]\n", __func__, stuff->destination, stuff->event.u.clientMessage.window, stuff->event.u.clientMessage.u.l.type, nxagentLocalToRemoteAtom(stuff->event.u.clientMessage.u.l.type));
+ #endif
+
+ XEvent X = {0};
+ X.xany.type = ClientMessage;
+
+ WindowPtr pWin2 = (WindowPtr)SecurityLookupWindow(stuff->event.u.clientMessage.window, client,
+ DixReadAccess);
+ X.xclient.window = nxagentWindowPriv(pWin2)->window;
+ X.xclient.format = stuff->event.u.u.detail;
+ X.xclient.send_event = True;
+ X.xclient.serial = 0;
+
+ if (X.xclient.format == 32)
+ {
+ X.xclient.message_type = nxagentLocalToRemoteAtom(stuff->event.u.clientMessage.u.l.type);
+ X.xclient.data.l[0] = stuff->event.u.clientMessage.u.l.longs0;
+ X.xclient.data.l[1] = nxagentLocalToRemoteAtom(stuff->event.u.clientMessage.u.l.longs1);
+ X.xclient.data.l[2] = nxagentLocalToRemoteAtom(stuff->event.u.clientMessage.u.l.longs2);
+ X.xclient.data.l[3] = nxagentLocalToRemoteAtom(stuff->event.u.clientMessage.u.l.longs3);
+ X.xclient.data.l[4] = nxagentLocalToRemoteAtom(stuff->event.u.clientMessage.u.l.longs4);
+ //X.xclient.data.l[3] = stuff->event.u.clientMessage.u.l.longs3;
+ //X.xclient.data.l[4] = stuff->event.u.clientMessage.u.l.longs4;
+ #ifdef DEBUG
+ for (int i = 0; i < 5; i++)
+ {
+ fprintf(stderr, "%s: data[%d] [%ld]\n", __func__, i, X.xclient.data.l[i]);
+ }
+ #endif
+ }
+ else
+ return; // ERROR!
+
+ #ifdef DEBUG
+ fprintf(stderr, "%s: window [0x%lx]\n", __func__, X.xclient.window);
+ fprintf(stderr, "%s: message_type [%ld]\n", __func__, X.xclient.message_type);
+ fprintf(stderr, "%s: format [%d]\n", __func__, X.xclient.format);
+ #endif
+
+ XlibWindow dest;
+ dest = DefaultRootWindow(nxagentDisplay);
+
+ Status stat = XSendEvent(nxagentDisplay, dest, stuff->propagate, stuff->eventMask, &X);
+ XFlush(nxagentDisplay);
+ #ifdef DEBUG
+ fprintf(stderr, "%s: send to window [0x%lx]\n", __func__, dest);
+ fprintf(stderr, "%s: return Status [%d]\n", __func__, stat);
+ #endif
+ }
+ }
+}
+
#ifdef NX_DEBUG_INPUT
void nxagentGuessDumpInputInfo(ClientPtr client, Atom property, char *data)
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.h b/nx-X11/programs/Xserver/hw/nxagent/Events.h
index 42784a8f3..a334897ec 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Events.h
+++ b/nx-X11/programs/Xserver/hw/nxagent/Events.h
@@ -222,4 +222,6 @@ int nxagentPendingEvents(Display *dpy);
int nxagentWaitEvents(Display *, useconds_t msec);
+void ForwardClientMessage(ClientPtr client, xSendEventReq *stuff);
+
#endif /* __Events_H__ */
diff --git a/nx-X11/programs/Xserver/hw/nxagent/NXevents.c b/nx-X11/programs/Xserver/hw/nxagent/NXevents.c
index 84414c11f..fccc718b0 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/NXevents.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/NXevents.c
@@ -425,6 +425,12 @@ ProcSendEvent(ClientPtr client)
REQUEST_SIZE_MATCH(xSendEventReq);
+ if (nxagentOption(Rootless) && stuff->event.u.u.type == ClientMessage)
+ {
+ ForwardClientMessage(client, stuff);
+ return Success;
+ }
+
if (stuff -> event.u.u.type == SelectionNotify)
{
if (nxagentSendNotify(&stuff->event) == 1)
--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/nx-libs.git
More information about the x2go-commits
mailing list