diff --git a/src/windy/platforms/emscripten/platform.nim b/src/windy/platforms/emscripten/platform.nim index ec8b794..7b78c64 100644 --- a/src/windy/platforms/emscripten/platform.nim +++ b/src/windy/platforms/emscripten/platform.nim @@ -646,7 +646,7 @@ proc onWheel(eventType: cint, wheelEvent: ptr EmscriptenWheelEvent, userData: po # very different magnitudes. Use a flat OS-based multiplier instead. let scale = if "Mac" in platform: -1.0f - else: 0.2f + else: -0.2f let x = wheelEvent.deltaX.float32 * scale y = wheelEvent.deltaY.float32 * scale @@ -656,15 +656,27 @@ proc onWheel(eventType: cint, wheelEvent: ptr EmscriptenWheelEvent, userData: po window.onScroll() return 1 +proc keyEventToButton(event: ptr EmscriptenKeyboardEvent): Button = + case $cast[cstring](event.code[0].addr) + of "MetaLeft": KeyLeftSuper + of "MetaRight": KeyRightSuper + else: keyCodeToButton(event.keyCode) + proc onKeyDown(eventType: cint, keyEvent: ptr EmscriptenKeyboardEvent, userData: pointer): EM_BOOL {.cdecl.} = let window = cast[Window](userData) - let button = keyCodeToButton(keyEvent.keyCode) + let button = keyEventToButton(keyEvent) window.handleButtonPress(button) + # Canceling a printable keydown suppresses the keypress that delivers runes. + # Keep navigation and shortcuts captured; onKeyPress consumes text input. + if window.runeInputEnabled and not keyEvent.ctrlKey and not keyEvent.metaKey: + let key = $cast[cstring](keyEvent.key[0].addr) + if key.runeLen == 1: + return 0 return 1 proc onKeyUp(eventType: cint, keyEvent: ptr EmscriptenKeyboardEvent, userData: pointer): EM_BOOL {.cdecl.} = let window = cast[Window](userData) - let button = keyCodeToButton(keyEvent.keyCode) + let button = keyEventToButton(keyEvent) window.handleButtonRelease(button) return 1