Sfoglia il codice sorgente

Added parameters to the add_*_event_listener JS functions for stopping event behavior

p2jason 11 mesi fa
parent
commit
0eac9f15bc
2 ha cambiato i file con 20 aggiunte e 11 eliminazioni
  1. 10 9
      core/sys/wasm/js/events.odin
  2. 10 2
      core/sys/wasm/js/odin.js

+ 10 - 9
core/sys/wasm/js/events.odin

@@ -313,14 +313,14 @@ foreign dom_lib {
 	dispatch_custom_event            :: proc(id: string, name: string, options := Event_Options{}) -> bool ---
 }
 
-add_event_listener :: proc(id: string, kind: Event_Kind, user_data: rawptr, callback: proc(e: Event), use_capture := false) -> bool {
+add_event_listener :: proc(id: string, kind: Event_Kind, user_data: rawptr, callback: proc(e: Event), use_capture := false, prevent_default := false, stop_prop := false, stop_imm_prop := false) -> bool {
 	@(default_calling_convention="contextless")
 	foreign dom_lib {
 		@(link_name="add_event_listener")
-		_add_event_listener :: proc(id: string, name: string, name_code: Event_Kind, user_data: rawptr, callback: proc "odin" (Event), use_capture: bool) -> bool ---
+		_add_event_listener :: proc(id: string, name: string, name_code: Event_Kind, user_data: rawptr, callback: proc "odin" (Event), use_capture: bool, prevent_default: bool, stop_prop: bool, stop_imm_prop: bool) -> bool ---
 	}
 	// TODO: Pointer_Lock_Change etc related stuff for all different browsers
-	return _add_event_listener(id, event_kind_string[kind], kind, user_data, callback, use_capture)
+	return _add_event_listener(id, event_kind_string[kind], kind, user_data, callback, use_capture, prevent_default, stop_prop, stop_imm_prop)
 }
 
 remove_event_listener :: proc(id: string, kind: Event_Kind, user_data: rawptr, callback: proc(e: Event)) -> bool {
@@ -332,13 +332,13 @@ remove_event_listener :: proc(id: string, kind: Event_Kind, user_data: rawptr, c
 	return _remove_event_listener(id, event_kind_string[kind], user_data, callback)
 }
 
-add_window_event_listener :: proc(kind: Event_Kind, user_data: rawptr, callback: proc(e: Event), use_capture := false) -> bool {
+add_window_event_listener :: proc(kind: Event_Kind, user_data: rawptr, callback: proc(e: Event), use_capture := false, prevent_default := false, stop_prop := false, stop_imm_prop := false) -> bool {
 	@(default_calling_convention="contextless")
 	foreign dom_lib {
 		@(link_name="add_window_event_listener")
-		_add_window_event_listener :: proc(name: string, name_code: Event_Kind, user_data: rawptr, callback: proc "odin" (Event), use_capture: bool) -> bool ---
+		_add_window_event_listener :: proc(name: string, name_code: Event_Kind, user_data: rawptr, callback: proc "odin" (Event), use_capture: bool, prevent_default: bool, stop_prop: bool, stop_imm_prop: bool) -> bool ---
 	}
-	return _add_window_event_listener(event_kind_string[kind], kind, user_data, callback, use_capture)
+	return _add_window_event_listener(event_kind_string[kind], kind, user_data, callback, use_capture, prevent_default, stop_prop, stop_imm_prop)
 }
 
 remove_window_event_listener :: proc(kind: Event_Kind, user_data: rawptr, callback: proc(e: Event)) -> bool {
@@ -357,14 +357,15 @@ remove_event_listener_from_event :: proc(e: Event) -> bool {
 	return remove_event_listener(e.id, e.kind, e.user_data, e.callback)
 }
 
-add_custom_event_listener :: proc(id: string, name: string, user_data: rawptr, callback: proc(e: Event), use_capture := false) -> bool {
+add_custom_event_listener :: proc(id: string, name: string, user_data: rawptr, callback: proc(e: Event), use_capture := false, prevent_default := false, stop_prop := false, stop_imm_prop := false) -> bool {
 	@(default_calling_convention="contextless")
 	foreign dom_lib {
 		@(link_name="add_event_listener")
-		_add_event_listener :: proc(id: string, name: string, name_code: Event_Kind, user_data: rawptr, callback: proc "odin" (Event), use_capture: bool) -> bool ---
+		_add_event_listener :: proc(id: string, name: string, name_code: Event_Kind, user_data: rawptr, callback: proc "odin" (Event), use_capture: bool, prevent_default: bool, stop_prop: bool, stop_imm_prop: bool) -> bool ---
 	}
-	return _add_event_listener(id, name, .Custom, user_data, callback, use_capture)
+	return _add_event_listener(id, name, .Custom, user_data, callback, use_capture, prevent_default, stop_prop, stop_imm_prop)
 }
+
 remove_custom_event_listener :: proc(id: string, name: string, user_data: rawptr, callback: proc(e: Event)) -> bool {
 	@(default_calling_convention="contextless")
 	foreign dom_lib {

+ 10 - 2
core/sys/wasm/js/odin.js

@@ -1579,7 +1579,7 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory, ev
 				}
 			},
 
-			add_event_listener: (id_ptr, id_len, name_ptr, name_len, name_code, data, callback, use_capture) => {
+			add_event_listener: (id_ptr, id_len, name_ptr, name_len, name_code, data, callback, use_capture, prevent_default, stop_prop, stop_imm_prop) => {
 				let id = wasmMemoryInterface.loadString(id_ptr, id_len);
 				let name = wasmMemoryInterface.loadString(name_ptr, name_len);
 				let element = getElement(id);
@@ -1594,6 +1594,10 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory, ev
 					event_data.event = e;
 					event_data.name_code = name_code;
 
+					if (prevent_default) e.preventDefault();
+					if (stop_prop) e.stopPropagation();
+					if (stop_imm_prop) e.stopImmediatePropagation();
+
 					eventQueue.push({event_data: event_data, data: data, callback: callback});
 				};
 				wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener;
@@ -1601,7 +1605,7 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory, ev
 				return true;
 			},
 
-			add_window_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture) => {
+			add_window_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture, prevent_default, stop_prop, stop_imm_prop) => {
 				let name = wasmMemoryInterface.loadString(name_ptr, name_len);
 				let element = window;
 				let listener = (e) => {
@@ -1611,6 +1615,10 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory, ev
 					event_data.event = e;
 					event_data.name_code = name_code;
 
+					if (prevent_default) e.preventDefault();
+					if (stop_prop) e.stopPropagation();
+					if (stop_imm_prop) e.stopImmediatePropagation();
+
 					eventQueue.push({event_data: event_data, data: data, callback: callback});
 				};
 				wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener;