[X2Go-Commits] [nx-libs] 126/219: nxagentMaximizeToFullScreen: only reparent if necessary

git-admin at x2go.org git-admin at x2go.org
Sat Sep 28 12:10:35 CEST 2019


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 6657b8cc8c8702527c9e66aaf7d999fe9240f5c3
Author: Ulrich Sibiller <uli42 at gmx.de>
Date:   Wed Jun 26 19:04:41 2019 +0200

    nxagentMaximizeToFullScreen: only reparent if necessary
    
    This fixes problems with kwin and compiz when using the
    switch-all-screens keystroke. The fullscreen would appear shortly and
    then vanish again.
    
    Fixes ArcticaProject/nx-libs#458
---
 nx-X11/programs/Xserver/hw/nxagent/Screen.c | 77 +++++++++++++++++++++--------
 1 file changed, 56 insertions(+), 21 deletions(-)

diff --git a/nx-X11/programs/Xserver/hw/nxagent/Screen.c b/nx-X11/programs/Xserver/hw/nxagent/Screen.c
index 4e466b502..ebc5d6ce9 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Screen.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Screen.c
@@ -336,6 +336,14 @@ void nxagentMinimizeFromFullScreen(ScreenPtr pScreen)
   }
 }
 
+/*
+ * This is the opposite function to nxagentMinimizeFromFullscreen. It
+ * will map the fullscreen window and unmap the icon window. It is
+ * only called if fullscreen mode was active when the minimize
+ * keystroke was pressed.
+ * Some window managers tend to do 'interesting' things with the
+ * icon window, which we try to counterfeit here.
+ */
 void nxagentMaximizeToFullScreen(ScreenPtr pScreen)
 {
   if (nxagentIpaq)
@@ -349,36 +357,51 @@ void nxagentMaximizeToFullScreen(ScreenPtr pScreen)
 /*
     XUnmapWindow(nxagentDisplay, nxagentIconWindow);
 */
+
+    Window root = RootWindow(nxagentDisplay, DefaultScreen(nxagentDisplay));
+
 /*
-FIXME: We'll check for ReparentNotify and LeaveNotify events after XReparentWindow()
-       in order to avoid the session window is iconified.
-       We could avoid the session window is iconified when a LeaveNotify event is received,
-       so this check would be unnecessary.
+FIXME: We'll check for ReparentNotify and LeaveNotify events after
+       XReparentWindow() in order to avoid the session window being
+       iconified.  We could avoid the session window being iconified
+       when a LeaveNotify event is received, so this check would be
+       unnecessary.
 */
-    struct timeval timeout;
-    int i;
-    XEvent e;
 
-    XReparentWindow(nxagentDisplay, nxagentFullscreenWindow,
-                        RootWindow(nxagentDisplay, DefaultScreen(nxagentDisplay)), 0, 0);
+    /* only reparent if necessary. FIXME: also check if the desired coordinates match */
 
-    for (i = 0; i < 100 && nxagentWMIsRunning; i++)
+    if (!nxagentIsParentOf(nxagentDisplay, root, nxagentFullscreenWindow))
     {
-      #ifdef TEST
-      fprintf(stderr, "nxagentMaximizeToFullscreen: WARNING! Going to wait for the ReparentNotify event.\n");
-      #endif
+      XReparentWindow(nxagentDisplay, nxagentFullscreenWindow,
+                      root, 0, 0);
 
-      if (XCheckTypedWindowEvent(nxagentDisplay, nxagentFullscreenWindow, ReparentNotify, &e))
+      for (int i = 0; i < 100 && nxagentWMIsRunning; i++)
       {
-        break;
-      }
+        struct timeval timeout;
+        XEvent e;
+
+        #ifdef TEST
+        fprintf(stderr, "nxagentMaximizeToFullscreen: WARNING! Going to wait for the ReparentNotify event [%d].\n", i);
+        #endif
 
-      XSync(nxagentDisplay, 0);
+        if (XCheckTypedWindowEvent(nxagentDisplay, nxagentFullscreenWindow, ReparentNotify, &e))
+        {
+          break;
+        }
 
-      timeout.tv_sec = 0;
-      timeout.tv_usec = 50 * 1000;
+        XSync(nxagentDisplay, 0);
 
-      nxagentWaitEvents(nxagentDisplay, &timeout);
+        timeout.tv_sec = 0;
+        timeout.tv_usec = 50 * 1000;
+
+        nxagentWaitEvents(nxagentDisplay, &timeout);
+      }
+    }
+    else
+    {
+      #ifdef TEST
+      fprintf(stderr, "%s: FullscreenWindow already is child of root window - skipping reparenting,\n", __func__);
+      #endif
     }
 
     XMapRaised(nxagentDisplay, nxagentFullscreenWindow);
@@ -386,7 +409,19 @@ FIXME: We'll check for ReparentNotify and LeaveNotify events after XReparentWind
     XIconifyWindow(nxagentDisplay, nxagentIconWindow,
                        DefaultScreen(nxagentDisplay));
 
-    while (XCheckTypedWindowEvent(nxagentDisplay, nxagentFullscreenWindow, LeaveNotify, &e));
+    /* swallow all LeaveNotify events for the FullscreenWindow;
+       Normally this does not swallow anything these days, but when
+       using fvwm you see one of these events here. */
+    while (1)
+    {
+      XEvent e;
+      if (!XCheckTypedWindowEvent(nxagentDisplay, nxagentFullscreenWindow, LeaveNotify, &e))
+        break;
+      #ifdef TEST
+      fprintf(stderr, "%d: swallowing LeaveNotify event\m", __func__);
+      #endif
+    }
+
 /*
     XMapWindow(nxagentDisplay, nxagentIconWindow);
 */

--
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