diff options
author | tomaka <pierre.krieger1708@gmail.com> | 2015-06-16 08:52:25 +0200 |
---|---|---|
committer | tomaka <pierre.krieger1708@gmail.com> | 2015-06-16 08:52:25 +0200 |
commit | 5e8271dad0a56697f0729c094dfe29cab302460b (patch) | |
tree | 07901f0a48dc1426d034bbb39dfed100cc3e7a40 | |
parent | a0e29d9410181368eee1e0b6db1bbbf11abf45f8 (diff) | |
parent | b2c2f300dce0b874efee4c328629ff9c2316c056 (diff) | |
download | glutin-5e8271dad0a56697f0729c094dfe29cab302460b.tar.gz glutin-5e8271dad0a56697f0729c094dfe29cab302460b.zip |
Merge pull request #483 from robertknight/rob-precise_scroll_deltas
Specify scroll deltas as either line or pixel-based
-rw-r--r-- | examples/cursor.rs | 2 | ||||
-rw-r--r-- | src/api/cocoa/mod.rs | 10 | ||||
-rw-r--r-- | src/api/win32/callback.rs | 5 | ||||
-rw-r--r-- | src/api/x11/window.rs | 7 | ||||
-rw-r--r-- | src/events.rs | 24 |
5 files changed, 37 insertions, 11 deletions
diff --git a/examples/cursor.rs b/examples/cursor.rs index 0dced66..d3beb84 100644 --- a/examples/cursor.rs +++ b/examples/cursor.rs @@ -17,7 +17,7 @@ fn main() { println!("This example requires glutin to be compiled with the `wind #[cfg(feature = "window")] fn main() { - let mut window = glutin::Window::new().unwrap(); + let window = glutin::Window::new().unwrap(); window.set_title("A fantastic window!"); unsafe { window.make_current() }; diff --git a/src/api/cocoa/mod.rs b/src/api/cocoa/mod.rs index 511148b..877aba7 100644 --- a/src/api/cocoa/mod.rs +++ b/src/api/cocoa/mod.rs @@ -275,7 +275,15 @@ impl<'a> Iterator for PollEventsIterator<'a> { self.window.delegate.state.pending_events.lock().unwrap().extend(events.into_iter()); event }, - NSScrollWheel => { Some(MouseWheel(event.scrollingDeltaX() as f64, event.scrollingDeltaY() as f64)) }, + NSScrollWheel => { + use events::MouseScrollDelta::{LineDelta, PixelDelta}; + let delta = if event.hasPreciseScrollingDeltas() == YES { + PixelDelta(event.scrollingDeltaX() as f32, event.scrollingDeltaY() as f32) + } else { + LineDelta(event.scrollingDeltaX() as f32, event.scrollingDeltaY() as f32) + }; + Some(MouseWheel(delta)) + }, _ => { None }, }; diff --git a/src/api/win32/callback.rs b/src/api/win32/callback.rs index 86d5f1c..6ac56f3 100644 --- a/src/api/win32/callback.rs +++ b/src/api/win32/callback.rs @@ -112,12 +112,13 @@ pub unsafe extern "system" fn callback(window: winapi::HWND, msg: winapi::UINT, winapi::WM_MOUSEWHEEL => { use events::Event::MouseWheel; + use events::MouseScrollDelta::LineDelta; let value = (wparam >> 16) as i16; let value = value as i32; - let value = value as f64 / winapi::WHEEL_DELTA as f64; + let value = value as f32 / winapi::WHEEL_DELTA as f32; - send_event(window, MouseWheel(0.0, value)); + send_event(window, MouseWheel(LineDelta(0.0, value))); 0 }, diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs index 8b74e77..55ee007 100644 --- a/src/api/x11/window.rs +++ b/src/api/x11/window.rs @@ -219,6 +219,7 @@ impl<'a> Iterator for PollEventsIterator<'a> { use events::Event::{MouseInput, MouseWheel}; use events::ElementState::{Pressed, Released}; use events::MouseButton::{Left, Right, Middle}; + use events::MouseScrollDelta::{LineDelta}; let event: &ffi::XButtonEvent = unsafe { mem::transmute(&xev) }; @@ -229,11 +230,13 @@ impl<'a> Iterator for PollEventsIterator<'a> { ffi::Button2 => Some(Middle), ffi::Button3 => Some(Right), ffi::Button4 => { - self.window.pending_events.lock().unwrap().push_back(MouseWheel(0.0, 1.0)); + let delta = LineDelta(0.0, 1.0); + self.window.pending_events.lock().unwrap().push_back(MouseWheel(delta)); None } ffi::Button5 => { - self.window.pending_events.lock().unwrap().push_back(MouseWheel(0.0, -1.0)); + let delta = LineDelta(0.0, -1.0); + self.window.pending_events.lock().unwrap().push_back(MouseWheel(delta)); None } _ => None diff --git a/src/events.rs b/src/events.rs index 7962706..c175810 100644 --- a/src/events.rs +++ b/src/events.rs @@ -25,11 +25,8 @@ pub enum Event { /// The parameter are the (x,y) coords in pixels relative to the top-left corner of the window. MouseMoved((i32, i32)), - /// Returns the horizontal and vertical mouse scrolling. - /// - /// A positive value indicates that the wheel was rotated forward, away from the user; - /// a negative value indicates that the wheel was rotated backward, toward the user. - MouseWheel(f64, f64), + /// A mouse wheel movement or touchpad scroll occurred. + MouseWheel(MouseScrollDelta), /// An event from the mouse has been received. MouseInput(ElementState, MouseButton), @@ -57,6 +54,23 @@ pub enum MouseButton { Other(u8), } +#[derive(Debug, Clone, Copy)] +pub enum MouseScrollDelta { + /// Amount in lines or rows to scroll in the horizontal + /// and vertical directions. + /// + /// Positive values indicate movement forward + /// (away from the user) or rightwards. + LineDelta(f32, f32), + /// Amount in pixels to scroll in the horizontal and + /// vertical direction. + /// + /// Scroll events are expressed as a PixelDelta if + /// supported by the device (eg. a touchpad) and + /// platform. + PixelDelta(f32, f32) +} + #[derive(Debug, Hash, PartialEq, Eq, Clone, Copy)] pub enum VirtualKeyCode { /// The '1' key over the letters. |