aboutsummaryrefslogtreecommitdiff
path: root/src/input
diff options
context:
space:
mode:
Diffstat (limited to 'src/input')
-rw-r--r--src/input/mod.rs35
1 files changed, 24 insertions, 11 deletions
diff --git a/src/input/mod.rs b/src/input/mod.rs
index c2667dfc..cc07aed3 100644
--- a/src/input/mod.rs
+++ b/src/input/mod.rs
@@ -3086,31 +3086,44 @@ impl State {
self.update_pointer_contents();
- let scroll_factor = match source {
- AxisSource::Wheel => self.niri.config.borrow().input.mouse.scroll_factor,
- AxisSource::Finger => self.niri.config.borrow().input.touchpad.scroll_factor,
- _ => None,
+ let device_scroll_factor = {
+ let config = self.niri.config.borrow();
+ match source {
+ AxisSource::Wheel => config.input.mouse.scroll_factor,
+ AxisSource::Finger => config.input.touchpad.scroll_factor,
+ _ => None,
+ }
};
- let scroll_factor = scroll_factor.map(|x| x.0).unwrap_or(1.);
+ // Get window-specific scroll factor
let window_scroll_factor = pointer
.current_focus()
.map(|focused| self.niri.find_root_shell_surface(&focused))
.and_then(|root| self.niri.layout.find_window_and_output(&root).unzip().0)
- .and_then(|window| window.rules().scroll_factor);
- let scroll_factor = scroll_factor * window_scroll_factor.unwrap_or(1.);
+ .and_then(|window| window.rules().scroll_factor)
+ .unwrap_or(1.);
+
+ // Determine final scroll factors based on configuration
+ let (horizontal_factor, vertical_factor) = device_scroll_factor
+ .map(|x| x.h_v_factors())
+ .unwrap_or((1.0, 1.0));
+ let (horizontal_factor, vertical_factor) = (
+ horizontal_factor * window_scroll_factor,
+ vertical_factor * window_scroll_factor,
+ );
let horizontal_amount = horizontal_amount.unwrap_or_else(|| {
// Winit backend, discrete scrolling.
horizontal_amount_v120.unwrap_or(0.0) / 120. * 15.
- }) * scroll_factor;
+ }) * horizontal_factor;
+
let vertical_amount = vertical_amount.unwrap_or_else(|| {
// Winit backend, discrete scrolling.
vertical_amount_v120.unwrap_or(0.0) / 120. * 15.
- }) * scroll_factor;
+ }) * vertical_factor;
- let horizontal_amount_v120 = horizontal_amount_v120.map(|x| x * scroll_factor);
- let vertical_amount_v120 = vertical_amount_v120.map(|x| x * scroll_factor);
+ let horizontal_amount_v120 = horizontal_amount_v120.map(|x| x * horizontal_factor);
+ let vertical_amount_v120 = vertical_amount_v120.map(|x| x * vertical_factor);
let mut frame = AxisFrame::new(event.time_msec()).source(source);
if horizontal_amount != 0.0 {