diff --git a/vendor/wasm/js/events.odin b/vendor/wasm/js/events.odin index 0d20531df..2d3f01ceb 100644 --- a/vendor/wasm/js/events.odin +++ b/vendor/wasm/js/events.odin @@ -233,6 +233,8 @@ Event :: struct { repeat: bool, + _key_len: int, + _code_len: int, _key_buf: [KEYBOARD_MAX_KEY_SIZE]byte, _code_buf: [KEYBOARD_MAX_KEY_SIZE]byte, }, @@ -343,7 +345,15 @@ do_event_callback :: proc(user_data: rawptr, callback: proc(e: Event)) { user_data = user_data, callback = callback, } + + init_event_raw(&event) + + if event.kind == .Key_Up || event.kind == .Key_Down || event.kind == .Key_Press { + event.key.key = string(event.key._key_buf[:event.key._key_len]) + event.key.code = string(event.key._code_buf[:event.key._code_len]) + } + callback(event) } } \ No newline at end of file diff --git a/vendor/wasm/js/runtime.js b/vendor/wasm/js/runtime.js index bcc7e2051..5980f8c6d 100644 --- a/vendor/wasm/js/runtime.js +++ b/vendor/wasm/js/runtime.js @@ -99,6 +99,11 @@ class WasmMemoryInterface { storeF64(addr, value) { this.mem.setFloat64(addr, value, true); } storeInt(addr, value) { this.mem.setInt32 (addr, value, true); } storeUint(addr, value) { this.mem.setUint32 (addr, value, true); } + + storeString(addr, value) { + const bytes = this.loadBytes(addr, value.length); + new TextEncoder("utf-8").encodeInto(value, bytes); + } }; class WebGLInterface { @@ -1384,6 +1389,7 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement) { wmi.storeUint(off(W), event_temp_data.id_ptr); wmi.storeUint(off(W), event_temp_data.id_len); + wmi.storeUint(off(W), 0); // padding wmi.storeF64(off(8), e.timeStamp*1e-3); @@ -1417,8 +1423,12 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement) { wmi.storeI16(off(2), e.button); wmi.storeU16(off(2), e.buttons); } else if (e instanceof KeyboardEvent) { - let keyOffset = off(W*2, W); - let codeOffet = off(W*2, W); + // Note: those strigs are constructed + // on the native side from buffers that + // are filled later, so skip them + const keyPtr = off(W*2, W); + const codePtr = off(W*2, W); + wmi.storeU8(off(1), e.location); wmi.storeU8(off(1), !!e.ctrlKey); @@ -1427,6 +1437,11 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement) { wmi.storeU8(off(1), !!e.metaKey); wmi.storeU8(off(1), !!e.repeat); + + wmi.storeI32(off(W), e.key.length) + wmi.storeI32(off(W), e.code.length) + wmi.storeString(off(16, 1), e.key); + wmi.storeString(off(16, 1), e.code); } else if (e instanceof WheelEvent) { wmi.storeF64(off(8), e.deltaX); wmi.storeF64(off(8), e.deltaY);