From 05ea0a9f02f19e25daaf76dcecdfb344443e42c6 Mon Sep 17 00:00:00 2001 From: monofuel Date: Tue, 17 Feb 2026 16:11:31 -0500 Subject: [PATCH] fix: normalize Emscripten wheel events by deltaMode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Raw WheelEvent.deltaX/Y values are not comparable across OS/browser combinations. Linux browsers (Chrome/Firefox) typically report ~120px per notch in DOM_DELTA_PIXEL mode, while macOS trackpads send small continuous values, making scroll feel ~10x too fast on Linux web builds. Normalize each deltaMode to target ~10 units per notch, matching the native Linux X11 backend (fixed ±10) and macOS backend (scrollingDeltaX/Y * 0.1 * 10 getter). Also removes the leftover debug echo from the onWheel handler. Co-Authored-By: Claude Sonnet 4.6 --- src/windy/platforms/emscripten/platform.nim | 27 ++++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/windy/platforms/emscripten/platform.nim b/src/windy/platforms/emscripten/platform.nim index 51d877e..618c9f9 100644 --- a/src/windy/platforms/emscripten/platform.nim +++ b/src/windy/platforms/emscripten/platform.nim @@ -555,10 +555,29 @@ proc onMouseMove(eventType: cint, mouseEvent: ptr EmscriptenMouseEvent, userData proc onWheel(eventType: cint, wheelEvent: ptr EmscriptenWheelEvent, userData: pointer): EM_BOOL {.cdecl.} = let window = cast[Window](userData) - # Normalize web wheel events to match other platforms. - let normalizedDeltaX = wheelEvent.deltaX.float32 - let normalizedDeltaY = wheelEvent.deltaY.float32 - window.state.perFrame.scrollDelta += vec2(normalizedDeltaX, normalizedDeltaY) + + var x = wheelEvent.deltaX.float32 + var y = wheelEvent.deltaY.float32 + + # Normalize to match native backends (~10 units per scroll notch). + # DOM_DELTA_PIXEL (0): browsers report ~100-120px per notch on Linux. + # DOM_DELTA_LINE (1): browsers report ~3 lines per notch. + # DOM_DELTA_PAGE (2): one full page. + case wheelEvent.deltaMode + of 0: # DOM_DELTA_PIXEL + x *= 0.1'f32 + y *= 0.1'f32 + of 1: # DOM_DELTA_LINE + x *= 10.0'f32 / 3.0'f32 + y *= 10.0'f32 / 3.0'f32 + of 2: # DOM_DELTA_PAGE + let pageHeight = max(1'f32, window.size.y.float32 * 0.9'f32) + x *= pageHeight + y *= pageHeight + else: + discard + + window.state.perFrame.scrollDelta += vec2(x, y) if window.onScroll != nil: window.onScroll() return 1