aboutsummaryrefslogtreecommitdiff
path: root/src/layout/scrolling.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-02-10 13:12:53 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-02-10 07:29:33 -0800
commit6942ecc13a40867850fc26429da21603647e8026 (patch)
treefaa00e99985eb8d24acb09235d93b7fe2822b301 /src/layout/scrolling.rs
parent963ff14ed025eeb5d6785dbcd4c073251ef7a9e9 (diff)
downloadniri-6942ecc13a40867850fc26429da21603647e8026.tar.gz
niri-6942ecc13a40867850fc26429da21603647e8026.tar.bz2
niri-6942ecc13a40867850fc26429da21603647e8026.zip
Implement clicking on tab to switch
Diffstat (limited to 'src/layout/scrolling.rs')
-rw-r--r--src/layout/scrolling.rs47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs
index ab0ad69a..18da2b46 100644
--- a/src/layout/scrolling.rs
+++ b/src/layout/scrolling.rs
@@ -14,7 +14,7 @@ use super::insert_hint_element::{InsertHintElement, InsertHintRenderElement};
use super::tab_indicator::{TabIndicator, TabIndicatorRenderElement, TabInfo};
use super::tile::{Tile, TileRenderElement, TileRenderSnapshot};
use super::workspace::{InteractiveResize, ResolvedSize};
-use super::{ConfigureIntent, InteractiveResizeData, LayoutElement, Options, RemovedTile};
+use super::{ConfigureIntent, HitType, InteractiveResizeData, LayoutElement, Options, RemovedTile};
use crate::animation::{Animation, Clock};
use crate::input::swipe_tracker::SwipeTracker;
use crate::niri_render_elements;
@@ -2645,6 +2645,51 @@ impl<W: LayoutElement> ScrollingSpace<W> {
rv
}
+ pub fn window_under(&self, pos: Point<f64, Logical>) -> Option<(&W, HitType)> {
+ // This matches self.tiles_with_render_positions().
+ let scale = self.scale;
+ let view_off = Point::from((-self.view_pos(), 0.));
+ for (col, col_x) in self.columns_in_render_order() {
+ let col_off = Point::from((col_x, 0.));
+ let col_render_off = col.render_offset();
+
+ // Hit the tab indicator.
+ if col.display_mode == ColumnDisplay::Tabbed && !col.is_fullscreen {
+ let col_pos = view_off + col_off + col_render_off;
+ let col_pos = col_pos.to_physical_precise_round(scale).to_logical(scale);
+
+ if let Some(idx) = col.tab_indicator.hit(
+ col.tab_indicator_area(),
+ col.tiles.len(),
+ scale,
+ pos - col_pos,
+ ) {
+ let hit = HitType::Activate {
+ is_tab_indicator: true,
+ };
+ return Some((col.tiles[idx].window(), hit));
+ }
+ }
+
+ for (tile, tile_off, visible) in col.tiles_in_render_order() {
+ if !visible {
+ continue;
+ }
+
+ let tile_pos =
+ view_off + col_off + col_render_off + tile_off + tile.render_offset();
+ // Round to physical pixels.
+ let tile_pos = tile_pos.to_physical_precise_round(scale).to_logical(scale);
+
+ if let Some(rv) = HitType::hit_tile(tile, tile_pos, pos) {
+ return Some(rv);
+ }
+ }
+ }
+
+ None
+ }
+
pub fn view_offset_gesture_begin(&mut self, is_touchpad: bool) {
if self.columns.is_empty() {
return;