mirror of
https://github.com/minetest/irrlicht.git
synced 2024-11-18 05:33:52 +01:00
CIrrDeviceLinux: reimplement fullscreen using NetWM hint
This commit is contained in:
parent
39c45024ed
commit
57a51e7ac4
@ -94,6 +94,7 @@ namespace
|
|||||||
Atom X_ATOM_NETWM_MAXIMIZE_VERT;
|
Atom X_ATOM_NETWM_MAXIMIZE_VERT;
|
||||||
Atom X_ATOM_NETWM_MAXIMIZE_HORZ;
|
Atom X_ATOM_NETWM_MAXIMIZE_HORZ;
|
||||||
Atom X_ATOM_NETWM_STATE;
|
Atom X_ATOM_NETWM_STATE;
|
||||||
|
Atom X_ATOM_NETWM_STATE_FULLSCREEN;
|
||||||
|
|
||||||
Atom X_ATOM_WM_DELETE_WINDOW;
|
Atom X_ATOM_WM_DELETE_WINDOW;
|
||||||
|
|
||||||
@ -252,7 +253,26 @@ bool CIrrDeviceLinux::switchToFullscreen()
|
|||||||
if (!CreationParams.Fullscreen)
|
if (!CreationParams.Fullscreen)
|
||||||
return true;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,7 +329,12 @@ bool CIrrDeviceLinux::createWindow()
|
|||||||
|
|
||||||
Screennr = DefaultScreen(XDisplay);
|
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_)
|
#if defined(_IRR_COMPILE_WITH_OPENGL_)
|
||||||
// don't use the XVisual with OpenGL, because it ignores all requested
|
// don't use the XVisual with OpenGL, because it ignores all requested
|
||||||
@ -425,6 +450,8 @@ bool CIrrDeviceLinux::createWindow()
|
|||||||
ExternalWindow = true;
|
ExternalWindow = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switchToFullscreen();
|
||||||
|
|
||||||
WindowMinimized=false;
|
WindowMinimized=false;
|
||||||
// Currently broken in X, see Bug ID 2795321
|
// Currently broken in X, see Bug ID 2795321
|
||||||
// XkbSetDetectableAutoRepeat(XDisplay, True, &AutorepeatSupport);
|
// XkbSetDetectableAutoRepeat(XDisplay, True, &AutorepeatSupport);
|
||||||
@ -458,13 +485,6 @@ bool CIrrDeviceLinux::createWindow()
|
|||||||
SoftwareImage->data = (char*) malloc(SoftwareImage->bytes_per_line * SoftwareImage->height * sizeof(char));
|
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();
|
initXInput2();
|
||||||
|
|
||||||
#endif // #ifdef _IRR_COMPILE_WITH_X11_
|
#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_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_MAXIMIZE_HORZ = XInternAtom(XDisplay, "_NET_WM_STATE_MAXIMIZED_HORZ", true);
|
||||||
X_ATOM_NETWM_STATE = XInternAtom(XDisplay, "_NET_WM_STATE", true);
|
X_ATOM_NETWM_STATE = XInternAtom(XDisplay, "_NET_WM_STATE", true);
|
||||||
|
X_ATOM_NETWM_STATE_FULLSCREEN = XInternAtom(XDisplay, "_NET_WM_STATE_FULLSCREEN", True);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user