mirror of
https://github.com/glfw/glfw.git
synced 2026-09-23 09:08:58 +00:00
Wayland: Fix undecorated libdecor frame creation
In order to safely call libdecor_frame_set_visibility during window creation, a libdecor frame state was synthesized and committed. This commit instead postpones the call to libdecor_frame_set_visibility until after the frame state received by the frame configure event has been committed. This appears to be a more polite approach. Related to #2842
This commit is contained in:
@@ -798,6 +798,8 @@ int _glfwInitWayland(void)
|
|||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_unset_capabilities");
|
_glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "libdecor_frame_unset_capabilities");
|
||||||
_glfw.wl.libdecor.libdecor_frame_set_visibility_ = (PFN_libdecor_frame_set_visibility)
|
_glfw.wl.libdecor.libdecor_frame_set_visibility_ = (PFN_libdecor_frame_set_visibility)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "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)
|
_glfw.wl.libdecor.libdecor_frame_get_xdg_toplevel_ = (PFN_libdecor_frame_get_xdg_toplevel)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.wl.libdecor.handle, "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)
|
_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_set_capabilities_ ||
|
||||||
!_glfw.wl.libdecor.libdecor_frame_unset_capabilities_ ||
|
!_glfw.wl.libdecor.libdecor_frame_unset_capabilities_ ||
|
||||||
!_glfw.wl.libdecor.libdecor_frame_set_visibility_ ||
|
!_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_frame_get_xdg_toplevel_ ||
|
||||||
!_glfw.wl.libdecor.libdecor_configuration_get_content_size_ ||
|
!_glfw.wl.libdecor.libdecor_configuration_get_content_size_ ||
|
||||||
!_glfw.wl.libdecor.libdecor_configuration_get_window_state_ ||
|
!_glfw.wl.libdecor.libdecor_configuration_get_window_state_ ||
|
||||||
|
|||||||
@@ -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_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_unset_capabilities)(struct libdecor_frame*,enum libdecor_capabilities);
|
||||||
typedef void (* PFN_libdecor_frame_set_visibility)(struct libdecor_frame*,bool visible);
|
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 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_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*);
|
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_set_capabilities _glfw.wl.libdecor.libdecor_frame_set_capabilities_
|
||||||
#define libdecor_frame_unset_capabilities _glfw.wl.libdecor.libdecor_frame_unset_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_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_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_content_size _glfw.wl.libdecor.libdecor_configuration_get_content_size_
|
||||||
#define libdecor_configuration_get_window_state _glfw.wl.libdecor.libdecor_configuration_get_window_state_
|
#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_set_capabilities libdecor_frame_set_capabilities_;
|
||||||
PFN_libdecor_frame_unset_capabilities libdecor_frame_unset_capabilities_;
|
PFN_libdecor_frame_unset_capabilities libdecor_frame_unset_capabilities_;
|
||||||
PFN_libdecor_frame_set_visibility libdecor_frame_set_visibility_;
|
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_frame_get_xdg_toplevel libdecor_frame_get_xdg_toplevel_;
|
||||||
PFN_libdecor_configuration_get_content_size libdecor_configuration_get_content_size_;
|
PFN_libdecor_configuration_get_content_size libdecor_configuration_get_content_size_;
|
||||||
PFN_libdecor_configuration_get_window_state libdecor_configuration_get_window_state_;
|
PFN_libdecor_configuration_get_window_state libdecor_configuration_get_window_state_;
|
||||||
|
|||||||
+6
-8
@@ -896,6 +896,10 @@ void libdecorFrameHandleConfigure(struct libdecor_frame* frame,
|
|||||||
libdecor_frame_commit(frame, frameState, config);
|
libdecor_frame_commit(frame, frameState, config);
|
||||||
libdecor_state_free(frameState);
|
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)
|
if (window->wl.activated != activated)
|
||||||
{
|
{
|
||||||
window->wl.activated = activated;
|
window->wl.activated = activated;
|
||||||
@@ -977,11 +981,6 @@ static GLFWbool createLibdecorFrame(_GLFWwindow* window)
|
|||||||
return GLFW_FALSE;
|
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))
|
if (strlen(window->wl.appId))
|
||||||
libdecor_frame_set_app_id(window->wl.libdecor.frame, 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
|
else
|
||||||
{
|
{
|
||||||
|
// Frame visibility is applied in libdecorFrameHandleConfigure
|
||||||
|
|
||||||
if (window->wl.maximized)
|
if (window->wl.maximized)
|
||||||
libdecor_frame_set_maximized(window->wl.libdecor.frame);
|
libdecor_frame_set_maximized(window->wl.libdecor.frame);
|
||||||
|
|
||||||
if (!window->decorated)
|
|
||||||
libdecor_frame_set_visibility(window->wl.libdecor.frame, false);
|
|
||||||
|
|
||||||
setIdleInhibitor(window, GLFW_FALSE);
|
setIdleInhibitor(window, GLFW_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user