diff options
Diffstat (limited to 'src/niri.rs')
| -rw-r--r-- | src/niri.rs | 75 |
1 files changed, 58 insertions, 17 deletions
diff --git a/src/niri.rs b/src/niri.rs index be553293..4aa353d1 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -992,9 +992,19 @@ impl State { // Clean up on-demand layer surface focus if necessary. if let Some(surface) = &self.niri.layer_shell_on_demand_focus { // Still alive and has on-demand interactivity. - let good = surface.alive() + let mut good = surface.alive() && surface.cached_state().keyboard_interactivity == wlr_layer::KeyboardInteractivity::OnDemand; + + // Check if it moved to the overview backdrop. + if let Some(mapped) = self.niri.mapped_layer_surfaces.get(surface) { + if mapped.place_within_backdrop() { + good = false; + } + } else { + good = false; + } + if !good { self.niri.layer_shell_on_demand_focus = None; } @@ -1042,6 +1052,11 @@ impl State { return None; } + let mapped = self.niri.mapped_layer_surfaces.get(surface)?; + if mapped.place_within_backdrop() { + return None; + } + let surface = surface.wl_surface().clone(); Some(KeyboardFocus::LayerShell { surface }) }) @@ -1513,11 +1528,10 @@ impl State { resized_outputs.push(output.clone()); } - let mut background_color = config + let background_color = config .map(|c| c.background_color) .unwrap_or(DEFAULT_BACKGROUND_COLOR) .to_array_unpremul(); - background_color[3] = 1.; let background_color = Color32F::from(background_color); let mut backdrop_color = config @@ -2710,11 +2724,10 @@ impl Niri { .map(|c| ipc_transform_to_smithay(c.transform)) .unwrap_or(Transform::Normal); - let mut background_color = c + let background_color = c .map(|c| c.background_color) .unwrap_or(DEFAULT_BACKGROUND_COLOR) .to_array_unpremul(); - background_color[3] = 1.; let mut backdrop_color = c .and_then(|c| c.backdrop_color) @@ -2991,6 +3004,11 @@ impl Niri { .layers_on(layer) .rev() .find_map(|layer_surface| { + let mapped = self.mapped_layer_surfaces.get(layer_surface)?; + if mapped.place_within_backdrop() { + return None; + } + let mut layer_pos_within_output = layers.layer_geometry(layer_surface).unwrap().loc.to_f64(); @@ -3141,6 +3159,11 @@ impl Niri { .layers_on(layer) .rev() .find_map(|layer_surface| { + let mapped = self.mapped_layer_surfaces.get(layer_surface)?; + if mapped.place_within_backdrop() { + return None; + } + let mut layer_pos_within_output = layers.layer_geometry(layer_surface).unwrap().loc.to_f64(); @@ -4021,19 +4044,27 @@ impl Niri { // Get layer-shell elements. let layer_map = layer_map_for_output(output); - let mut extend_from_layer = |elements: &mut SplitElements<LayerSurfaceRenderElement<R>>, - layer| { - self.render_layer(renderer, target, output_scale, &layer_map, layer, elements); - }; + let mut extend_from_layer = + |elements: &mut SplitElements<LayerSurfaceRenderElement<R>>, layer, for_backdrop| { + self.render_layer( + renderer, + target, + output_scale, + &layer_map, + layer, + elements, + for_backdrop, + ); + }; // The overlay layer elements go next. let mut layer_elems = SplitElements::default(); - extend_from_layer(&mut layer_elems, Layer::Overlay); + extend_from_layer(&mut layer_elems, Layer::Overlay, false); elements.extend(layer_elems.into_iter().map(OutputRenderElements::from)); // Collect the top layer elements. let mut layer_elems = SplitElements::default(); - extend_from_layer(&mut layer_elems, Layer::Top); + extend_from_layer(&mut layer_elems, Layer::Top, false); let top_layer = layer_elems; // When rendering above the top layer, we put the regular monitor elements first. @@ -4041,8 +4072,8 @@ impl Niri { if mon.render_above_top_layer() { // 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); + extend_from_layer(&mut layer_elems, Layer::Bottom, false); + extend_from_layer(&mut layer_elems, Layer::Background, false); elements.extend( int_move_elements @@ -4062,8 +4093,7 @@ impl Niri { ); elements.extend(top_layer.into_iter().map(OutputRenderElements::from)); - elements.extend(layer_elems.popups.drain(..).map(OutputRenderElements::from)); - elements.extend(layer_elems.normal.drain(..).map(OutputRenderElements::from)); + elements.extend(layer_elems.into_iter().map(OutputRenderElements::from)); elements.push(OutputRenderElements::from(background)); @@ -4090,8 +4120,8 @@ impl Niri { for (ws_geo, ws_elements) in monitor_elements { // 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); + extend_from_layer(&mut layer_elems, Layer::Bottom, false); + extend_from_layer(&mut layer_elems, Layer::Background, false); elements.extend( layer_elems @@ -4126,6 +4156,10 @@ impl Niri { } // Then the backdrop. + let mut layer_elems = SplitElements::default(); + extend_from_layer(&mut layer_elems, Layer::Background, true); + elements.extend(layer_elems.into_iter().map(OutputRenderElements::from)); + elements.push(backdrop); if self.debug_draw_opaque_regions { @@ -4135,6 +4169,7 @@ impl Niri { elements } + #[allow(clippy::too_many_arguments)] fn render_layer<R: NiriRenderer>( &self, renderer: &mut R, @@ -4143,10 +4178,16 @@ impl Niri { layer_map: &LayerMap, layer: Layer, elements: &mut SplitElements<LayerSurfaceRenderElement<R>>, + for_backdrop: bool, ) { // LayerMap returns layers in reverse stacking order. let iter = layer_map.layers_on(layer).rev().filter_map(|surface| { let mapped = self.mapped_layer_surfaces.get(surface)?; + + if for_backdrop != mapped.place_within_backdrop() { + return None; + } + let geo = layer_map.layer_geometry(surface)?; Some((mapped, geo)) }); |
