diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-03-22 13:05:05 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-03-22 13:10:40 +0400 |
| commit | 4b2fdd0776485fcf9f560c72e98c00dff318f9e7 (patch) | |
| tree | ea9447a480c4cd6d3346d24556c43a0b7205705e /src/wheel_tracker.rs | |
| parent | 969519b5d8b163e61d74e9c1a7e525a2d11bc7e6 (diff) | |
| download | niri-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.rs | 36 |
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.; + } +} |
