diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2021-10-05 15:07:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-05 15:07:23 +0200 |
commit | d9af98e114201aba61e8e237a8d0bdea4029cf71 (patch) | |
tree | 2289916a68ff524b0f782e4080f0a6176cd4139e /platform/javascript/js/libs/library_godot_os.js | |
parent | 8a0db53d0f275f63bac6464fdd4e95b940dbfdec (diff) | |
parent | 68616edcbc4aebd34ee98b78b1d165190fdcb9a6 (diff) | |
download | redot-engine-d9af98e114201aba61e8e237a8d0bdea4029cf71.tar.gz |
Merge pull request #52811 from Faless/js/4.x_our_input
Diffstat (limited to 'platform/javascript/js/libs/library_godot_os.js')
-rw-r--r-- | platform/javascript/js/libs/library_godot_os.js | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/platform/javascript/js/libs/library_godot_os.js b/platform/javascript/js/libs/library_godot_os.js index 99e7ee8b5f..c552e99415 100644 --- a/platform/javascript/js/libs/library_godot_os.js +++ b/platform/javascript/js/libs/library_godot_os.js @@ -328,3 +328,43 @@ const GodotOS = { autoAddDeps(GodotOS, '$GodotOS'); mergeInto(LibraryManager.library, GodotOS); + +/* + * Godot event listeners. + * Keeps track of registered event listeners so it can remove them on shutdown. + */ +const GodotEventListeners = { + $GodotEventListeners__deps: ['$GodotOS'], + $GodotEventListeners__postset: 'GodotOS.atexit(function(resolve, reject) { GodotEventListeners.clear(); resolve(); });', + $GodotEventListeners: { + handlers: [], + + has: function (target, event, method, capture) { + return GodotEventListeners.handlers.findIndex(function (e) { + return e.target === target && e.event === event && e.method === method && e.capture === capture; + }) !== -1; + }, + + add: function (target, event, method, capture) { + if (GodotEventListeners.has(target, event, method, capture)) { + return; + } + function Handler(p_target, p_event, p_method, p_capture) { + this.target = p_target; + this.event = p_event; + this.method = p_method; + this.capture = p_capture; + } + GodotEventListeners.handlers.push(new Handler(target, event, method, capture)); + target.addEventListener(event, method, capture); + }, + + clear: function () { + GodotEventListeners.handlers.forEach(function (h) { + h.target.removeEventListener(h.event, h.method, h.capture); + }); + GodotEventListeners.handlers.length = 0; + }, + }, +}; +mergeInto(LibraryManager.library, GodotEventListeners); |