Ver código fonte

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

Fix issues with js events not being initialized properly
gingerBill 2 anos atrás
pai
commit
b873651da7
2 arquivos alterados com 27 adições e 2 exclusões
  1. 10 0
      vendor/wasm/js/events.odin
  2. 17 2
      vendor/wasm/js/runtime.js

+ 10 - 0
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)
 	}
 }

+ 17 - 2
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);