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 | |
| 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')
| -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 | 
