summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthewZelriche <67518084+MatthewZelriche@users.noreply.github.com>2022-08-27 15:29:25 -0600
committerMatthewZelriche <67518084+MatthewZelriche@users.noreply.github.com>2022-08-29 19:11:20 -0600
commit37f3b9f1ef30175771b170a9c83d416cab1fb4c6 (patch)
treeb7a6ac28505b89f5decbfec8a341626ba77f7615
parent051f24b067642a241d0a4acbb1b7644e11700bfc (diff)
Fix fullscreen on X11.
Attempts to set a Godot window to fullscreen prior to the window being mapped would silently fail. This commit uses _window_fullscreen_check to test if a window had been set to fullscreen while unmapped, and if so, resets it to fullscreen once the window has been successfully mapped. Fixes #54065
-rw-r--r--platform/linuxbsd/display_server_x11.cpp14
-rw-r--r--platform/linuxbsd/display_server_x11.h1
2 files changed, 15 insertions, 0 deletions
diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp
index cacb9d2a27..017fc3e3a2 100644
--- a/platform/linuxbsd/display_server_x11.cpp
+++ b/platform/linuxbsd/display_server_x11.cpp
@@ -1869,6 +1869,14 @@ bool DisplayServerX11::_window_fullscreen_check(WindowID p_window) const {
return retval;
}
+void DisplayServerX11::_validate_fullscreen_on_map(WindowID p_window) {
+ const WindowData &wd = windows[p_window];
+ if (wd.fullscreen && !_window_fullscreen_check(p_window)) {
+ // Unmapped fullscreen attempt didn't take effect, redo...
+ _set_wm_fullscreen(p_window, true);
+ }
+}
+
bool DisplayServerX11::window_is_maximize_allowed(WindowID p_window) const {
_THREAD_SAFE_METHOD_
return _window_maximize_check(p_window, "_NET_WM_ALLOWED_ACTIONS");
@@ -3650,6 +3658,9 @@ void DisplayServerX11::process_events() {
const WindowData &wd = windows[window_id];
+ // Have we failed to set fullscreen while the window was unmapped?
+ _validate_fullscreen_on_map(window_id);
+
XWindowAttributes xwa;
XSync(x11_display, False);
XGetWindowAttributes(x11_display, wd.x11_window, &xwa);
@@ -4990,6 +5001,9 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
XNextEvent(x11_display, &xevent);
if (xevent.type == ConfigureNotify) {
_window_changed(&xevent);
+ } else if (xevent.type == MapNotify) {
+ // Have we failed to set fullscreen while the window was unmapped?
+ _validate_fullscreen_on_map(main_window);
}
}
diff --git a/platform/linuxbsd/display_server_x11.h b/platform/linuxbsd/display_server_x11.h
index 0174cfb881..6b9f57d78f 100644
--- a/platform/linuxbsd/display_server_x11.h
+++ b/platform/linuxbsd/display_server_x11.h
@@ -268,6 +268,7 @@ class DisplayServerX11 : public DisplayServer {
void _update_real_mouse_position(const WindowData &wd);
bool _window_maximize_check(WindowID p_window, const char *p_atom_name) const;
bool _window_fullscreen_check(WindowID p_window) const;
+ void _validate_fullscreen_on_map(WindowID p_window);
void _update_size_hints(WindowID p_window);
void _set_wm_fullscreen(WindowID p_window, bool p_enabled);
void _set_wm_maximized(WindowID p_window, bool p_enabled);