mirror of
https://github.com/rust-windowing/winit.git
synced 2026-06-26 22:53:15 -04:00
Usually, if mouse events are equal to (0, 0) we filter them out. However, if the event is very close to zero it will still be given to the user. In some cases this can be caused by bad float math on the X11 server side. Fix it by filtering absolute values smaller than floating point epsilon. Signed-off-by: John Nunley <dev@notgull.net> Closes: #3500
53 lines
1.1 KiB
Rust
53 lines
1.1 KiB
Rust
//! Utilities for handling mouse events.
|
|
|
|
/// Recorded mouse delta designed to filter out noise.
|
|
pub struct Delta<T> {
|
|
x: T,
|
|
y: T,
|
|
}
|
|
|
|
impl<T: Default> Default for Delta<T> {
|
|
fn default() -> Self {
|
|
Self {
|
|
x: Default::default(),
|
|
y: Default::default(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T: Default> Delta<T> {
|
|
pub(crate) fn set_x(&mut self, x: T) {
|
|
self.x = x;
|
|
}
|
|
|
|
pub(crate) fn set_y(&mut self, y: T) {
|
|
self.y = y;
|
|
}
|
|
}
|
|
|
|
macro_rules! consume {
|
|
($this:expr, $ty:ty) => {{
|
|
let this = $this;
|
|
let (x, y) = match (this.x.abs() < <$ty>::EPSILON, this.y.abs() < <$ty>::EPSILON) {
|
|
(true, true) => return None,
|
|
(true, false) => (this.x, 0.0),
|
|
(false, true) => (0.0, this.y),
|
|
(false, false) => (this.x, this.y),
|
|
};
|
|
|
|
Some((x, y))
|
|
}};
|
|
}
|
|
|
|
impl Delta<f32> {
|
|
pub(crate) fn consume(self) -> Option<(f32, f32)> {
|
|
consume!(self, f32)
|
|
}
|
|
}
|
|
|
|
impl Delta<f64> {
|
|
pub(crate) fn consume(self) -> Option<(f64, f64)> {
|
|
consume!(self, f64)
|
|
}
|
|
}
|