aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortomaka <pierre.krieger1708@gmail.com>2015-06-16 08:52:25 +0200
committertomaka <pierre.krieger1708@gmail.com>2015-06-16 08:52:25 +0200
commit5e8271dad0a56697f0729c094dfe29cab302460b (patch)
tree07901f0a48dc1426d034bbb39dfed100cc3e7a40
parenta0e29d9410181368eee1e0b6db1bbbf11abf45f8 (diff)
parentb2c2f300dce0b874efee4c328629ff9c2316c056 (diff)
downloadglutin-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.rs2
-rw-r--r--src/api/cocoa/mod.rs10
-rw-r--r--src/api/win32/callback.rs5
-rw-r--r--src/api/x11/window.rs7
-rw-r--r--src/events.rs24
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.