diff --git a/src/wl_init.c b/src/wl_init.c index 04af29b8..e6da5782 100644 --- a/src/wl_init.c +++ b/src/wl_init.c @@ -798,6 +798,8 @@ int _glfwInitWayland(void) _glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_unset_capabilities"); _glfw.wl.libdecor.libdecor_frame_set_visibility_ = (PFN_libdecor_frame_set_visibility) _glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_set_visibility"); + _glfw.wl.libdecor.libdecor_frame_is_visible_ = (PFN_libdecor_frame_is_visible) + _glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_is_visible"); _glfw.wl.libdecor.libdecor_frame_get_xdg_toplevel_ = (PFN_libdecor_frame_get_xdg_toplevel) _glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_get_xdg_toplevel"); _glfw.wl.libdecor.libdecor_configuration_get_content_size_ = (PFN_libdecor_configuration_get_content_size) @@ -829,6 +831,7 @@ int _glfwInitWayland(void) !_glfw.wl.libdecor.libdecor_frame_set_capabilities_ || !_glfw.wl.libdecor.libdecor_frame_unset_capabilities_ || !_glfw.wl.libdecor.libdecor_frame_set_visibility_ || + !_glfw.wl.libdecor.libdecor_frame_is_visible_ || !_glfw.wl.libdecor.libdecor_frame_get_xdg_toplevel_ || !_glfw.wl.libdecor.libdecor_configuration_get_content_size_ || !_glfw.wl.libdecor.libdecor_configuration_get_window_state_ || diff --git a/src/wl_platform.h b/src/wl_platform.h index 47189f59..405ea633 100644 --- a/src/wl_platform.h +++ b/src/wl_platform.h @@ -311,6 +311,7 @@ typedef void (* PFN_libdecor_frame_unset_maximized)(struct libdecor_frame*); typedef void (* PFN_libdecor_frame_set_capabilities)(struct libdecor_frame*,enum libdecor_capabilities); typedef void (* PFN_libdecor_frame_unset_capabilities)(struct libdecor_frame*,enum libdecor_capabilities); typedef void (* PFN_libdecor_frame_set_visibility)(struct libdecor_frame*,bool visible); +typedef bool (* PFN_libdecor_frame_is_visible)(struct libdecor_frame*); typedef struct xdg_toplevel* (* PFN_libdecor_frame_get_xdg_toplevel)(struct libdecor_frame*); typedef bool (* PFN_libdecor_configuration_get_content_size)(struct libdecor_configuration*,struct libdecor_frame*,int*,int*); typedef bool (* PFN_libdecor_configuration_get_window_state)(struct libdecor_configuration*,enum libdecor_window_state*); @@ -336,6 +337,7 @@ typedef void (* PFN_libdecor_state_free)(struct libdecor_state*); #define libdecor_frame_set_capabilities _glfw.wl.libdecor.libdecor_frame_set_capabilities_ #define libdecor_frame_unset_capabilities _glfw.wl.libdecor.libdecor_frame_unset_capabilities_ #define libdecor_frame_set_visibility _glfw.wl.libdecor.libdecor_frame_set_visibility_ +#define libdecor_frame_is_visible _glfw.wl.libdecor.libdecor_frame_is_visible_ #define libdecor_frame_get_xdg_toplevel _glfw.wl.libdecor.libdecor_frame_get_xdg_toplevel_ #define libdecor_configuration_get_content_size _glfw.wl.libdecor.libdecor_configuration_get_content_size_ #define libdecor_configuration_get_window_state _glfw.wl.libdecor.libdecor_configuration_get_window_state_ @@ -615,6 +617,7 @@ typedef struct _GLFWlibraryWayland PFN_libdecor_frame_set_capabilities libdecor_frame_set_capabilities_; PFN_libdecor_frame_unset_capabilities libdecor_frame_unset_capabilities_; PFN_libdecor_frame_set_visibility libdecor_frame_set_visibility_; + PFN_libdecor_frame_is_visible libdecor_frame_is_visible_; PFN_libdecor_frame_get_xdg_toplevel libdecor_frame_get_xdg_toplevel_; PFN_libdecor_configuration_get_content_size libdecor_configuration_get_content_size_; PFN_libdecor_configuration_get_window_state libdecor_configuration_get_window_state_; diff --git a/src/wl_window.c b/src/wl_window.c index 221b3ccd..46f6d469 100644 --- a/src/wl_window.c +++ b/src/wl_window.c @@ -896,6 +896,10 @@ void libdecorFrameHandleConfigure(struct libdecor_frame* frame, libdecor_frame_commit(frame, frameState, config); libdecor_state_free(frameState); + // NOTE: Frame visibility must only be set after a frame state has been committed + if (window->decorated != libdecor_frame_is_visible(window->wl.libdecor.frame)) + libdecor_frame_set_visibility(window->wl.libdecor.frame, window->decorated); + if (window->wl.activated != activated) { window->wl.activated = activated; @@ -977,11 +981,6 @@ static GLFWbool createLibdecorFrame(_GLFWwindow* window) return GLFW_FALSE; } - struct libdecor_state* frameState = - libdecor_state_new(window->wl.width, window->wl.height); - libdecor_frame_commit(window->wl.libdecor.frame, frameState, NULL); - libdecor_state_free(frameState); - if (strlen(window->wl.appId)) libdecor_frame_set_app_id(window->wl.libdecor.frame, window->wl.appId); @@ -1017,12 +1016,11 @@ static GLFWbool createLibdecorFrame(_GLFWwindow* window) } else { + // Frame visibility is applied in libdecorFrameHandleConfigure + if (window->wl.maximized) libdecor_frame_set_maximized(window->wl.libdecor.frame); - if (!window->decorated) - libdecor_frame_set_visibility(window->wl.libdecor.frame, false); - setIdleInhibitor(window, GLFW_FALSE); }