From 0f5b095042842006747f8dc04aded64ea3e05d2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Thu, 16 Jun 2022 01:36:55 +0200 Subject: [PATCH] Wayland: Fix erratic fallback decoration behavior The handler for xdg_toplevel::configure treated the provided size as the content area size when instead it is the size of the bounding rectangle of the wl_surface and all its subsurfaces. This caused the fallback decorations to try positioning themselves outside themselves, causing feedback loops during interactive resizing. Fixes #1991 Fixes #2115 Closes #2127 Related to #1914 --- CONTRIBUTORS.md | 2 ++ README.md | 2 ++ src/wl_window.c | 13 +++++++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 50f77fa5..1498d01e 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -24,6 +24,7 @@ video tutorials. - Waris Boonyasiriwat - Kyle Brenneman - Rok Breulj + - TheBrokenRail - Kai Burjack - Martin Capitanio - Nicolas Caramelli @@ -145,6 +146,7 @@ video tutorials. - Pierre Moulon - Martins Mozeiko - Pascal Muetschard + - James Murphy - Julian Møller - ndogxj - n3rdopolis diff --git a/README.md b/README.md index 5e75122e..3fd1a353 100644 --- a/README.md +++ b/README.md @@ -343,6 +343,8 @@ information on what to include when reporting a bug. - [Wayland] Bugfix: A window content scale event would be emitted every time the window resized - [Wayland] Bugfix: If `glfwInit` failed it would close stdin + - [Wayland] Bugfix: Manual resizing with fallback decorations behaved erratically + (#1991,#2115,#2127) - [POSIX] Removed use of deprecated function `gettimeofday` - [POSIX] Bugfix: `CLOCK_MONOTONIC` was not correctly tested for or enabled - [WGL] Disabled the DWM swap interval hack for Windows 8 and later (#1072) diff --git a/src/wl_window.c b/src/wl_window.c index f3c7aab4..900aae2a 100644 --- a/src/wl_window.c +++ b/src/wl_window.c @@ -495,8 +495,17 @@ static void xdgToplevelHandleConfigure(void* userData, if (width && height) { - window->wl.pending.width = width; - window->wl.pending.height = height; + if (window->wl.decorations.top.surface) + { + window->wl.pending.width = _glfw_max(0, width - GLFW_BORDER_SIZE * 2); + window->wl.pending.height = + _glfw_max(0, height - GLFW_BORDER_SIZE - GLFW_CAPTION_HEIGHT); + } + else + { + window->wl.pending.width = width; + window->wl.pending.height = height; + } } else {