소스 검색

Fix issues with js events not being initialized properly

Caedo 2 년 전
부모
커밋
1182f41f99
2개의 변경된 파일30개의 추가작업 그리고 2개의 파일을 삭제
  1. 13 0
      vendor/wasm/js/events.odin
  2. 17 2
      vendor/wasm/js/runtime.js

+ 13 - 0
vendor/wasm/js/events.odin

@@ -1,6 +1,8 @@
 //+build js wasm32, js wasm64p32
 package wasm_js_interface
 
+import "core:runtime"
+
 foreign import dom_lib "odin_dom"
 
 Event_Kind :: enum u32 {
@@ -343,7 +345,18 @@ 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 {
+			key := transmute(^runtime.Raw_String) &event.key.key
+			key.data = &event.key._key_buf[0]
+
+			code := transmute(^runtime.Raw_String) &event.key.code
+			code.data = &event.key._code_buf[0] 
+		}
+
 		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,14 @@ 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: we set string data pointers on the 
+					// native side, so skip those for now and
+					// set only string length
+					const keyPtr = off(W);
+					wmi.storeI32(off(W), e.key.length);
+					const codePtr = off(W);
+					wmi.storeI32(off(W), e.code.length);
+
 					wmi.storeU8(off(1), e.location);
 
 					wmi.storeU8(off(1), !!e.ctrlKey);
@@ -1427,6 +1439,9 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement) {
 					wmi.storeU8(off(1), !!e.metaKey);
 
 					wmi.storeU8(off(1), !!e.repeat);
+
+					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);