aboutsummaryrefslogtreecommitdiff
path: root/src/input/mod.rs
diff options
context:
space:
mode:
authorBernardo Kuri <github.com@bkuri.com>2025-08-18 23:51:32 -0600
committerGitHub <noreply@github.com>2025-08-19 05:51:32 +0000
commit5ea9092a4954f8c5cd795f0ebec910666b367d5f (patch)
treec9a6aec2fe9a2f6f1692de3c66ec8ac82c890bbf /src/input/mod.rs
parent43a2648e579fc81366fc81b15f834c9c9dff119b (diff)
downloadniri-5ea9092a4954f8c5cd795f0ebec910666b367d5f.tar.gz
niri-5ea9092a4954f8c5cd795f0ebec910666b367d5f.tar.bz2
niri-5ea9092a4954f8c5cd795f0ebec910666b367d5f.zip
Add per-axis scroll speed config for input devices (#2109)
* Add per-axis scroll speed config for input devices. Accepts negative values to inverse scroll direction. Properly complements/overrides global `scroll-direction` setting. Includes docs and tests. * Update per-axis scroll factor implementation after testing - Refined configuration structure in niri-config - Updated input handling to use per-axis scroll factors - Added comprehensive test snapshots - Updated documentation with per-axis examples 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Simplify per-axis scroll factor implementation per review feedback - Make documentation concise and clear - Remove unnecessary comments and test helper functions - Use inline snapshots for tests - Rename get_factors() to h_v_factors() for clarity - Remove unnecessary .clone() calls (ScrollFactor is Copy) - Reduce test count to essential cases only - Fix comment about window factor override behavior 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Remove unnecessary ScrollFactor::new() helper function The maintainer prefers minimal code, so removing this helper and constructing ScrollFactor directly in tests. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix scroll factor behavior - all settings now multiply with window factor Per maintainer feedback, both combined and per-axis scroll settings should multiply with the window-specific scroll factor, not override it. This ensures consistent behavior regardless of configuration method. Also removed the now-unused has_per_axis_override() method. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Final cleanup: remove redundant comments and unused snapshot files - Removed unused snapshot files (now using inline snapshots) - Removed redundant inline comments in tests - Simplified test descriptions to be more concise 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Convert scroll factor parsing tests to use assert_debug_snapshot Updates parse_scroll_factor_combined, parse_scroll_factor_split, and parse_scroll_factor_partial tests to use assert_debug_snapshot instead of manual assert_eq comparisons, as requested in PR review. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Convert to inline snapshots as requested - Convert all scroll factor parsing tests to use inline snapshots instead of external files - Remove external snapshot files to keep test directory clean - All tests still pass with inline snapshot assertions 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix missed assert_eq in parse_scroll_factor_mixed test Converts the remaining assert_eq calls to assert_debug_snapshot with inline snapshots in the mixed syntax test function. Also fixes raw string delimiters from ### to #. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Convert scroll_factor_h_v_factors test to use assert_debug_snapshot Makes all scroll factor tests consistent by using snapshots instead of assert_eq for better maintainability. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * fixes --------- Co-authored-by: Bernardo Kuri <github@bkuri.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
Diffstat (limited to 'src/input/mod.rs')
-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 {