layout: Return floating and scrolling elems separately from Workspace

This commit is contained in:
Ivan Molodetskikh
2025-04-17 10:46:55 +03:00
parent dbe0a9e293
commit acb69c3b4d
2 changed files with 27 additions and 16 deletions
+21 -14
View File
@@ -952,20 +952,27 @@ impl<W: LayoutElement> Monitor<W> {
self.workspaces_with_render_geo() self.workspaces_with_render_geo()
.flat_map(move |(ws, geo)| { .flat_map(move |(ws, geo)| {
ws.render_elements(renderer, target, focus_ring) let map_ws_contents = move |elem: WorkspaceRenderElement<R>| {
.filter_map(move |elem| { let elem = CropRenderElement::from_element(elem, scale, crop_bounds)?;
CropRenderElement::from_element(elem, scale, crop_bounds) Some(elem)
}) };
.map(move |elem| {
RelocateRenderElement::from_element( let (floating, scrolling) = ws.render_elements(renderer, target, focus_ring);
elem, let floating = floating.filter_map(map_ws_contents);
// The offset we get from workspaces_with_render_positions() is already let scrolling = scrolling.filter_map(map_ws_contents);
// rounded to physical pixels, but it's in the logical coordinate
// space, so we need to convert it to physical. let iter = floating.chain(scrolling);
geo.loc.to_physical_precise_round(scale),
Relocate::Relative, 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,
)
})
}) })
} }
+6 -2
View File
@@ -1409,7 +1409,10 @@ impl<W: LayoutElement> Workspace<W> {
renderer: &mut R, renderer: &mut R,
target: RenderTarget, target: RenderTarget,
focus_ring: bool, 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_focus_ring = focus_ring && !self.floating_is_active();
let scrolling = self let scrolling = self
.scrolling .scrolling
@@ -1424,8 +1427,9 @@ impl<W: LayoutElement> Workspace<W> {
.render_elements(renderer, view_rect, target, floating_focus_ring); .render_elements(renderer, view_rect, target, floating_focus_ring);
floating.into_iter().map(WorkspaceRenderElement::from) 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 { pub fn render_above_top_layer(&self) -> bool {