aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-08-26 13:28:41 +0100
committerGitHub <noreply@github.com>2025-08-26 13:28:41 +0100
commit2f0b018db25fe57ce9f4a4d4d679f6e4cc5d33d2 (patch)
treefa3ac19d237a7f146531e21cb04a2ab8f17483b7
parentac71a0aed1000c7bc10498ba4f529bff4bf325a4 (diff)
parent26d066d369de27892de66d3eefb8d2a4a54e5b7c (diff)
Merge pull request #5612 from Bazzas-Forks/master
Add `add/remove_document_event_listener()` to `core:sys/wasm/js`
-rw-r--r--core/sys/wasm/js/events.odin20
-rw-r--r--core/sys/wasm/js/events_all_targets.odin8
-rw-r--r--core/sys/wasm/js/odin.js36
3 files changed, 64 insertions, 0 deletions
diff --git a/core/sys/wasm/js/events.odin b/core/sys/wasm/js/events.odin
index 37a6e6c35..f5a47c06b 100644
--- a/core/sys/wasm/js/events.odin
+++ b/core/sys/wasm/js/events.odin
@@ -373,12 +373,32 @@ remove_window_event_listener :: proc(kind: Event_Kind, user_data: rawptr, callba
return _remove_window_event_listener(event_kind_string[kind], user_data, callback, use_capture)
}
+add_document_event_listener :: proc(kind: Event_Kind, user_data: rawptr, callback: proc(e: Event), use_capture := false) -> bool {
+ @(default_calling_convention="contextless")
+ foreign dom_lib {
+ @(link_name="add_document_event_listener")
+ _add_document_event_listener :: proc(name: string, name_code: Event_Kind, user_data: rawptr, callback: proc "odin" (Event), use_capture: bool) -> bool ---
+ }
+ return _add_document_event_listener(event_kind_string[kind], kind, user_data, callback, use_capture)
+}
+
+remove_document_event_listener :: proc(kind: Event_Kind, user_data: rawptr, callback: proc(e: Event), use_capture := false) -> bool {
+ @(default_calling_convention="contextless")
+ foreign dom_lib {
+ @(link_name="remove_document_event_listener")
+ _remove_document_event_listener :: proc(name: string, user_data: rawptr, callback: proc "odin" (Event), use_capture: bool) -> bool ---
+ }
+ return _remove_document_event_listener(event_kind_string[kind], user_data, callback, use_capture)
+}
+
remove_event_listener_from_event :: proc(e: Event) -> bool {
from_use_capture_false: bool
from_use_capture_true: bool
if e.id == "" {
from_use_capture_false = remove_window_event_listener(e.kind, e.user_data, e.callback, false)
from_use_capture_true = remove_window_event_listener(e.kind, e.user_data, e.callback, true)
+ from_use_capture_false |= remove_document_event_listener(e.kind, e.user_data, e.callback, false)
+ from_use_capture_true |= remove_document_event_listener(e.kind, e.user_data, e.callback, true)
} else {
from_use_capture_false = remove_event_listener(e.id, e.kind, e.user_data, e.callback, false)
from_use_capture_true = remove_event_listener(e.id, e.kind, e.user_data, e.callback, true)
diff --git a/core/sys/wasm/js/events_all_targets.odin b/core/sys/wasm/js/events_all_targets.odin
index 6439396c5..903252c7a 100644
--- a/core/sys/wasm/js/events_all_targets.odin
+++ b/core/sys/wasm/js/events_all_targets.odin
@@ -275,6 +275,14 @@ remove_window_event_listener :: proc(kind: Event_Kind, user_data: rawptr, callba
panic("vendor:wasm/js not supported on non JS targets")
}
+add_document_event_listener :: proc(kind: Event_Kind, user_data: rawptr, callback: proc(e: Event), use_capture := false) -> bool {
+ panic("vendor:wasm/js not supported on non JS targets")
+}
+
+remove_document_event_listener :: proc(kind: Event_Kind, user_data: rawptr, callback: proc(e: Event), use_capture := false) -> bool {
+ panic("vendor:wasm/js not supported on non JS targets")
+}
+
remove_event_listener_from_event :: proc(e: Event) -> bool {
panic("vendor:wasm/js not supported on non JS targets")
}
diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js
index 1fbcc886e..2a8ccdd5e 100644
--- a/core/sys/wasm/js/odin.js
+++ b/core/sys/wasm/js/odin.js
@@ -1738,6 +1738,28 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
return true;
},
+ add_document_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture) => {
+ let name = wasmMemoryInterface.loadString(name_ptr, name_len);
+ let element = document;
+ let key = listener_key('document', name, data, callback, !!use_capture);
+ if (wasmMemoryInterface.listenerMap.has(key)) {
+ return false;
+ }
+
+ let listener = (e) => {
+ let event_data = {};
+ event_data.id_ptr = 0;
+ event_data.id_len = 0;
+ event_data.event = e;
+ event_data.name_code = name_code;
+
+ onEventReceived(event_data, data, callback);
+ };
+ wasmMemoryInterface.listenerMap.set(key, listener);
+ element.addEventListener(name, listener, !!use_capture);
+ return true;
+ },
+
remove_event_listener: (id_ptr, id_len, name_ptr, name_len, data, callback, use_capture) => {
let id = wasmMemoryInterface.loadString(id_ptr, id_len);
let name = wasmMemoryInterface.loadString(name_ptr, name_len);
@@ -1770,6 +1792,20 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
element.removeEventListener(name, listener, !!use_capture);
return true;
},
+ remove_document_event_listener: (name_ptr, name_len, data, callback, use_capture) => {
+ let name = wasmMemoryInterface.loadString(name_ptr, name_len);
+ let element = document;
+
+ let key = listener_key('document', name, data, callback, !!use_capture);
+ let listener = wasmMemoryInterface.listenerMap.get(key);
+ if (listener === undefined) {
+ return false;
+ }
+ wasmMemoryInterface.listenerMap.delete(key);
+
+ element.removeEventListener(name, listener, !!use_capture);
+ return true;
+ },
event_stop_propagation: () => {
if (event_temp.data && event_temp.data.event) {