From edc95d554dd530a810240261d44013f39bef1c6d Mon Sep 17 00:00:00 2001 From: Robert Knight Date: Sun, 28 Jun 2015 22:09:26 +0100 Subject: [PATCH] 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. --- src/api/x11/input.rs | 16 ++++++++++++++-- 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 131f080d..2448c08a 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 b430ec90..9a01e17a 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