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 /src | |
| 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.
Diffstat (limited to 'src')
| -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 |
