From 6b9087c5755bd0a00f439c0bf4b50fdfc905c377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Tue, 14 Jun 2022 20:37:31 +0200 Subject: [PATCH] Wayland: Fix error from glfwSetWindowAspectRatio The aspect ratio was applied during resize but any call to glfwSetWindowAspectRatio emitted a GLFW_FEATURE_UNIMPLEMENTED error. (cherry picked from commit 91f18fb57697c57bf9da64ad546eed5c60518618) --- README.md | 2 ++ src/wl_window.c | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d93ca6e6..bd3c4fc0 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,8 @@ information on what to include when reporting a bug. scale - [Wayland] Bugfix: Window content scale events were not emitted when monitor scale changed + - [Wayland] Bugfix: `glfwSetWindowAspectRatio` reported an error instead of + applying the specified ratio ## Contact diff --git a/src/wl_window.c b/src/wl_window.c index 996bac8b..a693bc08 100644 --- a/src/wl_window.c +++ b/src/wl_window.c @@ -1988,8 +1988,20 @@ void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window, void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom) { - // TODO: find out how to trigger a resize. - // The actual limits are checked in the xdg_toplevel::configure handler. + if (window->wl.maximized || window->wl.fullscreen) + return; + + if (numer != GLFW_DONT_CARE && denom != GLFW_DONT_CARE) + { + const float aspectRatio = (float) window->wl.width / (float) window->wl.height; + const float targetRatio = (float) numer / (float) denom; + if (aspectRatio < targetRatio) + window->wl.height = window->wl.width / targetRatio; + else if (aspectRatio > targetRatio) + window->wl.width = window->wl.height * targetRatio; + + resizeWindow(window); + } } void _glfwPlatformGetFramebufferSize(_GLFWwindow* window,