var LibraryHTML5 = {
$JSEvents__deps: [
#if PTHREADS
'_emscripten_run_callback_on_thread',
#endif
'$addOnExit',
],
$JSEvents: {
#if USE_CLOSURE_COMPILER
batteryEvent: 0,
gamepadEvent: 0,
keyEvent: 0,
mouseEvent: 0,
wheelEvent: 0,
uiEvent: 0,
focusEvent: 0,
deviceOrientationEvent: 0,
orientationChangeEvent: 0,
deviceMotionEvent: 0,
fullscreenChangeEvent: 0,
pointerlockChangeEvent: 0,
visibilityChangeEvent: 0,
touchEvent: 0,
#endif
memcpy(target, src, size) {
HEAP8.set(HEAP8.subarray(src, src + size), target);
},
removeAllEventListeners() {
while (JSEvents.eventHandlers.length) {
JSEvents._removeHandler(JSEvents.eventHandlers.length - 1);
}
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
JSEvents.deferredCalls = [];
#endif
},
#if EXIT_RUNTIME
registerRemoveEventListeners() {
if (!JSEvents.removeEventListenersRegistered) {
addOnExit(JSEvents.removeAllEventListeners);
JSEvents.removeEventListenersRegistered = true;
}
},
#endif
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
inEventHandler: 0,
deferredCalls: [],
deferCall(targetFunction, precedence, argsList) {
function arraysHaveEqualContent(arrA, arrB) {
if (arrA.length != arrB.length) return false;
for (var i in arrA) {
if (arrA[i] != arrB[i]) return false;
}
return true;
}
for (var call of JSEvents.deferredCalls) {
if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) {
return;
}
}
JSEvents.deferredCalls.push({
targetFunction,
precedence,
argsList
});
JSEvents.deferredCalls.sort((x,y) => x.precedence < y.precedence);
},
removeDeferredCalls(targetFunction) {
JSEvents.deferredCalls = JSEvents.deferredCalls.filter((call) => call.targetFunction != targetFunction);
},
canPerformEventHandlerRequests() {
if (navigator.userActivation) {
return navigator.userActivation.isActive;
}
return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls;
},
runDeferredCalls() {
if (!JSEvents.canPerformEventHandlerRequests()) {
return;
}
var deferredCalls = JSEvents.deferredCalls;
JSEvents.deferredCalls = [];
for (var call of deferredCalls) {
call.targetFunction(...call.argsList);
}
},
#endif
eventHandlers: [],
removeAllHandlersOnTarget: (target, eventTypeString) => {
for (var i = 0; i < JSEvents.eventHandlers.length; ++i) {
if (JSEvents.eventHandlers[i].target == target &&
(!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) {
JSEvents._removeHandler(i--);
}
}
},
_removeHandler(i) {
var h = JSEvents.eventHandlers[i];
h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture);
JSEvents.eventHandlers.splice(i, 1);
},
registerOrRemoveHandler(eventHandler) {
if (!eventHandler.target) {
#if ASSERTIONS
err('registerOrRemoveHandler: the target element for event handler registration does not exist, when processing the following event handler registration:');
console.dir(eventHandler);
#endif
return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
}
if (eventHandler.callbackfunc) {
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
eventHandler.eventListenerFunc = function(event) {
++JSEvents.inEventHandler;
JSEvents.currentEventHandler = eventHandler;
JSEvents.runDeferredCalls();
eventHandler.handlerFunc(event);
JSEvents.runDeferredCalls();
--JSEvents.inEventHandler;
};
#else
eventHandler.eventListenerFunc = eventHandler.handlerFunc;
#endif
eventHandler.target.addEventListener(eventHandler.eventTypeString,
eventHandler.eventListenerFunc,
eventHandler.useCapture);
JSEvents.eventHandlers.push(eventHandler);
#if EXIT_RUNTIME
JSEvents.registerRemoveEventListeners();
#endif
} else {
for (var i = 0; i < JSEvents.eventHandlers.length; ++i) {
if (JSEvents.eventHandlers[i].target == eventHandler.target
&& JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) {
JSEvents._removeHandler(i--);
}
}
}
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
#if PTHREADS
getTargetThreadForEventCallback(targetThread) {
switch (targetThread) {
case {{{ cDefs.EM_CALLBACK_THREAD_CONTEXT_MAIN_RUNTIME_THREAD }}}:
return 0;
case {{{ cDefs.EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD }}}:
return PThread.currentProxiedOperationCallerThread;
default:
return targetThread;
}
},
#endif
getNodeNameForTarget(target) {
if (!target) return '';
if (target == window) return '#window';
if (target == screen) return '#screen';
return target?.nodeName || '';
},
fullscreenEnabled() {
return document.fullscreenEnabled
#if MIN_FIREFOX_VERSION <= 63
|| document.mozFullScreenEnabled
#endif
#if MIN_SAFARI_VERSION != TARGET_NOT_SUPPORTED
|| document.webkitFullscreenEnabled
#endif
;
},
},
$getFullscreenElement__internal: true,
$getFullscreenElement() {
return document.fullscreenElement || document.mozFullScreenElement ||
document.webkitFullscreenElement || document.webkitCurrentFullScreenElement ||
document.msFullscreenElement;
},
$registerKeyEventCallback__noleakcheck: true,
$registerKeyEventCallback__deps: ['$JSEvents', '$findEventTarget', '$stringToUTF8', 'malloc'],
$registerKeyEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.keyEvent ||= _malloc({{{ C_STRUCTS.EmscriptenKeyboardEvent.__size__ }}});
var keyEventHandlerFunc = (e) => {
#if ASSERTIONS
assert(e);
#endif
#if PTHREADS
var keyEventData = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenKeyboardEvent.__size__ }}}) : JSEvents.keyEvent;
#else
var keyEventData = JSEvents.keyEvent;
#endif
{{{ makeSetValue('keyEventData', C_STRUCTS.EmscriptenKeyboardEvent.timestamp, 'e.timeStamp', 'double') }}};
var idx = {{{ getHeapOffset('keyEventData', 'i32') }}};
HEAP32[idx + {{{ C_STRUCTS.EmscriptenKeyboardEvent.location / 4 }}}] = e.location;
HEAP8[keyEventData + {{{ C_STRUCTS.EmscriptenKeyboardEvent.ctrlKey }}}] = e.ctrlKey;
HEAP8[keyEventData + {{{ C_STRUCTS.EmscriptenKeyboardEvent.shiftKey }}}] = e.shiftKey;
HEAP8[keyEventData + {{{ C_STRUCTS.EmscriptenKeyboardEvent.altKey }}}] = e.altKey;
HEAP8[keyEventData + {{{ C_STRUCTS.EmscriptenKeyboardEvent.metaKey }}}] = e.metaKey;
HEAP8[keyEventData + {{{ C_STRUCTS.EmscriptenKeyboardEvent.repeat }}}] = e.repeat;
HEAP32[idx + {{{ C_STRUCTS.EmscriptenKeyboardEvent.charCode / 4 }}}] = e.charCode;
HEAP32[idx + {{{ C_STRUCTS.EmscriptenKeyboardEvent.keyCode / 4 }}}] = e.keyCode;
HEAP32[idx + {{{ C_STRUCTS.EmscriptenKeyboardEvent.which / 4 }}}] = e.which;
stringToUTF8(e.key || '', keyEventData + {{{ C_STRUCTS.EmscriptenKeyboardEvent.key }}}, {{{ cDefs.EM_HTML5_SHORT_STRING_LEN_BYTES }}});
stringToUTF8(e.code || '', keyEventData + {{{ C_STRUCTS.EmscriptenKeyboardEvent.code }}}, {{{ cDefs.EM_HTML5_SHORT_STRING_LEN_BYTES }}});
stringToUTF8(e.char || '', keyEventData + {{{ C_STRUCTS.EmscriptenKeyboardEvent.charValue }}}, {{{ cDefs.EM_HTML5_SHORT_STRING_LEN_BYTES }}});
stringToUTF8(e.locale || '', keyEventData + {{{ C_STRUCTS.EmscriptenKeyboardEvent.locale }}}, {{{ cDefs.EM_HTML5_SHORT_STRING_LEN_BYTES }}});
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, keyEventData, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, keyEventData, userData)) e.preventDefault();
};
var eventHandler = {
target: findEventTarget(target),
eventTypeString,
callbackfunc,
handlerFunc: keyEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
$specialHTMLTargets__docs: '/** @type {Object} */',
#if ENVIRONMENT_MAY_BE_WORKER || ENVIRONMENT_MAY_BE_NODE || ENVIRONMENT_MAY_BE_SHELL || PTHREADS
$specialHTMLTargets: "[0, typeof document != 'undefined' ? document : 0, typeof window != 'undefined' ? window : 0]",
#else
$specialHTMLTargets: "[0, document, window]",
#endif
#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
$maybeCStringToJsString: (cString) => {
return cString > 2 ? UTF8ToString(cString) : cString;
},
$findEventTarget__deps: ['$maybeCStringToJsString', '$specialHTMLTargets'],
$findEventTarget: (target) => {
target = maybeCStringToJsString(target);
#if ENVIRONMENT_MAY_BE_WORKER || ENVIRONMENT_MAY_BE_NODE
var domElement = specialHTMLTargets[target] || (typeof document != 'undefined' ? document.querySelector(target) : null);
#else
var domElement = specialHTMLTargets[target] || document.querySelector(target);
#endif
return domElement;
},
#if OFFSCREENCANVAS_SUPPORT
$findCanvasEventTarget__deps: ['$GL', '$maybeCStringToJsString'],
$findCanvasEventTarget: (target) => {
target = maybeCStringToJsString(target);
return GL.offscreenCanvases[target.slice(1)]
|| (target == 'canvas' && Object.keys(GL.offscreenCanvases)[0])
#if PTHREADS
|| (typeof document != 'undefined' && document.querySelector(target));
#else
|| document.querySelector(target);
#endif
},
#else
$findCanvasEventTarget: '$findEventTarget',
#endif
#else
$findEventTarget__deps: ['$specialHTMLTargets'],
$findEventTarget: (target) => {
#if ASSERTIONS
warnOnce('Rules for selecting event targets in HTML5 API are changing: instead of using document.getElementById() that only can refer to elements by their DOM ID, new event target selection mechanism uses the more flexible function document.querySelector() that can look up element names, classes, and complex CSS selectors. Build with -sDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR to change to the new lookup rules. See https://github.com/emscripten-core/emscripten/pull/7977 for more details.');
#endif
if (!target) return window;
if (typeof target == "number") target = specialHTMLTargets[target] || UTF8ToString(target);
if (target === '#window') return window;
else if (target === '#document') return document;
else if (target === '#screen') return screen;
else if (target === '#canvas') return Module['canvas'];
else if (typeof target == 'string')
#if ENVIRONMENT_MAY_BE_WORKER || ENVIRONMENT_MAY_BE_NODE
return (typeof document != 'undefined') ? document.getElementById(target) : null;
#else
return document.getElementById(target);
#endif
return target;
},
$findCanvasEventTarget__deps: ['$findEventTarget'],
$findCanvasEventTarget: (target) => {
if (typeof target == 'number') target = UTF8ToString(target);
if (!target || target === '#canvas') {
if (typeof GL != 'undefined' && GL.offscreenCanvases['canvas']) return GL.offscreenCanvases['canvas'];
return Module['canvas'];
}
if (typeof GL != 'undefined' && GL.offscreenCanvases[target]) return GL.offscreenCanvases[target];
return findEventTarget(target);
},
#endif
emscripten_set_keypress_callback_on_thread__proxy: 'sync',
emscripten_set_keypress_callback_on_thread__deps: ['$registerKeyEventCallback'],
emscripten_set_keypress_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerKeyEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_KEYPRESS }}}, "keypress", targetThread),
emscripten_set_keydown_callback_on_thread__proxy: 'sync',
emscripten_set_keydown_callback_on_thread__deps: ['$registerKeyEventCallback'],
emscripten_set_keydown_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerKeyEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_KEYDOWN }}}, "keydown", targetThread),
emscripten_set_keyup_callback_on_thread__proxy: 'sync',
emscripten_set_keyup_callback_on_thread__deps: ['$registerKeyEventCallback'],
emscripten_set_keyup_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerKeyEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_KEYUP }}}, "keyup", targetThread),
$getBoundingClientRect__deps: ['$specialHTMLTargets'],
$getBoundingClientRect: (e) => specialHTMLTargets.indexOf(e) < 0 ? e.getBoundingClientRect() : {'left':0,'top':0},
$fillMouseEventData__deps: ['$getBoundingClientRect'],
$fillMouseEventData: (eventStruct, e, target) => {
#if ASSERTIONS
assert(eventStruct % 4 == 0);
#endif
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenMouseEvent.timestamp, 'e.timeStamp', 'double') }}};
var idx = {{{ getHeapOffset('eventStruct', 'i32') }}};
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.screenX / 4 }}}] = e.screenX;
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.screenY / 4 }}}] = e.screenY;
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.clientX / 4 }}}] = e.clientX;
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.clientY / 4 }}}] = e.clientY;
HEAP8[eventStruct + {{{ C_STRUCTS.EmscriptenMouseEvent.ctrlKey }}}] = e.ctrlKey;
HEAP8[eventStruct + {{{ C_STRUCTS.EmscriptenMouseEvent.shiftKey }}}] = e.shiftKey;
HEAP8[eventStruct + {{{ C_STRUCTS.EmscriptenMouseEvent.altKey }}}] = e.altKey;
HEAP8[eventStruct + {{{ C_STRUCTS.EmscriptenMouseEvent.metaKey }}}] = e.metaKey;
HEAP16[idx*2 + {{{ C_STRUCTS.EmscriptenMouseEvent.button / 2 }}}] = e.button;
HEAP16[idx*2 + {{{ C_STRUCTS.EmscriptenMouseEvent.buttons / 2 }}}] = e.buttons;
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.movementX / 4 }}}] = e["movementX"];
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.movementY / 4 }}}] = e["movementY"];
#if !DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
if (Module['canvas']) {
var rect = getBoundingClientRect(Module['canvas']);
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.canvasX / 4 }}}] = e.clientX - (rect.left | 0);
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.canvasY / 4 }}}] = e.clientY - (rect.top | 0);
} else {
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.canvasX / 4 }}}] = 0;
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.canvasY / 4 }}}] = 0;
}
#endif
var rect = getBoundingClientRect(target);
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.targetX / 4 }}}] = e.clientX - (rect.left | 0);
HEAP32[idx + {{{ C_STRUCTS.EmscriptenMouseEvent.targetY / 4 }}}] = e.clientY - (rect.top | 0);
},
$registerMouseEventCallback__noleakcheck: true,
$registerMouseEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget', 'malloc'],
$registerMouseEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.mouseEvent ||= _malloc({{{ C_STRUCTS.EmscriptenMouseEvent.__size__ }}});
target = findEventTarget(target);
var mouseEventHandlerFunc = (e = event) => {
fillMouseEventData(JSEvents.mouseEvent, e, target);
#if PTHREADS
if (targetThread) {
var mouseEventData = _malloc({{{ C_STRUCTS.EmscriptenMouseEvent.__size__ }}});
fillMouseEventData(mouseEventData, e, target);
__emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, mouseEventData, userData);
} else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, JSEvents.mouseEvent, userData)) e.preventDefault();
};
var eventHandler = {
target,
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
allowsDeferredCalls: eventTypeString != 'mousemove' && eventTypeString != 'mouseenter' && eventTypeString != 'mouseleave',
#endif
eventTypeString,
callbackfunc,
handlerFunc: mouseEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_click_callback_on_thread__proxy: 'sync',
emscripten_set_click_callback_on_thread__deps: ['$registerMouseEventCallback'],
emscripten_set_click_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_CLICK }}}, "click", targetThread),
emscripten_set_mousedown_callback_on_thread__proxy: 'sync',
emscripten_set_mousedown_callback_on_thread__deps: ['$registerMouseEventCallback'],
emscripten_set_mousedown_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_MOUSEDOWN }}}, "mousedown", targetThread),
emscripten_set_mouseup_callback_on_thread__proxy: 'sync',
emscripten_set_mouseup_callback_on_thread__deps: ['$registerMouseEventCallback'],
emscripten_set_mouseup_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_MOUSEUP }}}, "mouseup", targetThread),
emscripten_set_dblclick_callback_on_thread__proxy: 'sync',
emscripten_set_dblclick_callback_on_thread__deps: ['$registerMouseEventCallback'],
emscripten_set_dblclick_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_DBLCLICK }}}, "dblclick", targetThread),
emscripten_set_mousemove_callback_on_thread__proxy: 'sync',
emscripten_set_mousemove_callback_on_thread__deps: ['$registerMouseEventCallback'],
emscripten_set_mousemove_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_MOUSEMOVE }}}, "mousemove", targetThread),
emscripten_set_mouseenter_callback_on_thread__proxy: 'sync',
emscripten_set_mouseenter_callback_on_thread__deps: ['$registerMouseEventCallback'],
emscripten_set_mouseenter_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_MOUSEENTER }}}, "mouseenter", targetThread),
emscripten_set_mouseleave_callback_on_thread__proxy: 'sync',
emscripten_set_mouseleave_callback_on_thread__deps: ['$registerMouseEventCallback'],
emscripten_set_mouseleave_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_MOUSELEAVE }}}, "mouseleave", targetThread),
emscripten_set_mouseover_callback_on_thread__proxy: 'sync',
emscripten_set_mouseover_callback_on_thread__deps: ['$registerMouseEventCallback'],
emscripten_set_mouseover_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_MOUSEOVER }}}, "mouseover", targetThread),
emscripten_set_mouseout_callback_on_thread__proxy: 'sync',
emscripten_set_mouseout_callback_on_thread__deps: ['$registerMouseEventCallback'],
emscripten_set_mouseout_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerMouseEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_MOUSEOUT }}}, "mouseout", targetThread),
emscripten_get_mouse_status__proxy: 'sync',
emscripten_get_mouse_status__deps: ['$JSEvents'],
emscripten_get_mouse_status: (mouseState) => {
if (!JSEvents.mouseEvent) return {{{ cDefs.EMSCRIPTEN_RESULT_NO_DATA }}};
JSEvents.memcpy(mouseState, JSEvents.mouseEvent, {{{ C_STRUCTS.EmscriptenMouseEvent.__size__ }}});
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$registerWheelEventCallback__noleakcheck: true,
$registerWheelEventCallback__deps: ['$JSEvents', '$fillMouseEventData', 'malloc'],
$registerWheelEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.wheelEvent ||= _malloc({{{ C_STRUCTS.EmscriptenWheelEvent.__size__ }}});
var wheelHandlerFunc = (e = event) => {
#if PTHREADS
var wheelEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenWheelEvent.__size__ }}}) : JSEvents.wheelEvent;
#else
var wheelEvent = JSEvents.wheelEvent;
#endif
fillMouseEventData(wheelEvent, e, target);
{{{ makeSetValue('wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaX, 'e["deltaX"]', 'double') }}};
{{{ makeSetValue('wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaY, 'e["deltaY"]', 'double') }}};
{{{ makeSetValue('wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaZ, 'e["deltaZ"]', 'double') }}};
{{{ makeSetValue('wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaMode, 'e["deltaMode"]', 'i32') }}};
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, wheelEvent, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, wheelEvent, userData)) e.preventDefault();
};
var eventHandler = {
target,
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
allowsDeferredCalls: true,
#endif
eventTypeString,
callbackfunc,
handlerFunc: wheelHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_wheel_callback_on_thread__proxy: 'sync',
emscripten_set_wheel_callback_on_thread__deps: ['$registerWheelEventCallback', '$findEventTarget'],
emscripten_set_wheel_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) => {
target = findEventTarget(target);
if (!target) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
if (typeof target.onwheel != 'undefined') {
return registerWheelEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_WHEEL }}}, "wheel", targetThread);
} else {
return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
}
},
$registerUiEventCallback__noleakcheck: true,
$registerUiEventCallback__deps: ['$JSEvents', '$findEventTarget', 'malloc'],
$registerUiEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.uiEvent ||= _malloc({{{ C_STRUCTS.EmscriptenUiEvent.__size__ }}});
#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
target = findEventTarget(target);
#else
if (eventTypeId == {{{ cDefs.EMSCRIPTEN_EVENT_SCROLL }}} && !target) {
target = document;
} else {
target = findEventTarget(target);
}
#else
#endif
var uiEventHandlerFunc = (e = event) => {
if (e.target != target) {
return;
}
var b = document.body;
if (!b) {
return;
}
#if PTHREADS
var uiEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenUiEvent.__size__ }}}) : JSEvents.uiEvent;
#else
var uiEvent = JSEvents.uiEvent;
#endif
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.detail, '0', 'i32') }}};
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.documentBodyClientWidth, 'b.clientWidth', 'i32') }}};
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.documentBodyClientHeight, 'b.clientHeight', 'i32') }}};
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.windowInnerWidth, 'innerWidth', 'i32') }}};
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.windowInnerHeight, 'innerHeight', 'i32') }}};
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.windowOuterWidth, 'outerWidth', 'i32') }}};
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.windowOuterHeight, 'outerHeight', 'i32') }}};
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.scrollTop, 'pageXOffset | 0', 'i32') }}};
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.scrollLeft, 'pageYOffset | 0', 'i32') }}};
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, uiEvent, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, uiEvent, userData)) e.preventDefault();
};
var eventHandler = {
target,
eventTypeString,
callbackfunc,
handlerFunc: uiEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_resize_callback_on_thread__proxy: 'sync',
emscripten_set_resize_callback_on_thread__deps: ['$registerUiEventCallback'],
emscripten_set_resize_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerUiEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_RESIZE }}}, "resize", targetThread),
emscripten_set_scroll_callback_on_thread__proxy: 'sync',
emscripten_set_scroll_callback_on_thread__deps: ['$registerUiEventCallback'],
emscripten_set_scroll_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerUiEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_SCROLL }}}, "scroll", targetThread),
$registerFocusEventCallback__noleakcheck: true,
$registerFocusEventCallback__deps: ['$JSEvents', '$findEventTarget', 'malloc', '$stringToUTF8'],
$registerFocusEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.focusEvent ||= _malloc({{{ C_STRUCTS.EmscriptenFocusEvent.__size__ }}});
var focusEventHandlerFunc = (e = event) => {
var nodeName = JSEvents.getNodeNameForTarget(e.target);
var id = e.target.id ? e.target.id : '';
#if PTHREADS
var focusEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenFocusEvent.__size__ }}}) : JSEvents.focusEvent;
#else
var focusEvent = JSEvents.focusEvent;
#endif
stringToUTF8(nodeName, focusEvent + {{{ C_STRUCTS.EmscriptenFocusEvent.nodeName }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}});
stringToUTF8(id, focusEvent + {{{ C_STRUCTS.EmscriptenFocusEvent.id }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}});
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, focusEvent, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, focusEvent, userData)) e.preventDefault();
};
var eventHandler = {
target: findEventTarget(target),
eventTypeString,
callbackfunc,
handlerFunc: focusEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_blur_callback_on_thread__proxy: 'sync',
emscripten_set_blur_callback_on_thread__deps: ['$registerFocusEventCallback'],
emscripten_set_blur_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerFocusEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BLUR }}}, "blur", targetThread),
emscripten_set_focus_callback_on_thread__proxy: 'sync',
emscripten_set_focus_callback_on_thread__deps: ['$registerFocusEventCallback'],
emscripten_set_focus_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerFocusEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_FOCUS }}}, "focus", targetThread),
emscripten_set_focusin_callback_on_thread__proxy: 'sync',
emscripten_set_focusin_callback_on_thread__deps: ['$registerFocusEventCallback'],
emscripten_set_focusin_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerFocusEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_FOCUSIN }}}, "focusin", targetThread),
emscripten_set_focusout_callback_on_thread__proxy: 'sync',
emscripten_set_focusout_callback_on_thread__deps: ['$registerFocusEventCallback'],
emscripten_set_focusout_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerFocusEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_FOCUSOUT }}}, "focusout", targetThread),
$fillDeviceOrientationEventData: (eventStruct, e, target) => {
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceOrientationEvent.alpha, 'e.alpha', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceOrientationEvent.beta, 'e.beta', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceOrientationEvent.gamma, 'e.gamma', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceOrientationEvent.absolute, 'e.absolute', 'i8') }}};
},
$registerDeviceOrientationEventCallback__noleakcheck: true,
$registerDeviceOrientationEventCallback__deps: ['$JSEvents', '$fillDeviceOrientationEventData', '$findEventTarget'],
$registerDeviceOrientationEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.deviceOrientationEvent ||= _malloc({{{ C_STRUCTS.EmscriptenDeviceOrientationEvent.__size__ }}});
var deviceOrientationEventHandlerFunc = (e = event) => {
fillDeviceOrientationEventData(JSEvents.deviceOrientationEvent, e, target);
#if PTHREADS
if (targetThread) {
var deviceOrientationEvent = _malloc({{{ C_STRUCTS.EmscriptenDeviceOrientationEvent.__size__ }}});
fillDeviceOrientationEventData(deviceOrientationEvent, e, target);
__emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, deviceOrientationEvent, userData);
} else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, JSEvents.deviceOrientationEvent, userData)) e.preventDefault();
};
var eventHandler = {
target: findEventTarget(target),
eventTypeString,
callbackfunc,
handlerFunc: deviceOrientationEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_deviceorientation_callback_on_thread__proxy: 'sync',
emscripten_set_deviceorientation_callback_on_thread__deps: ['$registerDeviceOrientationEventCallback'],
emscripten_set_deviceorientation_callback_on_thread: (userData, useCapture, callbackfunc, targetThread) => {
return registerDeviceOrientationEventCallback({{{ cDefs.EMSCRIPTEN_EVENT_TARGET_WINDOW }}}, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_DEVICEORIENTATION }}}, "deviceorientation", targetThread);
},
emscripten_get_deviceorientation_status__proxy: 'sync',
emscripten_get_deviceorientation_status__deps: ['$JSEvents'],
emscripten_get_deviceorientation_status: (orientationState) => {
if (!JSEvents.deviceOrientationEvent) return {{{ cDefs.EMSCRIPTEN_RESULT_NO_DATA }}};
JSEvents.memcpy(orientationState, JSEvents.deviceOrientationEvent, {{{ C_STRUCTS.EmscriptenDeviceOrientationEvent.__size__ }}});
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$fillDeviceMotionEventData: (eventStruct, e, target) => {
var supportedFields = 0;
var a = e['acceleration'];
supportedFields |= a && {{{ cDefs.EMSCRIPTEN_DEVICE_MOTION_EVENT_SUPPORTS_ACCELERATION }}};
var ag = e['accelerationIncludingGravity'];
supportedFields |= ag && {{{ cDefs.EMSCRIPTEN_DEVICE_MOTION_EVENT_SUPPORTS_ACCELERATION_INCLUDING_GRAVITY }}};
var rr = e['rotationRate'];
supportedFields |= rr && {{{ cDefs.EMSCRIPTEN_DEVICE_MOTION_EVENT_SUPPORTS_ROTATION_RATE }}};
a = a || {};
ag = ag || {};
rr = rr || {};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.accelerationX, 'a["x"]', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.accelerationY, 'a["y"]', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.accelerationZ, 'a["z"]', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.accelerationIncludingGravityX, 'ag["x"]', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.accelerationIncludingGravityY, 'ag["y"]', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.accelerationIncludingGravityZ, 'ag["z"]', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.rotationRateAlpha, 'rr["alpha"]', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.rotationRateBeta, 'rr["beta"]', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.rotationRateGamma, 'rr["gamma"]', 'double') }}};
},
$registerDeviceMotionEventCallback__noleakcheck: true,
$registerDeviceMotionEventCallback__deps: ['$JSEvents', '$fillDeviceMotionEventData', '$findEventTarget', 'malloc'],
$registerDeviceMotionEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.deviceMotionEvent ||= _malloc({{{ C_STRUCTS.EmscriptenDeviceMotionEvent.__size__ }}});
var deviceMotionEventHandlerFunc = (e = event) => {
fillDeviceMotionEventData(JSEvents.deviceMotionEvent, e, target);
#if PTHREADS
if (targetThread) {
var deviceMotionEvent = _malloc({{{ C_STRUCTS.EmscriptenDeviceMotionEvent.__size__ }}});
fillDeviceMotionEventData(deviceMotionEvent, e, target);
__emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, deviceMotionEvent, userData);
} else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, JSEvents.deviceMotionEvent, userData)) e.preventDefault();
};
var eventHandler = {
target: findEventTarget(target),
eventTypeString,
callbackfunc,
handlerFunc: deviceMotionEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_devicemotion_callback_on_thread__proxy: 'sync',
emscripten_set_devicemotion_callback_on_thread__deps: ['$registerDeviceMotionEventCallback'],
emscripten_set_devicemotion_callback_on_thread: (userData, useCapture, callbackfunc, targetThread) =>
registerDeviceMotionEventCallback({{{ cDefs.EMSCRIPTEN_EVENT_TARGET_WINDOW }}}, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_DEVICEMOTION }}}, "devicemotion", targetThread),
emscripten_get_devicemotion_status__proxy: 'sync',
emscripten_get_devicemotion_status__deps: ['$JSEvents'],
emscripten_get_devicemotion_status: (motionState) => {
if (!JSEvents.deviceMotionEvent) return {{{ cDefs.EMSCRIPTEN_RESULT_NO_DATA }}};
JSEvents.memcpy(motionState, JSEvents.deviceMotionEvent, {{{ C_STRUCTS.EmscriptenDeviceMotionEvent.__size__ }}});
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$screenOrientation: () => {
if (!window.screen) return undefined;
return screen.orientation || screen['mozOrientation'] || screen['webkitOrientation'];
},
$fillOrientationChangeEventData__deps: ['$screenOrientation'],
$fillOrientationChangeEventData: (eventStruct) => {
var orientationsType1 = ['portrait-primary', 'portrait-secondary', 'landscape-primary', 'landscape-secondary'];
var orientationsType2 = ['portrait', 'portrait', 'landscape', 'landscape'];
var orientationIndex = {{{ cDefs.EMSCRIPTEN_ORIENTATION_UNSUPPORTED }}};
var orientationAngle = 0;
var screenOrientObj = screenOrientation();
if (typeof screenOrientObj === 'object') {
orientationIndex = orientationsType1.indexOf(screenOrientObj.type);
if (orientationIndex < 0) {
orientationIndex = orientationsType2.indexOf(screenOrientObj.type);
}
if (orientationIndex >= 0) {
orientationIndex = 1 << orientationIndex;
}
orientationAngle = screenOrientObj.angle;
}
#if MIN_SAFARI_VERSION < 160400
else {
orientationAngle = window.orientation;
}
#endif
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenOrientationChangeEvent.orientationIndex, 'orientationIndex', 'i32') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenOrientationChangeEvent.orientationAngle, 'orientationAngle', 'i32') }}};
},
$registerOrientationChangeEventCallback__noleakcheck: true,
$registerOrientationChangeEventCallback__deps: ['$JSEvents', '$fillOrientationChangeEventData', 'malloc'],
$registerOrientationChangeEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.orientationChangeEvent ||= _malloc({{{ C_STRUCTS.EmscriptenOrientationChangeEvent.__size__ }}});
var orientationChangeEventHandlerFunc = (e = event) => {
#if PTHREADS
var orientationChangeEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenOrientationChangeEvent.__size__ }}}) : JSEvents.orientationChangeEvent;
#else
var orientationChangeEvent = JSEvents.orientationChangeEvent;
#endif
fillOrientationChangeEventData(orientationChangeEvent);
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, orientationChangeEvent, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, orientationChangeEvent, userData)) e.preventDefault();
};
var eventHandler = {
target,
eventTypeString,
callbackfunc,
handlerFunc: orientationChangeEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_orientationchange_callback_on_thread__proxy: 'sync',
emscripten_set_orientationchange_callback_on_thread__deps: ['$registerOrientationChangeEventCallback'],
emscripten_set_orientationchange_callback_on_thread: (userData, useCapture, callbackfunc, targetThread) => {
if (!window.screen || !screen.orientation) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
return registerOrientationChangeEventCallback(screen.orientation, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_ORIENTATIONCHANGE }}}, 'change', targetThread);
},
emscripten_get_orientation_status__proxy: 'sync',
emscripten_get_orientation_status__deps: ['$fillOrientationChangeEventData', '$screenOrientation'],
emscripten_get_orientation_status: (orientationChangeEvent) => {
if (!screenOrientation() && typeof orientation == 'undefined') return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
fillOrientationChangeEventData(orientationChangeEvent);
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
emscripten_lock_orientation__proxy: 'sync',
emscripten_lock_orientation: (allowedOrientations) => {
var orientations = [];
if (allowedOrientations & 1) orientations.push("portrait-primary");
if (allowedOrientations & 2) orientations.push("portrait-secondary");
if (allowedOrientations & 4) orientations.push("landscape-primary");
if (allowedOrientations & 8) orientations.push("landscape-secondary");
var succeeded;
if (screen.lockOrientation) {
succeeded = screen.lockOrientation(orientations);
} else if (screen.mozLockOrientation) {
succeeded = screen.mozLockOrientation(orientations);
} else if (screen.webkitLockOrientation) {
succeeded = screen.webkitLockOrientation(orientations);
} else {
return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
}
if (succeeded) {
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
}
return {{{ cDefs.EMSCRIPTEN_RESULT_FAILED }}};
},
emscripten_unlock_orientation__proxy: 'sync',
emscripten_unlock_orientation: () => {
if (screen.unlockOrientation) {
screen.unlockOrientation();
} else if (screen.mozUnlockOrientation) {
screen.mozUnlockOrientation();
} else if (screen.webkitUnlockOrientation) {
screen.webkitUnlockOrientation();
} else {
return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
}
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$fillFullscreenChangeEventData__deps: ['$JSEvents', '$stringToUTF8', '$getFullscreenElement'],
$fillFullscreenChangeEventData: (eventStruct) => {
var fullscreenElement = getFullscreenElement();
var isFullscreen = !!fullscreenElement;
#if !SAFE_HEAP
#endif
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenFullscreenChangeEvent.isFullscreen, 'isFullscreen', 'i8') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenFullscreenChangeEvent.fullscreenEnabled, 'JSEvents.fullscreenEnabled()', 'i8') }}};
var reportedElement = isFullscreen ? fullscreenElement : JSEvents.previousFullscreenElement;
var nodeName = JSEvents.getNodeNameForTarget(reportedElement);
var id = reportedElement?.id || '';
stringToUTF8(nodeName, eventStruct + {{{ C_STRUCTS.EmscriptenFullscreenChangeEvent.nodeName }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}});
stringToUTF8(id, eventStruct + {{{ C_STRUCTS.EmscriptenFullscreenChangeEvent.id }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}});
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenFullscreenChangeEvent.elementWidth, 'reportedElement ? reportedElement.clientWidth : 0', 'i32') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenFullscreenChangeEvent.elementHeight, 'reportedElement ? reportedElement.clientHeight : 0', 'i32') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenFullscreenChangeEvent.screenWidth, 'screen.width', 'i32') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenFullscreenChangeEvent.screenHeight, 'screen.height', 'i32') }}};
if (isFullscreen) {
JSEvents.previousFullscreenElement = fullscreenElement;
}
},
$registerFullscreenChangeEventCallback__noleakcheck: true,
$registerFullscreenChangeEventCallback__deps: ['$JSEvents', '$fillFullscreenChangeEventData', 'malloc'],
$registerFullscreenChangeEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.fullscreenChangeEvent ||= _malloc({{{ C_STRUCTS.EmscriptenFullscreenChangeEvent.__size__ }}});
var fullscreenChangeEventhandlerFunc = (e = event) => {
#if PTHREADS
var fullscreenChangeEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenFullscreenChangeEvent.__size__ }}}) : JSEvents.fullscreenChangeEvent;
#else
var fullscreenChangeEvent = JSEvents.fullscreenChangeEvent;
#endif
fillFullscreenChangeEventData(fullscreenChangeEvent);
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, fullscreenChangeEvent, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, fullscreenChangeEvent, userData)) e.preventDefault();
};
var eventHandler = {
target,
eventTypeString,
callbackfunc,
handlerFunc: fullscreenChangeEventhandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_fullscreenchange_callback_on_thread__proxy: 'sync',
emscripten_set_fullscreenchange_callback_on_thread__deps: ['$JSEvents', '$registerFullscreenChangeEventCallback', '$findEventTarget',
#if !DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
'$specialHTMLTargets'
#endif
],
emscripten_set_fullscreenchange_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) => {
if (!JSEvents.fullscreenEnabled()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
target = findEventTarget(target);
#else
target = target ? findEventTarget(target) : specialHTMLTargets[{{{ cDefs.EMSCRIPTEN_EVENT_TARGET_DOCUMENT }}}];
#endif
if (!target) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
#if MIN_FIREFOX_VERSION <= 63
registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_FULLSCREENCHANGE }}}, "mozfullscreenchange", targetThread);
#endif
#if MIN_CHROME_VERSION < 71 || MIN_SAFARI_VERSION != TARGET_NOT_SUPPORTED
registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_FULLSCREENCHANGE }}}, "webkitfullscreenchange", targetThread);
#endif
return registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_FULLSCREENCHANGE }}}, "fullscreenchange", targetThread);
},
emscripten_get_fullscreen_status__proxy: 'sync',
emscripten_get_fullscreen_status__deps: ['$JSEvents', '$fillFullscreenChangeEventData'],
emscripten_get_fullscreen_status: (fullscreenStatus) => {
if (!JSEvents.fullscreenEnabled()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
fillFullscreenChangeEventData(fullscreenStatus);
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$JSEvents_requestFullscreen__deps: ['$JSEvents', '$JSEvents_resizeCanvasForFullscreen'],
$JSEvents_requestFullscreen: (target, strategy) => {
if (strategy.scaleMode != {{{ cDefs.EMSCRIPTEN_FULLSCREEN_SCALE_DEFAULT }}} || strategy.canvasResolutionScaleMode != {{{ cDefs.EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE }}}) {
JSEvents_resizeCanvasForFullscreen(target, strategy);
}
if (target.requestFullscreen) {
target.requestFullscreen();
#if MIN_FIREFOX_VERSION <= 63
} else if (target.mozRequestFullScreen) {
target.mozRequestFullScreen();
} else if (target.mozRequestFullscreen) {
target.mozRequestFullscreen();
#endif
#if MIN_CHROME_VERSION <= 70 || MIN_SAFARI_VERSION != TARGET_NOT_SUPPORTED
} else if (target.webkitRequestFullscreen) {
target.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
#endif
} else {
return JSEvents.fullscreenEnabled() ? {{{ cDefs.EMSCRIPTEN_RESULT_INVALID_TARGET }}} : {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
}
currentFullscreenStrategy = strategy;
if (strategy.canvasResizedCallback) {
#if PTHREADS
if (strategy.canvasResizedCallbackTargetThread) __emscripten_run_callback_on_thread(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData);
else
#endif
{{{ makeDynCall('iipp', 'strategy.canvasResizedCallback') }}}({{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData);
}
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$JSEvents_resizeCanvasForFullscreen__deps: ['$registerRestoreOldStyle', '$getCanvasElementSize', '$setLetterbox', '$setCanvasElementSize', '$getBoundingClientRect'],
$JSEvents_resizeCanvasForFullscreen: (target, strategy) => {
var restoreOldStyle = registerRestoreOldStyle(target);
var cssWidth = strategy.softFullscreen ? innerWidth : screen.width;
var cssHeight = strategy.softFullscreen ? innerHeight : screen.height;
var rect = getBoundingClientRect(target);
var windowedCssWidth = rect.width;
var windowedCssHeight = rect.height;
var canvasSize = getCanvasElementSize(target);
var windowedRttWidth = canvasSize[0];
var windowedRttHeight = canvasSize[1];
if (strategy.scaleMode == {{{ cDefs.EMSCRIPTEN_FULLSCREEN_SCALE_CENTER }}}) {
setLetterbox(target, (cssHeight - windowedCssHeight) / 2, (cssWidth - windowedCssWidth) / 2);
cssWidth = windowedCssWidth;
cssHeight = windowedCssHeight;
} else if (strategy.scaleMode == {{{ cDefs.EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT }}}) {
if (cssWidth*windowedRttHeight < windowedRttWidth*cssHeight) {
var desiredCssHeight = windowedRttHeight * cssWidth / windowedRttWidth;
setLetterbox(target, (cssHeight - desiredCssHeight) / 2, 0);
cssHeight = desiredCssHeight;
} else {
var desiredCssWidth = windowedRttWidth * cssHeight / windowedRttHeight;
setLetterbox(target, 0, (cssWidth - desiredCssWidth) / 2);
cssWidth = desiredCssWidth;
}
}
target.style.backgroundColor ||= 'black';
document.body.style.backgroundColor ||= 'black';
target.style.width = cssWidth + 'px';
target.style.height = cssHeight + 'px';
if (strategy.filteringMode == {{{ cDefs.EMSCRIPTEN_FULLSCREEN_FILTERING_NEAREST }}}) {
target.style.imageRendering = 'optimizeSpeed';
target.style.imageRendering = '-moz-crisp-edges';
target.style.imageRendering = '-o-crisp-edges';
target.style.imageRendering = '-webkit-optimize-contrast';
target.style.imageRendering = 'optimize-contrast';
target.style.imageRendering = 'crisp-edges';
target.style.imageRendering = 'pixelated';
}
var dpiScale = (strategy.canvasResolutionScaleMode == {{{ cDefs.EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_HIDEF }}}) ? devicePixelRatio : 1;
if (strategy.canvasResolutionScaleMode != {{{ cDefs.EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE }}}) {
var newWidth = (cssWidth * dpiScale)|0;
var newHeight = (cssHeight * dpiScale)|0;
setCanvasElementSize(target, newWidth, newHeight);
if (target.GLctxObject) target.GLctxObject.GLctx.viewport(0, 0, newWidth, newHeight);
}
return restoreOldStyle;
},
$registerRestoreOldStyle__deps: ['$getCanvasElementSize', '$setCanvasElementSize', '$currentFullscreenStrategy'],
$registerRestoreOldStyle: (canvas) => {
var canvasSize = getCanvasElementSize(canvas);
var oldWidth = canvasSize[0];
var oldHeight = canvasSize[1];
var oldCssWidth = canvas.style.width;
var oldCssHeight = canvas.style.height;
var oldBackgroundColor = canvas.style.backgroundColor;
var oldDocumentBackgroundColor = document.body.style.backgroundColor;
var oldPaddingLeft = canvas.style.paddingLeft;
var oldPaddingRight = canvas.style.paddingRight;
var oldPaddingTop = canvas.style.paddingTop;
var oldPaddingBottom = canvas.style.paddingBottom;
var oldMarginLeft = canvas.style.marginLeft;
var oldMarginRight = canvas.style.marginRight;
var oldMarginTop = canvas.style.marginTop;
var oldMarginBottom = canvas.style.marginBottom;
var oldDocumentBodyMargin = document.body.style.margin;
var oldDocumentOverflow = document.documentElement.style.overflow;
var oldDocumentScroll = document.body.scroll;
var oldImageRendering = canvas.style.imageRendering;
function restoreOldStyle() {
if (!getFullscreenElement()) {
document.removeEventListener('fullscreenchange', restoreOldStyle);
#if MIN_FIREFOX_VERSION <= 63
document.removeEventListener('mozfullscreenchange', restoreOldStyle);
#endif
#if MIN_CHROME_VERSION < 71 || MIN_SAFARI_VERSION != TARGET_NOT_SUPPORTED
document.removeEventListener('webkitfullscreenchange', restoreOldStyle);
#endif
setCanvasElementSize(canvas, oldWidth, oldHeight);
canvas.style.width = oldCssWidth;
canvas.style.height = oldCssHeight;
canvas.style.backgroundColor = oldBackgroundColor;
if (!oldDocumentBackgroundColor) document.body.style.backgroundColor = 'white';
document.body.style.backgroundColor = oldDocumentBackgroundColor;
canvas.style.paddingLeft = oldPaddingLeft;
canvas.style.paddingRight = oldPaddingRight;
canvas.style.paddingTop = oldPaddingTop;
canvas.style.paddingBottom = oldPaddingBottom;
canvas.style.marginLeft = oldMarginLeft;
canvas.style.marginRight = oldMarginRight;
canvas.style.marginTop = oldMarginTop;
canvas.style.marginBottom = oldMarginBottom;
document.body.style.margin = oldDocumentBodyMargin;
document.documentElement.style.overflow = oldDocumentOverflow;
document.body.scroll = oldDocumentScroll;
canvas.style.imageRendering = oldImageRendering;
if (canvas.GLctxObject) canvas.GLctxObject.GLctx.viewport(0, 0, oldWidth, oldHeight);
if (currentFullscreenStrategy.canvasResizedCallback) {
#if PTHREADS
if (currentFullscreenStrategy.canvasResizedCallbackTargetThread) __emscripten_run_callback_on_thread(currentFullscreenStrategy.canvasResizedCallbackTargetThread, currentFullscreenStrategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, currentFullscreenStrategy.canvasResizedCallbackUserData);
else
#endif
{{{ makeDynCall('iipp', 'currentFullscreenStrategy.canvasResizedCallback') }}}({{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, currentFullscreenStrategy.canvasResizedCallbackUserData);
}
}
}
document.addEventListener('fullscreenchange', restoreOldStyle);
#if MIN_FIREFOX_VERSION <= 63
document.addEventListener('mozfullscreenchange', restoreOldStyle);
#endif
#if MIN_CHROME_VERSION < 71 || MIN_SAFARI_VERSION != TARGET_NOT_SUPPORTED
document.addEventListener('webkitfullscreenchange', restoreOldStyle);
#endif
return restoreOldStyle;
},
$hideEverythingExceptGivenElement: (onlyVisibleElement) => {
var child = onlyVisibleElement;
var parent = child.parentNode;
var hiddenElements = [];
while (child != document.body) {
var children = parent.children;
for (var currChild of children) {
if (currChild != child) {
hiddenElements.push({ node: currChild, displayState: currChild.style.display });
currChild.style.display = 'none';
}
}
child = parent;
parent = parent.parentNode;
}
return hiddenElements;
},
$restoreHiddenElements: (hiddenElements) => {
for (var elem of hiddenElements) {
elem.node.style.display = elem.displayState;
}
},
$setLetterbox: (element, topBottom, leftRight) => {
element.style.paddingLeft = element.style.paddingRight = leftRight + 'px';
element.style.paddingTop = element.style.paddingBottom = topBottom + 'px';
},
$currentFullscreenStrategy: {},
$restoreOldWindowedStyle: null,
$softFullscreenResizeWebGLRenderTarget__deps: ['$setLetterbox', '$currentFullscreenStrategy', '$getCanvasElementSize', '$setCanvasElementSize', '$jstoi_q'],
$softFullscreenResizeWebGLRenderTarget: () => {
var dpr = devicePixelRatio;
var inHiDPIFullscreenMode = currentFullscreenStrategy.canvasResolutionScaleMode == {{{ cDefs.EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_HIDEF }}};
var inAspectRatioFixedFullscreenMode = currentFullscreenStrategy.scaleMode == {{{ cDefs.EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT }}};
var inPixelPerfectFullscreenMode = currentFullscreenStrategy.canvasResolutionScaleMode != {{{ cDefs.EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE }}};
var inCenteredWithoutScalingFullscreenMode = currentFullscreenStrategy.scaleMode == {{{ cDefs.EMSCRIPTEN_FULLSCREEN_SCALE_CENTER }}};
var screenWidth = inHiDPIFullscreenMode ? Math.round(innerWidth*dpr) : innerWidth;
var screenHeight = inHiDPIFullscreenMode ? Math.round(innerHeight*dpr) : innerHeight;
var w = screenWidth;
var h = screenHeight;
var canvas = currentFullscreenStrategy.target;
var canvasSize = getCanvasElementSize(canvas);
var x = canvasSize[0];
var y = canvasSize[1];
var topMargin;
if (inAspectRatioFixedFullscreenMode) {
if (w*y < x*h) h = (w * y / x) | 0;
else if (w*y > x*h) w = (h * x / y) | 0;
topMargin = ((screenHeight - h) / 2) | 0;
}
if (inPixelPerfectFullscreenMode) {
setCanvasElementSize(canvas, w, h);
if (canvas.GLctxObject) canvas.GLctxObject.GLctx.viewport(0, 0, w, h);
}
if (inHiDPIFullscreenMode) {
topMargin /= dpr;
w /= dpr;
h /= dpr;
w = Math.round(w*1e4)/1e4;
h = Math.round(h*1e4)/1e4;
topMargin = Math.round(topMargin*1e4)/1e4;
}
if (inCenteredWithoutScalingFullscreenMode) {
var t = (innerHeight - jstoi_q(canvas.style.height)) / 2;
var b = (innerWidth - jstoi_q(canvas.style.width)) / 2;
setLetterbox(canvas, t, b);
} else {
canvas.style.width = w + 'px';
canvas.style.height = h + 'px';
var b = (innerWidth - w) / 2;
setLetterbox(canvas, topMargin, b);
}
if (!inCenteredWithoutScalingFullscreenMode && currentFullscreenStrategy.canvasResizedCallback) {
#if PTHREADS
if (currentFullscreenStrategy.canvasResizedCallbackTargetThread) __emscripten_run_callback_on_thread(currentFullscreenStrategy.canvasResizedCallbackTargetThread, currentFullscreenStrategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, currentFullscreenStrategy.canvasResizedCallbackUserData);
else
#endif
{{{ makeDynCall('iipp', 'currentFullscreenStrategy.canvasResizedCallback') }}}({{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, currentFullscreenStrategy.canvasResizedCallbackUserData);
}
},
$doRequestFullscreen__deps: ['$JSEvents', '$JSEvents_requestFullscreen', '$findEventTarget'],
$doRequestFullscreen: (target, strategy) => {
if (!JSEvents.fullscreenEnabled()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
#if !DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
target ||= '#canvas';
#endif
target = findEventTarget(target);
if (!target) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
if (!target.requestFullscreen
#if MIN_FIREFOX_VERSION <= 63
&& !target.mozRequestFullScreen
&& !target.mozRequestFullscreen
#endif
#if MIN_CHROME_VERSION <= 70 || MIN_SAFARI_VERSION != TARGET_NOT_SUPPORTED
&& !target.webkitRequestFullscreen
#endif
) {
return {{{ cDefs.EMSCRIPTEN_RESULT_INVALID_TARGET }}};
}
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
if (!JSEvents.canPerformEventHandlerRequests()) {
if (strategy.deferUntilInEventHandler) {
JSEvents.deferCall(JSEvents_requestFullscreen, 1 , [target, strategy]);
return {{{ cDefs.EMSCRIPTEN_RESULT_DEFERRED }}};
}
return {{{ cDefs.EMSCRIPTEN_RESULT_FAILED_NOT_DEFERRED }}};
}
#endif
return JSEvents_requestFullscreen(target, strategy);
},
emscripten_request_fullscreen__deps: ['$doRequestFullscreen'],
emscripten_request_fullscreen__proxy: 'sync',
emscripten_request_fullscreen: (target, deferUntilInEventHandler) => {
var strategy = {
scaleMode: {{{ cDefs.EMSCRIPTEN_FULLSCREEN_SCALE_DEFAULT }}},
canvasResolutionScaleMode: {{{ cDefs.EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE }}},
filteringMode: {{{ cDefs.EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT }}},
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
deferUntilInEventHandler,
#endif
canvasResizedCallbackTargetThread: {{{ cDefs.EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD }}}
};
return doRequestFullscreen(target, strategy);
},
emscripten_request_fullscreen_strategy__deps: ['$doRequestFullscreen'],
emscripten_request_fullscreen_strategy__proxy: 'sync',
emscripten_request_fullscreen_strategy: (target, deferUntilInEventHandler, fullscreenStrategy) => {
var strategy = {
scaleMode: {{{ makeGetValue('fullscreenStrategy', C_STRUCTS.EmscriptenFullscreenStrategy.scaleMode, 'i32') }}},
canvasResolutionScaleMode: {{{ makeGetValue('fullscreenStrategy', C_STRUCTS.EmscriptenFullscreenStrategy.canvasResolutionScaleMode, 'i32') }}},
filteringMode: {{{ makeGetValue('fullscreenStrategy', C_STRUCTS.EmscriptenFullscreenStrategy.filteringMode, 'i32') }}},
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
deferUntilInEventHandler,
#endif
#if PTHREADS
canvasResizedCallbackTargetThread: {{{ makeGetValue('fullscreenStrategy', C_STRUCTS.EmscriptenFullscreenStrategy.canvasResizedCallbackTargetThread, 'i32') }}},
#endif
canvasResizedCallback: {{{ makeGetValue('fullscreenStrategy', C_STRUCTS.EmscriptenFullscreenStrategy.canvasResizedCallback, 'i32') }}},
canvasResizedCallbackUserData: {{{ makeGetValue('fullscreenStrategy', C_STRUCTS.EmscriptenFullscreenStrategy.canvasResizedCallbackUserData, 'i32') }}}
};
return doRequestFullscreen(target, strategy);
},
emscripten_enter_soft_fullscreen__deps: ['$JSEvents', '$hideEverythingExceptGivenElement', '$restoreOldWindowedStyle', '$restoreHiddenElements', '$currentFullscreenStrategy', '$softFullscreenResizeWebGLRenderTarget', '$JSEvents_resizeCanvasForFullscreen', '$findEventTarget'],
emscripten_enter_soft_fullscreen__proxy: 'sync',
emscripten_enter_soft_fullscreen: (target, fullscreenStrategy) => {
#if !DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
target ||= '#canvas';
#endif
target = findEventTarget(target);
if (!target) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
var strategy = {
scaleMode: {{{ makeGetValue('fullscreenStrategy', C_STRUCTS.EmscriptenFullscreenStrategy.scaleMode, 'i32') }}},
canvasResolutionScaleMode: {{{ makeGetValue('fullscreenStrategy', C_STRUCTS.EmscriptenFullscreenStrategy.canvasResolutionScaleMode, 'i32') }}},
filteringMode: {{{ makeGetValue('fullscreenStrategy', C_STRUCTS.EmscriptenFullscreenStrategy.filteringMode, 'i32') }}},
canvasResizedCallback: {{{ makeGetValue('fullscreenStrategy', C_STRUCTS.EmscriptenFullscreenStrategy.canvasResizedCallback, 'i32') }}},
canvasResizedCallbackUserData: {{{ makeGetValue('fullscreenStrategy', C_STRUCTS.EmscriptenFullscreenStrategy.canvasResizedCallbackUserData, 'i32') }}},
#if PTHREADS
canvasResizedCallbackTargetThread: JSEvents.getTargetThreadForEventCallback(),
#endif
target,
softFullscreen: true
};
var restoreOldStyle = JSEvents_resizeCanvasForFullscreen(target, strategy);
document.documentElement.style.overflow = 'hidden';
document.body.scroll = "no";
document.body.style.margin = '0px';
var hiddenElements = hideEverythingExceptGivenElement(target);
function restoreWindowedState() {
restoreOldStyle();
restoreHiddenElements(hiddenElements);
removeEventListener('resize', softFullscreenResizeWebGLRenderTarget);
if (strategy.canvasResizedCallback) {
#if PTHREADS
if (strategy.canvasResizedCallbackTargetThread) __emscripten_run_callback_on_thread(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData);
else
#endif
{{{ makeDynCall('iipp', 'strategy.canvasResizedCallback') }}}({{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData);
}
currentFullscreenStrategy = 0;
}
restoreOldWindowedStyle = restoreWindowedState;
currentFullscreenStrategy = strategy;
addEventListener('resize', softFullscreenResizeWebGLRenderTarget);
if (strategy.canvasResizedCallback) {
#if PTHREADS
if (strategy.canvasResizedCallbackTargetThread) __emscripten_run_callback_on_thread(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData);
else
#endif
{{{ makeDynCall('iipp', 'strategy.canvasResizedCallback') }}}({{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData);
}
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
emscripten_exit_soft_fullscreen__deps: ['$restoreOldWindowedStyle'],
emscripten_exit_soft_fullscreen__proxy: 'sync',
emscripten_exit_soft_fullscreen: () => {
restoreOldWindowedStyle?.();
restoreOldWindowedStyle = null;
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
emscripten_exit_fullscreen__deps: [
'$JSEvents',
'$specialHTMLTargets',
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
'$JSEvents_requestFullscreen',
#endif
],
emscripten_exit_fullscreen__proxy: 'sync',
emscripten_exit_fullscreen: () => {
if (!JSEvents.fullscreenEnabled()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
JSEvents.removeDeferredCalls(JSEvents_requestFullscreen);
#endif
var d = specialHTMLTargets[{{{ cDefs.EMSCRIPTEN_EVENT_TARGET_DOCUMENT }}}];
if (d.exitFullscreen) {
d.fullscreenElement && d.exitFullscreen();
#if MIN_FIREFOX_VERSION < 64
} else if (d.mozCancelFullScreen) {
d.mozFullScreenElement && d.mozCancelFullScreen();
#endif
#if MIN_SAFARI_VERSION != TARGET_NOT_SUPPORTED
} else if (d.webkitExitFullscreen) {
d.webkitFullscreenElement && d.webkitExitFullscreen();
#endif
} else {
return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
}
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$fillPointerlockChangeEventData__deps: ['$JSEvents', '$stringToUTF8'],
$fillPointerlockChangeEventData: (eventStruct) => {
var pointerLockElement = document.pointerLockElement;
var isPointerlocked = !!pointerLockElement;
#if !SAFE_HEAP
#endif
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenPointerlockChangeEvent.isActive, 'isPointerlocked', 'i8') }}};
var nodeName = JSEvents.getNodeNameForTarget(pointerLockElement);
var id = pointerLockElement?.id || '';
stringToUTF8(nodeName, eventStruct + {{{ C_STRUCTS.EmscriptenPointerlockChangeEvent.nodeName }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}});
stringToUTF8(id, eventStruct + {{{ C_STRUCTS.EmscriptenPointerlockChangeEvent.id }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}});
},
$registerPointerlockChangeEventCallback__noleakcheck: true,
$registerPointerlockChangeEventCallback__deps: ['$JSEvents', '$fillPointerlockChangeEventData', 'malloc'],
$registerPointerlockChangeEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.pointerlockChangeEvent ||= _malloc({{{ C_STRUCTS.EmscriptenPointerlockChangeEvent.__size__ }}});
var pointerlockChangeEventHandlerFunc = (e = event) => {
#if PTHREADS
var pointerlockChangeEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenPointerlockChangeEvent.__size__ }}}) : JSEvents.pointerlockChangeEvent;
#else
var pointerlockChangeEvent = JSEvents.pointerlockChangeEvent;
#endif
fillPointerlockChangeEventData(pointerlockChangeEvent);
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, pointerlockChangeEvent, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, pointerlockChangeEvent, userData)) e.preventDefault();
};
var eventHandler = {
target,
eventTypeString,
callbackfunc,
handlerFunc: pointerlockChangeEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_pointerlockchange_callback_on_thread__proxy: 'sync',
emscripten_set_pointerlockchange_callback_on_thread__deps: ['$registerPointerlockChangeEventCallback', '$findEventTarget',
#if !DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
'$specialHTMLTargets'
#endif
],
emscripten_set_pointerlockchange_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) => {
if (!document.body?.requestPointerLock) {
return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
}
#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
target = findEventTarget(target);
#else
target = target ? findEventTarget(target) : specialHTMLTargets[{{{ cDefs.EMSCRIPTEN_EVENT_TARGET_DOCUMENT }}}];
#endif
if (!target) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
return registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_POINTERLOCKCHANGE }}}, "pointerlockchange", targetThread);
},
$registerPointerlockErrorEventCallback__deps: ['$JSEvents'],
$registerPointerlockErrorEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
var pointerlockErrorEventHandlerFunc = (e = event) => {
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, 0, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, 0, userData)) e.preventDefault();
};
var eventHandler = {
target,
eventTypeString,
callbackfunc,
handlerFunc: pointerlockErrorEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_pointerlockerror_callback_on_thread__proxy: 'sync',
emscripten_set_pointerlockerror_callback_on_thread__deps: ['$registerPointerlockErrorEventCallback', '$findEventTarget',
#if !DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
'$specialHTMLTargets'
#endif
],
emscripten_set_pointerlockerror_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) => {
if (!document.body?.requestPointerLock) {
return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
}
#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
target = findEventTarget(target);
#else
target = target ? findEventTarget(target) : specialHTMLTargets[{{{ cDefs.EMSCRIPTEN_EVENT_TARGET_DOCUMENT }}}];
#endif
if (!target) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
return registerPointerlockErrorEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_POINTERLOCKERROR }}}, "pointerlockerror", targetThread);
},
emscripten_get_pointerlock_status__proxy: 'sync',
emscripten_get_pointerlock_status__deps: ['$fillPointerlockChangeEventData'],
emscripten_get_pointerlock_status: (pointerlockStatus) => {
if (pointerlockStatus) fillPointerlockChangeEventData(pointerlockStatus);
if (!document.body?.requestPointerLock) {
return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
}
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$requestPointerLock: (target) => {
if (target.requestPointerLock) {
target.requestPointerLock();
} else {
if (document.body.requestPointerLock) {
return {{{ cDefs.EMSCRIPTEN_RESULT_INVALID_TARGET }}};
}
return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
}
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
emscripten_request_pointerlock__proxy: 'sync',
emscripten_request_pointerlock__deps: ['$requestPointerLock', '$findEventTarget',
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
'$JSEvents',
#endif
],
emscripten_request_pointerlock: (target, deferUntilInEventHandler) => {
#if !DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
target ||= '#canvas';
#endif
target = findEventTarget(target);
if (!target) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
if (!target.requestPointerLock) {
return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
}
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
if (!JSEvents.canPerformEventHandlerRequests()) {
if (deferUntilInEventHandler) {
JSEvents.deferCall(requestPointerLock, 2 , [target]);
return {{{ cDefs.EMSCRIPTEN_RESULT_DEFERRED }}};
}
return {{{ cDefs.EMSCRIPTEN_RESULT_FAILED_NOT_DEFERRED }}};
}
#endif
return requestPointerLock(target);
},
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
emscripten_exit_pointerlock__deps: ['$JSEvents', '$requestPointerLock'],
#endif
emscripten_exit_pointerlock__proxy: 'sync',
emscripten_exit_pointerlock: () => {
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
JSEvents.removeDeferredCalls(requestPointerLock);
#endif
if (!document.exitPointerLock) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
document.exitPointerLock();
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
emscripten_vibrate__proxy: 'sync',
emscripten_vibrate: (msecs) => {
if (!navigator.vibrate) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
navigator.vibrate(msecs);
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
emscripten_vibrate_pattern__proxy: 'sync',
emscripten_vibrate_pattern: (msecsArray, numEntries) => {
if (!navigator.vibrate) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
var vibrateList = [];
for (var i = 0; i < numEntries; ++i) {
var msecs = {{{ makeGetValue('msecsArray', 'i*4', 'i32') }}};
vibrateList.push(msecs);
}
navigator.vibrate(vibrateList);
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$fillVisibilityChangeEventData: (eventStruct) => {
var visibilityStates = [ "hidden", "visible", "prerender", "unloaded" ];
var visibilityState = visibilityStates.indexOf(document.visibilityState);
#if !SAFE_HEAP
#endif
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenVisibilityChangeEvent.hidden, 'document.hidden', 'i8') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenVisibilityChangeEvent.visibilityState, 'visibilityState', 'i32') }}};
},
$registerVisibilityChangeEventCallback__noleakcheck: true,
$registerVisibilityChangeEventCallback__deps: ['$JSEvents', '$fillVisibilityChangeEventData', 'malloc'],
$registerVisibilityChangeEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.visibilityChangeEvent ||= _malloc({{{ C_STRUCTS.EmscriptenVisibilityChangeEvent.__size__ }}});
var visibilityChangeEventHandlerFunc = (e = event) => {
#if PTHREADS
var visibilityChangeEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenVisibilityChangeEvent.__size__ }}}) : JSEvents.visibilityChangeEvent;
#else
var visibilityChangeEvent = JSEvents.visibilityChangeEvent;
#endif
fillVisibilityChangeEventData(visibilityChangeEvent);
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, visibilityChangeEvent, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, visibilityChangeEvent, userData)) e.preventDefault();
};
var eventHandler = {
target,
eventTypeString,
callbackfunc,
handlerFunc: visibilityChangeEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_visibilitychange_callback_on_thread__proxy: 'sync',
emscripten_set_visibilitychange_callback_on_thread__deps: ['$registerVisibilityChangeEventCallback', '$specialHTMLTargets'],
emscripten_set_visibilitychange_callback_on_thread: (userData, useCapture, callbackfunc, targetThread) => {
#if ENVIRONMENT_MAY_BE_WORKER || ENVIRONMENT_MAY_BE_NODE || ENVIRONMENT_MAY_BE_SHELL
if (!specialHTMLTargets[{{{ cDefs.EMSCRIPTEN_EVENT_TARGET_DOCUMENT }}}]) {
return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
}
#endif
return registerVisibilityChangeEventCallback(specialHTMLTargets[{{{ cDefs.EMSCRIPTEN_EVENT_TARGET_DOCUMENT }}}], userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_VISIBILITYCHANGE }}}, "visibilitychange", targetThread);
},
emscripten_get_visibility_status__proxy: 'sync',
emscripten_get_visibility_status__deps: ['$fillVisibilityChangeEventData'],
emscripten_get_visibility_status: (visibilityStatus) => {
if (typeof document.visibilityState == 'undefined' && typeof document.hidden == 'undefined') {
return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
}
fillVisibilityChangeEventData(visibilityStatus);
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$registerTouchEventCallback__noleakcheck: true,
$registerTouchEventCallback__deps: ['$JSEvents', '$findEventTarget', '$getBoundingClientRect', 'malloc'],
$registerTouchEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.touchEvent ||= _malloc({{{ C_STRUCTS.EmscriptenTouchEvent.__size__ }}});
target = findEventTarget(target);
var touchEventHandlerFunc = (e) => {
#if ASSERTIONS
assert(e);
#endif
var t, touches = {}, et = e.touches;
for (let t of et) {
t.isChanged = t.onTarget = 0;
touches[t.identifier] = t;
}
for (let t of e.changedTouches) {
t.isChanged = 1;
touches[t.identifier] = t;
}
for (let t of e.targetTouches) {
touches[t.identifier].onTarget = 1;
}
#if PTHREADS
var touchEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenTouchEvent.__size__ }}}) : JSEvents.touchEvent;
#else
var touchEvent = JSEvents.touchEvent;
#endif
{{{ makeSetValue('touchEvent', C_STRUCTS.EmscriptenTouchEvent.timestamp, 'e.timeStamp', 'double') }}};
HEAP8[touchEvent + {{{ C_STRUCTS.EmscriptenTouchEvent.ctrlKey }}}] = e.ctrlKey;
HEAP8[touchEvent + {{{ C_STRUCTS.EmscriptenTouchEvent.shiftKey }}}] = e.shiftKey;
HEAP8[touchEvent + {{{ C_STRUCTS.EmscriptenTouchEvent.altKey }}}] = e.altKey;
HEAP8[touchEvent + {{{ C_STRUCTS.EmscriptenTouchEvent.metaKey }}}] = e.metaKey;
var idx = touchEvent + {{{ C_STRUCTS.EmscriptenTouchEvent.touches }}};
#if !DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
var canvasRect = Module['canvas'] ? getBoundingClientRect(Module['canvas']) : undefined;
#endif
var targetRect = getBoundingClientRect(target);
var numTouches = 0;
for (let t of Object.values(touches)) {
var idx32 = {{{ getHeapOffset('idx', 'i32') }}};
HEAP32[idx32 + {{{ C_STRUCTS.EmscriptenTouchPoint.identifier / 4 }}}] = t.identifier;
HEAP32[idx32 + {{{ C_STRUCTS.EmscriptenTouchPoint.screenX / 4 }}}] = t.screenX;
HEAP32[idx32 + {{{ C_STRUCTS.EmscriptenTouchPoint.screenY / 4 }}}] = t.screenY;
HEAP32[idx32 + {{{ C_STRUCTS.EmscriptenTouchPoint.clientX / 4 }}}] = t.clientX;
HEAP32[idx32 + {{{ C_STRUCTS.EmscriptenTouchPoint.clientY / 4 }}}] = t.clientY;
HEAP32[idx32 + {{{ C_STRUCTS.EmscriptenTouchPoint.pageX / 4 }}}] = t.pageX;
HEAP32[idx32 + {{{ C_STRUCTS.EmscriptenTouchPoint.pageY / 4 }}}] = t.pageY;
HEAP8[idx + {{{ C_STRUCTS.EmscriptenTouchPoint.isChanged }}}] = t.isChanged;
HEAP8[idx + {{{ C_STRUCTS.EmscriptenTouchPoint.onTarget }}}] = t.onTarget;
HEAP32[idx32 + {{{ C_STRUCTS.EmscriptenTouchPoint.targetX / 4 }}}] = t.clientX - (targetRect.left | 0);
HEAP32[idx32 + {{{ C_STRUCTS.EmscriptenTouchPoint.targetY / 4 }}}] = t.clientY - (targetRect.top | 0);
#if !DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
HEAP32[idx32 + {{{ C_STRUCTS.EmscriptenTouchPoint.canvasX / 4 }}}] = canvasRect ? t.clientX - (canvasRect.left | 0) : 0;
HEAP32[idx32 + {{{ C_STRUCTS.EmscriptenTouchPoint.canvasY / 4 }}}] = canvasRect ? t.clientY - (canvasRect.top | 0) : 0;
#endif
idx += {{{ C_STRUCTS.EmscriptenTouchPoint.__size__ }}};
if (++numTouches > 31) {
break;
}
}
{{{ makeSetValue('touchEvent', C_STRUCTS.EmscriptenTouchEvent.numTouches, 'numTouches', 'i32') }}};
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, touchEvent, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, touchEvent, userData)) e.preventDefault();
};
var eventHandler = {
target,
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
allowsDeferredCalls: eventTypeString == 'touchstart' || eventTypeString == 'touchend',
#endif
eventTypeString,
callbackfunc,
handlerFunc: touchEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_touchstart_callback_on_thread__proxy: 'sync',
emscripten_set_touchstart_callback_on_thread__deps: ['$registerTouchEventCallback'],
emscripten_set_touchstart_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerTouchEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_TOUCHSTART }}}, "touchstart", targetThread),
emscripten_set_touchend_callback_on_thread__proxy: 'sync',
emscripten_set_touchend_callback_on_thread__deps: ['$registerTouchEventCallback'],
emscripten_set_touchend_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerTouchEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_TOUCHEND }}}, "touchend", targetThread),
emscripten_set_touchmove_callback_on_thread__proxy: 'sync',
emscripten_set_touchmove_callback_on_thread__deps: ['$registerTouchEventCallback'],
emscripten_set_touchmove_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerTouchEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_TOUCHMOVE }}}, "touchmove", targetThread),
emscripten_set_touchcancel_callback_on_thread__proxy: 'sync',
emscripten_set_touchcancel_callback_on_thread__deps: ['$registerTouchEventCallback'],
emscripten_set_touchcancel_callback_on_thread: (target, userData, useCapture, callbackfunc, targetThread) =>
registerTouchEventCallback(target, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_TOUCHCANCEL }}}, "touchcancel", targetThread),
$fillGamepadEventData__deps: ['$stringToUTF8'],
$fillGamepadEventData: (eventStruct, e) => {
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenGamepadEvent.timestamp, 'e.timestamp', 'double') }}};
for (var i = 0; i < e.axes.length; ++i) {
{{{ makeSetValue('eventStruct+i*8', C_STRUCTS.EmscriptenGamepadEvent.axis, 'e.axes[i]', 'double') }}};
}
for (var i = 0; i < e.buttons.length; ++i) {
if (typeof e.buttons[i] == 'object') {
{{{ makeSetValue('eventStruct+i*8', C_STRUCTS.EmscriptenGamepadEvent.analogButton, 'e.buttons[i].value', 'double') }}};
} else {
{{{ makeSetValue('eventStruct+i*8', C_STRUCTS.EmscriptenGamepadEvent.analogButton, 'e.buttons[i]', 'double') }}};
}
}
for (var i = 0; i < e.buttons.length; ++i) {
if (typeof e.buttons[i] == 'object') {
{{{ makeSetValue('eventStruct+i', C_STRUCTS.EmscriptenGamepadEvent.digitalButton, 'e.buttons[i].pressed', 'i8') }}};
} else {
#if !SAFE_HEAP
#endif
{{{ makeSetValue('eventStruct+i', C_STRUCTS.EmscriptenGamepadEvent.digitalButton, 'e.buttons[i] == 1', 'i8') }}};
}
}
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenGamepadEvent.connected, 'e.connected', 'i8') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenGamepadEvent.index, 'e.index', 'i32') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenGamepadEvent.numAxes, 'e.axes.length', 'i32') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenGamepadEvent.numButtons, 'e.buttons.length', 'i32') }}};
stringToUTF8(e.id, eventStruct + {{{ C_STRUCTS.EmscriptenGamepadEvent.id }}}, {{{ cDefs.EM_HTML5_MEDIUM_STRING_LEN_BYTES }}});
stringToUTF8(e.mapping, eventStruct + {{{ C_STRUCTS.EmscriptenGamepadEvent.mapping }}}, {{{ cDefs.EM_HTML5_MEDIUM_STRING_LEN_BYTES }}});
},
$registerGamepadEventCallback__noleakcheck: true,
$registerGamepadEventCallback__deps: ['$JSEvents', '$fillGamepadEventData', '$findEventTarget', 'malloc'],
$registerGamepadEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.gamepadEvent ||= _malloc({{{ C_STRUCTS.EmscriptenGamepadEvent.__size__ }}});
var gamepadEventHandlerFunc = (e = event) => {
#if PTHREADS
var gamepadEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenGamepadEvent.__size__ }}}) : JSEvents.gamepadEvent;
#else
var gamepadEvent = JSEvents.gamepadEvent;
#endif
fillGamepadEventData(gamepadEvent, e["gamepad"]);
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, gamepadEvent, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, gamepadEvent, userData)) e.preventDefault();
};
var eventHandler = {
target: findEventTarget(target),
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
allowsDeferredCalls: true,
#endif
eventTypeString,
callbackfunc,
handlerFunc: gamepadEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_gamepadconnected_callback_on_thread__proxy: 'sync',
emscripten_set_gamepadconnected_callback_on_thread__deps: ['$registerGamepadEventCallback', 'emscripten_sample_gamepad_data'],
emscripten_set_gamepadconnected_callback_on_thread: (userData, useCapture, callbackfunc, targetThread) => {
if (_emscripten_sample_gamepad_data()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
return registerGamepadEventCallback({{{ cDefs.EMSCRIPTEN_EVENT_TARGET_WINDOW }}}, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_GAMEPADCONNECTED }}}, "gamepadconnected", targetThread);
},
emscripten_set_gamepaddisconnected_callback_on_thread__proxy: 'sync',
emscripten_set_gamepaddisconnected_callback_on_thread__deps: ['$registerGamepadEventCallback', 'emscripten_sample_gamepad_data'],
emscripten_set_gamepaddisconnected_callback_on_thread: (userData, useCapture, callbackfunc, targetThread) => {
if (_emscripten_sample_gamepad_data()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
return registerGamepadEventCallback({{{ cDefs.EMSCRIPTEN_EVENT_TARGET_WINDOW }}}, userData, useCapture, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_GAMEPADDISCONNECTED }}}, "gamepaddisconnected", targetThread);
},
emscripten_sample_gamepad_data__docs: '/** @suppress {checkTypes} */',
emscripten_sample_gamepad_data__proxy: 'sync',
emscripten_sample_gamepad_data__deps: ['$JSEvents'],
emscripten_sample_gamepad_data: () => {
try {
if (navigator.getGamepads) return (JSEvents.lastGamepadState = navigator.getGamepads())
? {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}} : {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
} catch(e) {
#if ASSERTIONS
err(`navigator.getGamepads() exists, but failed to execute with exception ${e}. Disabling Gamepad access.`);
#endif
navigator.getGamepads = null;
}
return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
},
emscripten_get_num_gamepads__proxy: 'sync',
emscripten_get_num_gamepads__deps: ['$JSEvents'],
emscripten_get_num_gamepads: () => {
#if ASSERTIONS
if (!JSEvents.lastGamepadState) throw 'emscripten_get_num_gamepads() can only be called after having first called emscripten_sample_gamepad_data() and that function has returned EMSCRIPTEN_RESULT_SUCCESS!';
#endif
return JSEvents.lastGamepadState.length;
},
emscripten_get_gamepad_status__proxy: 'sync',
emscripten_get_gamepad_status__deps: ['$JSEvents', '$fillGamepadEventData'],
emscripten_get_gamepad_status: (index, gamepadState) => {
#if ASSERTIONS
if (!JSEvents.lastGamepadState) throw 'emscripten_get_gamepad_status() can only be called after having first called emscripten_sample_gamepad_data() and that function has returned EMSCRIPTEN_RESULT_SUCCESS!';
#endif
if (index < 0 || index >= JSEvents.lastGamepadState.length) return {{{ cDefs.EMSCRIPTEN_RESULT_INVALID_PARAM }}};
if (!JSEvents.lastGamepadState[index]) return {{{ cDefs.EMSCRIPTEN_RESULT_NO_DATA }}};
fillGamepadEventData(gamepadState, JSEvents.lastGamepadState[index]);
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$registerBeforeUnloadEventCallback__deps: ['$JSEvents', '$findEventTarget'],
$registerBeforeUnloadEventCallback: (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) => {
var beforeUnloadEventHandlerFunc = (e = event) => {
var confirmationMessage = {{{ makeDynCall('pipp', 'callbackfunc') }}}(eventTypeId, 0, userData);
if (confirmationMessage) {
confirmationMessage = UTF8ToString(confirmationMessage);
}
if (confirmationMessage) {
e.preventDefault();
e.returnValue = confirmationMessage;
return confirmationMessage;
}
};
var eventHandler = {
target: findEventTarget(target),
eventTypeString,
callbackfunc,
handlerFunc: beforeUnloadEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_beforeunload_callback_on_thread__proxy: 'sync',
emscripten_set_beforeunload_callback_on_thread__deps: ['$registerBeforeUnloadEventCallback'],
emscripten_set_beforeunload_callback_on_thread: (userData, callbackfunc, targetThread) => {
if (typeof onbeforeunload == 'undefined') return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
if (targetThread !== {{{ cDefs.EM_CALLBACK_THREAD_CONTEXT_MAIN_RUNTIME_THREAD }}}) return {{{ cDefs.EMSCRIPTEN_RESULT_INVALID_PARAM }}};
return registerBeforeUnloadEventCallback({{{ cDefs.EMSCRIPTEN_EVENT_TARGET_WINDOW }}}, userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BEFOREUNLOAD }}}, "beforeunload");
},
$fillBatteryEventData: (eventStruct, battery) => {
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.chargingTime, 'battery.chargingTime', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.dischargingTime, 'battery.dischargingTime', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.level, 'battery.level', 'double') }}};
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenBatteryEvent.charging, 'battery.charging', 'i8') }}};
},
$hasBatteryAPI: () => typeof navigator != 'undefined' && navigator.getBattery,
$hasBatteryAPI__internal: true,
$registerBatteryEventCallback__noleakcheck: true,
$registerBatteryEventCallback__deps: ['$JSEvents', '$fillBatteryEventData', 'malloc'],
$registerBatteryEventCallback: (battery, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
#endif
JSEvents.batteryEvent ||= _malloc({{{ C_STRUCTS.EmscriptenBatteryEvent.__size__ }}});
var batteryEventHandlerFunc = (e = event) => {
#if PTHREADS
var batteryEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenBatteryEvent.__size__ }}}) : JSEvents.batteryEvent;
#else
var batteryEvent = JSEvents.batteryEvent;
#endif
fillBatteryEventData(batteryEvent, battery);
#if PTHREADS
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, batteryEvent, userData);
else
#endif
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, batteryEvent, userData)) e.preventDefault();
};
var eventHandler = {
target: battery,
eventTypeString,
callbackfunc,
handlerFunc: batteryEventHandlerFunc,
useCapture
};
return JSEvents.registerOrRemoveHandler(eventHandler);
},
emscripten_set_batterychargingchange_callback_on_thread__proxy: 'sync',
emscripten_set_batterychargingchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$hasBatteryAPI'],
emscripten_set_batterychargingchange_callback_on_thread: (userData, callbackfunc, targetThread) => {
if (!hasBatteryAPI()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
navigator.getBattery().then((b) => {
registerBatteryEventCallback(b, userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYCHARGINGCHANGE }}}, "chargingchange", targetThread);
});
},
emscripten_set_batterylevelchange_callback_on_thread__proxy: 'sync',
emscripten_set_batterylevelchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$hasBatteryAPI'],
emscripten_set_batterylevelchange_callback_on_thread: (userData, callbackfunc, targetThread) => {
if (!hasBatteryAPI()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
navigator.getBattery().then((b) => {
registerBatteryEventCallback(b, userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYLEVELCHANGE }}}, "levelchange", targetThread);
});
},
$batteryManager: undefined,
$batteryManager__internal: true,
emscripten_get_battery_status__proxy: 'sync',
emscripten_get_battery_status__deps: ['$fillBatteryEventData', '$hasBatteryAPI', '$batteryManager'],
emscripten_get_battery_status: (batteryState) => {
if (!hasBatteryAPI()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
if (!batteryManager) {
navigator.getBattery().then((b) => {
batteryManager = b;
});
return {{{ cDefs.EMSCRIPTEN_RESULT_NO_DATA }}};
}
fillBatteryEventData(batteryState, batteryManager);
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
#if PTHREADS
$setCanvasElementSizeCallingThread__deps: [
#if OFFSCREENCANVAS_SUPPORT
'$setOffscreenCanvasSizeOnTargetThread',
#endif
'$findCanvasEventTarget'],
$setCanvasElementSizeCallingThread: (target, width, height) => {
var canvas = findCanvasEventTarget(target);
if (!canvas) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
#if OFFSCREENCANVAS_SUPPORT
if (canvas.canvasSharedPtr) {
{{{ makeSetValue('canvas.canvasSharedPtr', 0, 'width', 'i32') }}};
{{{ makeSetValue('canvas.canvasSharedPtr', 4, 'height', 'i32') }}};
}
if (canvas.offscreenCanvas || !canvas.controlTransferredOffscreen) {
if (canvas.offscreenCanvas) canvas = canvas.offscreenCanvas;
#else
if (!canvas.controlTransferredOffscreen) {
#endif
var autoResizeViewport = false;
if (canvas.GLctxObject?.GLctx) {
var prevViewport = canvas.GLctxObject.GLctx.getParameter(0xBA2 );
autoResizeViewport = (prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas.width && prevViewport[3] === canvas.height);
#if GL_DEBUG
dbg(`Resizing canvas from ${canvas.width}x${canvas.height} to ${width}x${height}. Previous GL viewport size was ${prevViewport}, so autoResizeViewport=${autoResizeViewport}`);
#endif
}
canvas.width = width;
canvas.height = height;
if (autoResizeViewport) {
#if GL_DEBUG
dbg(`Automatically resizing GL viewport to cover whole render target ${width}x${height}`);
#endif
canvas.GLctxObject.GLctx.viewport(0, 0, width, height);
}
#if OFFSCREENCANVAS_SUPPORT
} else if (canvas.canvasSharedPtr) {
var targetThread = {{{ makeGetValue('canvas.canvasSharedPtr', 8, '*') }}};
setOffscreenCanvasSizeOnTargetThread(targetThread, target, width, height);
return {{{ cDefs.EMSCRIPTEN_RESULT_DEFERRED }}};
#endif
} else {
#if GL_DEBUG
dbg('canvas.controlTransferredOffscreen but we do not own the canvas, and do not know who has (no canvas.canvasSharedPtr present, an internal bug?)!\n');
#endif
return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
}
#if OFFSCREEN_FRAMEBUFFER
if (canvas.GLctxObject) GL.resizeOffscreenFramebuffer(canvas.GLctxObject);
#endif
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
#if OFFSCREENCANVAS_SUPPORT
$setOffscreenCanvasSizeOnTargetThread__deps: ['$stringToNewUTF8', '_emscripten_set_offscreencanvas_size_on_thread'],
$setOffscreenCanvasSizeOnTargetThread: (targetThread, targetCanvas, width, height) => {
targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : '';
var targetCanvasPtr = 0;
if (targetCanvas) {
targetCanvasPtr = stringToNewUTF8(targetCanvas);
}
__emscripten_set_offscreencanvas_size_on_thread(targetThread, targetCanvasPtr, width, height);
},
#endif
$setCanvasElementSizeMainThread__proxy: 'sync',
$setCanvasElementSizeMainThread__deps: ['$setCanvasElementSizeCallingThread'],
$setCanvasElementSizeMainThread: (target, width, height) => setCanvasElementSizeCallingThread(target, width, height),
emscripten_set_canvas_element_size__deps: ['$setCanvasElementSizeCallingThread', '$setCanvasElementSizeMainThread', '$findCanvasEventTarget'],
emscripten_set_canvas_element_size: (target, width, height) => {
#if GL_DEBUG
dbg(`emscripten_set_canvas_element_size(target=${target},width=${width},height=${height}`);
#endif
var canvas = findCanvasEventTarget(target);
if (canvas) {
return setCanvasElementSizeCallingThread(target, width, height);
}
return setCanvasElementSizeMainThread(target, width, height);
},
#else
emscripten_set_canvas_element_size__deps: ['$findCanvasEventTarget'],
emscripten_set_canvas_element_size: (target, width, height) => {
#if GL_DEBUG
dbg(`emscripten_set_canvas_element_size(target=${target},width=${width},height=${height}`);
#endif
var canvas = findCanvasEventTarget(target);
if (!canvas) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
canvas.width = width;
canvas.height = height;
#if OFFSCREEN_FRAMEBUFFER
if (canvas.GLctxObject) GL.resizeOffscreenFramebuffer(canvas.GLctxObject);
#endif
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
#endif
$setCanvasElementSize__deps: ['emscripten_set_canvas_element_size', '$stackSave', '$stackRestore', '$stringToUTF8OnStack'],
$setCanvasElementSize: (target, width, height) => {
#if GL_DEBUG
dbg(`setCanvasElementSize(target=${target},width=${width},height=${height}`);
#endif
if (!target.controlTransferredOffscreen) {
target.width = width;
target.height = height;
} else {
var sp = stackSave();
var targetInt = stringToUTF8OnStack(target.id);
_emscripten_set_canvas_element_size(targetInt, width, height);
stackRestore(sp);
}
},
#if PTHREADS
$getCanvasSizeCallingThread__deps: ['$findCanvasEventTarget'],
$getCanvasSizeCallingThread: (target, width, height) => {
var canvas = findCanvasEventTarget(target);
if (!canvas) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
#if OFFSCREENCANVAS_SUPPORT
if (canvas.canvasSharedPtr) {
var w = {{{ makeGetValue('canvas.canvasSharedPtr', 0, 'i32') }}};
var h = {{{ makeGetValue('canvas.canvasSharedPtr', 4, 'i32') }}};
{{{ makeSetValue('width', 0, 'w', 'i32') }}};
{{{ makeSetValue('height', 0, 'h', 'i32') }}};
} else if (canvas.offscreenCanvas) {
{{{ makeSetValue('width', 0, 'canvas.offscreenCanvas.width', 'i32') }}};
{{{ makeSetValue('height', 0, 'canvas.offscreenCanvas.height', 'i32') }}};
} else
#endif
if (!canvas.controlTransferredOffscreen) {
{{{ makeSetValue('width', 0, 'canvas.width', 'i32') }}};
{{{ makeSetValue('height', 0, 'canvas.height', 'i32') }}};
} else {
#if GL_DEBUG
dbg('canvas.controlTransferredOffscreen but we do not own the canvas, and do not know who has (no canvas.canvasSharedPtr present, an internal bug?)!\n');
#endif
return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
}
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
$getCanvasSizeMainThread__proxy: 'sync',
$getCanvasSizeMainThread__deps: ['$getCanvasSizeCallingThread'],
$getCanvasSizeMainThread: (target, width, height) => getCanvasSizeCallingThread(target, width, height),
emscripten_get_canvas_element_size__deps: ['$getCanvasSizeCallingThread', '$getCanvasSizeMainThread', '$findCanvasEventTarget'],
emscripten_get_canvas_element_size: (target, width, height) => {
var canvas = findCanvasEventTarget(target);
if (canvas) {
return getCanvasSizeCallingThread(target, width, height);
}
return getCanvasSizeMainThread(target, width, height);
},
#else
emscripten_get_canvas_element_size__deps: ['$findCanvasEventTarget'],
emscripten_get_canvas_element_size: (target, width, height) => {
var canvas = findCanvasEventTarget(target);
if (!canvas) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
{{{ makeSetValue('width', '0', 'canvas.width', 'i32') }}};
{{{ makeSetValue('height', '0', 'canvas.height', 'i32') }}};
},
#endif
$getCanvasElementSize__deps: ['emscripten_get_canvas_element_size', '$stackSave', '$stackRestore', '$stringToUTF8OnStack'],
$getCanvasElementSize: (target) => {
var sp = stackSave();
var w = stackAlloc(8);
var h = w + 4;
var targetInt = stringToUTF8OnStack(target.id);
var ret = _emscripten_get_canvas_element_size(targetInt, w, h);
var size = [{{{ makeGetValue('w', 0, 'i32')}}}, {{{ makeGetValue('h', 0, 'i32')}}}];
stackRestore(sp);
return size;
},
emscripten_set_element_css_size__proxy: 'sync',
emscripten_set_element_css_size__deps: ['$findEventTarget'],
emscripten_set_element_css_size: (target, width, height) => {
#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
target = findEventTarget(target);
#else
target = target ? findEventTarget(target) : Module['canvas'];
#endif
if (!target) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
target.style.width = width + "px";
target.style.height = height + "px";
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
emscripten_get_element_css_size__proxy: 'sync',
emscripten_get_element_css_size__deps: ['$findEventTarget', '$getBoundingClientRect'],
emscripten_get_element_css_size: (target, width, height) => {
#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
target = findEventTarget(target);
#else
target = target ? findEventTarget(target) : Module['canvas'];
#endif
if (!target) return {{{ cDefs.EMSCRIPTEN_RESULT_UNKNOWN_TARGET }}};
var rect = getBoundingClientRect(target);
{{{ makeSetValue('width', '0', 'rect.width', 'double') }}};
{{{ makeSetValue('height', '0', 'rect.height', 'double') }}};
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},
emscripten_html5_remove_all_event_listeners__deps: ['$JSEvents'],
emscripten_html5_remove_all_event_listeners: () => JSEvents.removeAllEventListeners(),
emscripten_request_animation_frame: (cb, userData) =>
requestAnimationFrame((timeStamp) => {{{ makeDynCall('idp', 'cb') }}}(timeStamp, userData)),
emscripten_cancel_animation_frame: (id) => cancelAnimationFrame(id),
emscripten_request_animation_frame_loop: (cb, userData) => {
function tick(timeStamp) {
if ({{{ makeDynCall('idp', 'cb') }}}(timeStamp, userData)) {
requestAnimationFrame(tick);
}
}
return requestAnimationFrame(tick);
},
emscripten_get_device_pixel_ratio__proxy: 'sync',
emscripten_get_device_pixel_ratio: () => {
#if ENVIRONMENT_MAY_BE_NODE || ENVIRONMENT_MAY_BE_SHELL
return (typeof devicePixelRatio == 'number' && devicePixelRatio) || 1.0;
#else
return devicePixelRatio;
#endif
}
};
addToLibrary(LibraryHTML5);