From 889d062df7d89bf8084414c6f8fd87075c3cf85a Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Thu, 2 Nov 2023 13:07:01 +0400 Subject: Render top layer under fullscreen surfaces when stationary --- src/layout.rs | 23 +++++++++++++++++++++++ src/niri.rs | 30 +++++++++++++++++++++++------- 2 files changed, 46 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/layout.rs b/src/layout.rs index 5426af95..663a5fc3 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -1768,6 +1768,16 @@ impl Monitor { } } } + + pub fn render_above_top_layer(&self) -> bool { + // Render above the top layer only if the view is stationary. + if self.workspace_switch.is_some() { + return false; + } + + let ws = &self.workspaces[self.active_workspace_idx]; + ws.render_above_top_layer() + } } impl Monitor { @@ -2449,6 +2459,19 @@ impl Workspace { let value = !col.is_fullscreen; self.set_fullscreen(window, value); } + + pub fn render_above_top_layer(&self) -> bool { + // Render above the top layer if we're on a fullscreen window and the view is stationary. + if self.columns.is_empty() { + return false; + } + + if self.view_offset_anim.is_some() { + return false; + } + + self.columns[self.active_column_idx].is_fullscreen + } } impl Workspace { diff --git a/src/niri.rs b/src/niri.rs index 0b77de93..eb1cd243 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -993,9 +993,21 @@ impl Niri { }) }; - let (surface, surface_pos_within_output) = layer_surface_under(Layer::Overlay) - .or_else(|| layer_surface_under(Layer::Top)) - .or_else(window_under) + let mon = self.layout.monitor_for_output(output).unwrap(); + + let mut under = layer_surface_under(Layer::Overlay); + + if mon.render_above_top_layer() { + under = under + .or_else(window_under) + .or_else(|| layer_surface_under(Layer::Top)); + } else { + under = under + .or_else(|| layer_surface_under(Layer::Top)) + .or_else(window_under); + } + + let (surface, surface_pos_within_output) = under .or_else(|| layer_surface_under(Layer::Bottom)) .or_else(|| layer_surface_under(Layer::Background))?; @@ -1440,11 +1452,15 @@ impl Niri { // The upper layer-shell elements go next. extend_from_layer(&mut elements, Layer::Overlay); - // FIXME: hide top layer when a fullscreen surface is showing somehow. - extend_from_layer(&mut elements, Layer::Top); - // Then the regular monitor elements. - elements.extend(monitor_elements.into_iter().map(OutputRenderElements::from)); + // Then the regular monitor elements and the top layer in varying order. + if mon.render_above_top_layer() { + elements.extend(monitor_elements.into_iter().map(OutputRenderElements::from)); + extend_from_layer(&mut elements, Layer::Top); + } else { + extend_from_layer(&mut elements, Layer::Top); + elements.extend(monitor_elements.into_iter().map(OutputRenderElements::from)); + } // Then the lower layer-shell elements. extend_from_layer(&mut elements, Layer::Bottom); -- cgit