aboutsummaryrefslogtreecommitdiff
path: root/src/wheel_tracker.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-03-22 13:05:05 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-03-22 13:10:40 +0400
commit4b2fdd0776485fcf9f560c72e98c00dff318f9e7 (patch)
treeea9447a480c4cd6d3346d24556c43a0b7205705e /src/wheel_tracker.rs
parent969519b5d8b163e61d74e9c1a7e525a2d11bc7e6 (diff)
downloadniri-4b2fdd0776485fcf9f560c72e98c00dff318f9e7.tar.gz
niri-4b2fdd0776485fcf9f560c72e98c00dff318f9e7.tar.bz2
niri-4b2fdd0776485fcf9f560c72e98c00dff318f9e7.zip
Implement mouse wheel bindings
Diffstat (limited to 'src/wheel_tracker.rs')
-rw-r--r--src/wheel_tracker.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/wheel_tracker.rs b/src/wheel_tracker.rs
new file mode 100644
index 00000000..0163548a
--- /dev/null
+++ b/src/wheel_tracker.rs
@@ -0,0 +1,36 @@
+pub struct WheelTracker {
+ last: f64,
+ acc: f64,
+}
+
+impl WheelTracker {
+ #[allow(clippy::new_without_default)]
+ pub fn new() -> Self {
+ Self { last: 0., acc: 0. }
+ }
+
+ pub fn accumulate(&mut self, amount_v120: f64) -> i8 {
+ let changed_direction =
+ (self.last > 0. && amount_v120 < 0.) || (self.last < 0. && amount_v120 > 0.);
+ if changed_direction {
+ self.acc = 0.
+ }
+
+ self.last = amount_v120;
+ self.acc += amount_v120;
+
+ let mut ticks = 0;
+ if self.acc.abs() >= 120. {
+ let clamped = self.acc.clamp(-127. * 120., 127. * 120.);
+ ticks = (clamped as i16 / 120) as i8;
+ self.acc %= 120.;
+ }
+
+ ticks
+ }
+
+ pub fn reset(&mut self) {
+ self.last = 0.;
+ self.acc = 0.;
+ }
+}