From a597d09a7afeb10ce050ffa2220651e9bbc4f396 Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Tue, 29 Sep 2026 15:13:31 +0100 Subject: [PATCH] Settle window animations when their workspace hides --- compositor/src/state.rs | 6 +++++- crates/ferese-animation/src/lib.rs | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/compositor/src/state.rs b/compositor/src/state.rs index 4c0363e..7c4852f 100644 --- a/compositor/src/state.rs +++ b/compositor/src/state.rs @@ -1460,7 +1460,11 @@ impl Ferese { if visible.contains(id) { continue; } - layout_changed |= space.element_location(window).is_some(); + let was_mapped = space.element_location(window).is_some(); + layout_changed |= was_mapped; + if was_mapped && let Some(geometry) = self.window_geometry.get_mut(id) { + geometry.settle_presentation(); + } space.unmap_elem(window); } self.space = space; diff --git a/crates/ferese-animation/src/lib.rs b/crates/ferese-animation/src/lib.rs index 6fd8fe2..477dd6c 100644 --- a/crates/ferese-animation/src/lib.rs +++ b/crates/ferese-animation/src/lib.rs @@ -597,6 +597,22 @@ mod tests { assert!(!geometry.advance(Duration::from_millis(16), SpringConfig::default(), true)); } + #[test] + fn hiding_maximized_window_finishes_resize_without_hiding_decorations() { + let normal = Rect::new(100.0, 50.0, 900.0, 700.0); + let maximized = Rect::new(0.0, 40.0, 1920.0, 1040.0); + let mut geometry = WindowGeometry::new(normal, None); + geometry.set_presentation_mode(maximized, PresentationMode::Maximized, Duration::ZERO); + geometry.advance(Duration::from_millis(16), SpringConfig::default(), true); + assert!(geometry.is_zooming()); + + geometry.settle_presentation(); + + assert_eq!(geometry.visual.current, maximized); + assert_eq!(geometry.decorations, 1.0); + assert!(!geometry.is_zooming()); + } + #[test] fn maximized_zoom_keeps_decorations_and_restores_through_fullscreen() { let normal = Rect::new(800.0, 50.0, 600.0, 700.0);