var LibraryJsEvents = {
$JsEvents: {
// pointers to structs malloc()ed to Emscripten HEAP for JS->C interop.
keyEvent: 0,
mouseEvent: 0,
wheelEvent: 0,
uiEvent: 0,
focusEvent: 0,
deviceOrientationEvent: 0,
deviceMotionEvent: 0,
fullscreenChangeEvent: 0,
pointerlockChangeEvent: 0,
visibilityChangeEvent: 0,
touchEvent: 0,
// When the C runtime exits via exit(), we unregister all event handlers added by this library to be nice and clean.
// Track in this field whether we have yet registered that __ATEXIT__ handler.
removeEventListenersRegistered: false,
registerRemoveEventListeners: function() {
if (!JsEvents.removeEventListenersRegistered) {
__ATEXIT__.push({ func: function() {
for(var i = JsEvents.eventHandlers.length-1; i >= 0; --i) {
JsEvents._removeHandler(i);
}
} });
JsEvents.removeEventListenersRegistered = true;
}
},
findEventTarget: function(target) {
if (target) {
if (typeof target == "number") {
target = Pointer_stringify(target);
}
if (target == '#window') {
return window;
} else if (target == '#document') {
return document;
} else if (target == '#screen') {
return window.screen;
} else if (target == '#canvas') {
return Module['canvas'];
}
if (typeof target == 'string') {
return document.getElementById(target);
} else {
return target;
}
} else {
// The sensible target varies between events, but use window as the default
// since DOM events mostly can default to that. Specific callback registrations
// override their own defaults.
return window;
}
},
deferredCalls: [],
// Queues the given function call to occur the next time we enter an event handler.
// Existing implementations of pointerlock apis have required that
// the target element is active in fullscreen mode first. Thefefore give
// fullscreen mode request a precedence of 1 and pointer lock a precedence of 2
// and sort by that to always request fullscreen before pointer lock.
deferCall: function(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;
}
// Test if the given call was already queued, and if so, don't add it again.
for(var i in JsEvents.deferredCalls) {
var call = JsEvents.deferredCalls[