From 92fcceba54cb1a8ce76ab5a62a6a4602b185580b Mon Sep 17 00:00:00 2001 From: Tom Grushka Date: Fri, 15 May 2026 15:51:24 -0600 Subject: [PATCH] fix(magnifier): smooth mouse wheel zoom and respect natural scroll direction - Disable animation for mouse wheel zoom to eliminate the timing race that causes lag and sudden jumps. Each wheel tick now zooms instantly. - Invert zoom direction when natural scrolling is enabled so that forward scroll zooms in, matching macOS/Windows behavior. --- src/input/mod.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/input/mod.rs b/src/input/mod.rs index 2a62947c..d2d08e9f 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -37,11 +37,12 @@ use cosmic_settings_config::shortcuts; use cosmic_settings_config::shortcuts::action::{Direction, ResizeDirection}; use smithay::{ backend::input::{ - AbsolutePositionEvent, Axis, AxisSource, Device, DeviceCapability, GestureBeginEvent, - GestureEndEvent, GesturePinchUpdateEvent as _, GestureSwipeUpdateEvent as _, InputBackend, - InputEvent, KeyState, KeyboardKeyEvent, PointerAxisEvent, ProximityState, Switch, - SwitchState, SwitchToggleEvent, TabletToolButtonEvent, TabletToolEvent, - TabletToolProximityEvent, TabletToolTipEvent, TabletToolTipState, TouchEvent, + AbsolutePositionEvent, Axis, AxisRelativeDirection, AxisSource, Device, DeviceCapability, + GestureBeginEvent, GestureEndEvent, GesturePinchUpdateEvent as _, + GestureSwipeUpdateEvent as _, InputBackend, InputEvent, KeyState, KeyboardKeyEvent, + PointerAxisEvent, ProximityState, Switch, SwitchState, SwitchToggleEvent, + TabletToolButtonEvent, TabletToolEvent, TabletToolProximityEvent, TabletToolTipEvent, + TabletToolTipState, TouchEvent, }, desktop::{PopupKeyboardGrab, WindowSurfaceType, utils::under_from_surface_tree}, input::{ @@ -914,12 +915,18 @@ impl State { .or_else(|| event.amount(Axis::Vertical)) .map(|val| val * scroll_factor) { + if event.relative_direction(Axis::Vertical) + == AxisRelativeDirection::Inverted + { + percentage *= -1.; + } + if event.source() == AxisSource::Wheel { percentage *= 5.; } let change = -(percentage / 100.); - self.update_zoom(&seat, change, event.source() == AxisSource::Wheel); + self.update_zoom(&seat, change, false); } } else { let mut frame = AxisFrame::new(event.time_msec()).source(event.source());