aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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