focus event

This commit is contained in:
Jorijn van der Graaf 2025-11-10 21:21:35 +01:00
commit 780189a1a6
4 changed files with 37 additions and 11 deletions

View file

@ -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);

View file

@ -42,10 +42,10 @@ export namespace Crafter::CppDOMBindings {
std::unordered_map<int, std::function<void(Crafter::MouseEvent)>>* mouseUpHandlers = new std::unordered_map<int, std::function<void(Crafter::MouseEvent)>>();
std::int32_t focusHandlerMaxId = 0;
std::unordered_map<int, std::function<void(void)>>* focusHandlers = new std::unordered_map<int, std::function<void(void)>>();
std::unordered_map<int, std::function<void(Crafter::FocusEvent)>>* focusHandlers = new std::unordered_map<int, std::function<void(Crafter::FocusEvent)>>();
std::int32_t blurHandlerMaxId = 0;
std::unordered_map<int, std::function<void(void)>>* blurHandlers = new std::unordered_map<int, std::function<void(void)>>();
std::unordered_map<int, std::function<void(Crafter::FocusEvent)>>* blurHandlers = new std::unordered_map<int, std::function<void(Crafter::FocusEvent)>>();
std::int32_t keyDownHandlerMaxId = 0;
std::unordered_map<int, std::function<void(Crafter::KeyboardEvent)>>* keyDownHandlers = new std::unordered_map<int, std::function<void(Crafter::KeyboardEvent)>>();
@ -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) {

View file

@ -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;

View file

@ -148,7 +148,7 @@ namespace Crafter {
}
// Focus Events
std::int32_t AddFocusListener(std::function<void(void)> callback) {
std::int32_t AddFocusListener(std::function<void(Crafter::FocusEvent)> 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<void(void)> callback) {
std::int32_t AddBlurListener(std::function<void(Crafter::FocusEvent)> callback) {
std::int32_t id = CppDOMBindings::blurHandlerMaxId++;
blurHandlers.push_back(id);
CppDOMBindings::blurHandlers->insert({id, callback});