aboutsummaryrefslogtreecommitdiffstats
path: root/src/api/x11
diff options
context:
space:
mode:
authorRobert Knight <robert.knight@mendeley.com>2015-06-28 22:09:26 +0100
committerRobert Knight <robert.knight@mendeley.com>2015-06-28 22:09:26 +0100
commitedc95d554dd530a810240261d44013f39bef1c6d (patch)
tree5601865abe34b49a71696881eeb21697439c245c /src/api/x11
parentcb08d9b05bb904e82a44bc67c818af9ba8a94568 (diff)
downloadglutin-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.rs16
-rw-r--r--src/api/x11/window.rs3
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