From acb69c3b4df81ad6869603fda51bc3b0e6b8830c Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Thu, 17 Apr 2025 10:46:55 +0300 Subject: layout: Return floating and scrolling elems separately from Workspace --- src/layout/monitor.rs | 35 +++++++++++++++++++++-------------- src/layout/workspace.rs | 8 ++++++-- 2 files changed, 27 insertions(+), 16 deletions(-) (limited to 'src/layout') diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs index 023738fe..209bfcbf 100644 --- a/src/layout/monitor.rs +++ b/src/layout/monitor.rs @@ -952,20 +952,27 @@ impl Monitor { self.workspaces_with_render_geo() .flat_map(move |(ws, geo)| { - ws.render_elements(renderer, target, focus_ring) - .filter_map(move |elem| { - CropRenderElement::from_element(elem, scale, crop_bounds) - }) - .map(move |elem| { - RelocateRenderElement::from_element( - elem, - // The offset we get from workspaces_with_render_positions() is already - // rounded to physical pixels, but it's in the logical coordinate - // space, so we need to convert it to physical. - geo.loc.to_physical_precise_round(scale), - Relocate::Relative, - ) - }) + let map_ws_contents = move |elem: WorkspaceRenderElement| { + let elem = CropRenderElement::from_element(elem, scale, crop_bounds)?; + Some(elem) + }; + + let (floating, scrolling) = ws.render_elements(renderer, target, focus_ring); + let floating = floating.filter_map(map_ws_contents); + let scrolling = scrolling.filter_map(map_ws_contents); + + let iter = floating.chain(scrolling); + + iter.map(move |elem| { + RelocateRenderElement::from_element( + elem, + // The offset we get from workspaces_with_render_positions() is already + // rounded to physical pixels, but it's in the logical coordinate + // space, so we need to convert it to physical. + geo.loc.to_physical_precise_round(scale), + Relocate::Relative, + ) + }) }) } diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index f7690ee1..af899966 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -1409,7 +1409,10 @@ impl Workspace { renderer: &mut R, target: RenderTarget, focus_ring: bool, - ) -> impl Iterator> { + ) -> ( + impl Iterator>, + impl Iterator>, + ) { let scrolling_focus_ring = focus_ring && !self.floating_is_active(); let scrolling = self .scrolling @@ -1424,8 +1427,9 @@ impl Workspace { .render_elements(renderer, view_rect, target, floating_focus_ring); floating.into_iter().map(WorkspaceRenderElement::from) }); + let floating = floating.into_iter().flatten(); - floating.into_iter().flatten().chain(scrolling) + (floating, scrolling) } pub fn render_above_top_layer(&self) -> bool { -- cgit