From cf38b6f18768afe0ce964bd72de35174016c387f Mon Sep 17 00:00:00 2001 From: "Wilson E. Alvarez" Date: Wed, 29 Jun 2022 21:55:40 -0400 Subject: [PATCH] Properly check for fullscreen toggle made through the Window Manager --- platform/x11/os_x11.cpp | 44 +++++++++++++++++++++++++++++++++++++++++ platform/x11/os_x11.h | 1 + 2 files changed, 45 insertions(+) diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index 9a27989b778e..8ba64e41ea8d 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -1814,6 +1814,49 @@ bool OS_X11::window_maximize_check(const char *p_atom_name) const { return retval; } +bool OS_X11::window_fullscreen_check() const { + // Using EWMH -- Extended Window Manager Hints + Atom property = XInternAtom(x11_display, "_NET_WM_STATE", False); + Atom type; + int format; + unsigned long len; + unsigned long remaining; + unsigned char *data = nullptr; + bool retval = false; + + if (property == None) { + return retval; + } + + int result = XGetWindowProperty( + x11_display, + x11_window, + property, + 0, + 1024, + False, + XA_ATOM, + &type, + &format, + &len, + &remaining, + &data); + + if (result == Success) { + Atom *atoms = (Atom *)data; + Atom wm_fullscreen = XInternAtom(x11_display, "_NET_WM_STATE_FULLSCREEN", False); + for (uint64_t i = 0; i < len; i++) { + if (atoms[i] == wm_fullscreen) { + retval = true; + break; + } + } + XFree(data); + } + + return retval; +} + bool OS_X11::is_window_maximize_allowed() const { return window_maximize_check("_NET_WM_ALLOWED_ACTIONS"); } @@ -2663,6 +2706,7 @@ void OS_X11::process_xevents() { switch (event.type) { case Expose: { DEBUG_LOG_X11("[%u] Expose window=%lu, count='%u' \n", frame, event.xexpose.window, event.xexpose.count); + current_videomode.fullscreen = window_fullscreen_check(); Main::force_redraw(); } break; diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h index 35507e6d2eca..850c761d1b6e 100644 --- a/platform/x11/os_x11.h +++ b/platform/x11/os_x11.h @@ -247,6 +247,7 @@ class OS_X11 : public OS_Unix { void _window_changed(XEvent *event); bool window_maximize_check(const char *p_atom_name) const; + bool window_fullscreen_check() const; bool is_window_maximize_allowed() const; public: