diff --git a/src/lib/libhtml5.js b/src/lib/libhtml5.js
index 6c28e9b5471f7..67f073a7ff7d9 100644
--- a/src/lib/libhtml5.js
+++ b/src/lib/libhtml5.js
@@ -51,10 +51,6 @@ var LibraryHTML5 = {
currentEventHandler: null,
#endif
*/
- memcpy(target, src, size) {
- HEAP8.set(HEAP8.subarray(src, src + size), target);
- },
-
removeAllEventListeners() {
while (JSEvents.eventHandlers.length) {
JSEvents._removeHandler(JSEvents.eventHandlers.length - 1);
@@ -551,16 +547,14 @@ var LibraryHTML5 = {
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 }}};
- // HTML5 does not really have a polling API for mouse events, so implement one manually by
- // returning the data from the most recently received event. This requires that user has registered
- // at least some no-op function as an event handler to any of the mouse function.
- JSEvents.memcpy(mouseState, JSEvents.mouseEvent, {{{ C_STRUCTS.EmscriptenMouseEvent.__size__ }}});
- return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
- },
+ // HTML5 does not really have a polling API for mouse events, so implement one
+ // manually by returning the data from the most recently received event. This
+ // requires that user has registered at least some no-op function as an event
+ // handler to any of the mouse function.
+ _emscripten_get_last_mouse_event__proxy: 'sync',
+ _emscripten_get_last_mouse_event__internal: true,
+ _emscripten_get_last_mouse_event__deps: ['$JSEvents'],
+ _emscripten_get_last_mouse_event: () => JSEvents.mouseEvent,
$registerWheelEventCallback__noleakcheck: true,
$registerWheelEventCallback__deps: ['$JSEvents', '$fillMouseEventData', 'malloc'],
@@ -778,16 +772,14 @@ var LibraryHTML5 = {
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 }}};
- // HTML5 does not really have a polling API for device orientation events, so implement one manually by
- // returning the data from the most recently received event. This requires that user has registered
- // at least some no-op function as an event handler.
- JSEvents.memcpy(orientationState, JSEvents.deviceOrientationEvent, {{{ C_STRUCTS.EmscriptenDeviceOrientationEvent.__size__ }}});
- return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
- },
+ // HTML5 does not really have a polling API for device orientation events, so
+ // implement one manually by returning the data from the most recently
+ // received event. This requires that user has registered at least some
+ // no-op function as an event handler.
+ _emscripten_get_last_deviceorientation_event__proxy: 'sync',
+ _emscripten_get_last_deviceorientation_event__internal: true,
+ _emscripten_get_last_deviceorientation_event__deps: ['$JSEvents'],
+ _emscripten_get_last_deviceorientation_event: () => JSEvents.deviceOrientationEvent,
$fillDeviceMotionEventData: (eventStruct, e, target) => {
var supportedFields = 0;
@@ -847,16 +839,14 @@ var LibraryHTML5 = {
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 }}};
- // HTML5 does not really have a polling API for device motion events, so implement one manually by
- // returning the data from the most recently received event. This requires that user has registered
- // at least some no-op function as an event handler.
- JSEvents.memcpy(motionState, JSEvents.deviceMotionEvent, {{{ C_STRUCTS.EmscriptenDeviceMotionEvent.__size__ }}});
- return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
- },
+ // HTML5 does not really have a polling API for device motion events, so
+ // implement one manually by returning the data from the most recently
+ // received event. This requires that user has registered at least some
+ // no-op function as an event handler.
+ _emscripten_get_last_devicemotion_event__proxy: 'sync',
+ _emscripten_get_last_devicemotion_event__internal: true,
+ _emscripten_get_last_devicemotion_event__deps: ['$JSEvents'],
+ _emscripten_get_last_devicemotion_event: () => JSEvents.deviceMotionEvent,
$screenOrientation: () => {
if (!window.screen) return undefined;
diff --git a/src/lib/libsigs.js b/src/lib/libsigs.js
index e2b5f43371de6..6790d6fd6bcf4 100644
--- a/src/lib/libsigs.js
+++ b/src/lib/libsigs.js
@@ -320,6 +320,9 @@ sigs = {
_emscripten_fetch_get_response_headers__sig: 'pipp',
_emscripten_fetch_get_response_headers_length__sig: 'pi',
_emscripten_fs_load_embedded_files__sig: 'vp',
+ _emscripten_get_last_devicemotion_event__sig: 'p',
+ _emscripten_get_last_deviceorientation_event__sig: 'p',
+ _emscripten_get_last_mouse_event__sig: 'p',
_emscripten_get_now_is_monotonic__sig: 'i',
_emscripten_get_progname__sig: 'vpi',
_emscripten_init_main_thread_js__sig: 'vp',
@@ -642,15 +645,12 @@ sigs = {
emscripten_get_canvas_size__sig: 'vppp',
emscripten_get_compiler_setting__sig: 'pp',
emscripten_get_device_pixel_ratio__sig: 'd',
- emscripten_get_devicemotion_status__sig: 'ip',
- emscripten_get_deviceorientation_status__sig: 'ip',
emscripten_get_element_css_size__sig: 'ippp',
emscripten_get_exported_function__sig: 'pp',
emscripten_get_fullscreen_status__sig: 'ip',
emscripten_get_gamepad_status__sig: 'iip',
emscripten_get_heap_max__sig: 'p',
emscripten_get_main_loop_timing__sig: 'vpp',
- emscripten_get_mouse_status__sig: 'ip',
emscripten_get_now__sig: 'd',
emscripten_get_now_res__sig: 'd',
emscripten_get_num_gamepads__sig: 'i',
diff --git a/system/lib/html5/callback.c b/system/lib/html5/callback.c
index 981a04f2013df..c0cc9b80b28e4 100644
--- a/system/lib/html5/callback.c
+++ b/system/lib/html5/callback.c
@@ -42,3 +42,23 @@ void _emscripten_run_callback_on_thread(pthread_t t,
assert(false && "emscripten_proxy_async failed");
}
}
+
+static EMSCRIPTEN_RESULT _get_last_event(void* out, void *latest, size_t len) {
+ if (!latest) {
+ return EMSCRIPTEN_RESULT_NO_DATA;
+ }
+ memcpy(out, latest, len);
+ return EMSCRIPTEN_RESULT_SUCCESS;
+}
+
+EMSCRIPTEN_RESULT emscripten_get_deviceorientation_status(EmscriptenDeviceOrientationEvent *out) {
+ return _get_last_event(out, _emscripten_get_last_deviceorientation_event(), sizeof(*out));
+}
+
+EMSCRIPTEN_RESULT emscripten_get_devicemotion_status(EmscriptenDeviceMotionEvent *out) {
+ return _get_last_event(out, _emscripten_get_last_devicemotion_event(), sizeof(*out));
+}
+
+EMSCRIPTEN_RESULT emscripten_get_mouse_status(EmscriptenMouseEvent *out) {
+ return _get_last_event(out, _emscripten_get_last_mouse_event(), sizeof(*out));
+}
diff --git a/system/lib/libc/emscripten_internal.h b/system/lib/libc/emscripten_internal.h
index 6b6eb97693ab9..599f98ad445f8 100644
--- a/system/lib/libc/emscripten_internal.h
+++ b/system/lib/libc/emscripten_internal.h
@@ -147,6 +147,10 @@ int _emscripten_system(const char *command);
void _emscripten_log_formatted(int flags, const char* str);
+EmscriptenDeviceOrientationEvent* _emscripten_get_last_deviceorientation_event();
+EmscriptenDeviceMotionEvent* _emscripten_get_last_devicemotion_event();
+EmscriptenMouseEvent* _emscripten_get_last_mouse_event();
+
#ifdef __cplusplus
}
#endif
diff --git a/test/codesize/test_codesize_hello_dylink_all.json b/test/codesize/test_codesize_hello_dylink_all.json
index 0c2e7110427d1..d8afa1e025859 100644
--- a/test/codesize/test_codesize_hello_dylink_all.json
+++ b/test/codesize/test_codesize_hello_dylink_all.json
@@ -1,7 +1,7 @@
{
- "a.out.js": 245475,
- "a.out.nodebug.wasm": 573783,
- "total": 819258,
+ "a.out.js": 245299,
+ "a.out.nodebug.wasm": 574162,
+ "total": 819461,
"sent": [
"IMG_Init",
"IMG_Load",
@@ -270,6 +270,9 @@
"_dlsym_js",
"_emscripten_dlopen_js",
"_emscripten_fs_load_embedded_files",
+ "_emscripten_get_last_devicemotion_event",
+ "_emscripten_get_last_deviceorientation_event",
+ "_emscripten_get_last_mouse_event",
"_emscripten_get_now_is_monotonic",
"_emscripten_get_progname",
"_emscripten_log_formatted",
@@ -461,14 +464,11 @@
"emscripten_get_canvas_size",
"emscripten_get_compiler_setting",
"emscripten_get_device_pixel_ratio",
- "emscripten_get_devicemotion_status",
- "emscripten_get_deviceorientation_status",
"emscripten_get_element_css_size",
"emscripten_get_fullscreen_status",
"emscripten_get_gamepad_status",
"emscripten_get_heap_max",
"emscripten_get_main_loop_timing",
- "emscripten_get_mouse_status",
"emscripten_get_now",
"emscripten_get_now_res",
"emscripten_get_num_gamepads",
@@ -1457,6 +1457,9 @@
"env._dlopen_js",
"env._dlsym_js",
"env._emscripten_dlopen_js",
+ "env._emscripten_get_last_devicemotion_event",
+ "env._emscripten_get_last_deviceorientation_event",
+ "env._emscripten_get_last_mouse_event",
"env._emscripten_get_progname",
"env._emscripten_log_formatted",
"env._emscripten_lookup_name",
@@ -2220,7 +2223,10 @@
"emscripten_fiber_init_from_current_context",
"emscripten_futex_wait",
"emscripten_futex_wake",
+ "emscripten_get_devicemotion_status",
+ "emscripten_get_deviceorientation_status",
"emscripten_get_heap_size",
+ "emscripten_get_mouse_status",
"emscripten_get_sbrk_ptr",
"emscripten_has_threading_support",
"emscripten_is_main_runtime_thread",
@@ -4082,7 +4088,10 @@
"$emscripten_fiber_init",
"$emscripten_fiber_init_from_current_context",
"$emscripten_futex_wait",
+ "$emscripten_get_devicemotion_status",
+ "$emscripten_get_deviceorientation_status",
"$emscripten_get_heap_size",
+ "$emscripten_get_mouse_status",
"$emscripten_get_sbrk_ptr",
"$emscripten_log",
"$emscripten_longjmp",