Skip to content

Commit

Permalink
Merge pull request #62551 from akien-mga/x11-check-fullscreen
Browse files Browse the repository at this point in the history
Properly check for fullscreen toggle made through the Window Manager
  • Loading branch information
akien-mga authored Jul 1, 2022
2 parents 8819226 + aadf831 commit 110248c
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 0 deletions.
48 changes: 48 additions & 0 deletions platform/linuxbsd/display_server_x11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1817,6 +1817,52 @@ bool DisplayServerX11::_window_maximize_check(WindowID p_window, const char *p_a
return retval;
}

bool DisplayServerX11::_window_fullscreen_check(WindowID p_window) const {
ERR_FAIL_COND_V(!windows.has(p_window), false);
const WindowData &wd = windows[p_window];

// 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,
wd.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 DisplayServerX11::window_is_maximize_allowed(WindowID p_window) const {
_THREAD_SAFE_METHOD_
return _window_maximize_check(p_window, "_NET_WM_ALLOWED_ACTIONS");
Expand Down Expand Up @@ -3604,6 +3650,8 @@ void DisplayServerX11::process_events() {
case Expose: {
DEBUG_LOG_X11("[%u] Expose window=%lu (%u), count='%u' \n", frame, event.xexpose.window, window_id, event.xexpose.count);

windows[window_id].fullscreen = _window_fullscreen_check(window_id);

Main::force_redraw();
} break;

Expand Down
1 change: 1 addition & 0 deletions platform/linuxbsd/display_server_x11.h
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,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 _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);
Expand Down

0 comments on commit 110248c

Please sign in to comment.