From 57a51e7ac44fc02190567eeb758458870142a4f8 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Tue, 15 Jun 2021 17:43:40 +0200 Subject: [PATCH] CIrrDeviceLinux: reimplement fullscreen using NetWM hint --- source/Irrlicht/CIrrDeviceLinux.cpp | 39 ++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/source/Irrlicht/CIrrDeviceLinux.cpp b/source/Irrlicht/CIrrDeviceLinux.cpp index 9514b5d..1ff2942 100644 --- a/source/Irrlicht/CIrrDeviceLinux.cpp +++ b/source/Irrlicht/CIrrDeviceLinux.cpp @@ -94,6 +94,7 @@ namespace Atom X_ATOM_NETWM_MAXIMIZE_VERT; Atom X_ATOM_NETWM_MAXIMIZE_HORZ; Atom X_ATOM_NETWM_STATE; + Atom X_ATOM_NETWM_STATE_FULLSCREEN; Atom X_ATOM_WM_DELETE_WINDOW; @@ -252,7 +253,26 @@ bool CIrrDeviceLinux::switchToFullscreen() if (!CreationParams.Fullscreen) return true; - // To be filled... + if (!HasNetWM) + { + os::Printer::log("NetWM support is required to allow Irrlicht to switch " + "to fullscreen mode. Running in windowed mode instead.", ELL_WARNING); + CreationParams.Fullscreen = false; + return false; + } + + XEvent ev = {0}; + + ev.type = ClientMessage; + ev.xclient.window = XWindow; + ev.xclient.message_type = X_ATOM_NETWM_STATE; + ev.xclient.format = 32; + ev.xclient.data.l[0] = 1; // _NET_WM_STATE_ADD + ev.xclient.data.l[1] = X_ATOM_NETWM_STATE_FULLSCREEN; + + XSendEvent(XDisplay, DefaultRootWindow(XDisplay), false, + SubstructureNotifyMask | SubstructureRedirectMask, &ev); + return true; } @@ -309,7 +329,12 @@ bool CIrrDeviceLinux::createWindow() Screennr = DefaultScreen(XDisplay); - switchToFullscreen(); + initXAtoms(); + + // check netwm support + Atom WMCheck = XInternAtom(XDisplay, "_NET_SUPPORTING_WM_CHECK", True); + if (WMCheck != None) + HasNetWM = true; #if defined(_IRR_COMPILE_WITH_OPENGL_) // don't use the XVisual with OpenGL, because it ignores all requested @@ -425,6 +450,8 @@ bool CIrrDeviceLinux::createWindow() ExternalWindow = true; } + switchToFullscreen(); + WindowMinimized=false; // Currently broken in X, see Bug ID 2795321 // XkbSetDetectableAutoRepeat(XDisplay, True, &AutorepeatSupport); @@ -458,13 +485,6 @@ bool CIrrDeviceLinux::createWindow() SoftwareImage->data = (char*) malloc(SoftwareImage->bytes_per_line * SoftwareImage->height * sizeof(char)); } - initXAtoms(); - - // check netwm support - Atom WMCheck = XInternAtom(XDisplay, "_NET_SUPPORTING_WM_CHECK", true); - if (WMCheck != None) - HasNetWM = true; - initXInput2(); #endif // #ifdef _IRR_COMPILE_WITH_X11_ @@ -1863,6 +1883,7 @@ void CIrrDeviceLinux::initXAtoms() X_ATOM_NETWM_MAXIMIZE_VERT = XInternAtom(XDisplay, "_NET_WM_STATE_MAXIMIZED_VERT", true); X_ATOM_NETWM_MAXIMIZE_HORZ = XInternAtom(XDisplay, "_NET_WM_STATE_MAXIMIZED_HORZ", true); X_ATOM_NETWM_STATE = XInternAtom(XDisplay, "_NET_WM_STATE", true); + X_ATOM_NETWM_STATE_FULLSCREEN = XInternAtom(XDisplay, "_NET_WM_STATE_FULLSCREEN", True); #endif }