diff options
author | Robert Knight <robert.knight@mendeley.com> | 2015-06-28 22:09:26 +0100 |
---|---|---|
committer | Robert Knight <robert.knight@mendeley.com> | 2015-06-28 22:09:26 +0100 |
commit | edc95d554dd530a810240261d44013f39bef1c6d (patch) | |
tree | 5601865abe34b49a71696881eeb21697439c245c /src/api/x11 | |
parent | cb08d9b05bb904e82a44bc67c818af9ba8a94568 (diff) | |
download | glutin-edc95d554dd530a810240261d44013f39bef1c6d.tar.gz glutin-edc95d554dd530a810240261d44013f39bef1c6d.zip |
X11 - Ignore scroll events that happen outside of Glutin windows
Scroll deltas are calculated in X11 by comparing the current and
previous absolute values for the scroll axis when a scroll motion
event is received. If the user scrolls whilst the cursor is outside
of the window then an incorrect delta is reported when the cursor
re-enters the window.
Fix this by resetting the last-seen axis values whenever the cursor
re-enters the window.
Diffstat (limited to 'src/api/x11')
-rw-r--r-- | src/api/x11/input.rs | 16 | ||||
-rw-r--r-- | src/api/x11/window.rs | 3 |
2 files changed, 15 insertions, 4 deletions
diff --git a/src/api/x11/input.rs b/src/api/x11/input.rs index 131f080..2448c08 100644 --- a/src/api/x11/input.rs +++ b/src/api/x11/input.rs @@ -75,7 +75,7 @@ impl XInputEventHandler { // Button clicks and mouse events are handled via XInput // events. Key presses are still handled via plain core // X11 events. - let mut mask: [libc::c_uchar; 1] = [0]; + let mut mask: [libc::c_uchar; 2] = [0, 0]; let mut input_event_mask = ffi::XIEventMask { deviceid: ffi::XIAllDevices, mask_len: mask.len() as i32, @@ -84,7 +84,9 @@ impl XInputEventHandler { let events = &[ ffi::XI_ButtonPress, ffi::XI_ButtonRelease, - ffi::XI_Motion + ffi::XI_Motion, + ffi::XI_Enter, + ffi::XI_Leave ]; for event in events { ffi::XISetMask(&mut mask, *event); @@ -224,6 +226,16 @@ impl XInputEventHandler { } } }, + ffi::XI_Enter => { + // axis movements whilst the cursor is outside the window + // will alter the absolute value of the axes. We only want to + // report changes in the axis value whilst the cursor is above + // our window however, so clear the previous axis state whenever + // the cursor re-enters the window + self.current_state.axis_values.clear(); + None + }, + ffi::XI_Leave => None, _ => None } } diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs index b430ec9..9a01e17 100644 --- a/src/api/x11/window.rs +++ b/src/api/x11/window.rs @@ -7,7 +7,6 @@ use std::{mem, ptr}; use std::cell::Cell; use std::sync::atomic::AtomicBool; use std::collections::VecDeque; -use std::slice::from_raw_parts; use std::sync::{Arc, Mutex}; use Api; @@ -23,7 +22,7 @@ use api::egl::Context as EglContext; use platform::MonitorID as PlatformMonitorID; use super::input::XInputEventHandler; -use super::{events, ffi}; +use super::{ffi}; use super::{MonitorID, XConnection}; // XOpenIM doesn't seem to be thread-safe |