[Vm-dev] [commit][3498]
Fix for Mantix 7833 by Nicolai Hess to support return from full screen
commits at squeakvm.org
commits at squeakvm.org
Sun Nov 15 17:32:05 UTC 2015
Revision: 3498
Author: lewis
Date: 2015-11-15 09:32:03 -0800 (Sun, 15 Nov 2015)
Log Message:
-----------
Fix for Mantix 7833 by Nicolai Hess to support return from full screen
mode on certain window managers that do not handle it properly. Also add
command line parameter -fullscreenDirect and matching environment variable
SQUEAK_FULLSCREEN_DIRECT to allow original behavior to be specified in
the case of a simple window manager (e.g. twm) than does not understand
the _NET_WM_STATE_FULLSCREEN window manager hint.
Modified Paths:
--------------
trunk/platforms/unix/vm/sqUnixMain.c
trunk/platforms/unix/vm-display-X11/sqUnixX11.c
Modified: trunk/platforms/unix/vm/sqUnixMain.c
===================================================================
--- trunk/platforms/unix/vm/sqUnixMain.c 2015-11-14 20:16:45 UTC (rev 3497)
+++ trunk/platforms/unix/vm/sqUnixMain.c 2015-11-15 17:32:03 UTC (rev 3498)
@@ -1046,11 +1046,13 @@
if (!strcmp(argv[0], arg)) \
return parseModuleArgument(argc, argv, &type##Module, #type, name);
- moduleArg("-nodisplay", display, "null");
- moduleArg("-display", display, "X11");
- moduleArg("-headless", display, "X11");
- moduleArg("-quartz", display, "Quartz");
- moduleArg("-nosound", sound, "null");
+ moduleArg("-nodisplay", display, "null");
+ moduleArg("-display", display, "X11");
+ moduleArg("-headless", display, "X11");
+ moduleArg("-fullscreen", display, "X11");
+ moduleArg("-fullscreenDirect", display, "X11");
+ moduleArg("-quartz", display, "Quartz");
+ moduleArg("-nosound", sound, "null");
# undef moduleArg
Modified: trunk/platforms/unix/vm-display-X11/sqUnixX11.c
===================================================================
--- trunk/platforms/unix/vm-display-X11/sqUnixX11.c 2015-11-14 20:16:45 UTC (rev 3497)
+++ trunk/platforms/unix/vm-display-X11/sqUnixX11.c 2015-11-15 17:32:03 UTC (rev 3498)
@@ -335,6 +335,7 @@
int sleepWhenUnmapped= 0;
int noTitle= 0;
int fullScreen= 0;
+int fullScreenDirect= 0;
int iconified= 0;
int closeQuit= 0;
int withSpy= 0;
@@ -3982,6 +3983,57 @@
}
+static void enterFullScreenMode(Window root)
+{
+ XSynchronize(stDisplay, True);
+ overrideRedirect(stDisplay, stWindow, True);
+ XReparentWindow(stDisplay, stWindow, root, 0, 0);
+#if 1
+ XResizeWindow(stDisplay, stWindow, scrW, scrH);
+#else
+ XResizeWindow(stDisplay, stParent, scrW, scrH);
+#endif
+ XLowerWindow(stDisplay, stParent);
+ XRaiseWindow(stDisplay, stWindow);
+ XSetInputFocus(stDisplay, stWindow, RevertToPointerRoot, CurrentTime);
+ XSynchronize(stDisplay, False);
+}
+
+
+static void returnFromFullScreenMode()
+{
+ XSynchronize(stDisplay, True);
+ XRaiseWindow(stDisplay, stParent);
+ XReparentWindow(stDisplay, stWindow, stParent, 0, 0);
+ overrideRedirect(stDisplay, stWindow, False);
+#if 1
+ XResizeWindow(stDisplay, stWindow, scrW, scrH);
+#else
+ XResizeWindow(stDisplay, stParent, winW, winH);
+#endif
+ XSetInputFocus(stDisplay, stWindow, RevertToPointerRoot, CurrentTime);
+ XSynchronize(stDisplay, False);
+}
+
+
+static void sendFullScreenHint(int enable)
+{
+ XEvent xev;
+ Atom wm_state = XInternAtom(stDisplay, "_NET_WM_STATE", False);
+ Atom fullscreen = XInternAtom(stDisplay, "_NET_WM_STATE_FULLSCREEN", False);
+
+ memset(&xev, 0, sizeof(xev));
+ xev.type = ClientMessage;
+ xev.xclient.window = stParent;
+ xev.xclient.message_type = wm_state;
+ xev.xclient.format = 32;
+ xev.xclient.data.l[0] = enable; /* 1 enable, 0 disable fullscreen */
+ xev.xclient.data.l[1] = fullscreen;
+ xev.xclient.data.l[2] = 0;
+ XSendEvent(stDisplay, DefaultRootWindow(stDisplay), False, SubstructureNotifyMask, &xev);
+}
+
+
static sqInt display_ioSetFullScreen(sqInt fullScreen)
{
int winX, winY;
@@ -4007,18 +4059,10 @@
winW= (winW / sizeof(void *)) * sizeof(void *);
setSavedWindowSize((winW << 16) + (winH & 0xFFFF));
savedWindowOrigin= (winX << 16) + (winY & 0xFFFF);
- XSynchronize(stDisplay, True);
- overrideRedirect(stDisplay, stWindow, True);
- XReparentWindow(stDisplay, stWindow, root, 0, 0);
-# if 1
- XResizeWindow(stDisplay, stWindow, scrW, scrH);
-# else
- XResizeWindow(stDisplay, stParent, scrW, scrH);
-# endif
- XLowerWindow(stDisplay, stParent);
- XRaiseWindow(stDisplay, stWindow);
- XSetInputFocus(stDisplay, stWindow, RevertToPointerRoot, CurrentTime);
- XSynchronize(stDisplay, False);
+ if (fullScreenDirect)
+ enterFullScreenMode(root); /* simple window manager, e.g. twm */
+ else
+ sendFullScreenHint(1); /* Required for Compiz window manager */
windowState= WIN_ZOOMED;
fullDisplayUpdate();
}
@@ -4039,17 +4083,10 @@
winX= savedWindowOrigin >> 16;
winY= savedWindowOrigin & 0xFFFF;
savedWindowOrigin= -1; /* prevents consecutive full-screen disables */
- XSynchronize(stDisplay, True);
- XRaiseWindow(stDisplay, stParent);
- XReparentWindow(stDisplay, stWindow, stParent, 0, 0);
- overrideRedirect(stDisplay, stWindow, False);
-# if 1
- XResizeWindow(stDisplay, stWindow, scrW, scrH);
-# else
- XResizeWindow(stDisplay, stParent, winW, winH);
-# endif
- XSetInputFocus(stDisplay, stWindow, RevertToPointerRoot, CurrentTime);
- XSynchronize(stDisplay, False);
+ if (fullScreenDirect)
+ returnFromFullScreenMode(); /* simple window manager, e.g. twm */
+ else
+ sendFullScreenHint(0); /* Required for Compiz window manager */
windowState= WIN_CHANGED;
}
}
@@ -5987,6 +6024,7 @@
printf(" -compositioninput enable overlay window for composed characters\n");
printf(" -display <dpy> display on <dpy> (default: $DISPLAY)\n");
printf(" -fullscreen occupy the entire screen\n");
+ printf(" -fullscreenDirect simple window manager support for fullscreen\n");
#if (USE_X11_GLX)
printf(" -glxdebug <n> set GLX debug verbosity level to <n>\n");
#endif
@@ -6044,6 +6082,7 @@
if (getenv("SQUEAK_NOTITLE")) noTitle= 1;
if (getenv("SQUEAK_NOXDND")) useXdnd= 0;
if (getenv("SQUEAK_FULLSCREEN")) fullScreen= 1;
+ if (getenv("SQUEAK_FULLSCREEN_DIRECT")) fullScreenDirect= 1;
if (getenv("SQUEAK_ICONIC")) iconified= 1;
if (getenv("SQUEAK_CLOSEQUIT")) closeQuit= 1;
if (getenv("SQUEAK_MAPDELBS")) mapDelBs= 1;
@@ -6076,6 +6115,7 @@
else if (!strcmp(arg, "-mapdelbs")) mapDelBs= 1;
else if (!strcmp(arg, "-swapbtn")) swapBtn= 1;
else if (!strcmp(arg, "-fullscreen")) fullScreen= 1;
+ else if (!strcmp(arg, "-fullscreenDirect")) fullScreenDirect= 1;
else if (!strcmp(arg, "-iconic")) iconified= 1;
else if (!strcmp(arg, "-closequit")) closeQuit= 1;
#if !defined (INIT_INPUT_WHEN_KEY_PRESSED)
More information about the Vm-dev
mailing list