Render top layer under fullscreen surfaces when stationary

This commit is contained in:
Ivan Molodetskikh
2023-11-02 13:07:01 +04:00
parent 10905efeaf
commit 889d062df7
2 changed files with 46 additions and 7 deletions
+23
View File
@@ -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> {
+23 -7
View File
@@ -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);