Browse Source

wasm: deal with offset within a page, allow to skip mousewheel

pull/421/head
falkTX 2 years ago
parent
commit
1412663c85
1 changed files with 54 additions and 13 deletions
  1. +54
    -13
      dgl/src/pugl-extra/wasm.c

+ 54
- 13
dgl/src/pugl-extra/wasm.c View File

@@ -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);


Loading…
Cancel
Save