diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-04-17 10:46:55 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-04-25 02:00:18 -0700 |
| commit | acb69c3b4df81ad6869603fda51bc3b0e6b8830c (patch) | |
| tree | 66659def3d7c49ea6133fd731dd8617bd269bd6a /src/layout | |
| parent | dbe0a9e2931b17ac113bdc90d610cf9a28029629 (diff) | |
| download | niri-acb69c3b4df81ad6869603fda51bc3b0e6b8830c.tar.gz niri-acb69c3b4df81ad6869603fda51bc3b0e6b8830c.tar.bz2 niri-acb69c3b4df81ad6869603fda51bc3b0e6b8830c.zip | |
layout: Return floating and scrolling elems separately from Workspace
Diffstat (limited to 'src/layout')
| -rw-r--r-- | src/layout/monitor.rs | 35 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 8 |
2 files changed, 27 insertions, 16 deletions
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<W: LayoutElement> Monitor<W> { 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<R>| { + 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<W: LayoutElement> Workspace<W> { renderer: &mut R, target: RenderTarget, focus_ring: bool, - ) -> impl Iterator<Item = WorkspaceRenderElement<R>> { + ) -> ( + impl Iterator<Item = WorkspaceRenderElement<R>>, + impl Iterator<Item = WorkspaceRenderElement<R>>, + ) { let scrolling_focus_ring = focus_ring && !self.floating_is_active(); let scrolling = self .scrolling @@ -1424,8 +1427,9 @@ impl<W: LayoutElement> Workspace<W> { .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 { |
