aboutsummaryrefslogtreecommitdiff
path: root/src/input/mod.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-04-25 09:49:40 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-04-25 02:00:18 -0700
commitb8a9be542fe6c6e99b1eac159188166f2bf2e82e (patch)
tree26c1c7c284bc8859e44e3efa9ac58ccf7ded83fd /src/input/mod.rs
parent59de6918b3c7f3bc8e988046b3fef2cead322f9a (diff)
downloadniri-b8a9be542fe6c6e99b1eac159188166f2bf2e82e.tar.gz
niri-b8a9be542fe6c6e99b1eac159188166f2bf2e82e.tar.bz2
niri-b8a9be542fe6c6e99b1eac159188166f2bf2e82e.zip
overview: Add touchscreen gestures
Diffstat (limited to 'src/input/mod.rs')
-rw-r--r--src/input/mod.rs41
1 files changed, 38 insertions, 3 deletions
diff --git a/src/input/mod.rs b/src/input/mod.rs
index 44527b8a..8ab9bde1 100644
--- a/src/input/mod.rs
+++ b/src/input/mod.rs
@@ -35,6 +35,7 @@ use smithay::wayland::pointer_constraints::{with_pointer_constraint, PointerCons
use smithay::wayland::selection::data_device::DnDGrab;
use smithay::wayland::tablet_manager::{TabletDescriptor, TabletSeatTrait};
use touch_move_grab::TouchMoveGrab;
+use touch_overview_grab::TouchOverviewGrab;
use self::move_grab::MoveGrab;
use self::resize_grab::ResizeGrab;
@@ -56,6 +57,7 @@ pub mod scroll_tracker;
pub mod spatial_movement_grab;
pub mod swipe_tracker;
pub mod touch_move_grab;
+pub mod touch_overview_grab;
pub mod touch_resize_grab;
use backend_ext::{NiriInputBackend as InputBackend, NiriInputDevice as _};
@@ -3467,12 +3469,45 @@ impl State {
let mod_key = self.backend.mod_key(&self.niri.config.borrow());
if !handle.is_grabbed() {
- if let Some((window, _)) = under.window {
+ let mods = self.niri.seat.get_keyboard().unwrap().modifier_state();
+ let mods = modifiers_from_state(mods);
+ let mod_down = mods.contains(mod_key.to_modifiers());
+
+ if self.niri.layout.is_overview_open() && !mod_down && under.layer.is_none() {
+ let (output, pos_within_output) = self.niri.output_under(touch_location).unwrap();
+ let output = output.clone();
+
+ let mut matched_narrow = true;
+ let mut ws = self.niri.workspace_under(false, touch_location);
+ if ws.is_none() {
+ matched_narrow = false;
+ ws = self.niri.workspace_under(true, touch_location);
+ }
+ let ws_id = ws.map(|(_, ws)| ws.id());
+
+ let mapped = self.niri.window_under(touch_location);
+ let window = mapped.map(|mapped| mapped.window.clone());
+
+ let start_data = TouchGrabStartData {
+ focus: None,
+ slot: evt.slot(),
+ location: touch_location,
+ };
+ let start_timestamp = Duration::from_micros(evt.time());
+ let grab = TouchOverviewGrab::new(
+ start_data,
+ start_timestamp,
+ output,
+ pos_within_output,
+ ws_id,
+ matched_narrow,
+ window,
+ );
+ handle.set_grab(self, grab, serial);
+ } else if let Some((window, _)) = under.window {
self.niri.layout.activate_window(&window);
// Check if we need to start an interactive move.
- let mods = self.niri.seat.get_keyboard().unwrap().modifier_state();
- let mod_down = modifiers_from_state(mods).contains(mod_key.to_modifiers());
if mod_down {
let (output, pos_within_output) =
self.niri.output_under(touch_location).unwrap();