From 7b4cf094ef6c45ca92eaca4b0d42ef0a7c77e7e3 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Thu, 1 May 2025 10:09:25 +0300 Subject: Draw workspace shadows behind all workspaces --- src/layout/monitor.rs | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) (limited to 'src/layout') diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs index fc7b53a5..ad91f874 100644 --- a/src/layout/monitor.rs +++ b/src/layout/monitor.rs @@ -1505,7 +1505,6 @@ impl Monitor { }; let zoom = self.overview_zoom(); - let overview_clamped_progress = self.overview_progress.as_ref().map(|p| p.clamped_value()); // Draw the insert hint. let mut insert_hint = None; @@ -1532,13 +1531,6 @@ impl Monitor { let floating = floating.filter_map(map_ws_contents); let scrolling = scrolling.filter_map(map_ws_contents); - let shadow = overview_clamped_progress.map(|value| { - ws.render_shadow(renderer) - .map(move |elem| elem.with_alpha(value.clamp(0., 1.) as f32)) - .map(MonitorInnerRenderElement::Shadow) - }); - let shadow = shadow.into_iter().flatten(); - let hint = if matches!(insert_hint, Some((hint_ws_id, _)) if hint_ws_id == ws.id()) { let iter = insert_hint.take().unwrap().1; let iter = iter.filter_map(move |elem| { @@ -1552,7 +1544,7 @@ impl Monitor { }; let hint = hint.into_iter().flatten(); - let iter = floating.chain(hint).chain(scrolling).chain(shadow); + let iter = floating.chain(hint).chain(scrolling); let iter = iter.map(move |elem| { let elem = RescaleRenderElement::from_element(elem, Point::from((0, 0)), zoom); @@ -1570,6 +1562,36 @@ impl Monitor { }) } + pub fn render_workspace_shadows<'a, R: NiriRenderer>( + &'a self, + renderer: &'a mut R, + ) -> impl Iterator> + 'a { + let _span = tracy_client::span!("Monitor::render_workspace_shadows"); + + let scale = self.scale.fractional_scale(); + let zoom = self.overview_zoom(); + let overview_clamped_progress = self.overview_progress.as_ref().map(|p| p.clamped_value()); + + self.workspaces_with_render_geo() + .flat_map(move |(ws, geo)| { + let shadow = overview_clamped_progress.map(|value| { + ws.render_shadow(renderer) + .map(move |elem| elem.with_alpha(value.clamp(0., 1.) as f32)) + .map(MonitorInnerRenderElement::Shadow) + }); + let iter = shadow.into_iter().flatten(); + + iter.map(move |elem| { + let elem = RescaleRenderElement::from_element(elem, Point::from((0, 0)), zoom); + RelocateRenderElement::from_element( + elem, + geo.loc.to_physical_precise_round(scale), + Relocate::Relative, + ) + }) + }) + } + pub fn workspace_switch_gesture_begin(&mut self, is_touchpad: bool) { let center_idx = self.active_workspace_idx; let current_idx = self.workspace_render_idx(); -- cgit