Put the top layer above bottom and background layer popups

Makes it consistent with how window popups are below the top layer, also
will make more sense for the overview.
This commit is contained in:
Ivan Molodetskikh
2025-04-12 09:27:19 +03:00
parent ee4c5e23ab
commit 86351938f2
2 changed files with 24 additions and 8 deletions
+13
View File
@@ -1062,6 +1062,19 @@ impl State {
// The target geometry for the positioner should be relative to its parent's geometry, so
// we will compute that here.
let mut target = Rectangle::from_size(output_geo.size);
// Background and bottom layer popups render below the top and the overlay layer, so let's
// put them into the non-exclusive zone.
//
// FIXME: ideally this should use the "top and overlay layer" non-exclusive zone, but
// Smithay only computes the "all layers" non-exclusive zone atm.
//
// FIXME: related to the above, top layer popups should use the "overlay layer"
// non-exclusive zone.
if matches!(layer_surface.layer(), Layer::Background | Layer::Bottom) {
target = map.non_exclusive_zone();
}
target.loc -= layer_geo.loc;
target.loc -= get_popup_toplevel_coords(popup);
+11 -8
View File
@@ -2880,9 +2880,9 @@ impl Niri {
let mon = self.layout.monitor_for_output(output).unwrap();
if !mon.render_above_top_layer()
&& (layer_popup_under(Layer::Top)
|| layer_toplevel_under(Layer::Top)
|| layer_popup_under(Layer::Bottom)
|| layer_popup_under(Layer::Background)
|| layer_toplevel_under(Layer::Top))
|| layer_popup_under(Layer::Background))
{
return None;
}
@@ -3008,17 +3008,17 @@ impl Niri {
under = under
.or_else(window_under)
.or_else(|| layer_popup_under(Layer::Top))
.or_else(|| layer_toplevel_under(Layer::Top))
.or_else(|| layer_popup_under(Layer::Bottom))
.or_else(|| layer_popup_under(Layer::Background))
.or_else(|| layer_toplevel_under(Layer::Top))
.or_else(|| layer_toplevel_under(Layer::Bottom))
.or_else(|| layer_toplevel_under(Layer::Background));
} else {
under = under
.or_else(|| layer_popup_under(Layer::Top))
.or_else(|| layer_toplevel_under(Layer::Top))
.or_else(|| layer_popup_under(Layer::Bottom))
.or_else(|| layer_popup_under(Layer::Background))
.or_else(|| layer_toplevel_under(Layer::Top))
.or_else(window_under)
.or_else(|| layer_toplevel_under(Layer::Bottom))
.or_else(|| layer_toplevel_under(Layer::Background));
@@ -3791,10 +3791,13 @@ impl Niri {
extend_from_layer(&mut layer_elems, Layer::Overlay);
elements.extend(layer_elems.into_iter().map(OutputRenderElements::from));
// Collect all other layer-shell elements.
// Collect the top layer elements.
let mut layer_elems = SplitElements::default();
extend_from_layer(&mut layer_elems, Layer::Top);
let top_layer_normal = mem::take(&mut layer_elems.normal);
let top_layer = layer_elems;
// Collect all other layer-shell elements.
let mut layer_elems = SplitElements::default();
extend_from_layer(&mut layer_elems, Layer::Bottom);
extend_from_layer(&mut layer_elems, Layer::Background);
@@ -3808,12 +3811,12 @@ impl Niri {
);
elements.extend(monitor_elements.into_iter().map(OutputRenderElements::from));
elements.extend(top_layer.into_iter().map(OutputRenderElements::from));
elements.extend(layer_elems.popups.drain(..).map(OutputRenderElements::from));
elements.extend(top_layer_normal.into_iter().map(OutputRenderElements::from));
elements.extend(layer_elems.normal.drain(..).map(OutputRenderElements::from));
} else {
elements.extend(top_layer.into_iter().map(OutputRenderElements::from));
elements.extend(layer_elems.popups.drain(..).map(OutputRenderElements::from));
elements.extend(top_layer_normal.into_iter().map(OutputRenderElements::from));
elements.extend(
int_move_elements