]> git.lizzy.rs Git - irrlicht.git/commitdiff
CIrrDeviceLinux: reimplement fullscreen using NetWM hint
authorsfan5 <sfan5@live.de>
Tue, 15 Jun 2021 15:43:40 +0000 (17:43 +0200)
committersfan5 <sfan5@live.de>
Tue, 15 Jun 2021 15:46:22 +0000 (17:46 +0200)
source/Irrlicht/CIrrDeviceLinux.cpp

index 9514b5d19f18bed007c2b4def65c5b5ae04059bc..1ff2942b3d914f010fbabe928b760f09f54f071e 100644 (file)
@@ -94,6 +94,7 @@ namespace
        Atom X_ATOM_NETWM_MAXIMIZE_VERT;\r
        Atom X_ATOM_NETWM_MAXIMIZE_HORZ;\r
        Atom X_ATOM_NETWM_STATE;\r
+       Atom X_ATOM_NETWM_STATE_FULLSCREEN;\r
 \r
        Atom X_ATOM_WM_DELETE_WINDOW;\r
 \r
@@ -252,7 +253,26 @@ bool CIrrDeviceLinux::switchToFullscreen()
        if (!CreationParams.Fullscreen)\r
                return true;\r
 \r
-       // To be filled...\r
+       if (!HasNetWM)\r
+       {\r
+               os::Printer::log("NetWM support is required to allow Irrlicht to switch "\r
+               "to fullscreen mode. Running in windowed mode instead.", ELL_WARNING);\r
+               CreationParams.Fullscreen = false;\r
+               return false;\r
+       }\r
+\r
+       XEvent ev = {0};\r
+\r
+       ev.type = ClientMessage;\r
+       ev.xclient.window = XWindow;\r
+       ev.xclient.message_type = X_ATOM_NETWM_STATE;\r
+       ev.xclient.format = 32;\r
+       ev.xclient.data.l[0] = 1; // _NET_WM_STATE_ADD\r
+       ev.xclient.data.l[1] = X_ATOM_NETWM_STATE_FULLSCREEN;\r
+\r
+       XSendEvent(XDisplay, DefaultRootWindow(XDisplay), false,\r
+                       SubstructureNotifyMask | SubstructureRedirectMask, &ev);\r
+\r
        return true;\r
 }\r
 \r
@@ -309,7 +329,12 @@ bool CIrrDeviceLinux::createWindow()
 \r
        Screennr = DefaultScreen(XDisplay);\r
 \r
-       switchToFullscreen();\r
+       initXAtoms();\r
+\r
+       // check netwm support\r
+       Atom WMCheck = XInternAtom(XDisplay, "_NET_SUPPORTING_WM_CHECK", True);\r
+       if (WMCheck != None)\r
+               HasNetWM = true;\r
 \r
 #if defined(_IRR_COMPILE_WITH_OPENGL_)\r
        // don't use the XVisual with OpenGL, because it ignores all requested\r
@@ -425,6 +450,8 @@ bool CIrrDeviceLinux::createWindow()
                ExternalWindow = true;\r
        }\r
 \r
+       switchToFullscreen();\r
+\r
        WindowMinimized=false;\r
        // Currently broken in X, see Bug ID 2795321\r
        // XkbSetDetectableAutoRepeat(XDisplay, True, &AutorepeatSupport);\r
@@ -458,13 +485,6 @@ bool CIrrDeviceLinux::createWindow()
                        SoftwareImage->data = (char*) malloc(SoftwareImage->bytes_per_line * SoftwareImage->height * sizeof(char));\r
        }\r
 \r
-       initXAtoms();\r
-\r
-       // check netwm support\r
-       Atom WMCheck = XInternAtom(XDisplay, "_NET_SUPPORTING_WM_CHECK", true);\r
-       if (WMCheck != None)\r
-               HasNetWM = true;\r
-\r
        initXInput2();\r
 \r
 #endif // #ifdef _IRR_COMPILE_WITH_X11_\r
@@ -1863,6 +1883,7 @@ void CIrrDeviceLinux::initXAtoms()
        X_ATOM_NETWM_MAXIMIZE_VERT = XInternAtom(XDisplay, "_NET_WM_STATE_MAXIMIZED_VERT", true);\r
        X_ATOM_NETWM_MAXIMIZE_HORZ = XInternAtom(XDisplay, "_NET_WM_STATE_MAXIMIZED_HORZ", true);\r
        X_ATOM_NETWM_STATE = XInternAtom(XDisplay, "_NET_WM_STATE", true);\r
+       X_ATOM_NETWM_STATE_FULLSCREEN = XInternAtom(XDisplay, "_NET_WM_STATE_FULLSCREEN", True);\r
 #endif\r
 }\r
 \r