Add wasm things to menus, fix up event handling

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2022-07-10 03:56:35 +01:00
parent d1d08e4704
commit 48a01f0b22
No known key found for this signature in database
GPG key ID: CDBAA37ABC74FBA0
6 changed files with 74 additions and 11 deletions

2
dpf

@ -1 +1 @@
Subproject commit 02216aba747685fe3d8c1e7b95d7fc008249fee2 Subproject commit f022c766bd315b5bb22800b9ab78a4e1ec991edc

View file

@ -504,7 +504,4 @@ void ImGuiWidget::drawFramebufferCommon(const Vec& fbSize, const float scaleFact
ImGui_ImplOpenGL2_RenderDrawData(data); ImGui_ImplOpenGL2_RenderDrawData(data);
#endif #endif
} }
// FIXME
io.KeysDown[GLFW_KEY_DELETE] = io.KeysDown[GLFW_KEY_BACKSPACE] = io.KeysDown[GLFW_KEY_ENTER] = false;
} }

View file

@ -136,7 +136,11 @@ struct Initializer
{ {
using namespace rack; using namespace rack;
#ifdef DISTRHO_OS_WASM
settings::allowCursorLock = true;
#else
settings::allowCursorLock = false; settings::allowCursorLock = false;
#endif
settings::autoCheckUpdates = false; settings::autoCheckUpdates = false;
settings::autosaveInterval = 0; settings::autosaveInterval = 0;
settings::devMode = true; settings::devMode = true;

View file

@ -110,7 +110,12 @@ struct FileButton : MenuButton {
menu->cornerFlags = BND_CORNER_TOP; menu->cornerFlags = BND_CORNER_TOP;
menu->box.pos = getAbsoluteOffset(math::Vec(0, box.size.y)); menu->box.pos = getAbsoluteOffset(math::Vec(0, box.size.y));
menu->addChild(createMenuItem("New", RACK_MOD_CTRL_NAME "+N", []() { #ifndef DISTRHO_OS_WASM
const char* const NewShortcut = RACK_MOD_CTRL_NAME "+N";
#else
const char* const NewShortcut = "";
#endif
menu->addChild(createMenuItem("New", NewShortcut, []() {
patchUtils::loadTemplateDialog(); patchUtils::loadTemplateDialog();
})); }));
@ -523,7 +528,9 @@ struct ViewButton : MenuButton {
menu->addChild(new ui::MenuSeparator); menu->addChild(new ui::MenuSeparator);
menu->addChild(createMenuLabel("Parameters")); menu->addChild(createMenuLabel("Parameters"));
// menu->addChild(createBoolPtrMenuItem("Lock cursor while dragging", "", &settings::allowCursorLock)); #ifdef DISTRHO_OS_WASM
menu->addChild(createBoolPtrMenuItem("Lock cursor while dragging", "", &settings::allowCursorLock));
#endif
static const std::vector<std::string> knobModeLabels = { static const std::vector<std::string> knobModeLabels = {
"Linear", "Linear",
@ -550,6 +557,16 @@ struct ViewButton : MenuButton {
menu->addChild(new ui::MenuSeparator); menu->addChild(new ui::MenuSeparator);
menu->addChild(createMenuLabel("Window")); menu->addChild(createMenuLabel("Window"));
#ifdef DISTRHO_OS_WASM
const bool fullscreen = APP->window->isFullScreen();
std::string fullscreenText = "F11";
if (fullscreen)
fullscreenText += " " CHECKMARK_STRING;
menu->addChild(createMenuItem("Fullscreen", fullscreenText, [=]() {
APP->window->setFullScreen(!fullscreen);
}));
#endif
menu->addChild(createBoolPtrMenuItem("Invert zoom", "", &settings::invertZoom)); menu->addChild(createBoolPtrMenuItem("Invert zoom", "", &settings::invertZoom));
static const std::vector<std::string> rateLimitLabels = { static const std::vector<std::string> rateLimitLabels = {

View file

@ -360,6 +360,12 @@ void Scene::onHoverKey(const HoverKeyEvent& e) {
window::generateScreenshot(); window::generateScreenshot();
e.consume(this); e.consume(this);
} }
#ifdef DISTRHO_OS_WASM
if (e.key == GLFW_KEY_F11 && (e.mods & RACK_MOD_MASK) == 0) {
APP->window->setFullScreen(!APP->window->isFullScreen());
e.consume(this);
}
#endif
// Module selections // Module selections
if (e.keyName == "a" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { if (e.keyName == "a" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {

View file

@ -62,6 +62,10 @@
# include "src/Resources.hpp" # include "src/Resources.hpp"
#endif #endif
#ifdef DISTRHO_OS_WASM
# include <emscripten/html5.h>
#endif
namespace rack { namespace rack {
namespace window { namespace window {
@ -172,7 +176,11 @@ struct Window::Internal {
Internal() Internal()
: hiddenApp(false), : hiddenApp(false),
hiddenWindow(hiddenApp) { hiddenApp.idle(); } hiddenWindow(hiddenApp)
{
hiddenWindow.setIgnoringKeyRepeat(true);
hiddenApp.idle();
}
}; };
@ -224,6 +232,10 @@ Window::Window() {
if (uiFont != nullptr) if (uiFont != nullptr)
bndSetFont(uiFont->handle); bndSetFont(uiFont->handle);
#ifdef DISTRHO_OS_WASM
emscripten_lock_orientation(EMSCRIPTEN_ORIENTATION_LANDSCAPE_PRIMARY);
#endif
} }
void WindowSetPluginUI(Window* const window, DISTRHO_NAMESPACE::UI* const ui) void WindowSetPluginUI(Window* const window, DISTRHO_NAMESPACE::UI* const ui)
@ -536,7 +548,7 @@ void Window::step() {
#ifdef STBI_WRITE_NO_STDIO #ifdef STBI_WRITE_NO_STDIO
Window__downscaleBitmap(pixelsWithOffset, winWidth, winHeight); Window__downscaleBitmap(pixelsWithOffset, winWidth, winHeight);
stbi_write_png_to_func(Window__writeImagePNG, internal->ui, stbi_write_png_to_func(Window__writeImagePNG, internal->ui,
winWidth, winHeight, depth, pixelsWithOffset, stride); winWidth, winHeight, depth, pixelsWithOffset, stride);
#else #else
stbi_write_png("screenshot.png", winWidth, winHeight, depth, pixelsWithOffset, stride); stbi_write_png("screenshot.png", winWidth, winHeight, depth, pixelsWithOffset, stride);
#endif #endif
@ -572,14 +584,31 @@ void Window::close() {
void Window::cursorLock() { void Window::cursorLock() {
#ifdef DISTRHO_OS_WASM
if (!settings::allowCursorLock)
return;
emscripten_request_pointerlock(internal->ui->getWindow().getApp().getClassName(), false);
#endif
} }
void Window::cursorUnlock() { void Window::cursorUnlock() {
#ifdef DISTRHO_OS_WASM
if (!settings::allowCursorLock)
return;
emscripten_exit_pointerlock();
#endif
} }
bool Window::isCursorLocked() { bool Window::isCursorLocked() {
#ifdef DISTRHO_OS_WASM
EmscriptenPointerlockChangeEvent status;
if (emscripten_get_pointerlock_status(&status) == EMSCRIPTEN_RESULT_SUCCESS)
return status.isActive;
#endif
return false; return false;
} }
@ -589,19 +618,29 @@ int Window::getMods() {
} }
void Window::setFullScreen(bool) { void Window::setFullScreen(const bool fullscreen) {
#ifdef DISTRHO_OS_WASM
if (fullscreen)
emscripten_request_fullscreen(internal->ui->getWindow().getApp().getClassName(), false);
else
emscripten_exit_fullscreen();
#endif
} }
bool Window::isFullScreen() { bool Window::isFullScreen() {
#if defined(CARDINAL_TRANSPARENT_SCREENSHOTS) && !defined(DGL_USE_GLES) #ifdef DISTRHO_OS_WASM
EmscriptenFullscreenChangeEvent status;
if (emscripten_get_fullscreen_status(&status) == EMSCRIPTEN_RESULT_SUCCESS)
return status.isFullscreen;
return false;
#elif defined(CARDINAL_TRANSPARENT_SCREENSHOTS) && !defined(DGL_USE_GLES)
return internal->generateScreenshotStep != kScreenshotStepNone; return internal->generateScreenshotStep != kScreenshotStepNone;
#else #else
return false; return false;
#endif #endif
} }
double Window::getMonitorRefreshRate() { double Window::getMonitorRefreshRate() {
return internal->monitorRefreshRate; return internal->monitorRefreshRate;
} }