diff options
| author | srdusr <[email protected]> | 2025-02-04 23:21:00 +0200 |
|---|---|---|
| committer | srdusr <[email protected]> | 2025-02-04 23:21:00 +0200 |
| commit | 31942ff440c6039b943b4975714dca25372f80c5 (patch) | |
| tree | 420fa5be87eb03fd3b898f3c86402380be3514cf /crates/wayland/src/udev/capture.rs | |
| parent | dae1617a8b7ee7c40beb452046c5ec84e69931ee (diff) | |
| download | srdwm-31942ff440c6039b943b4975714dca25372f80c5.tar.gz srdwm-31942ff440c6039b943b4975714dca25372f80c5.zip | |
Fix CSD windows rendering with a wallpaper-visible gap at their corner
srdwm never read xdg_surface.set_window_geometry anywhere. A CSD
client (GTK4/Firefox) declares its real visible content as a sub-rect
inset within a larger buffer that also reserves an invisible shadow
margin - that margin stays reserved in the buffer even once the
tiled-state hint tells the client to stop drawing the shadow itself.
Every render path was positioning content at the client's raw buffer
origin instead of subtracting that declared offset, leaving the
margin's width/height as a gap with wallpaper visible through it at
the window's top-left corner. Confirmed by pixel-diffing the gap
against the real wallpaper at that exact screen position: an exact
match, ruling out "just the client's own dark theme."
Fixed in three places that have to move together: udev/render.rs and
winit/render.rs's content-positioning code, and sync_geometry's
space.map_element call. That last one matters as much as the other
two - it's what smithay's Space (and therefore click hit-testing)
reads, so a render-only fix would have traded a visible gap for an
invisible, same-size hit-test offset in the other direction. Also
applied to the new capture-workspace off-screen render for the same
reason.
This likely also explains real dropdown/context-menu misplacement (and
the clicks landing on the wrong spot) in CSD apps: popup positioning
anchors against the same window position this fix corrects.
Diffstat (limited to 'crates/wayland/src/udev/capture.rs')
| -rw-r--r-- | crates/wayland/src/udev/capture.rs | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/crates/wayland/src/udev/capture.rs b/crates/wayland/src/udev/capture.rs index 0f87d27..bcf2aa4 100644 --- a/crates/wayland/src/udev/capture.rs +++ b/crates/wayland/src/udev/capture.rs @@ -62,7 +62,12 @@ impl CompState { let Some(w) = self.id_to_window.get(&id) else { continue }; let Some(surface) = crate::input::dwindow_wl_surface(w) else { continue }; let Some(geom) = self.wm.borrow().window(id).map(|w| w.geometry) else { continue }; - let loc = (geom.x - origin.0, geom.y - origin.1); + // Same `set_window_geometry` offset every other render path + // subtracts (see `udev/render.rs`'s matching fix) - without + // it, a CSD window's invisible shadow margin would show up as + // a gap in the capture too. + let content_offset = w.geometry().loc; + let loc = (geom.x - origin.0 - content_offset.x, geom.y - origin.1 - content_offset.y); elements.extend(render_elements_from_surface_tree(&mut udev.renderer, &surface, loc, 1.0, 1.0, Kind::Unspecified)); } |