mirror of
https://github.com/niri-wm/niri.git
synced 2026-06-22 02:01:55 +07:00
layout: Extract interactive_moved_window_under() and add output check
Fixes interactively moved window getting input on every output rather than just its own.
This commit is contained in:
+17
-5
@@ -2272,6 +2272,23 @@ impl<W: LayoutElement> Layout<W> {
|
|||||||
mon.active_window().map(|win| (win, &mon.output))
|
mon.active_window().map(|win| (win, &mon.output))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn interactive_moved_window_under(
|
||||||
|
&self,
|
||||||
|
output: &Output,
|
||||||
|
pos_within_output: Point<f64, Logical>,
|
||||||
|
) -> Option<(&W, HitType)> {
|
||||||
|
if let Some(InteractiveMoveState::Moving(move_)) = &self.interactive_move {
|
||||||
|
if move_.output == *output {
|
||||||
|
let tile_pos = move_.tile_render_location(1.);
|
||||||
|
HitType::hit_tile(&move_.tile, tile_pos, pos_within_output)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the window under the cursor and the hit type.
|
/// Returns the window under the cursor and the hit type.
|
||||||
pub fn window_under(
|
pub fn window_under(
|
||||||
&self,
|
&self,
|
||||||
@@ -2282,11 +2299,6 @@ impl<W: LayoutElement> Layout<W> {
|
|||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(InteractiveMoveState::Moving(move_)) = &self.interactive_move {
|
|
||||||
let tile_pos = move_.tile_render_location();
|
|
||||||
return HitType::hit_tile(&move_.tile, tile_pos, pos_within_output);
|
|
||||||
};
|
|
||||||
|
|
||||||
let mon = monitors.iter().find(|mon| &mon.output == output)?;
|
let mon = monitors.iter().find(|mon| &mon.output == output)?;
|
||||||
mon.window_under(pos_within_output)
|
mon.window_under(pos_within_output)
|
||||||
}
|
}
|
||||||
|
|||||||
+14
@@ -2902,6 +2902,13 @@ impl Niri {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some((window, _loc)) = self
|
||||||
|
.layout
|
||||||
|
.interactive_moved_window_under(output, pos_within_output)
|
||||||
|
{
|
||||||
|
return Some(window);
|
||||||
|
}
|
||||||
|
|
||||||
let (window, _loc) = self.layout.window_under(output, pos_within_output)?;
|
let (window, _loc) = self.layout.window_under(output, pos_within_output)?;
|
||||||
Some(window)
|
Some(window)
|
||||||
}
|
}
|
||||||
@@ -3008,6 +3015,11 @@ impl Niri {
|
|||||||
(surface_and_pos, (Some((window.clone(), hit)), None))
|
(surface_and_pos, (Some((window.clone(), hit)), None))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let interactive_moved_window_under = || {
|
||||||
|
self.layout
|
||||||
|
.interactive_moved_window_under(output, pos_within_output)
|
||||||
|
.map(mapped_hit_data)
|
||||||
|
};
|
||||||
let window_under = || {
|
let window_under = || {
|
||||||
self.layout
|
self.layout
|
||||||
.window_under(output, pos_within_output)
|
.window_under(output, pos_within_output)
|
||||||
@@ -3023,6 +3035,7 @@ impl Niri {
|
|||||||
// Otherwise, we will render all layer-shell pop-ups and the top layer on top.
|
// Otherwise, we will render all layer-shell pop-ups and the top layer on top.
|
||||||
if mon.render_above_top_layer() {
|
if mon.render_above_top_layer() {
|
||||||
under = under
|
under = under
|
||||||
|
.or_else(interactive_moved_window_under)
|
||||||
.or_else(window_under)
|
.or_else(window_under)
|
||||||
.or_else(|| layer_popup_under(Layer::Top))
|
.or_else(|| layer_popup_under(Layer::Top))
|
||||||
.or_else(|| layer_toplevel_under(Layer::Top))
|
.or_else(|| layer_toplevel_under(Layer::Top))
|
||||||
@@ -3036,6 +3049,7 @@ impl Niri {
|
|||||||
.or_else(|| layer_toplevel_under(Layer::Top))
|
.or_else(|| layer_toplevel_under(Layer::Top))
|
||||||
.or_else(|| layer_popup_under(Layer::Bottom))
|
.or_else(|| layer_popup_under(Layer::Bottom))
|
||||||
.or_else(|| layer_popup_under(Layer::Background))
|
.or_else(|| layer_popup_under(Layer::Background))
|
||||||
|
.or_else(interactive_moved_window_under)
|
||||||
.or_else(window_under)
|
.or_else(window_under)
|
||||||
.or_else(|| layer_toplevel_under(Layer::Bottom))
|
.or_else(|| layer_toplevel_under(Layer::Bottom))
|
||||||
.or_else(|| layer_toplevel_under(Layer::Background));
|
.or_else(|| layer_toplevel_under(Layer::Background));
|
||||||
|
|||||||
Reference in New Issue
Block a user