Merge pull request #2748 from Caedo/js-events-fix

Fix issues with js events not being initialized properly
This commit is contained in:
gingerBill
2023-08-17 16:40:54 +01:00
committed by GitHub
2 changed files with 27 additions and 2 deletions

View File

@@ -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)
}
}

View File

@@ -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);