From 780189a1a651514de7e1a11e0b4774a0a9748ef5 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Mon, 10 Nov 2025 21:21:35 +0100 Subject: [PATCH] focus event --- additional/env.js | 26 ++++++++++++++++--- interfaces/Crafter.CppDOM-BindingsExport.cppm | 12 ++++----- interfaces/Crafter.CppDOM-EventTypes.cppm | 6 +++++ interfaces/Crafter.CppDOM-HtmlElement.cppm | 4 +-- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/additional/env.js b/additional/env.js index b0de910..b73c49b 100644 --- a/additional/env.js +++ b/additional/env.js @@ -21,7 +21,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA const decoder = new TextDecoder(); const encoder = new TextEncoder(); -let memorycounter = -1; +let memorycounter = 0; const jsmemory = new Map(); const eventHandlers = new Map(); @@ -188,7 +188,17 @@ function addFocusListener(ptr, handlerID) { const handler = function (event) { const { ExecuteFocusHandler } = window.crafter_webbuild_wasi.instance.exports; - ExecuteFocusHandler(handlerID); + if(event.relatedTarget) { + const targetKey = ++memorycounter; + const relatedTargetKey = ++memorycounter; + jsmemory.set(targetKey, event.target); + jsmemory.set(relatedTargetKey, event.relatedTarget); + ExecuteFocusHandler(handlerID, targetKey, relatedTargetKey); + } else { + const targetKey = ++memorycounter; + jsmemory.set(targetKey, event.target); + ExecuteFocusHandler(handlerID, targetKey, 0); + } }; eventHandlers.set(`${ptr}-${handlerID}-focus`, handler); @@ -209,7 +219,17 @@ function addBlurListener(ptr, handlerID) { const handler = function (event) { const { ExecuteBlurHandler } = window.crafter_webbuild_wasi.instance.exports; - ExecuteBlurHandler(handlerID); + if(event.relatedTarget) { + const targetKey = ++memorycounter; + const relatedTargetKey = ++memorycounter; + jsmemory.set(targetKey, event.target); + jsmemory.set(relatedTargetKey, event.relatedTarget); + ExecuteBlurHandler(handlerID, targetKey, relatedTargetKey); + } else { + const targetKey = ++memorycounter; + jsmemory.set(targetKey, event.target); + ExecuteBlurHandler(handlerID, targetKey, 0); + } }; eventHandlers.set(`${ptr}-${handlerID}-blur`, handler); diff --git a/interfaces/Crafter.CppDOM-BindingsExport.cppm b/interfaces/Crafter.CppDOM-BindingsExport.cppm index 45eaedc..d9802e9 100644 --- a/interfaces/Crafter.CppDOM-BindingsExport.cppm +++ b/interfaces/Crafter.CppDOM-BindingsExport.cppm @@ -42,10 +42,10 @@ export namespace Crafter::CppDOMBindings { std::unordered_map>* mouseUpHandlers = new std::unordered_map>(); std::int32_t focusHandlerMaxId = 0; - std::unordered_map>* focusHandlers = new std::unordered_map>(); + std::unordered_map>* focusHandlers = new std::unordered_map>(); std::int32_t blurHandlerMaxId = 0; - std::unordered_map>* blurHandlers = new std::unordered_map>(); + std::unordered_map>* blurHandlers = new std::unordered_map>(); std::int32_t keyDownHandlerMaxId = 0; std::unordered_map>* keyDownHandlers = new std::unordered_map>(); @@ -130,12 +130,12 @@ extern "C" { Crafter::CppDOMBindings::mouseUpHandlers->find(handlerID)->second(Crafter::MouseEvent(clientX, clientY, screenX, screenY, button, buttons, altKey, ctrlKey, shiftKey, metaKey)); } - __attribute__((export_name("ExecuteFocusHandler"))) void ExecuteFocusHandler(std::int32_t handlerID) { - Crafter::CppDOMBindings::focusHandlers->find(handlerID)->second(); + __attribute__((export_name("ExecuteFocusHandler"))) void ExecuteFocusHandler(std::int32_t handlerID, void* target, void* relatedTarget) { + Crafter::CppDOMBindings::focusHandlers->find(handlerID)->second(Crafter::FocusEvent(target, relatedTarget)); } - __attribute__((export_name("ExecuteBlurHandler"))) void ExecuteBlurHandler(std::int32_t handlerID) { - Crafter::CppDOMBindings::blurHandlers->find(handlerID)->second(); + __attribute__((export_name("ExecuteBlurHandler"))) void ExecuteBlurHandler(std::int32_t handlerID, void* target, void* relatedTarget) { + Crafter::CppDOMBindings::blurHandlers->find(handlerID)->second(Crafter::FocusEvent(target, relatedTarget)); } __attribute__((export_name("ExecuteKeyDownHandler"))) void ExecuteKeyDownHandler(std::int32_t handlerID, const char* key, std::int32_t keyCode, bool altKey, bool ctrlKey, bool shiftKey, bool metaKey) { diff --git a/interfaces/Crafter.CppDOM-EventTypes.cppm b/interfaces/Crafter.CppDOM-EventTypes.cppm index 6b1930a..1790700 100644 --- a/interfaces/Crafter.CppDOM-EventTypes.cppm +++ b/interfaces/Crafter.CppDOM-EventTypes.cppm @@ -32,6 +32,12 @@ export namespace Crafter { KeyboardEvent(const char* key, std::int32_t keyCode, bool altKey, bool ctrlKey, bool shiftKey, bool metaKey) : key(key), keyCode(keyCode), altKey(altKey), ctrlKey(ctrlKey), shiftKey(shiftKey), metaKey(metaKey) {} }; + struct FocusEvent { + void* target; + void* relatedTarget; + FocusEvent(void* target, void* relatedTarget) : target(target), relatedTarget(relatedTarget) {} + }; + // Mouse event structure struct MouseEvent { double clientX; diff --git a/interfaces/Crafter.CppDOM-HtmlElement.cppm b/interfaces/Crafter.CppDOM-HtmlElement.cppm index c903d2a..09db530 100644 --- a/interfaces/Crafter.CppDOM-HtmlElement.cppm +++ b/interfaces/Crafter.CppDOM-HtmlElement.cppm @@ -148,7 +148,7 @@ namespace Crafter { } // Focus Events - std::int32_t AddFocusListener(std::function callback) { + std::int32_t AddFocusListener(std::function callback) { std::int32_t id = CppDOMBindings::focusHandlerMaxId++; focusHandlers.push_back(id); CppDOMBindings::focusHandlers->insert({id, callback}); @@ -162,7 +162,7 @@ namespace Crafter { CppDOMBindings::RemoveFocusListener(ptr, id); } - std::int32_t AddBlurListener(std::function callback) { + std::int32_t AddBlurListener(std::function callback) { std::int32_t id = CppDOMBindings::blurHandlerMaxId++; blurHandlers.push_back(id); CppDOMBindings::blurHandlers->insert({id, callback});