From 59de6918b3c7f3bc8e988046b3fef2cead322f9a Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Fri, 25 Apr 2025 09:48:54 +0300 Subject: overview: Add two-finger touchpad scroll --- src/input/scroll_swipe_gesture.rs | 69 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/input/scroll_swipe_gesture.rs (limited to 'src/input/scroll_swipe_gesture.rs') diff --git a/src/input/scroll_swipe_gesture.rs b/src/input/scroll_swipe_gesture.rs new file mode 100644 index 00000000..c15ace23 --- /dev/null +++ b/src/input/scroll_swipe_gesture.rs @@ -0,0 +1,69 @@ +//! Swipe gesture from scroll events. +//! +//! Tracks when to begin, update, and end a swipe gesture from pointer axis events, also whether +//! the gesture is vertical or horizontal. Necessary because libinput only provides touchpad swipe +//! gesture events for 3+ fingers. + +#[derive(Debug)] +pub struct ScrollSwipeGesture { + ongoing: bool, + vertical: bool, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Action { + BeginUpdate, + Update, + End, +} + +impl ScrollSwipeGesture { + pub const fn new() -> Self { + Self { + ongoing: false, + vertical: false, + } + } + + pub fn update(&mut self, dx: f64, dy: f64) -> Action { + if dx == 0. && dy == 0. { + self.ongoing = false; + Action::End + } else if !self.ongoing { + self.ongoing = true; + self.vertical = dy != 0.; + Action::BeginUpdate + } else { + Action::Update + } + } + + pub fn reset(&mut self) -> bool { + if self.ongoing { + self.ongoing = false; + true + } else { + false + } + } + + pub fn is_vertical(&self) -> bool { + self.vertical + } +} + +impl Default for ScrollSwipeGesture { + fn default() -> Self { + Self::new() + } +} + +impl Action { + pub fn begin(self) -> bool { + self == Action::BeginUpdate + } + + pub fn end(self) -> bool { + self == Action::End + } +} -- cgit