aboutsummaryrefslogtreecommitdiff
path: root/src/layout/monitor.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-05-01 10:09:25 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-05-01 10:10:11 +0300
commit7b4cf094ef6c45ca92eaca4b0d42ef0a7c77e7e3 (patch)
treea16e0c40d245dce007544872811d64ba9304ff7b /src/layout/monitor.rs
parent446bc155ce15103c347c1a4f654c71a88d9991fa (diff)
downloadniri-7b4cf094ef6c45ca92eaca4b0d42ef0a7c77e7e3.tar.gz
niri-7b4cf094ef6c45ca92eaca4b0d42ef0a7c77e7e3.tar.bz2
niri-7b4cf094ef6c45ca92eaca4b0d42ef0a7c77e7e3.zip
Draw workspace shadows behind all workspaces
Diffstat (limited to 'src/layout/monitor.rs')
-rw-r--r--src/layout/monitor.rs40
1 files changed, 31 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();