diff options
| -rw-r--r-- | src/layout/monitor.rs | 40 | ||||
| -rw-r--r-- | src/niri.rs | 13 |
2 files changed, 44 insertions, 9 deletions
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<W: LayoutElement> Monitor<W> { }; 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<W: LayoutElement> Monitor<W> { 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<W: LayoutElement> Monitor<W> { }; 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<W: LayoutElement> Monitor<W> { }) } + pub fn render_workspace_shadows<'a, R: NiriRenderer>( + &'a self, + renderer: &'a mut R, + ) -> impl Iterator<Item = MonitorRenderElement<R>> + '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(); diff --git a/src/niri.rs b/src/niri.rs index ab7371dc..9b195a1e 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -4009,6 +4009,7 @@ impl Niri { mon.render_elements(renderer, target, focus_ring) .map(|(geo, iter)| (geo, Vec::from_iter(iter))), ); + let workspace_shadow_elements = Vec::from_iter(mon.render_workspace_shadows(renderer)); let insert_hint_elements = mon.render_insert_hint_between_workspaces(renderer); let int_move_elements: Vec<_> = self .layout @@ -4062,6 +4063,12 @@ impl Niri { elements.extend(layer_elems.normal.drain(..).map(OutputRenderElements::from)); elements.push(OutputRenderElements::from(background)); + + elements.extend( + workspace_shadow_elements + .into_iter() + .map(OutputRenderElements::from), + ); } else { elements.extend(top_layer.into_iter().map(OutputRenderElements::from)); @@ -4107,6 +4114,12 @@ impl Niri { elements.push(OutputRenderElements::from(elem)); } } + + elements.extend( + workspace_shadow_elements + .into_iter() + .map(OutputRenderElements::from), + ); } // Then the backdrop. |
