aboutsummaryrefslogtreecommitdiff
path: root/src/niri.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/niri.rs')
-rw-r--r--src/niri.rs75
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))
});