From 7bf669fb5ca3429c5cbd7f45e567244b1682db10 Mon Sep 17 00:00:00 2001 From: Kirill Primak Date: Sat, 19 Apr 2025 00:58:03 +0300 Subject: [PATCH] xdg-surface: fix geom for surfaces that don't set it explicitly If a surface which relies on the default window geometry (e.g. wlroots' Wayland backend output) gets resized, the geometry doesn't get updated. This commit fixes that. Additionally, the fallback is the explicitly set window geometry now, not the extents; this works better for Chromium. --- types/xdg_shell/wlr_xdg_surface.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/types/xdg_shell/wlr_xdg_surface.c b/types/xdg_shell/wlr_xdg_surface.c index e492405d3..8a252d2f8 100644 --- a/types/xdg_shell/wlr_xdg_surface.c +++ b/types/xdg_shell/wlr_xdg_surface.c @@ -257,22 +257,24 @@ static const struct xdg_surface_interface xdg_surface_implementation = { // the surface, in which case it's updated on map, so that subsurfaces are // mapped and surface extents are computed correctly. static void update_geometry(struct wlr_xdg_surface *surface) { - if ((surface->current.committed & WLR_XDG_SURFACE_STATE_WINDOW_GEOMETRY) != 0) { - wlr_surface_get_extents(surface->surface, &surface->geometry); + if (!wlr_box_empty(&surface->current.geometry)) { + if ((surface->current.committed & WLR_XDG_SURFACE_STATE_WINDOW_GEOMETRY) != 0) { + struct wlr_box *geom = &surface->geometry; + wlr_surface_get_extents(surface->surface, geom); - struct wlr_box effective; - wlr_box_intersection(&effective, &surface->geometry, &surface->current.geometry); + wlr_box_intersection(geom, geom, &surface->current.geometry); + if (wlr_box_empty(geom)) { + wlr_log(WLR_INFO, + "A client has committed an invalid effective window geometry (%d,%d %dx%d); " + "this will result in client disconnection in the future", + geom->x, geom->y, geom->width, geom->height); - if (wlr_box_empty(&effective)) { - wlr_log(WLR_INFO, - "A client has committed an invalid effective window geometry (%d,%d %dx%d); " - "this will result in client disconnection in the future", - effective.x, effective.y, effective.width, effective.height); - // The extents are used instead - } else { - surface->geometry = effective; + // Fall back to the explicitly set window geometry as extents could be empty which + // would result in strange state when the client commits a buffer later + *geom = surface->current.geometry; + } } - } else if (wlr_box_empty(&surface->geometry)) { + } else { wlr_surface_get_extents(surface->surface, &surface->geometry); } }