DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit 207e0ae8720faa4db6f34192d83a0ee3b85b832a
parent 8eb504d3eb6b4f9984503bedfbd3c02b7cb63d2b
Author: falkTX <falktx@falktx.com>
Date:   Thu, 29 Dec 2022 20:53:22 +0000

Handle full screen for wasm builds

Signed-off-by: falkTX <falktx@falktx.com>

Diffstat:
Mdgl/src/pugl-extra/wasm.c | 83++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
Mdgl/src/pugl-extra/wasm.h | 1+
2 files changed, 64 insertions(+), 20 deletions(-)

diff --git a/dgl/src/pugl-extra/wasm.c b/dgl/src/pugl-extra/wasm.c @@ -263,12 +263,14 @@ puglMouseCallback(const int eventType, const EmscriptenMouseEvent* const mouseEv double scaleFactor = view->world->impl->scaleFactor; #ifdef __MOD_DEVICES__ - scaleFactor /= EM_ASM_DOUBLE({ - return parseFloat( - RegExp('^scale\\\((.*)\\\)$') - .exec(document.getElementById("pedalboard-dashboard").style.transform)[1] - ); - }) * MOD_SCALE_FACTOR_MULT; + if (!view->impl->isFullscreen) { + scaleFactor /= EM_ASM_DOUBLE({ + return parseFloat( + RegExp('^scale\\\((.*)\\\)$') + .exec(document.getElementById("pedalboard-dashboard").style.transform)[1] + ); + }) * MOD_SCALE_FACTOR_MULT; + } #endif // workaround missing pointer lock callback, see https://github.com/emscripten-core/emscripten/issues/9681 @@ -400,12 +402,14 @@ puglTouchCallback(const int eventType, const EmscriptenTouchEvent* const touchEv double scaleFactor = view->world->impl->scaleFactor; #ifdef __MOD_DEVICES__ - scaleFactor /= EM_ASM_DOUBLE({ - return parseFloat( - RegExp('^scale\\\((.*)\\\)$') - .exec(document.getElementById("pedalboard-dashboard").style.transform)[1] - ); - }) * MOD_SCALE_FACTOR_MULT; + if (!view->impl->isFullscreen) { + scaleFactor /= EM_ASM_DOUBLE({ + return parseFloat( + RegExp('^scale\\\((.*)\\\)$') + .exec(document.getElementById("pedalboard-dashboard").style.transform)[1] + ); + }) * MOD_SCALE_FACTOR_MULT; + } #endif d_debug("touch %d|%s %d || %ld", @@ -517,12 +521,14 @@ puglWheelCallback(const int eventType, const EmscriptenWheelEvent* const wheelEv double scaleFactor = view->world->impl->scaleFactor; #ifdef __MOD_DEVICES__ - scaleFactor /= EM_ASM_DOUBLE({ - return parseFloat( - RegExp('^scale\\\((.*)\\\)$') - .exec(document.getElementById("pedalboard-dashboard").style.transform)[1] - ); - }) * MOD_SCALE_FACTOR_MULT; + if (!view->impl->isFullscreen) { + scaleFactor /= EM_ASM_DOUBLE({ + return parseFloat( + RegExp('^scale\\\((.*)\\\)$') + .exec(document.getElementById("pedalboard-dashboard").style.transform)[1] + ); + }) * MOD_SCALE_FACTOR_MULT; + } #endif PuglEvent event = {{PUGL_SCROLL, 0}}; @@ -570,18 +576,54 @@ puglUiCallback(const int eventType, const EmscriptenUiEvent* const uiEvent, void #endif view->world->impl->scaleFactor = scaleFactor; - emscripten_set_canvas_element_size(view->world->className, width * scaleFactor, height * scaleFactor); - PuglEvent event = {{PUGL_CONFIGURE, 0}}; event.configure.x = view->frame.x; event.configure.y = view->frame.y; event.configure.width = width * scaleFactor; event.configure.height = height * scaleFactor; puglDispatchEvent(view, &event); + + emscripten_set_canvas_element_size(view->world->className, width * scaleFactor, height * scaleFactor); return EM_TRUE; } static EM_BOOL +puglFullscreenChangeCallback(const int eventType, const EmscriptenFullscreenChangeEvent* const fscEvent, void* const userData) +{ + PuglView* const view = (PuglView*)userData; + + view->impl->isFullscreen = fscEvent->isFullscreen; + + double scaleFactor = emscripten_get_device_pixel_ratio(); +#ifdef __MOD_DEVICES__ + scaleFactor *= MOD_SCALE_FACTOR_MULT; +#endif + view->world->impl->scaleFactor = scaleFactor; + + if (fscEvent->isFullscreen) { + PuglEvent event = {{PUGL_CONFIGURE, 0}}; + event.configure.x = 0; + event.configure.y = 0; + event.configure.width = fscEvent->elementWidth * scaleFactor; + event.configure.height = fscEvent->elementHeight * scaleFactor; + puglDispatchEvent(view, &event); + + emscripten_set_canvas_element_size(view->world->className, + fscEvent->elementWidth * scaleFactor, + fscEvent->elementHeight * scaleFactor); + +#ifdef __MOD_DEVICES__ + EM_ASM({ + document.getElementById("pedalboard-dashboard").style.transform = "scale(1.0)"; + }); +#endif + return EM_TRUE; + } + + return puglUiCallback(0, NULL, userData); +} + +static EM_BOOL puglVisibilityChangeCallback(const int eventType, const EmscriptenVisibilityChangeEvent* const visibilityChangeEvent, void* const userData) { PuglView* const view = (PuglView*)userData; @@ -665,6 +707,7 @@ puglRealize(PuglView* const view) emscripten_set_wheel_callback(className, view, false, puglWheelCallback); emscripten_set_pointerlockchange_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, view, false, puglPointerLockChangeCallback); emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, view, false, puglUiCallback); + emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, view, false, puglFullscreenChangeCallback); emscripten_set_visibilitychange_callback(view, false, puglVisibilityChangeCallback); printf("TODO: %s %d\n", __func__, __LINE__); diff --git a/dgl/src/pugl-extra/wasm.h b/dgl/src/pugl-extra/wasm.h @@ -26,6 +26,7 @@ struct LastMotionValues { struct PuglInternalsImpl { PuglSurface* surface; + bool isFullscreen; bool needsRepaint; bool pointerLocked; uint32_t numTimers;