Skip to content

Standardize WheelDelta to v120 convention across all platforms #3533

@mattleibow

Description

@mattleibow

Summary

SKTouchEventArgs.WheelDelta currently has no documented unit contract. Only Windows MAUI passes meaningful values (raw ±120 per notch). All other platforms either hardcode 0 or don't handle wheel events at all.

We need to standardize WheelDelta across all platforms to use the v120 convention: 120 units = 1 discrete mouse wheel notch. This is the same standard used by both Windows (WHEEL_DELTA = 120) and Linux (libinput v120 API). The number 120 was chosen for its high divisibility (factors: 1,2,3,4,5,6,8,10,12,15,20,24,30,40,60,120), enabling clean subdivision for high-resolution scroll hardware.

Proposed Standard

Unit: v120

WheelDelta = number of v120 units, where 120 = one discrete mouse wheel notch.

Sign Convention

  • Positive = scroll up (away from user)
  • Negative = scroll down (toward user)
  • Matches Windows convention

Discrete Scroll (mouse wheel)

  • One notch MUST produce exactly ±120
  • High-resolution mice may produce sub-120 values (e.g., 30, 60)
  • Consumers should accumulate until ±120 for line-based scrolling, or use raw values for smooth/pixel scrolling

Fine/Precise Scroll (trackpad, Magic Mouse, high-res mice)

  • Values scale proportionally: small gesture → small integer value
  • Always integer (platform handler rounds to nearest)
  • No dead zone: any detectable movement produces at least ±1
  • Sub-120 values represent fractional notches (e.g., 60 = half a notch)

Current State & Sub-Issues

Platform Status Native API Raw per notch Sub-issue
Windows MAUI ✅ Already correct MouseWheelDelta ±120 (int) N/A
Blazor WASM ❌ Not implemented WheelEvent.deltaY + deltaMode ~100px / ~3 lines #3534
Android MAUI ❌ Not implemented MotionEvent.AXIS_VSCROLL ±1.0 (float) #3535
macOS MAUI ❌ Not implemented NSEvent.scrollingDeltaY ±1.0 (CGFloat) #3536
iOS/iPadOS + Mac Catalyst ❌ Not implemented UIPanGestureRecognizer Points (CGPoint) #3537
Tizen MAUI ❌ Not implemented Wheel.Z ±1 (int) #3538
WPF / WinForms ❌ No touch handler MouseWheelEventArgs.Delta / MouseEventArgs.Delta ±120 (int) #3539
GTK3/4 (Linux) ❌ No scroll handler (GTK4 view merged in #3527) EventControllerScroll / libinput v120 ±1.0 / ±120 #3540

Normalization Summary

Platform Formula Mouse notch → Trackpad micro →
Windows passthrough 120 Sub-120
macOS round(scrollingDeltaY × 120) 120 ~12-60
iOS/iPadOS round(translationDelta × scale) ~120 proportional
Android round(axisValue × 120) 120 ~12-60
Tizen -Z × 120 120 N/A
Browser (pixel) round(-deltaY × 1.2) ~120 ~1-5
Browser (line) round(-deltaY × 40) ~120 ~40
Browser (page) round(-deltaY × 120) ~120 N/A
WPF/WinForms passthrough 120 Sub-120
GTK round(-dy × 120) 120 ~12-60
Linux (libinput) passthrough 120 Sub-120

Implementation Priority

  1. Blazor WASM (Add wheel support to Blazor WASM views with v120 normalization #3534) — No wheel support; add with v120 normalization
  2. Android (Add wheel support to Android MAUI views with v120 normalization #3535) — Most common platform missing wheel, simple AXIS_VSCROLL × 120
  3. macOS (Add wheel support to macOS MAUI views with v120 normalization #3536) — Important for desktop, scrollingDeltaY × 120
  4. iOS/iPadOS + Mac Catalyst (Add wheel support to iOS/iPadOS and Mac Catalyst MAUI views with v120 normalization #3537) — Follows macOS, needs UIPanGestureRecognizer
  5. Tizen (Add wheel support to Tizen MAUI views with v120 normalization #3538) — Lower priority
  6. WPF / WinForms (Add wheel support to WPF and Windows Forms views with v120 normalization #3539) — Requires touch handler infrastructure first
  7. GTK3/4 (Add wheel support to GTK3/GTK4 views with v120 normalization #3540) — GTK4 view exists (Add SkiaSharp.Views.Gtk4 using GirCore.Gtk-4.0 bindings #3527), needs scroll event controller

Sub-issues

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    Status

    New

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions