aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-04-12 09:27:19 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-04-25 02:00:18 -0700
commit86351938f28b6cd0da60f7e7a85195ee71a69b60 (patch)
tree7592a8aacebb432846d5f0e009ca3c426b67c708 /src
parentee4c5e23ab93d606d30e64ccf1c6cf3d9367ad91 (diff)
downloadniri-86351938f28b6cd0da60f7e7a85195ee71a69b60.tar.gz
niri-86351938f28b6cd0da60f7e7a85195ee71a69b60.tar.bz2
niri-86351938f28b6cd0da60f7e7a85195ee71a69b60.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/handlers/xdg_shell.rs13
-rw-r--r--src/niri.rs19
2 files changed, 24 insertions, 8 deletions
diff --git a/src/handlers/xdg_shell.rs b/src/handlers/xdg_shell.rs
index ecae2475..e06d1fca 100644
--- a/src/handlers/xdg_shell.rs
+++ b/src/handlers/xdg_shell.rs
@@ -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);
diff --git a/src/niri.rs b/src/niri.rs
index c06d99c7..1acb01ea 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -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