diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-02-10 08:47:44 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-02-10 07:29:33 -0800 |
| commit | 55e2ea0c3bb0bccae351aa6e82987a0b77da54ae (patch) | |
| tree | d1d4d6ce033fe458e4be0cfdfaf3b04b76a7e442 | |
| parent | 1d883931b4ae7704128f02fd566486fb02351196 (diff) | |
| download | niri-55e2ea0c3bb0bccae351aa6e82987a0b77da54ae.tar.gz niri-55e2ea0c3bb0bccae351aa6e82987a0b77da54ae.tar.bz2 niri-55e2ea0c3bb0bccae351aa6e82987a0b77da54ae.zip | |
layout: Extract tile.hit(), HitType::hit_tile()
| -rw-r--r-- | src/layout/mod.rs | 21 | ||||
| -rw-r--r-- | src/layout/tile.rs | 19 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 15 |
3 files changed, 28 insertions, 27 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 593279b7..4e0dbf93 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -507,6 +507,16 @@ impl HitType { } self } + + pub fn hit_tile<W: LayoutElement>( + tile: &Tile<W>, + tile_pos: Point<f64, Logical>, + point: Point<f64, Logical>, + ) -> Option<(&W, Self)> { + let pos_within_tile = point - tile_pos; + tile.hit(pos_within_tile) + .map(|hit| (tile.window(), hit.offset_win_pos(tile_pos))) + } } impl Options { @@ -2191,16 +2201,7 @@ impl<W: LayoutElement> Layout<W> { if let Some(InteractiveMoveState::Moving(move_)) = &self.interactive_move { let tile_pos = move_.tile_render_location(); - let pos_within_tile = pos_within_output - tile_pos; - - if move_.tile.is_in_input_region(pos_within_tile) { - let win_pos = tile_pos + move_.tile.buf_loc(); - return Some((move_.tile.window(), HitType::Input { win_pos })); - } else if move_.tile.is_in_activation_region(pos_within_tile) { - return Some((move_.tile.window(), HitType::Activate)); - } - - return None; + return HitType::hit_tile(&move_.tile, tile_pos, pos_within_output); }; let mon = monitors.iter().find(|mon| &mon.output == output)?; diff --git a/src/layout/tile.rs b/src/layout/tile.rs index ff099bab..a08f058f 100644 --- a/src/layout/tile.rs +++ b/src/layout/tile.rs @@ -10,8 +10,8 @@ use super::focus_ring::{FocusRing, FocusRingRenderElement}; use super::opening_window::{OpenAnimation, OpeningWindowRenderElement}; use super::shadow::Shadow; use super::{ - LayoutElement, LayoutElementRenderElement, LayoutElementRenderSnapshot, Options, SizeFrac, - RESIZE_ANIMATION_THRESHOLD, + HitType, LayoutElement, LayoutElementRenderElement, LayoutElementRenderSnapshot, Options, + SizeFrac, RESIZE_ANIMATION_THRESHOLD, }; use crate::animation::{Animation, Clock}; use crate::niri_render_elements; @@ -606,16 +606,27 @@ impl<W: LayoutElement> Tile<W> { loc } - pub fn is_in_input_region(&self, mut point: Point<f64, Logical>) -> bool { + fn is_in_input_region(&self, mut point: Point<f64, Logical>) -> bool { point -= self.window_loc().to_f64(); self.window.is_in_input_region(point) } - pub fn is_in_activation_region(&self, point: Point<f64, Logical>) -> bool { + fn is_in_activation_region(&self, point: Point<f64, Logical>) -> bool { let activation_region = Rectangle::from_size(self.tile_size()); activation_region.contains(point) } + pub fn hit(&self, point: Point<f64, Logical>) -> Option<HitType> { + if self.is_in_input_region(point) { + let win_pos = self.buf_loc(); + Some(HitType::Input { win_pos }) + } else if self.is_in_activation_region(point) { + Some(HitType::Activate) + } else { + None + } + } + pub fn request_tile_size( &mut self, mut size: Size<f64, Logical>, diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 165ae750..0dca0805 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -1468,16 +1468,7 @@ impl<W: LayoutElement> Workspace<W> { return None; } - let pos_within_tile = pos - tile_pos; - - if tile.is_in_input_region(pos_within_tile) { - let win_pos = tile_pos + tile.buf_loc(); - return Some((tile.window(), HitType::Input { win_pos })); - } else if tile.is_in_activation_region(pos_within_tile) { - return Some((tile.window(), HitType::Activate)); - } - - None + HitType::hit_tile(tile, tile_pos, pos) }) } @@ -1492,9 +1483,7 @@ impl<W: LayoutElement> Workspace<W> { let pos_within_tile = pos - tile_pos; - if tile.is_in_input_region(pos_within_tile) - || tile.is_in_activation_region(pos_within_tile) - { + if tile.hit(pos_within_tile).is_some() { let size = tile.tile_size().to_f64(); let mut edges = ResizeEdge::empty(); |
