On Mon, 22 Mar 2021 15:42:04 -0400
Duncan Murdoch <murdoch.dun...@gmail.com> wrote:

> I'd be happy to add something to rgl if you could point me to 
> an example

On Mon, 22 Mar 2021 14:54:43 -0500
Dirk Eddelbuettel <e...@debian.org> wrote:

> Just like Duncan I see now WM_HINTS yet, so maybe by
> just giving them we can improve?

The surrounding code and
<https://tronche.com/gui/x/xlib/ICC/client-to-window-manager/wm-hints.html>
proved to be enough of an example. The following patch makes it
possible to group x11() windows on my PC with Xfce running:

-----------------------------------8<-----------------------------------
Index: src/modules/X11/devX11.c
===================================================================
--- src/modules/X11/devX11.c    (revision 80104)
+++ src/modules/X11/devX11.c    (working copy)
@@ -105,7 +105,7 @@
 static Display *display;                       /* Display */
 static char dspname[101]="";
 static int screen;                             /* Screen */
-static Window rootwin;                         /* Root Window */
+static Window rootwin, group_leader;           /* Root Window, Group leader */
 static Visual *visual;                         /* Visual */
 static int depth;                              /* Pixmap depth */
 static int Vclass;                             /* Visual class */
@@ -1617,6 +1617,16 @@
                             PropModeReplace,
                             (const unsigned char*) rlogo_icon, 2 + 99*77);
 
+           /* set the window group leader */
+           XWMHints * hints;
+           hints = XAllocWMHints();
+           if (hints) {
+               hints->window_group = group_leader;
+               hints->flags |= WindowGroupHint;
+               XSetWMHints(display, xd->window, hints);
+               XFree(hints);
+           }
+
            /* set up protocols so that window manager sends */
            /* me an event when user "destroys" window */
            _XA_WM_PROTOCOLS = XInternAtom(display, "WM_PROTOCOLS", 0);
@@ -2109,6 +2119,7 @@
     if (numX11Devices == 0)  {
        int fd = ConnectionNumber(display);
        /* Free Resources Here */
+       XDestroyWindow(display, group_leader);
        while (nfonts--)
              R_XFreeFont(display, fontcache[nfonts].font);
        nfonts = 0;
@@ -3133,6 +3144,9 @@
 #endif
     screen = DefaultScreen(display);
     rootwin = DefaultRootWindow(display);
+    group_leader = XCreateSimpleWindow( /* never mapped or visible */
+       display, rootwin, 0, 0, 1, 1, 0, 0, 0
+    );
     depth = DefaultDepth(display, screen);
     visual = DefaultVisual(display, screen);
     colormap = DefaultColormap(display, screen);
-----------------------------------8<-----------------------------------

Some very limited testing didn't seem to uncover any problems.

-- 
Best regards,
Ivan
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to