aboutsummaryrefslogtreecommitdiff
path: root/src/scroll_tracker.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-03-23 19:58:11 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-03-23 20:17:01 +0400
commit6ba195211bf60c3b753e4167b047b055dd5c129d (patch)
tree2f00ec0d82ca5c159091c8fb55af662433b98dd2 /src/scroll_tracker.rs
parentafaaf36f27caf73b6c6b394e8f96ae362c454e61 (diff)
downloadniri-6ba195211bf60c3b753e4167b047b055dd5c129d.tar.gz
niri-6ba195211bf60c3b753e4167b047b055dd5c129d.tar.bz2
niri-6ba195211bf60c3b753e4167b047b055dd5c129d.zip
Rename WheelTracker to ScrollTracker
Diffstat (limited to 'src/scroll_tracker.rs')
-rw-r--r--src/scroll_tracker.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/scroll_tracker.rs b/src/scroll_tracker.rs
new file mode 100644
index 00000000..fc48ef06
--- /dev/null
+++ b/src/scroll_tracker.rs
@@ -0,0 +1,40 @@
+pub struct ScrollTracker {
+ tick: f64,
+ last: f64,
+ acc: f64,
+}
+
+impl ScrollTracker {
+ #[allow(clippy::new_without_default)]
+ pub fn new(tick: i8) -> Self {
+ Self {
+ tick: f64::from(tick),
+ last: 0.,
+ acc: 0.,
+ }
+ }
+
+ pub fn accumulate(&mut self, amount: f64) -> i8 {
+ let changed_direction = (self.last > 0. && amount < 0.) || (self.last < 0. && amount > 0.);
+ if changed_direction {
+ self.acc = 0.
+ }
+
+ self.last = amount;
+ self.acc += amount;
+
+ let mut ticks = 0;
+ if self.acc.abs() >= self.tick {
+ let clamped = self.acc.clamp(-127. * self.tick, 127. * self.tick);
+ ticks = (clamped as i16 / self.tick as i16) as i8;
+ self.acc %= self.tick;
+ }
+
+ ticks
+ }
+
+ pub fn reset(&mut self) {
+ self.last = 0.;
+ self.acc = 0.;
+ }
+}