aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-09-27 08:50:00 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-09-27 08:50:00 +0400
commit5d8bb2589eca471dbd40152a7accd3e24a99c304 (patch)
tree58aca8e0ad09c1655e8d40cf401adcd0e8dfba38 /src
parent93369e1958e995d9ad487bb1e33a1bfb9afabb2e (diff)
downloadniri-5d8bb2589eca471dbd40152a7accd3e24a99c304.tar.gz
niri-5d8bb2589eca471dbd40152a7accd3e24a99c304.tar.bz2
niri-5d8bb2589eca471dbd40152a7accd3e24a99c304.zip
Fix layer-shell render layering
Diffstat (limited to 'src')
-rw-r--r--src/niri.rs54
1 files changed, 17 insertions, 37 deletions
diff --git a/src/niri.rs b/src/niri.rs
index c3dbbe63..1cbebe6c 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -27,9 +27,7 @@ use smithay::desktop::utils::{
surface_presentation_feedback_flags_from_states, take_presentation_feedback_surface_tree,
OutputPresentationFeedback,
};
-use smithay::desktop::{
- layer_map_for_output, LayerSurface, PopupManager, Space, Window, WindowSurfaceType,
-};
+use smithay::desktop::{layer_map_for_output, PopupManager, Space, Window, WindowSurfaceType};
use smithay::input::keyboard::XkbConfig;
use smithay::input::pointer::{CursorImageAttributes, CursorImageStatus, MotionEvent};
use smithay::input::{Seat, SeatState};
@@ -906,24 +904,18 @@ impl Niri {
let mon = self.monitor_set.monitor_for_output(output).unwrap();
let monitor_elements = mon.render_elements(renderer);
- // Get layer-shell elements.
- let layer_map = layer_map_for_output(output);
- let (lower, upper): (Vec<&LayerSurface>, Vec<&LayerSurface>) = layer_map
- .layers()
- .rev()
- .partition(|s| matches!(s.layer(), Layer::Background | Layer::Bottom));
-
// The pointer goes on the top.
let mut elements = vec![];
if include_pointer {
elements = self.pointer_element(renderer, output);
}
- // Then the upper layer-shell elements.
- // FIXME: hide top layer when a fullscreen surface is showing somehow.
- elements.extend(
- upper
- .into_iter()
+ // Get layer-shell elements.
+ let layer_map = layer_map_for_output(output);
+ let mut extend_from_layer = |elements: &mut Vec<OutputRenderElements<GlesRenderer>>,
+ layer| {
+ let iter = layer_map
+ .layers_on(layer)
.filter_map(|surface| {
layer_map
.layer_geometry(surface)
@@ -939,33 +931,21 @@ impl Niri {
)
.into_iter()
.map(OutputRenderElements::Wayland)
- }),
- );
+ });
+ elements.extend(iter);
+ };
+
+ // The upper layer-shell elements go next.
+ extend_from_layer(&mut elements, Layer::Overlay);
+ // FIXME: hide top layer when a fullscreen surface is showing somehow.
+ extend_from_layer(&mut elements, Layer::Top);
// Then the regular monitor elements.
elements.extend(monitor_elements.into_iter().map(OutputRenderElements::from));
// Then the lower layer-shell elements.
- elements.extend(
- lower
- .into_iter()
- .filter_map(|surface| {
- layer_map
- .layer_geometry(surface)
- .map(|geo| (geo.loc, surface))
- })
- .flat_map(|(loc, surface)| {
- surface
- .render_elements(
- renderer,
- loc.to_physical_precise_round(output_scale),
- output_scale,
- 1.,
- )
- .into_iter()
- .map(OutputRenderElements::Wayland)
- }),
- );
+ extend_from_layer(&mut elements, Layer::Bottom);
+ extend_from_layer(&mut elements, Layer::Background);
elements
}