aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-04-24 22:11:04 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-04-25 02:00:18 -0700
commit8b878f355f43b0e76840d6bfe535ff3b61a5f5ca (patch)
tree375f01925287364560a40b6239b7231d7d581307 /src
parent395b6d9a4f05176ad2a54e5c59a697f9d0c54cd9 (diff)
downloadniri-8b878f355f43b0e76840d6bfe535ff3b61a5f5ca.tar.gz
niri-8b878f355f43b0e76840d6bfe535ff3b61a5f5ca.tar.bz2
niri-8b878f355f43b0e76840d6bfe535ff3b61a5f5ca.zip
Put interactively moved window on top of background and bottom layer popups
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));