Description: enable grouping of x11 plot windows
 Patch posted by Ivan Krylov to r-devel today which permits multiple x11
 window to be grouped under a common root -- by defining that common root
Author: Ivan Krylov 
Origin: r-devel list
Reviewed-By: Dirk Eddelbuettel <edd@debian.org>
Last-Update: 2021-03-23

--- r-base-4.0.4.orig/src/modules/X11/devX11.c
+++ r-base-4.0.4/src/modules/X11/devX11.c
@@ -105,7 +105,7 @@ static Cursor cross_cursor = (Cursor) 0
 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 */
@@ -1611,6 +1611,16 @@ X11_Open(pDevDesc dd, pX11Desc xd, const
                             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);
@@ -2095,6 +2105,7 @@ static void X11_Close(pDevDesc dd)
     if (numX11Devices == 0)  {
 	int fd = ConnectionNumber(display);
 	/* Free Resources Here */
+	XDestroyWindow(display, group_leader);
 	while (nfonts--)
 	      R_XFreeFont(display, fontcache[nfonts].font);
 	nfonts = 0;
@@ -3084,6 +3095,9 @@ Rf_setX11Display(Display *dpy, double ga
 #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);
