Use EWMH for DisplayServerX11::_window_minimize_check() implementation

(cherry picked from commit 5666656d42)
This commit is contained in:
PorkrollPosadist 2023-07-29 20:05:47 -04:00 committed by Yuri Sizov
parent 67f5ec2f2f
commit f5130502be
1 changed files with 14 additions and 12 deletions

View File

@ -2097,9 +2097,10 @@ bool DisplayServerX11::_window_maximize_check(WindowID p_window, const char *p_a
bool DisplayServerX11::_window_minimize_check(WindowID p_window) const {
const WindowData &wd = windows[p_window];
// Using ICCCM -- Inter-Client Communication Conventions Manual
Atom property = XInternAtom(x11_display, "WM_STATE", True);
if (property == None) {
// Using EWMH instead of ICCCM, might work better for Wayland users.
Atom property = XInternAtom(x11_display, "_NET_WM_STATE", True);
Atom hidden = XInternAtom(x11_display, "_NET_WM_STATE_HIDDEN", True);
if (property == None || hidden == None) {
return false;
}
@ -2107,7 +2108,7 @@ bool DisplayServerX11::_window_minimize_check(WindowID p_window) const {
int format;
unsigned long len;
unsigned long remaining;
unsigned char *data = nullptr;
Atom *atoms = nullptr;
int result = XGetWindowProperty(
x11_display,
@ -2116,20 +2117,21 @@ bool DisplayServerX11::_window_minimize_check(WindowID p_window) const {
0,
32,
False,
AnyPropertyType,
XA_ATOM,
&type,
&format,
&len,
&remaining,
&data);
(unsigned char **)&atoms);
if (result == Success && data) {
long *state = (long *)data;
if (state[0] == WM_IconicState) {
XFree(data);
return true;
if (result == Success && atoms) {
for (unsigned int i = 0; i < len; i++) {
if (atoms[i] == hidden) {
XFree(atoms);
return true;
}
}
XFree(data);
XFree(atoms);
}
return false;