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

(cherry picked from commit 0f5b095042)
This commit is contained in:
Camilla Löwy 2022-06-16 01:36:55 +02:00
parent 4ba1208239
commit cdbcb8c5a7
3 changed files with 15 additions and 2 deletions

View File

@ -23,6 +23,7 @@ video tutorials.
- Waris Boonyasiriwat - Waris Boonyasiriwat
- Kyle Brenneman - Kyle Brenneman
- Rok Breulj - Rok Breulj
- TheBrokenRail
- Kai Burjack - Kai Burjack
- Martin Capitanio - Martin Capitanio
- Nicolas Caramelli - Nicolas Caramelli
@ -143,6 +144,7 @@ video tutorials.
- Jon Morton - Jon Morton
- Pierre Moulon - Pierre Moulon
- Martins Mozeiko - Martins Mozeiko
- James Murphy
- Julian Møller - Julian Møller
- ndogxj - ndogxj
- Kristian Nielsen - Kristian Nielsen

View File

@ -162,6 +162,8 @@ information on what to include when reporting a bug.
- [Wayland] Bugfix: A window content scale event would be emitted every time - [Wayland] Bugfix: A window content scale event would be emitted every time
the window resized the window resized
- [Wayland] Bugfix: If `glfwInit` failed it would close stdin - [Wayland] Bugfix: If `glfwInit` failed it would close stdin
- [Wayland] Bugfix: Manual resizing with fallback decorations behaved erratically
(#1991,#2115,#2127)
## Contact ## Contact

View File

@ -537,10 +537,19 @@ static void xdgToplevelHandleConfigure(void* userData,
window->wl.fullscreen = fullscreen; window->wl.fullscreen = fullscreen;
if (width && height) if (width && 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.width = width;
window->wl.pending.height = height; window->wl.pending.height = height;
} }
}
else else
{ {
window->wl.pending.width = window->wl.width; window->wl.pending.width = window->wl.width;