Decouple scrolling translation from resize readiness

Track configure-owned presentation dependencies so independent viewport translation can continue while clients resize. Preserve linked reflow waits, native snapshots, handoff deadlines and shared rendering/input coordinates.

Closes #10.
This commit is contained in:
Samuel Onoja authored and GitHub committed 2026-10-04 08:05:44 +01:00
1 parent c1801e1f07
commit d5a829eb16
14 files changed
+1742 -72

No files matched your search

+15 -2
View File
@@ -9,6 +9,7 @@ mod outputs;
mod reconciliation;
pub(crate) use reconciliation::{DesktopChanges, DesktopOutput, DesktopTransition};
mod prediction;
mod presentation_dependencies;
pub(crate) use prediction::FrameScene;
mod lifecycle;
mod window_registry;
@@ -154,6 +155,8 @@ struct FocusSwipe {
start: f64,
destination: f64,
progress: f64,
layout: Option<ferese_layout::ScrollingLayout>,
dependencies: Option<presentation_dependencies::ViewportDependencies>,
}
impl FocusSwipe {
@@ -433,7 +436,7 @@ pub struct Ferese {
pub(crate) logout_query: Option<u32>,
pub(crate) logout_owner: Option<ObjectId>,
viewport_animations: HashMap<WorkspaceId, AnimatedValue>,
paused_workspaces: HashSet<WorkspaceId>,
presentation_dependencies: presentation_dependencies::PresentationDependencies,
#[cfg(feature = "resize-metrics")]
pub(crate) resize_metrics: crate::resize_metrics::ResizeMetrics,
focus_swipe: Option<FocusSwipe>,
@@ -488,6 +491,8 @@ pub struct Ferese {
pub(crate) overview: OverviewState,
next_output_id: u64,
last_animation_tick: Instant,
#[cfg(test)]
animation_test_time: Option<Duration>,
pub popups: PopupManager,
pub(crate) dismissing_popups: Vec<(WlSurface, PopupKind, DimAnimation)>,
pub seat: Seat<Self>,
@@ -676,7 +681,7 @@ impl Ferese {
logout_query: None,
logout_owner: None,
viewport_animations: HashMap::new(),
paused_workspaces: HashSet::new(),
presentation_dependencies: Default::default(),
#[cfg(feature = "resize-metrics")]
resize_metrics: crate::resize_metrics::ResizeMetrics::default(),
focus_swipe: None,
@@ -726,6 +731,8 @@ impl Ferese {
overview: OverviewState::with_font_family(config.overview_font_family),
next_output_id: 1,
last_animation_tick: start_time,
#[cfg(test)]
animation_test_time: None,
popups: PopupManager::default(),
dismissing_popups: Vec::new(),
seat,
@@ -1213,6 +1220,8 @@ mod tests {
start: 20.0,
destination: 20.0,
progress: 2.0,
layout: None,
dependencies: None,
};
assert!(swipe.position() > 20.0 && swipe.position() < 84.0);
assert!(swipe.release_velocity(0.0, 3.0) > 0.0);
@@ -1363,6 +1372,8 @@ mod tests {
start: 500.0,
destination,
progress: 0.75,
layout: None,
dependencies: None,
};
let far = swipe.position();
swipe.progress = 0.25;
@@ -1391,6 +1402,8 @@ mod tests {
start: 0.0,
destination: 0.0,
progress: 0.5,
layout: None,
dependencies: None,
};
assert_eq!(swipe.position(), sign * 32.0);
assert_eq!(swipe.destination, 0.0);