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, + }, + ))); + } } } _ => (),