diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-09-27 08:50:00 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-09-27 08:50:00 +0400 |
| commit | 5d8bb2589eca471dbd40152a7accd3e24a99c304 (patch) | |
| tree | 58aca8e0ad09c1655e8d40cf401adcd0e8dfba38 /src | |
| parent | 93369e1958e995d9ad487bb1e33a1bfb9afabb2e (diff) | |
| download | niri-5d8bb2589eca471dbd40152a7accd3e24a99c304.tar.gz niri-5d8bb2589eca471dbd40152a7accd3e24a99c304.tar.bz2 niri-5d8bb2589eca471dbd40152a7accd3e24a99c304.zip | |
Fix layer-shell render layering
Diffstat (limited to 'src')
| -rw-r--r-- | src/niri.rs | 54 |
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 } |
