From bdafaa07e53146d15dc1bc591d5530d1995691fb Mon Sep 17 00:00:00 2001 From: Ferdinand Schober Date: Mon, 3 Nov 2025 18:04:09 +0100 Subject: [PATCH] macos: fix scroll capture (#350) --- input-capture/src/macos.rs | 56 ++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/input-capture/src/macos.rs b/input-capture/src/macos.rs index b0af388..0d4138c 100644 --- a/input-capture/src/macos.rs +++ b/input-capture/src/macos.rs @@ -318,21 +318,47 @@ fn get_events( }))) } CGEventType::ScrollWheel => { - let v = ev.get_integer_value_field(EventField::SCROLL_WHEEL_EVENT_POINT_DELTA_AXIS_1); - let h = ev.get_integer_value_field(EventField::SCROLL_WHEEL_EVENT_POINT_DELTA_AXIS_2); - if v != 0 { - result.push(CaptureEvent::Input(Event::Pointer(PointerEvent::Axis { - time: 0, - axis: 0, // Vertical - value: v as f64, - }))); - } - if h != 0 { - result.push(CaptureEvent::Input(Event::Pointer(PointerEvent::Axis { - time: 0, - axis: 1, // Horizontal - value: h as f64, - }))); + if ev.get_integer_value_field(EventField::SCROLL_WHEEL_EVENT_IS_CONTINUOUS) != 0 { + let v = + ev.get_integer_value_field(EventField::SCROLL_WHEEL_EVENT_POINT_DELTA_AXIS_1); + let h = + ev.get_integer_value_field(EventField::SCROLL_WHEEL_EVENT_POINT_DELTA_AXIS_2); + if v != 0 { + result.push(CaptureEvent::Input(Event::Pointer(PointerEvent::Axis { + time: 0, + axis: 0, // Vertical + value: v as f64, + }))); + } + if h != 0 { + result.push(CaptureEvent::Input(Event::Pointer(PointerEvent::Axis { + time: 0, + axis: 1, // Horizontal + value: h as f64, + }))); + } + } else { + // line based scrolling + const LINES_PER_STEP: i32 = 3; + const V120_STEPS_PER_LINE: i32 = 120 / LINES_PER_STEP; + let v = ev.get_integer_value_field(EventField::SCROLL_WHEEL_EVENT_DELTA_AXIS_1); + let h = ev.get_integer_value_field(EventField::SCROLL_WHEEL_EVENT_DELTA_AXIS_2); + if v != 0 { + result.push(CaptureEvent::Input(Event::Pointer( + PointerEvent::AxisDiscrete120 { + axis: 0, // Vertical + value: V120_STEPS_PER_LINE * v as i32, + }, + ))); + } + if h != 0 { + result.push(CaptureEvent::Input(Event::Pointer( + PointerEvent::AxisDiscrete120 { + axis: 1, // Horizontal + value: V120_STEPS_PER_LINE * h as i32, + }, + ))); + } } } _ => (),