aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/layout.rs23
-rw-r--r--src/niri.rs30
2 files changed, 46 insertions, 7 deletions
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<W: LayoutElement> Monitor<W> {
}
}
}
+
+ 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<Window> {
@@ -2449,6 +2459,19 @@ impl<W: LayoutElement> Workspace<W> {
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<Window> {
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);