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 we transition from fullscreen to windowed mode, we remember here the element that was just in fullscreen mode
// so that we can report information about that element in the event message.
previousFullscreenElement: null,
// Remember the current mouse coordinates in case we need to emulate movementXY generation for browsers that don't support it.
// Some browsers (e.g. Safari 6.0.5) only give movementXY when Pointerlock is active.
previousScreenX: null,
previousScreenY: null,
// 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