[X11] Add window borderless state detection, fix borderless state restoration after exiting fullscreen.

This commit is contained in:
bruvzg 2019-06-11 12:07:48 +03:00
parent 629bc10d80
commit 2a950f3a7c
No known key found for this signature in database
GPG Key ID: 89DD917D9CE4218D
1 changed files with 22 additions and 5 deletions

View File

@ -1017,12 +1017,12 @@ void OS_X11::set_wm_fullscreen(bool p_enabled) {
XFree(xsh); XFree(xsh);
} }
if (!p_enabled && !get_borderless_window()) { if (!p_enabled) {
// put decorations back if the window wasn't suppoesed to be borderless // put back or remove decorations according to the last set borderless state
Hints hints; Hints hints;
Atom property; Atom property;
hints.flags = 2; hints.flags = 2;
hints.decorations = 1; hints.decorations = current_videomode.borderless_window ? 0 : 1;
property = XInternAtom(x11_display, "_MOTIF_WM_HINTS", True); property = XInternAtom(x11_display, "_MOTIF_WM_HINTS", True);
XChangeProperty(x11_display, x11_window, property, property, 32, PropModeReplace, (unsigned char *)&hints, 5); XChangeProperty(x11_display, x11_window, property, property, 32, PropModeReplace, (unsigned char *)&hints, 5);
} }
@ -1531,7 +1531,7 @@ bool OS_X11::is_window_always_on_top() const {
void OS_X11::set_borderless_window(bool p_borderless) { void OS_X11::set_borderless_window(bool p_borderless) {
if (current_videomode.borderless_window == p_borderless) if (get_borderless_window() == p_borderless)
return; return;
if (!p_borderless && layered_window) if (!p_borderless && layered_window)
@ -1551,7 +1551,24 @@ void OS_X11::set_borderless_window(bool p_borderless) {
} }
bool OS_X11::get_borderless_window() { bool OS_X11::get_borderless_window() {
return current_videomode.borderless_window;
bool borderless = current_videomode.borderless_window;
Atom prop = XInternAtom(x11_display, "_MOTIF_WM_HINTS", True);
if (prop != None) {
Atom type;
int format;
unsigned long len;
unsigned long remaining;
unsigned char *data = NULL;
if (XGetWindowProperty(x11_display, x11_window, prop, 0, sizeof(Hints), False, AnyPropertyType, &type, &format, &len, &remaining, &data) == Success) {
if (data && (format == 32) && (len >= 5)) {
borderless = !((Hints *)data)->decorations;
}
XFree(data);
}
}
return borderless;
} }
void OS_X11::request_attention() { void OS_X11::request_attention() {