From 75bf6df49a6fa87c718f4052343a4b6ff4de574c Mon Sep 17 00:00:00 2001 From: Adam Scott Date: Thu, 7 Nov 2024 13:24:06 -0500 Subject: [PATCH 1/2] Make IME code early return instead --- platform/web/js/libs/library_godot_input.js | 77 +++++++++++---------- 1 file changed, 41 insertions(+), 36 deletions(-) diff --git a/platform/web/js/libs/library_godot_input.js b/platform/web/js/libs/library_godot_input.js index 6e3b97023d..dfab882fd3 100644 --- a/platform/web/js/libs/library_godot_input.js +++ b/platform/web/js/libs/library_godot_input.js @@ -44,35 +44,38 @@ const GodotIME = { }, ime_active: function (active) { + if (GodotIME.ime == null) { + return; + } + function focus_timer() { GodotIME.active = true; GodotIME.ime.focus(); } - if (GodotIME.ime) { - if (active) { - GodotIME.ime.style.display = 'block'; - setInterval(focus_timer, 100); - } else { - GodotIME.ime.style.display = 'none'; - GodotConfig.canvas.focus(); - GodotIME.active = false; - } + if (active) { + GodotIME.ime.style.display = 'block'; + setInterval(focus_timer, 100); + } else { + GodotIME.ime.style.display = 'none'; + GodotConfig.canvas.focus(); + GodotIME.active = false; } }, ime_position: function (x, y) { - if (GodotIME.ime) { - const canvas = GodotConfig.canvas; - const rect = canvas.getBoundingClientRect(); - const rw = canvas.width / rect.width; - const rh = canvas.height / rect.height; - const clx = (x / rw) + rect.x; - const cly = (y / rh) + rect.y; - - GodotIME.ime.style.left = `${clx}px`; - GodotIME.ime.style.top = `${cly}px`; + if (GodotIME.ime == null) { + return; } + const canvas = GodotConfig.canvas; + const rect = canvas.getBoundingClientRect(); + const rw = canvas.width / rect.width; + const rh = canvas.height / rect.height; + const clx = (x / rw) + rect.x; + const cly = (y / rh) + rect.y; + + GodotIME.ime.style.left = `${clx}px`; + GodotIME.ime.style.top = `${cly}px`; }, init: function (ime_cb, key_cb, code, key) { @@ -84,20 +87,21 @@ const GodotIME = { evt.preventDefault(); } function ime_event_cb(event) { - if (GodotIME.ime) { - if (event.type === 'compositionstart') { - ime_cb(0, null); - GodotIME.ime.innerHTML = ''; - } else if (event.type === 'compositionupdate') { - const ptr = GodotRuntime.allocString(event.data); - ime_cb(1, ptr); - GodotRuntime.free(ptr); - } else if (event.type === 'compositionend') { - const ptr = GodotRuntime.allocString(event.data); - ime_cb(2, ptr); - GodotRuntime.free(ptr); - GodotIME.ime.innerHTML = ''; - } + if (GodotIME.ime == null) { + return; + } + if (event.type === 'compositionstart') { + ime_cb(0, null); + GodotIME.ime.innerHTML = ''; + } else if (event.type === 'compositionupdate') { + const ptr = GodotRuntime.allocString(event.data); + ime_cb(1, ptr); + GodotRuntime.free(ptr); + } else if (event.type === 'compositionend') { + const ptr = GodotRuntime.allocString(event.data); + ime_cb(2, ptr); + GodotRuntime.free(ptr); + GodotIME.ime.innerHTML = ''; } } @@ -133,10 +137,11 @@ const GodotIME = { }, clear: function () { - if (GodotIME.ime) { - GodotIME.ime.remove(); - GodotIME.ime = null; + if (GodotIME.ime == null) { + return; } + GodotIME.ime.remove(); + GodotIME.ime = null; }, }, }; From 529569299039a8f483d2d9bc17f01ef9d98aa6cf Mon Sep 17 00:00:00 2001 From: Adam Scott Date: Thu, 7 Nov 2024 13:25:36 -0500 Subject: [PATCH 2/2] Fix issue where focus timer would throw continuously --- platform/web/js/libs/library_godot_input.js | 43 ++++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/platform/web/js/libs/library_godot_input.js b/platform/web/js/libs/library_godot_input.js index dfab882fd3..8134631f1b 100644 --- a/platform/web/js/libs/library_godot_input.js +++ b/platform/web/js/libs/library_godot_input.js @@ -38,28 +38,41 @@ const GodotIME = { $GodotIME: { ime: null, active: false, + focusTimerIntervalId: -1, getModifiers: function (evt) { return (evt.shiftKey + 0) + ((evt.altKey + 0) << 1) + ((evt.ctrlKey + 0) << 2) + ((evt.metaKey + 0) << 3); }, ime_active: function (active) { + function clearFocusTimerInterval() { + clearInterval(GodotIME.focusTimerIntervalId); + GodotIME.focusTimerIntervalId = -1; + } + + function focusTimer() { + if (GodotIME.ime == null) { + clearFocusTimerInterval(); + return; + } + GodotIME.ime.focus(); + } + + if (GodotIME.focusTimerIntervalId > -1) { + clearFocusTimerInterval(); + } + if (GodotIME.ime == null) { return; } - function focus_timer() { - GodotIME.active = true; - GodotIME.ime.focus(); - } - + GodotIME.active = active; if (active) { GodotIME.ime.style.display = 'block'; - setInterval(focus_timer, 100); + GodotIME.focusTimerIntervalId = setInterval(focusTimer, 100); } else { GodotIME.ime.style.display = 'none'; GodotConfig.canvas.focus(); - GodotIME.active = false; } }, @@ -90,18 +103,24 @@ const GodotIME = { if (GodotIME.ime == null) { return; } - if (event.type === 'compositionstart') { + switch (event.type) { + case 'compositionstart': ime_cb(0, null); GodotIME.ime.innerHTML = ''; - } else if (event.type === 'compositionupdate') { + break; + case 'compositionupdate': { const ptr = GodotRuntime.allocString(event.data); ime_cb(1, ptr); GodotRuntime.free(ptr); - } else if (event.type === 'compositionend') { + } break; + case 'compositionend': { const ptr = GodotRuntime.allocString(event.data); ime_cb(2, ptr); GodotRuntime.free(ptr); GodotIME.ime.innerHTML = ''; + } break; + default: + // Do nothing. } } @@ -140,6 +159,10 @@ const GodotIME = { if (GodotIME.ime == null) { return; } + if (GodotIME.focusTimerIntervalId > -1) { + clearInterval(GodotIME.focusTimerIntervalId); + GodotIME.focusTimerIntervalId = -1; + } GodotIME.ime.remove(); GodotIME.ime = null; },