mirror of
https://github.com/niri-wm/niri.git
synced 2026-06-24 02:01:18 +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> {
|
impl Monitor<Window> {
|
||||||
@@ -2449,6 +2459,19 @@ impl<W: LayoutElement> Workspace<W> {
|
|||||||
let value = !col.is_fullscreen;
|
let value = !col.is_fullscreen;
|
||||||
self.set_fullscreen(window, value);
|
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> {
|
impl Workspace<Window> {
|
||||||
|
|||||||
+21
-5
@@ -993,9 +993,21 @@ impl Niri {
|
|||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
let (surface, surface_pos_within_output) = layer_surface_under(Layer::Overlay)
|
let mon = self.layout.monitor_for_output(output).unwrap();
|
||||||
.or_else(|| layer_surface_under(Layer::Top))
|
|
||||||
|
let mut under = layer_surface_under(Layer::Overlay);
|
||||||
|
|
||||||
|
if mon.render_above_top_layer() {
|
||||||
|
under = under
|
||||||
.or_else(window_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::Bottom))
|
||||||
.or_else(|| layer_surface_under(Layer::Background))?;
|
.or_else(|| layer_surface_under(Layer::Background))?;
|
||||||
|
|
||||||
@@ -1440,11 +1452,15 @@ impl Niri {
|
|||||||
|
|
||||||
// The upper layer-shell elements go next.
|
// The upper layer-shell elements go next.
|
||||||
extend_from_layer(&mut elements, Layer::Overlay);
|
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.
|
// 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));
|
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.
|
// Then the lower layer-shell elements.
|
||||||
extend_from_layer(&mut elements, Layer::Bottom);
|
extend_from_layer(&mut elements, Layer::Bottom);
|
||||||
|
|||||||
Reference in New Issue
Block a user