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",