aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/niri.rs47
1 files changed, 38 insertions, 9 deletions
diff --git a/src/niri.rs b/src/niri.rs
index c4472a52..2543ddb3 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -2837,7 +2837,7 @@ impl Niri {
Some((output, pos_within_output))
}
- pub fn is_layout_obscured_under(
+ pub fn is_sticky_obscured_under(
&self,
output: &Output,
pos_within_output: Point<f64, Logical>,
@@ -2876,11 +2876,34 @@ impl Niri {
return false;
}
- if layer_popup_under(Layer::Top)
- || layer_toplevel_under(Layer::Top)
- || layer_popup_under(Layer::Bottom)
- || layer_popup_under(Layer::Background)
- {
+ if layer_popup_under(Layer::Top) || layer_toplevel_under(Layer::Top) {
+ return true;
+ }
+
+ false
+ }
+
+ pub fn is_layout_obscured_under(
+ &self,
+ output: &Output,
+ pos_within_output: Point<f64, Logical>,
+ ) -> bool {
+ // Check if some layer-shell surface is on top.
+ let layers = layer_map_for_output(output);
+ let layer_popup_under = |layer| {
+ layers
+ .layers_on(layer)
+ .rev()
+ .find_map(|layer| {
+ let layer_pos_within_output =
+ layers.layer_geometry(layer).unwrap().loc.to_f64();
+ let surface_type = WindowSurfaceType::POPUP | WindowSurfaceType::SUBSURFACE;
+ layer.surface_under(pos_within_output - layer_pos_within_output, surface_type)
+ })
+ .is_some()
+ };
+
+ if layer_popup_under(Layer::Bottom) || layer_popup_under(Layer::Background) {
return true;
}
@@ -2898,7 +2921,7 @@ impl Niri {
let (output, pos_within_output) = self.output_under(pos)?;
- if self.is_layout_obscured_under(output, pos_within_output) {
+ if self.is_sticky_obscured_under(output, pos_within_output) {
return None;
}
@@ -2909,6 +2932,10 @@ impl Niri {
return Some(window);
}
+ if self.is_layout_obscured_under(output, pos_within_output) {
+ return None;
+ }
+
let (window, _loc) = self.layout.window_under(output, pos_within_output)?;
Some(window)
}
@@ -3047,9 +3074,9 @@ impl Niri {
under = under
.or_else(|| layer_popup_under(Layer::Top))
.or_else(|| layer_toplevel_under(Layer::Top))
+ .or_else(interactive_moved_window_under)
.or_else(|| layer_popup_under(Layer::Bottom))
.or_else(|| layer_popup_under(Layer::Background))
- .or_else(interactive_moved_window_under)
.or_else(window_under)
.or_else(|| layer_toplevel_under(Layer::Bottom))
.or_else(|| layer_toplevel_under(Layer::Background));
@@ -3847,13 +3874,15 @@ impl Niri {
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(
int_move_elements
.into_iter()
.map(OutputRenderElements::from),
);
+
+ elements.extend(layer_elems.popups.drain(..).map(OutputRenderElements::from));
+
elements.extend(monitor_elements.into_iter().map(OutputRenderElements::from));
elements.extend(layer_elems.normal.drain(..).map(OutputRenderElements::from));