diff --git a/src/wl_platform.h b/src/wl_platform.h index c0721e2b..0c64bf2b 100644 --- a/src/wl_platform.h +++ b/src/wl_platform.h @@ -241,6 +241,10 @@ typedef struct _GLFWwindowWayland struct wl_egl_window* native; struct wl_callback* callback; + struct { + int width, height; + } pending; + struct { struct xdg_surface* surface; struct xdg_toplevel* toplevel; diff --git a/src/wl_window.c b/src/wl_window.c index ef1ac584..522a80e7 100644 --- a/src/wl_window.c +++ b/src/wl_window.c @@ -464,8 +464,6 @@ static void xdgToplevelHandleConfigure(void* userData, struct wl_array* states) { _GLFWwindow* window = userData; - float aspectRatio; - float targetRatio; uint32_t* state; GLFWbool maximized = GLFW_FALSE; GLFWbool fullscreen = GLFW_FALSE; @@ -489,28 +487,6 @@ static void xdgToplevelHandleConfigure(void* userData, } } - if (width != 0 && height != 0) - { - if (!maximized && !fullscreen) - { - if (window->numer != GLFW_DONT_CARE && window->denom != GLFW_DONT_CARE) - { - aspectRatio = (float)width / (float)height; - targetRatio = (float)window->numer / (float)window->denom; - if (aspectRatio < targetRatio) - height = width / targetRatio; - else if (aspectRatio > targetRatio) - width = height * targetRatio; - } - } - - _glfwInputWindowSize(window, width, height); - window->wl.width = width; - window->wl.height = height; - resizeWindow(window); - _glfwInputWindowDamage(window); - } - if (window->wl.activated && !activated) { if (window->monitor && window->autoIconify) @@ -525,6 +501,17 @@ static void xdgToplevelHandleConfigure(void* userData, window->wl.activated = activated; window->wl.maximized = maximized; window->wl.fullscreen = fullscreen; + + if (width && height) + { + window->wl.pending.width = width; + window->wl.pending.height = height; + } + else + { + window->wl.pending.width = window->wl.width; + window->wl.pending.height = window->wl.height; + } } static void xdgToplevelHandleClose(void* userData, @@ -544,7 +531,34 @@ static void xdgSurfaceHandleConfigure(void* userData, struct xdg_surface* surface, uint32_t serial) { + _GLFWwindow* window = userData; + int width = window->wl.pending.width; + int height = window->wl.pending.height; + xdg_surface_ack_configure(surface, serial); + + if (!window->wl.maximized && !window->wl.fullscreen) + { + if (window->numer != GLFW_DONT_CARE && window->denom != GLFW_DONT_CARE) + { + const float aspectRatio = (float) width / (float) height; + const float targetRatio = (float) window->numer / (float) window->denom; + if (aspectRatio < targetRatio) + height = width / targetRatio; + else if (aspectRatio > targetRatio) + width = height * targetRatio; + } + } + + if (width != window->wl.width || height != window->wl.height) + { + window->wl.width = width; + window->wl.height = height; + resizeWindow(window); + + _glfwInputWindowSize(window, width, height); + _glfwInputWindowDamage(window); + } } static const struct xdg_surface_listener xdgSurfaceListener = {