diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/input/mod.rs | 35 |
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 { |
