diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-03-23 19:58:11 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-03-23 20:17:01 +0400 |
| commit | 6ba195211bf60c3b753e4167b047b055dd5c129d (patch) | |
| tree | 2f00ec0d82ca5c159091c8fb55af662433b98dd2 /src/scroll_tracker.rs | |
| parent | afaaf36f27caf73b6c6b394e8f96ae362c454e61 (diff) | |
| download | niri-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.rs | 40 |
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.; + } +} |
