diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-04-12 09:27:19 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-04-25 02:00:18 -0700 |
| commit | 86351938f28b6cd0da60f7e7a85195ee71a69b60 (patch) | |
| tree | 7592a8aacebb432846d5f0e009ca3c426b67c708 | |
| parent | ee4c5e23ab93d606d30e64ccf1c6cf3d9367ad91 (diff) | |
| download | niri-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.
| -rw-r--r-- | src/handlers/xdg_shell.rs | 13 | ||||
| -rw-r--r-- | src/niri.rs | 19 |
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 |
