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:
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;