From 6e2c670826caa5ef756e8b9580ddddbcaa174f3d 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 3146550bc..36adae661 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -1789,6 +1789,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"); } @@ -2632,6 +2675,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 6f355e27d..d7166ed11 100644 --- a/platform/x11/os_x11.h +++ b/platform/x11/os_x11.h @@ -246,6 +246,7 @@ protected: 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: