aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-04-17 10:46:55 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-04-25 02:00:18 -0700
commitacb69c3b4df81ad6869603fda51bc3b0e6b8830c (patch)
tree66659def3d7c49ea6133fd731dd8617bd269bd6a /src
parentdbe0a9e2931b17ac113bdc90d610cf9a28029629 (diff)
downloadniri-acb69c3b4df81ad6869603fda51bc3b0e6b8830c.tar.gz
niri-acb69c3b4df81ad6869603fda51bc3b0e6b8830c.tar.bz2
niri-acb69c3b4df81ad6869603fda51bc3b0e6b8830c.zip
layout: Return floating and scrolling elems separately from Workspace
Diffstat (limited to 'src')
-rw-r--r--src/layout/monitor.rs35
-rw-r--r--src/layout/workspace.rs8
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 {