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.
This commit is contained in:
Robert Knight 2015-06-28 22:09:26 +01:00
parent cb08d9b05b
commit edc95d554d
2 changed files with 15 additions and 4 deletions

View file

@ -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
}
}

View file

@ -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