diff --git a/core/sys/wasm/js/events.odin b/core/sys/wasm/js/events.odin index 905b3eba9..0d23277a7 100644 --- a/core/sys/wasm/js/events.odin +++ b/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 { diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index 98b112890..f6aa45f28 100644 --- a/core/sys/wasm/js/odin.js +++ b/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;