aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Sibiller <uli42@gmx.de>2019-06-26 19:04:41 +0200
committerUlrich Sibiller <uli42@gmx.de>2019-06-27 20:34:17 +0200
commit6657b8cc8c8702527c9e66aaf7d999fe9240f5c3 (patch)
treea81dbcd23c5333a7a4a12deb218fe9cd8482711e
parentd32706888f83b91d6feab93067d1207c507335fa (diff)
downloadnx-libs-6657b8cc8c8702527c9e66aaf7d999fe9240f5c3.tar.gz
nx-libs-6657b8cc8c8702527c9e66aaf7d999fe9240f5c3.tar.bz2
nx-libs-6657b8cc8c8702527c9e66aaf7d999fe9240f5c3.zip
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
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Screen.c77
1 files 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);
*/