mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-25 06:41:31 +11:00
Merge pull request #580 from mbrubeck/scroll-lines
Fix smooth-scrolling increment on some X11 devices
This commit is contained in:
commit
08cb668037
|
@ -21,7 +21,8 @@ struct Axis {
|
||||||
id: i32,
|
id: i32,
|
||||||
device_id: i32,
|
device_id: i32,
|
||||||
axis_number: i32,
|
axis_number: i32,
|
||||||
axis_type: AxisType
|
axis_type: AxisType,
|
||||||
|
scroll_increment: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -167,7 +168,7 @@ impl XInputEventHandler {
|
||||||
use events::Event::{Focused, MouseInput, MouseMoved, MouseWheel};
|
use events::Event::{Focused, MouseInput, MouseMoved, MouseWheel};
|
||||||
use events::ElementState::{Pressed, Released};
|
use events::ElementState::{Pressed, Released};
|
||||||
use events::MouseButton::{Left, Right, Middle};
|
use events::MouseButton::{Left, Right, Middle};
|
||||||
use events::MouseScrollDelta::{PixelDelta, LineDelta};
|
use events::MouseScrollDelta::LineDelta;
|
||||||
use events::{Touch, TouchPhase};
|
use events::{Touch, TouchPhase};
|
||||||
|
|
||||||
match cookie.evtype {
|
match cookie.evtype {
|
||||||
|
@ -221,7 +222,7 @@ impl XInputEventHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
if scroll_delta.0.abs() > 0.0 || scroll_delta.1.abs() > 0.0 {
|
if scroll_delta.0.abs() > 0.0 || scroll_delta.1.abs() > 0.0 {
|
||||||
Some(MouseWheel(PixelDelta(scroll_delta.0 as f32, scroll_delta.1 as f32)))
|
Some(MouseWheel(LineDelta(scroll_delta.0 as f32, scroll_delta.1 as f32)))
|
||||||
} else {
|
} else {
|
||||||
let new_cursor_pos = (event_data.event_x, event_data.event_y);
|
let new_cursor_pos = (event_data.event_x, event_data.event_y);
|
||||||
if new_cursor_pos != self.current_state.cursor_pos {
|
if new_cursor_pos != self.current_state.cursor_pos {
|
||||||
|
@ -267,10 +268,9 @@ fn read_input_axis_info(display: &Arc<XConnection>) -> Vec<Axis> {
|
||||||
let mut axis_list = Vec::new();
|
let mut axis_list = Vec::new();
|
||||||
let mut device_count = 0;
|
let mut device_count = 0;
|
||||||
|
|
||||||
// only get events from the master devices which are 'attached'
|
// Check all input devices for scroll axes.
|
||||||
// to the keyboard or cursor
|
|
||||||
let devices = unsafe{
|
let devices = unsafe{
|
||||||
(display.xinput2.XIQueryDevice)(display.display, ffi::XIAllMasterDevices, &mut device_count)
|
(display.xinput2.XIQueryDevice)(display.display, ffi::XIAllDevices, &mut device_count)
|
||||||
};
|
};
|
||||||
for i in 0..device_count {
|
for i in 0..device_count {
|
||||||
let device = unsafe { *(devices.offset(i as isize)) };
|
let device = unsafe { *(devices.offset(i as isize)) };
|
||||||
|
@ -290,7 +290,8 @@ fn read_input_axis_info(display: &Arc<XConnection>) -> Vec<Axis> {
|
||||||
ffi::XIScrollTypeHorizontal => AxisType::HorizontalScroll,
|
ffi::XIScrollTypeHorizontal => AxisType::HorizontalScroll,
|
||||||
ffi::XIScrollTypeVertical => AxisType::VerticalScroll,
|
ffi::XIScrollTypeVertical => AxisType::VerticalScroll,
|
||||||
_ => { unreachable!() }
|
_ => { unreachable!() }
|
||||||
}
|
},
|
||||||
|
scroll_increment: scroll_class.increment,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
_ => {}
|
_ => {}
|
||||||
|
@ -314,7 +315,7 @@ fn calc_scroll_deltas(event: &ffi::XIDeviceEvent,
|
||||||
prev_axis.axis_number == axis_id
|
prev_axis.axis_number == axis_id
|
||||||
});
|
});
|
||||||
let delta = match prev_value_pos {
|
let delta = match prev_value_pos {
|
||||||
Some(idx) => axis_value - prev_axis_values[idx].value,
|
Some(idx) => prev_axis_values[idx].value - axis_value,
|
||||||
None => 0.0
|
None => 0.0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -335,8 +336,8 @@ fn calc_scroll_deltas(event: &ffi::XIDeviceEvent,
|
||||||
if axis.id == event.sourceid &&
|
if axis.id == event.sourceid &&
|
||||||
axis.axis_number == axis_id {
|
axis.axis_number == axis_id {
|
||||||
match axis.axis_type {
|
match axis.axis_type {
|
||||||
AxisType::HorizontalScroll => scroll_delta.0 = delta,
|
AxisType::HorizontalScroll => scroll_delta.0 = delta / axis.scroll_increment,
|
||||||
AxisType::VerticalScroll => scroll_delta.1 = delta
|
AxisType::VerticalScroll => scroll_delta.1 = delta / axis.scroll_increment
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue