diff --git a/README.md b/README.md index b27ea51dd..b05132e7b 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,7 @@ information on what to include when reporting a bug. - [X11] Bugfix: Prevent BadWindow when creating small windows with a content scale less than 1 (#2754) - [X11] Bugfix: Clamp width and height to >= 1 to prevent BadValue error and app exit + - [X11] Bugfix: Floating windows silently became non-floating when hidden (#2276) - [Linux] Bugfix: The header for `ioctl` was only implicitly included (#2778) - [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface` - [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless` diff --git a/src/x11_window.c b/src/x11_window.c index 045878aa5..5fc42b4a2 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -2438,6 +2438,38 @@ void _glfwShowWindowX11(_GLFWwindow* window) if (_glfwWindowVisibleX11(window)) return; + if (window->floating && _glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_ABOVE) + { + Atom* states = NULL; + const unsigned long count = + _glfwGetWindowPropertyX11(window->x11.handle, + _glfw.x11.NET_WM_STATE, + XA_ATOM, (unsigned char**) &states); + + // NOTE: We don't check for failure as this property may not exist yet + // and that's fine (and we'll create it implicitly with append) + + unsigned long i; + + for (i = 0; i < count; i++) + { + if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE) + break; + } + + if (i == count) + { + XChangeProperty(_glfw.x11.display, window->x11.handle, + _glfw.x11.NET_WM_STATE, XA_ATOM, 32, + PropModeAppend, + (unsigned char*) &_glfw.x11.NET_WM_STATE_ABOVE, + 1); + } + + if (states) + XFree(states); + } + XMapWindow(_glfw.x11.display, window->x11.handle); waitForVisibilityNotify(window); } @@ -2667,6 +2699,10 @@ void _glfwSetWindowFloatingX11(_GLFWwindow* window, GLFWbool enabled) } else { + // NOTE: _NET_WM_STATE_ABOVE is added when the window is shown + if (enabled) + return; + Atom* states = NULL; const unsigned long count = _glfwGetWindowPropertyX11(window->x11.handle, @@ -2677,26 +2713,7 @@ void _glfwSetWindowFloatingX11(_GLFWwindow* window, GLFWbool enabled) // NOTE: We don't check for failure as this property may not exist yet // and that's fine (and we'll create it implicitly with append) - if (enabled) - { - unsigned long i; - - for (i = 0; i < count; i++) - { - if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE) - break; - } - - if (i == count) - { - XChangeProperty(_glfw.x11.display, window->x11.handle, - _glfw.x11.NET_WM_STATE, XA_ATOM, 32, - PropModeAppend, - (unsigned char*) &_glfw.x11.NET_WM_STATE_ABOVE, - 1); - } - } - else if (states) + if (states) { for (unsigned long i = 0; i < count; i++) {