| @@ -26,6 +26,7 @@ | |||||
| // #define PUGL_WASM_AUTO_POINTER_LOCK | // #define PUGL_WASM_AUTO_POINTER_LOCK | ||||
| // #define PUGL_WASM_NO_KEYBOARD_INPUT | // #define PUGL_WASM_NO_KEYBOARD_INPUT | ||||
| // #define PUGL_WASM_NO_MOUSEWHEEL_INPUT | |||||
| PuglWorldInternals* | PuglWorldInternals* | ||||
| puglInitWorldInternals(const PuglWorldType type, const PuglWorldFlags flags) | puglInitWorldInternals(const PuglWorldType type, const PuglWorldFlags flags) | ||||
| @@ -285,8 +286,15 @@ puglMouseCallback(const int eventType, const EmscriptenMouseEvent* const mouseEv | |||||
| const long canvasX = mouseEvent->canvasX; | const long canvasX = mouseEvent->canvasX; | ||||
| const long canvasY = mouseEvent->canvasY; | const long canvasY = mouseEvent->canvasY; | ||||
| #else | #else | ||||
| const long canvasX = mouseEvent->clientX; | |||||
| const long canvasY = mouseEvent->clientY; | |||||
| const char* const className = view->world->className; | |||||
| const double canvasX = mouseEvent->clientX - EM_ASM_INT({ | |||||
| var canvasWrapper = document.getElementById(UTF8ToString($0)).parentElement; | |||||
| return canvasWrapper.getBoundingClientRect().x; | |||||
| }, className); | |||||
| const double canvasY = mouseEvent->clientY - EM_ASM_INT({ | |||||
| var canvasWrapper = document.getElementById(UTF8ToString($0)).parentElement; | |||||
| return canvasWrapper.getBoundingClientRect().y; | |||||
| }, className); | |||||
| #endif | #endif | ||||
| switch (eventType) { | switch (eventType) { | ||||
| @@ -387,14 +395,14 @@ puglTouchCallback(const int eventType, const EmscriptenTouchEvent* const touchEv | |||||
| return EM_FALSE; | return EM_FALSE; | ||||
| } | } | ||||
| PuglView* const view = (PuglView*)userData; | |||||
| PuglInternals* const impl = view->impl; | |||||
| PuglView* const view = (PuglView*)userData; | |||||
| PuglInternals* const impl = view->impl; | |||||
| const char* const className = view->world->className; | |||||
| if (impl->supportsTouch == PUGL_DONT_CARE) { | if (impl->supportsTouch == PUGL_DONT_CARE) { | ||||
| impl->supportsTouch = PUGL_TRUE; | impl->supportsTouch = PUGL_TRUE; | ||||
| // stop using mouse press events which conflict with touch | // stop using mouse press events which conflict with touch | ||||
| const char* const className = view->world->className; | |||||
| emscripten_set_mousedown_callback(className, view, false, NULL); | emscripten_set_mousedown_callback(className, view, false, NULL); | ||||
| emscripten_set_mouseup_callback(className, view, false, NULL); | emscripten_set_mouseup_callback(className, view, false, NULL); | ||||
| } | } | ||||
| @@ -445,14 +453,28 @@ puglTouchCallback(const int eventType, const EmscriptenTouchEvent* const touchEv | |||||
| puglDispatchEventWithContext(view, &impl->nextButtonEvent); | puglDispatchEventWithContext(view, &impl->nextButtonEvent); | ||||
| } | } | ||||
| #ifdef __MOD_DEVICES__ | |||||
| const long canvasX = point->canvasX; | |||||
| const long canvasY = point->canvasY; | |||||
| #else | |||||
| const double canvasX = point->clientX - EM_ASM_INT({ | |||||
| var canvasWrapper = document.getElementById(UTF8ToString($0)).parentElement; | |||||
| return canvasWrapper.getBoundingClientRect().x; | |||||
| }, className); | |||||
| const double canvasY = point->clientY - EM_ASM_INT({ | |||||
| var canvasWrapper = document.getElementById(UTF8ToString($0)).parentElement; | |||||
| return canvasWrapper.getBoundingClientRect().y; | |||||
| }, className); | |||||
| #endif | |||||
| switch (eventType) { | switch (eventType) { | ||||
| case EMSCRIPTEN_EVENT_TOUCHEND: | case EMSCRIPTEN_EVENT_TOUCHEND: | ||||
| case EMSCRIPTEN_EVENT_TOUCHCANCEL: | case EMSCRIPTEN_EVENT_TOUCHCANCEL: | ||||
| event.button.type = PUGL_BUTTON_RELEASE; | event.button.type = PUGL_BUTTON_RELEASE; | ||||
| event.button.time = time; | event.button.time = time; | ||||
| event.button.button = eventType == EMSCRIPTEN_EVENT_TOUCHCANCEL ? 1 : 0; | event.button.button = eventType == EMSCRIPTEN_EVENT_TOUCHCANCEL ? 1 : 0; | ||||
| event.button.x = point->canvasX * scaleFactor; | |||||
| event.button.y = point->canvasY * scaleFactor; | |||||
| event.button.x = canvasX * scaleFactor; | |||||
| event.button.y = canvasY * scaleFactor; | |||||
| event.button.xRoot = point->screenX * scaleFactor; | event.button.xRoot = point->screenX * scaleFactor; | ||||
| event.button.yRoot = point->screenY * scaleFactor; | event.button.yRoot = point->screenY * scaleFactor; | ||||
| event.button.state = state; | event.button.state = state; | ||||
| @@ -463,8 +485,8 @@ puglTouchCallback(const int eventType, const EmscriptenTouchEvent* const touchEv | |||||
| event.button.type = PUGL_BUTTON_PRESS; | event.button.type = PUGL_BUTTON_PRESS; | ||||
| event.button.time = time; | event.button.time = time; | ||||
| event.button.button = 1; // if no other event occurs soon, treat it as right-click | event.button.button = 1; // if no other event occurs soon, treat it as right-click | ||||
| event.button.x = point->canvasX * scaleFactor; | |||||
| event.button.y = point->canvasY * scaleFactor; | |||||
| event.button.x = canvasX * scaleFactor; | |||||
| event.button.y = canvasY * scaleFactor; | |||||
| event.button.xRoot = point->screenX * scaleFactor; | event.button.xRoot = point->screenX * scaleFactor; | ||||
| event.button.yRoot = point->screenY * scaleFactor; | event.button.yRoot = point->screenY * scaleFactor; | ||||
| event.button.state = state; | event.button.state = state; | ||||
| @@ -475,8 +497,8 @@ puglTouchCallback(const int eventType, const EmscriptenTouchEvent* const touchEv | |||||
| case EMSCRIPTEN_EVENT_TOUCHMOVE: | case EMSCRIPTEN_EVENT_TOUCHMOVE: | ||||
| event.motion.type = PUGL_MOTION; | event.motion.type = PUGL_MOTION; | ||||
| event.motion.time = time; | event.motion.time = time; | ||||
| event.motion.x = point->canvasX * scaleFactor; | |||||
| event.motion.y = point->canvasY * scaleFactor; | |||||
| event.motion.x = canvasX * scaleFactor; | |||||
| event.motion.y = canvasY * scaleFactor; | |||||
| event.motion.xRoot = point->screenX * scaleFactor; | event.motion.xRoot = point->screenX * scaleFactor; | ||||
| event.motion.yRoot = point->screenY * scaleFactor; | event.motion.yRoot = point->screenY * scaleFactor; | ||||
| event.motion.state = state; | event.motion.state = state; | ||||
| @@ -521,6 +543,7 @@ puglPointerLockChangeCallback(const int eventType, const EmscriptenPointerlockCh | |||||
| return EM_TRUE; | return EM_TRUE; | ||||
| } | } | ||||
| #ifndef PUGL_WASM_NO_MOUSEWHEEL_INPUT | |||||
| static EM_BOOL | static EM_BOOL | ||||
| puglWheelCallback(const int eventType, const EmscriptenWheelEvent* const wheelEvent, void* const userData) | puglWheelCallback(const int eventType, const EmscriptenWheelEvent* const wheelEvent, void* const userData) | ||||
| { | { | ||||
| @@ -542,10 +565,25 @@ puglWheelCallback(const int eventType, const EmscriptenWheelEvent* const wheelEv | |||||
| } | } | ||||
| #endif | #endif | ||||
| #ifdef __MOD_DEVICES__ | |||||
| const long canvasX = wheelEvent->mouse.canvasX; | |||||
| const long canvasY = wheelEvent->mouse.canvasY; | |||||
| #else | |||||
| const char* const className = view->world->className; | |||||
| const double canvasX = wheelEvent->mouse.canvasX - EM_ASM_INT({ | |||||
| var canvasWrapper = document.getElementById(UTF8ToString($0)).parentElement; | |||||
| return canvasWrapper.getBoundingClientRect().x; | |||||
| }, className); | |||||
| const double canvasY = wheelEvent->mouse.canvasY - EM_ASM_INT({ | |||||
| var canvasWrapper = document.getElementById(UTF8ToString($0)).parentElement; | |||||
| return canvasWrapper.getBoundingClientRect().y; | |||||
| }, className); | |||||
| #endif | |||||
| PuglEvent event = {{PUGL_SCROLL, 0}}; | PuglEvent event = {{PUGL_SCROLL, 0}}; | ||||
| event.scroll.time = wheelEvent->mouse.timestamp / 1e3; | event.scroll.time = wheelEvent->mouse.timestamp / 1e3; | ||||
| event.scroll.x = wheelEvent->mouse.canvasX; | |||||
| event.scroll.y = wheelEvent->mouse.canvasY; | |||||
| event.scroll.x = canvasX; | |||||
| event.scroll.y = canvasY; | |||||
| event.scroll.xRoot = wheelEvent->mouse.screenX; | event.scroll.xRoot = wheelEvent->mouse.screenX; | ||||
| event.scroll.yRoot = wheelEvent->mouse.screenY; | event.scroll.yRoot = wheelEvent->mouse.screenY; | ||||
| event.scroll.state = translateModifiers(wheelEvent->mouse.ctrlKey, | event.scroll.state = translateModifiers(wheelEvent->mouse.ctrlKey, | ||||
| @@ -559,6 +597,7 @@ puglWheelCallback(const int eventType, const EmscriptenWheelEvent* const wheelEv | |||||
| return puglDispatchEventWithContext(view, &event) == PUGL_SUCCESS ? EM_TRUE : EM_FALSE; | return puglDispatchEventWithContext(view, &event) == PUGL_SUCCESS ? EM_TRUE : EM_FALSE; | ||||
| } | } | ||||
| #endif | |||||
| static EM_BOOL | static EM_BOOL | ||||
| puglUiCallback(const int eventType, const EmscriptenUiEvent* const uiEvent, void* const userData) | puglUiCallback(const int eventType, const EmscriptenUiEvent* const uiEvent, void* const userData) | ||||
| @@ -717,7 +756,9 @@ puglRealize(PuglView* const view) | |||||
| emscripten_set_mouseleave_callback(className, view, false, puglMouseCallback); | emscripten_set_mouseleave_callback(className, view, false, puglMouseCallback); | ||||
| emscripten_set_focusin_callback(className, view, false, puglFocusCallback); | emscripten_set_focusin_callback(className, view, false, puglFocusCallback); | ||||
| emscripten_set_focusout_callback(className, view, false, puglFocusCallback); | emscripten_set_focusout_callback(className, view, false, puglFocusCallback); | ||||
| #ifndef PUGL_WASM_NO_MOUSEWHEEL_INPUT | |||||
| emscripten_set_wheel_callback(className, view, false, puglWheelCallback); | emscripten_set_wheel_callback(className, view, false, puglWheelCallback); | ||||
| #endif | |||||
| emscripten_set_pointerlockchange_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, view, false, puglPointerLockChangeCallback); | emscripten_set_pointerlockchange_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, view, false, puglPointerLockChangeCallback); | ||||
| emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, view, false, puglUiCallback); | emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, view, false, puglUiCallback); | ||||
| emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, view, false, puglFullscreenChangeCallback); | emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, view, false, puglFullscreenChangeCallback); | ||||