mirror of
https://github.com/niri-wm/niri.git
synced 2026-06-23 02:05:33 +07:00
Render top layer under fullscreen surfaces when stationary
This commit is contained in:
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user