Crafter.CppDOM/additional/env.js

677 lines
25 KiB
JavaScript
Raw Normal View History

2025-01-02 02:48:44 +01:00
/*
2025-02-12 23:12:24 +01:00
Crafter.CppDOM
Copyright (C) 2025 Catcrafts
2025-01-02 02:48:44 +01:00
Catcrafts.net
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3.0 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
2025-02-12 22:22:06 +01:00
const decoder = new TextDecoder();
2025-11-09 22:43:52 +01:00
const encoder = new TextEncoder();
2025-02-03 22:51:14 +01:00
2025-11-10 21:21:35 +01:00
let memorycounter = 0;
2025-02-12 22:22:06 +01:00
const jsmemory = new Map();
2025-11-09 22:43:52 +01:00
const eventHandlers = new Map();
2025-02-03 22:51:14 +01:00
2025-02-12 22:22:06 +01:00
function freeJs(ptr) {
jsmemory.delete(ptr);
2025-02-03 22:51:14 +01:00
}
2025-01-02 02:48:44 +01:00
2025-11-10 20:02:11 +01:00
function writeStringToWasm(str) {
const encoder = new TextEncoder();
const encoded = encoder.encode(str + '\0');
const len = encoded.length;
const { WasmAlloc } = window.crafter_webbuild_wasi.instance.exports;
const ptr = WasmAlloc(len);
const memView = new Uint8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, ptr, len);
memView.set(encoded);
return ptr;
}
2025-02-12 22:22:06 +01:00
function getElementById(id, idLenght) {
const obj = document.getElementById(decoder.decode(new Int8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, id, idLenght)));
jsmemory.set(++memorycounter, obj);
return memorycounter;
2025-01-02 02:48:44 +01:00
}
2025-02-12 22:22:06 +01:00
function setInnerHTML(ptr, html, htmlLenght) {
jsmemory.get(ptr).innerHTML = decoder.decode(new Int8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, html, htmlLenght));
2025-02-03 22:51:14 +01:00
}
2025-11-09 22:56:29 +01:00
// Event handler registration functions
2025-11-09 22:43:52 +01:00
function addClickListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:43:52 +01:00
// Create a handler that will trigger a notification to C++
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:43:52 +01:00
const { ExecuteClickHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 21:31:06 +01:00
ExecuteClickHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-09 22:43:52 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:43:52 +01:00
eventHandlers.set(`${ptr}-${handlerID}`, handler);
2025-11-10 20:02:11 +01:00
2025-11-09 22:43:52 +01:00
element.addEventListener("click", handler);
}
function removeClickListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:43:52 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:43:52 +01:00
element.removeEventListener("click", handler);
2025-11-09 22:56:29 +01:00
eventHandlers.delete(`${ptr}-${handlerID}`);
}
2025-11-10 20:02:11 +01:00
// Mouse Events
2025-11-09 22:56:29 +01:00
function addMouseOverListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteMouseOverHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteMouseOverHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-mouseover`, handler);
element.addEventListener("mouseover", handler);
}
function removeMouseOverListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-mouseover`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("mouseover", handler);
eventHandlers.delete(`${ptr}-${handlerID}-mouseover`);
}
function addMouseOutListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteMouseOutHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteMouseOutHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-mouseout`, handler);
element.addEventListener("mouseout", handler);
}
function removeMouseOutListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-mouseout`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("mouseout", handler);
eventHandlers.delete(`${ptr}-${handlerID}-mouseout`);
}
function addMouseMoveListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteMouseMoveHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteMouseMoveHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-mousemove`, handler);
element.addEventListener("mousemove", handler);
}
function removeMouseMoveListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-mousemove`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("mousemove", handler);
eventHandlers.delete(`${ptr}-${handlerID}-mousemove`);
}
2025-11-10 20:02:11 +01:00
function addMouseDownListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = function (event) {
const { ExecuteMouseDownHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteMouseDownHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-10 20:02:11 +01:00
};
eventHandlers.set(`${ptr}-${handlerID}-mousedown`, handler);
element.addEventListener("mousedown", handler);
}
function removeMouseDownListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = eventHandlers.get(`${ptr}-${handlerID}-mousedown`);
element.removeEventListener("mousedown", handler);
eventHandlers.delete(`${ptr}-${handlerID}-mousedown`);
}
function addMouseUpListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = function (event) {
const { ExecuteMouseUpHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteMouseUpHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-10 20:02:11 +01:00
};
eventHandlers.set(`${ptr}-${handlerID}-mouseup`, handler);
element.addEventListener("mouseup", handler);
}
function removeMouseUpListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = eventHandlers.get(`${ptr}-${handlerID}-mouseup`);
element.removeEventListener("mouseup", handler);
eventHandlers.delete(`${ptr}-${handlerID}-mouseup`);
}
// Focus Events
2025-11-09 22:56:29 +01:00
function addFocusListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteFocusHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 21:21:35 +01:00
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);
}
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-focus`, handler);
element.addEventListener("focus", handler);
}
function removeFocusListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-focus`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("focus", handler);
eventHandlers.delete(`${ptr}-${handlerID}-focus`);
}
function addBlurListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteBlurHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 21:21:35 +01:00
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);
}
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-blur`, handler);
element.addEventListener("blur", handler);
}
function removeBlurListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-blur`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("blur", handler);
eventHandlers.delete(`${ptr}-${handlerID}-blur`);
}
2025-11-10 20:02:11 +01:00
// Keyboard Events
2025-11-09 22:56:29 +01:00
function addKeyDownListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
const { ExecuteKeyDownHandler, WasmFree } = window.crafter_webbuild_wasi.instance.exports;
const ptr = writeStringToWasm(event.key);
ExecuteKeyDownHandler(handlerID, ptr, event.keyCode, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
WasmFree(ptr);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-keydown`, handler);
element.addEventListener("keydown", handler);
}
function removeKeyDownListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-keydown`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("keydown", handler);
eventHandlers.delete(`${ptr}-${handlerID}-keydown`);
}
function addKeyUpListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
const { ExecuteKeyUpHandler, WasmFree } = window.crafter_webbuild_wasi.instance.exports;
const ptr = writeStringToWasm(event.key);
ExecuteKeyUpHandler(handlerID, ptr, event.keyCode, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
WasmFree(ptr);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-keyup`, handler);
element.addEventListener("keyup", handler);
}
function removeKeyUpListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-keyup`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("keyup", handler);
eventHandlers.delete(`${ptr}-${handlerID}-keyup`);
}
function addKeyPressListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
const { ExecuteKeyPressHandler, WasmFree } = window.crafter_webbuild_wasi.instance.exports;
const ptr = writeStringToWasm(event.key);
ExecuteKeyPressHandler(handlerID, ptr, event.keyCode, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
WasmFree(ptr);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-keypress`, handler);
element.addEventListener("keypress", handler);
}
function removeKeyPressListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-keypress`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("keypress", handler);
eventHandlers.delete(`${ptr}-${handlerID}-keypress`);
}
function addChangeListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-10 21:38:38 +01:00
const { ExecuteChangeHandler, WasmFree } = window.crafter_webbuild_wasi.instance.exports;
const ptr = writeStringToWasm(event.target.value);
ExecuteChangeHandler(handlerID, ptr);
WasmFree(ptr);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-change`, handler);
element.addEventListener("change", handler);
}
function removeChangeListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-change`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("change", handler);
eventHandlers.delete(`${ptr}-${handlerID}-change`);
}
function addSubmitListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteSubmitHandler } = window.crafter_webbuild_wasi.instance.exports;
ExecuteSubmitHandler(handlerID);
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-submit`, handler);
element.addEventListener("submit", handler);
}
function removeSubmitListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-submit`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("submit", handler);
eventHandlers.delete(`${ptr}-${handlerID}-submit`);
}
function addInputListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-10 21:38:38 +01:00
const { ExecuteInputHandler, WasmFree } = window.crafter_webbuild_wasi.instance.exports;
const ptr = writeStringToWasm(event.data || event.target.value);
ExecuteInputHandler(handlerID, ptr, event.inputType === 'insertCompositionText');
WasmFree(ptr);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-input`, handler);
element.addEventListener("input", handler);
}
function removeInputListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-input`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("input", handler);
eventHandlers.delete(`${ptr}-${handlerID}-input`);
}
function addResizeListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteResizeHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:02:11 +01:00
ExecuteResizeHandler(handlerID, window.innerWidth, window.innerHeight);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-resize`, handler);
element.addEventListener("resize", handler);
}
function removeResizeListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-resize`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("resize", handler);
eventHandlers.delete(`${ptr}-${handlerID}-resize`);
}
function addScrollListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteScrollHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:02:11 +01:00
ExecuteScrollHandler(handlerID, window.scrollX, window.scrollY);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-scroll`, handler);
element.addEventListener("scroll", handler);
}
function removeScrollListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-scroll`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("scroll", handler);
eventHandlers.delete(`${ptr}-${handlerID}-scroll`);
}
2025-11-10 20:02:11 +01:00
// Context Menu Events
2025-11-09 22:56:29 +01:00
function addContextMenuListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteContextMenuHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteContextMenuHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-contextmenu`, handler);
element.addEventListener("contextmenu", handler);
}
function removeContextMenuListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-contextmenu`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("contextmenu", handler);
eventHandlers.delete(`${ptr}-${handlerID}-contextmenu`);
}
2025-11-10 20:02:11 +01:00
// Drag and Drop Events
2025-11-09 22:56:29 +01:00
function addDragStartListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteDragStartHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteDragStartHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-dragstart`, handler);
element.addEventListener("dragstart", handler);
}
function removeDragStartListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-dragstart`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("dragstart", handler);
eventHandlers.delete(`${ptr}-${handlerID}-dragstart`);
}
function addDragEndListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteDragEndHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteDragEndHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-dragend`, handler);
element.addEventListener("dragend", handler);
}
function removeDragEndListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-dragend`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("dragend", handler);
eventHandlers.delete(`${ptr}-${handlerID}-dragend`);
}
function addDropListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
const handler = function (event) {
2025-11-09 22:56:29 +01:00
const { ExecuteDropHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteDropHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-09 22:56:29 +01:00
};
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
eventHandlers.set(`${ptr}-${handlerID}-drop`, handler);
element.addEventListener("drop", handler);
}
function removeDropListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
const handler = eventHandlers.get(`${ptr}-${handlerID}-drop`);
2025-11-10 20:02:11 +01:00
2025-11-09 22:56:29 +01:00
element.removeEventListener("drop", handler);
eventHandlers.delete(`${ptr}-${handlerID}-drop`);
2025-11-09 22:43:52 +01:00
}
2025-11-10 20:02:11 +01:00
// Additional Drag Events
function addDragOverListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = function (event) {
const { ExecuteDragOverHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteDragOverHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-10 20:02:11 +01:00
};
eventHandlers.set(`${ptr}-${handlerID}-dragover`, handler);
element.addEventListener("dragover", handler);
}
function removeDragOverListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = eventHandlers.get(`${ptr}-${handlerID}-dragover`);
element.removeEventListener("dragover", handler);
eventHandlers.delete(`${ptr}-${handlerID}-dragover`);
}
function addDragEnterListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = function (event) {
const { ExecuteDragEnterHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteDragEnterHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-10 20:02:11 +01:00
};
eventHandlers.set(`${ptr}-${handlerID}-dragenter`, handler);
element.addEventListener("dragenter", handler);
}
function removeDragEnterListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = eventHandlers.get(`${ptr}-${handlerID}-dragenter`);
element.removeEventListener("dragenter", handler);
eventHandlers.delete(`${ptr}-${handlerID}-dragenter`);
}
function addDragLeaveListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = function (event) {
const { ExecuteDragLeaveHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteDragLeaveHandler(handlerID, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-10 20:02:11 +01:00
};
eventHandlers.set(`${ptr}-${handlerID}-dragleave`, handler);
element.addEventListener("dragleave", handler);
}
function removeDragLeaveListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = eventHandlers.get(`${ptr}-${handlerID}-dragleave`);
element.removeEventListener("dragleave", handler);
eventHandlers.delete(`${ptr}-${handlerID}-dragleave`);
}
// Wheel Event
function addWheelListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = function (event) {
const { ExecuteWheelHandler } = window.crafter_webbuild_wasi.instance.exports;
2025-11-10 20:42:35 +01:00
ExecuteWheelHandler(handlerID, event.deltaX, event.deltaY, event.deltaZ, event.deltaMode, event.clientX, event.clientY, event.screenX, event.screenY, event.button, event.buttons, event.altKey, event.ctrlKey, event.shiftKey, event.metaKey);
2025-11-10 20:02:11 +01:00
};
eventHandlers.set(`${ptr}-${handlerID}-wheel`, handler);
element.addEventListener("wheel", handler);
}
function removeWheelListener(ptr, handlerID) {
const element = jsmemory.get(ptr);
const handler = eventHandlers.get(`${ptr}-${handlerID}-wheel`);
element.removeEventListener("wheel", handler);
eventHandlers.delete(`${ptr}-${handlerID}-wheel`);
}
2025-01-02 02:48:44 +01:00
let env = {
2025-11-09 22:43:52 +01:00
freeJs: freeJs,
getElementById: getElementById,
setInnerHTML: setInnerHTML,
2025-11-10 22:06:27 +01:00
setStyle: function(ptr, style, styleLength) {
jsmemory.get(ptr).style.cssText = decoder.decode(new Int8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, style, styleLength));
},
setProperty: function(ptr, property, propertyLength, value, valueLength) {
const prop = decoder.decode(new Int8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, property, propertyLength));
const val = decoder.decode(new Int8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, value, valueLength));
jsmemory.get(ptr).style.setProperty(prop, val);
},
addClass: function(ptr, className, classNameLength) {
const cls = decoder.decode(new Int8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, className, classNameLength));
jsmemory.get(ptr).classList.add(cls);
},
removeClass: function(ptr, className, classNameLength) {
const cls = decoder.decode(new Int8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, className, classNameLength));
jsmemory.get(ptr).classList.remove(cls);
},
toggleClass: function(ptr, className, classNameLength) {
const cls = decoder.decode(new Int8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, className, classNameLength));
jsmemory.get(ptr).classList.toggle(cls);
},
hasClass: function(ptr, className, classNameLength) {
const cls = decoder.decode(new Int8Array(window.crafter_webbuild_wasi.instance.exports.memory.buffer, className, classNameLength));
return jsmemory.get(ptr).classList.contains(cls);
},
2025-11-09 22:43:52 +01:00
addClickListener: addClickListener,
removeClickListener: removeClickListener,
2025-11-09 22:56:29 +01:00
addMouseOverListener: addMouseOverListener,
removeMouseOverListener: removeMouseOverListener,
addMouseOutListener: addMouseOutListener,
removeMouseOutListener: removeMouseOutListener,
addMouseMoveListener: addMouseMoveListener,
removeMouseMoveListener: removeMouseMoveListener,
2025-11-10 20:02:11 +01:00
addMouseDownListener: addMouseDownListener,
removeMouseDownListener: removeMouseDownListener,
addMouseUpListener: addMouseUpListener,
removeMouseUpListener: removeMouseUpListener,
2025-11-09 22:56:29 +01:00
addFocusListener: addFocusListener,
removeFocusListener: removeFocusListener,
addBlurListener: addBlurListener,
removeBlurListener: removeBlurListener,
addKeyDownListener: addKeyDownListener,
removeKeyDownListener: removeKeyDownListener,
addKeyUpListener: addKeyUpListener,
removeKeyUpListener: removeKeyUpListener,
addKeyPressListener: addKeyPressListener,
removeKeyPressListener: removeKeyPressListener,
addChangeListener: addChangeListener,
removeChangeListener: removeChangeListener,
addSubmitListener: addSubmitListener,
removeSubmitListener: removeSubmitListener,
addInputListener: addInputListener,
removeInputListener: removeInputListener,
addResizeListener: addResizeListener,
removeResizeListener: removeResizeListener,
addScrollListener: addScrollListener,
removeScrollListener: removeScrollListener,
addContextMenuListener: addContextMenuListener,
removeContextMenuListener: removeContextMenuListener,
addDragStartListener: addDragStartListener,
removeDragStartListener: removeDragStartListener,
addDragEndListener: addDragEndListener,
removeDragEndListener: removeDragEndListener,
addDropListener: addDropListener,
removeDropListener: removeDropListener,
2025-11-10 20:02:11 +01:00
addWheelListener: addWheelListener,
removeWheelListener: removeWheelListener,
addDragOverListener: addDragOverListener,
removeDragOverListener: removeDragOverListener,
addDragEnterListener: addDragEnterListener,
removeDragEnterListener: removeDragEnterListener,
addDragLeaveListener: addDragLeaveListener,
removeDragLeaveListener: removeDragLeaveListener,
2025-01-02 02:48:44 +01:00
}
2025-11-09 20:11:22 +01:00
window.crafter_webbuild_env = env;