Signed-off-by: falkTX <falktx@falktx.com>pull/457/head
| @@ -48,10 +48,7 @@ if(DPF_EXAMPLES) | |||
| add_subdirectory("examples/CairoUI") | |||
| endif() | |||
| endif() | |||
| if((NOT WIN32) AND (NOT APPLE)) | |||
| add_subdirectory("examples/ExternalUI") | |||
| endif() | |||
| add_subdirectory("examples/EmbedExternalUI") | |||
| #add_subdirectory("examples/EmbedExternalUI") | |||
| add_subdirectory("examples/FileHandling") | |||
| add_subdirectory("examples/Info") | |||
| add_subdirectory("examples/Latency") | |||
| @@ -35,9 +35,9 @@ examples: dgl | |||
| ifeq ($(HAVE_CAIRO),true) | |||
| $(MAKE) all -C examples/CairoUI | |||
| endif | |||
| ifeq ($(HAVE_DGL),true) | |||
| $(MAKE) all -C examples/EmbedExternalUI | |||
| endif | |||
| # ifeq ($(HAVE_DGL),true) | |||
| # $(MAKE) all -C examples/EmbedExternalUI | |||
| # endif | |||
| ifeq ($(CAN_GENERATE_TTL),true) | |||
| gen: examples utils/lv2_ttl_generator | |||
| @@ -185,6 +185,9 @@ ifeq ($(HAVE_OPENGL),true) | |||
| UI_TYPE = opengl | |||
| else ifeq ($(HAVE_CAIRO),true) | |||
| UI_TYPE = cairo | |||
| else | |||
| HAVE_DGL = false | |||
| UI_TYPE = none | |||
| endif | |||
| endif | |||
| @@ -236,20 +239,11 @@ HAVE_DGL = false | |||
| endif | |||
| endif | |||
| ifeq ($(UI_TYPE),web) | |||
| DGL_FLAGS += -DDGL_WEB -DHAVE_DGL | |||
| DGL_LIB = $(DGL_BUILD_DIR)/libdgl-web.a | |||
| HAVE_DGL = true | |||
| USE_WEBVIEW = true | |||
| endif | |||
| ifeq ($(UI_TYPE),external) | |||
| DGL_FLAGS += -DDGL_EXTERNAL | |||
| HAVE_DGL = true | |||
| endif | |||
| ifeq ($(UI_TYPE),stub) | |||
| DGL_FLAGS += -DDGL_EXTERNAL -DHAVE_DGL | |||
| ifeq ($(HAVE_STUB),true) | |||
| DGL_FLAGS += $(STUB_FLAGS) | |||
| DGL_LIBS += $(STUB_LIBS) | |||
| DGL_LIB = $(DGL_BUILD_DIR)/libdgl-stub.a | |||
| HAVE_DGL = true | |||
| else | |||
| @@ -257,6 +251,13 @@ HAVE_DGL = false | |||
| endif | |||
| endif | |||
| ifeq ($(UI_TYPE),web) | |||
| DGL_FLAGS += -DDGL_WEB -DHAVE_DGL | |||
| DGL_LIB = $(DGL_BUILD_DIR)/libdgl-stub.a | |||
| HAVE_DGL = true | |||
| USE_WEBVIEW = true | |||
| endif | |||
| ifeq ($(HAVE_DGL)$(LINUX)$(USE_WEBVIEW),truetruetrue) | |||
| DGL_LIB_SHARED = $(shell $(CC) -print-file-name=Scrt1.o) | |||
| endif | |||
| @@ -91,7 +91,8 @@ endif | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| OBJS_stub = $(OBJS_common) | |||
| OBJS_stub = $(OBJS_common) \ | |||
| $(BUILD_DIR)/dgl/Stub.cpp.o | |||
| ifeq ($(MACOS),true) | |||
| OBJS_stub += $(BUILD_DIR)/dgl/pugl.mm.o | |||
| @@ -404,10 +404,12 @@ public: | |||
| Window& getParentWindow() const noexcept { return getWindow(); } | |||
| protected: | |||
| #if defined(DGL_CAIRO) || defined(DGL_OPENGL) || defined(DGL_VULKAN) | |||
| /** | |||
| A function called to draw the widget contents. | |||
| */ | |||
| virtual void onDisplay() = 0; | |||
| #endif | |||
| /** | |||
| A function called when a key is pressed or released. | |||
| @@ -31,11 +31,7 @@ | |||
| # include "Vulkan.hpp" | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # include "../dgl/Base.hpp" | |||
| # include "extra/ExternalWindow.hpp" | |||
| typedef DISTRHO_NAMESPACE::ExternalWindow UIWidget; | |||
| #elif DISTRHO_UI_USE_CUSTOM | |||
| #if DISTRHO_UI_USE_CUSTOM | |||
| # include DISTRHO_UI_CUSTOM_INCLUDE_PATH | |||
| typedef DISTRHO_UI_CUSTOM_WIDGET_TYPE UIWidget; | |||
| #elif DISTRHO_UI_USE_CAIRO | |||
| @@ -44,9 +40,6 @@ typedef DGL_NAMESPACE::CairoTopLevelWidget UIWidget; | |||
| #elif DISTRHO_UI_USE_NANOVG | |||
| # include "../dgl/NanoVG.hpp" | |||
| typedef DGL_NAMESPACE::NanoTopLevelWidget UIWidget; | |||
| #elif DISTRHO_UI_USE_WEBVIEW | |||
| # include "../dgl/Web.hpp" | |||
| typedef DGL_NAMESPACE::WebViewWidget UIWidget; | |||
| #else | |||
| # include "../dgl/TopLevelWidget.hpp" | |||
| typedef DGL_NAMESPACE::TopLevelWidget UIWidget; | |||
| @@ -55,9 +48,8 @@ typedef DGL_NAMESPACE::TopLevelWidget UIWidget; | |||
| #if DISTRHO_UI_FILE_BROWSER | |||
| # include "extra/FileBrowserDialog.hpp" | |||
| #endif | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # include <vector> | |||
| #endif | |||
| #include <vector> | |||
| START_NAMESPACE_DISTRHO | |||
| @@ -217,34 +209,6 @@ public: | |||
| void* getPluginInstancePointer() const noexcept; | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * External UI helpers */ | |||
| /** | |||
| Get the bundle path that will be used for the next UI. | |||
| @note: This function is only valid during createUI(), | |||
| it will return null when called from anywhere else. | |||
| */ | |||
| static const char* getNextBundlePath() noexcept; | |||
| /** | |||
| Get the scale factor that will be used for the next UI. | |||
| @note: This function is only valid during createUI(), | |||
| it will return 1.0 when called from anywhere else. | |||
| */ | |||
| static double getNextScaleFactor() noexcept; | |||
| # if DISTRHO_PLUGIN_HAS_EMBED_UI | |||
| /** | |||
| Get the Window Id that will be used for the next created window. | |||
| @note: This function is only valid during createUI(), | |||
| it will return 0 when called from anywhere else. | |||
| */ | |||
| static uintptr_t getNextWindowId() noexcept; | |||
| # endif | |||
| #endif | |||
| protected: | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * DSP/Plugin Callbacks */ | |||
| @@ -300,7 +264,6 @@ protected: | |||
| */ | |||
| virtual void uiScaleFactorChanged(double scaleFactor); | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| /** | |||
| Get the types available for the data in a clipboard. | |||
| Must only be called within the context of uiClipboardDataOffer. | |||
| @@ -337,7 +300,6 @@ protected: | |||
| The most common exception is custom OpenGL setup, but only really needed for custom OpenGL drawing code. | |||
| */ | |||
| virtual void uiReshape(uint width, uint height); | |||
| #endif // !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_UI_FILE_BROWSER | |||
| /** | |||
| @@ -355,21 +317,12 @@ protected: | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * UI Resize Handling, internal */ | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| /** | |||
| External Window resize function, called when the window is resized. | |||
| This is overriden here so the host knows when the UI is resized by you. | |||
| @see ExternalWindow::sizeChanged(uint,uint) | |||
| */ | |||
| void sizeChanged(uint width, uint height) override; | |||
| #else | |||
| /** | |||
| Widget resize function, called when the widget is resized. | |||
| This is overriden here so the host knows when the UI is resized by you. | |||
| @see Widget::onResize(const ResizeEvent&) | |||
| */ | |||
| void onResize(const ResizeEvent& ev) override; | |||
| #endif | |||
| // ------------------------------------------------------------------------------------------------------- | |||
| @@ -378,10 +331,8 @@ private: | |||
| PrivateData* const uiData; | |||
| friend class PluginWindow; | |||
| friend class UIExporter; | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| /** @internal */ | |||
| void requestSizeChange(uint width, uint height) override; | |||
| #endif | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI) | |||
| }; | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012-2024 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -18,8 +18,8 @@ | |||
| # error bad include | |||
| #endif | |||
| #if defined(DISTRHO_UI_USE_WEBVIEW) && DISTRHO_UI_USE_WEBVIEW == 0 | |||
| # error To use WebViews in DPF plugins please set DISTRHO_UI_USE_WEBVIEW to 1 | |||
| #if defined(DISTRHO_UI_WEB_VIEW) && DISTRHO_UI_WEB_VIEW == 0 | |||
| # error To use WebViews in DPF plugins please set DISTRHO_UI_WEB_VIEW to 1 | |||
| #endif | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2023 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012-2024 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -29,7 +29,7 @@ | |||
| # error DISTRHO_PLUGIN_CLAP_ID undefined! | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) | |||
| # undef DISTRHO_PLUGIN_HAS_UI | |||
| # define DISTRHO_PLUGIN_HAS_UI 0 | |||
| #endif | |||
| @@ -57,7 +57,7 @@ | |||
| #include "clap/ext/thread-check.h" | |||
| #include "clap/ext/timer-support.h" | |||
| #if (defined(DISTRHO_OS_MAC) || defined(DISTRHO_OS_WINDOWS)) && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if defined(DISTRHO_OS_MAC) || defined(DISTRHO_OS_WINDOWS) | |||
| # define DPF_CLAP_USING_HOST_TIMER 0 | |||
| #else | |||
| # define DPF_CLAP_USING_HOST_TIMER 1 | |||
| @@ -49,10 +49,6 @@ | |||
| # define DISTRHO_PLUGIN_HAS_UI 0 | |||
| #endif | |||
| #ifndef DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # define DISTRHO_PLUGIN_HAS_EXTERNAL_UI 0 | |||
| #endif | |||
| #ifndef DISTRHO_PLUGIN_IS_RT_SAFE | |||
| # define DISTRHO_PLUGIN_IS_RT_SAFE 0 | |||
| #endif | |||
| @@ -110,6 +106,10 @@ | |||
| # define DISTRHO_UI_USER_RESIZABLE 0 | |||
| #endif | |||
| #ifndef DISTRHO_UI_USE_EXTERNAL | |||
| # define DISTRHO_UI_USE_EXTERNAL 0 | |||
| #endif | |||
| #ifndef DISTRHO_UI_USE_NANOVG | |||
| # define DISTRHO_UI_USE_NANOVG 0 | |||
| #endif | |||
| @@ -118,17 +118,6 @@ | |||
| # define DISTRHO_UI_USE_WEBVIEW 0 | |||
| #endif | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // Define DISTRHO_PLUGIN_HAS_EMBED_UI if needed | |||
| #ifndef DISTRHO_PLUGIN_HAS_EMBED_UI | |||
| # if (defined(DGL_CAIRO) && defined(HAVE_CAIRO)) || (defined(DGL_OPENGL) && defined(HAVE_OPENGL)) || defined(DGL_WEB) | |||
| # define DISTRHO_PLUGIN_HAS_EMBED_UI 1 | |||
| # else | |||
| # define DISTRHO_PLUGIN_HAS_EMBED_UI 0 | |||
| # endif | |||
| #endif | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // Define DISTRHO_UI_WEB_VIEW if needed | |||
| @@ -147,16 +136,20 @@ | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // Test for wrong compiler macros | |||
| #if defined(DGL_CAIRO) && defined(DGL_OPENGL) | |||
| # error invalid build config: trying to build for both cairo and opengl at the same time | |||
| #if defined(DISTRHO_PLUGIN_HAS_EXTERNAL_UI) | |||
| # error DISTRHO_PLUGIN_HAS_EXTERNAL_UI has been replaced by DISTRHO_UI_USE_EXTERNAL | |||
| #endif | |||
| #if defined(DGL_CAIRO) && DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # error invalid build config: trying to build cairo while using external UI | |||
| #if defined(DISTRHO_PLUGIN_HAS_EMBED_UI) | |||
| # warning DISTRHO_PLUGIN_HAS_EMBED_UI has been removed, it is now always on | |||
| #endif | |||
| #if defined(DGL_OPENGL) && DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # error invalid build config: trying to build opengl while using external UI | |||
| #if defined(DGL_CAIRO) && defined(DGL_OPENGL) | |||
| # error invalid build config: trying to build for both cairo and opengl at the same time | |||
| #elif defined(DGL_EXTERNAL) && defined(DGL_CAIRO) | |||
| # error invalid build config: trying to build for both external and cairo at the same time | |||
| #elif defined(DGL_EXTERNAL) && defined(DGL_OPENGL) | |||
| # error invalid build config: trying to build for both external and opengl at the same time | |||
| #endif | |||
| #if DISTRHO_UI_FILE_BROWSER && defined(DGL_FILE_BROWSER_DISABLED) | |||
| @@ -205,25 +198,14 @@ | |||
| #endif | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // Disable file browser if using external UI | |||
| #if DISTRHO_UI_FILE_BROWSER && DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # warning file browser APIs do not work for external UIs | |||
| # undef DISTRHO_UI_FILE_BROWSER 0 | |||
| # define DISTRHO_UI_FILE_BROWSER 0 | |||
| #endif | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // Disable UI if DGL or external UI is not available | |||
| // Disable UI if DGL is not available | |||
| #if (defined(DGL_CAIRO) && ! defined(HAVE_CAIRO)) || (defined(DGL_OPENGL) && ! defined(HAVE_OPENGL)) | |||
| # undef DISTRHO_PLUGIN_HAS_EMBED_UI | |||
| # define DISTRHO_PLUGIN_HAS_EMBED_UI 0 | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EMBED_UI && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # undef DISTRHO_PLUGIN_HAS_UI | |||
| # define DISTRHO_PLUGIN_HAS_UI 0 | |||
| # ifdef HAVE_DGL | |||
| # error HAVE_DGL is defined in a wrong configuration | |||
| # endif | |||
| #endif | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| @@ -74,7 +74,7 @@ | |||
| # define DISTRHO_PLUGIN_USES_CUSTOM_MODGUI 0 | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_EMBED_UI | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| # if defined(DISTRHO_OS_HAIKU) | |||
| # define DISTRHO_LV2_UI_TYPE "BeUI" | |||
| # elif defined(DISTRHO_OS_MAC) | |||
| @@ -155,7 +155,7 @@ static constexpr const char* const lv2ManifestUiExtensionData[] = { | |||
| }; | |||
| static constexpr const char* const lv2ManifestUiOptionalFeatures[] = { | |||
| #if DISTRHO_PLUGIN_HAS_EMBED_UI | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| #if !DISTRHO_UI_USER_RESIZABLE | |||
| "ui:noUserResize", | |||
| #endif | |||
| @@ -1550,7 +1550,7 @@ void lv2_generate_ttl(const char* const basename) | |||
| stylesheetFile.close(); | |||
| std::cout << " done!" << std::endl; | |||
| } | |||
| #endif // DISTRHO_PLUGIN_USES_MODGUI && DISTRHO_PLUGIN_HAS_EMBED_UI && !DISTRHO_PLUGIN_USES_CUSTOM_MODGUI | |||
| #endif // DISTRHO_PLUGIN_USES_MODGUI && !DISTRHO_PLUGIN_USES_CUSTOM_MODGUI | |||
| // --------------------------------------------- | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012-2024 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -23,17 +23,7 @@ | |||
| #include <algorithm> | |||
| #include <cmath> | |||
| #if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EMBED_UI | |||
| # undef DISTRHO_PLUGIN_HAS_UI | |||
| # define DISTRHO_PLUGIN_HAS_UI 0 | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # undef DISTRHO_PLUGIN_HAS_UI | |||
| # define DISTRHO_PLUGIN_HAS_UI 0 | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| # include "Base.hpp" | |||
| #endif | |||
| @@ -224,7 +214,7 @@ void snprintf_u32_utf16(int16_t* const dst, const uint32_t value, const size_t s | |||
| return snprintf_utf16_t<uint32_t>(dst, value, "%u", size); | |||
| } | |||
| #if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_HAS_UI | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // translate a vstgui-based key character and code to matching values used by DPF | |||
| @@ -178,10 +178,8 @@ public: | |||
| nullptr, // TODO file request | |||
| d_nextBundlePath, | |||
| plugin->getInstancePointer(), | |||
| scaleFactor) | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| , fKeyboardModifiers(0) | |||
| #endif | |||
| scaleFactor), | |||
| fKeyboardModifiers(0) | |||
| #if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||
| , fNotesRingBuffer() | |||
| #endif | |||
| @@ -242,7 +240,6 @@ public: | |||
| } | |||
| #endif | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| int handlePluginKeyEvent(const bool down, const int32_t index, const intptr_t value) | |||
| { | |||
| d_stdout("handlePluginKeyEvent %i %i %li\n", down, index, (long int)value); | |||
| @@ -281,7 +278,6 @@ public: | |||
| value >= 0 ? static_cast<uint>(value) : 0, | |||
| fKeyboardModifiers) ? 1 : 0; | |||
| } | |||
| #endif // !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| // ---------------------------------------------------------------------------------------------------------------- | |||
| @@ -347,9 +343,7 @@ private: | |||
| // Plugin UI | |||
| UIExporter fUI; | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| uint16_t fKeyboardModifiers; | |||
| #endif | |||
| #if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||
| RingBufferControl<SmallStackBuffer> fNotesRingBuffer; | |||
| #endif | |||
| @@ -678,7 +672,6 @@ public: | |||
| fVstUI->idle(); | |||
| break; | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| case VST_EFFECT_OPCODE_3B: // key down | |||
| if (fVstUI != nullptr) | |||
| return fVstUI->handlePluginKeyEvent(true, index, value); | |||
| @@ -688,7 +681,6 @@ public: | |||
| if (fVstUI != nullptr) | |||
| return fVstUI->handlePluginKeyEvent(false, index, value); | |||
| break; | |||
| #endif | |||
| #endif // DISTRHO_PLUGIN_HAS_UI | |||
| #if DISTRHO_PLUGIN_WANT_STATE | |||
| @@ -60,7 +60,7 @@ END_NAMESPACE_DISTRHO | |||
| # include "../extra/FileBrowserDialogImpl.cpp" | |||
| #endif | |||
| #if DISTRHO_UI_USE_WEBVIEW && !defined(DISTRHO_OS_MAC) | |||
| #if DISTRHO_UI_WEB_VIEW && !defined(DISTRHO_OS_MAC) | |||
| # define DISTRHO_WEB_VIEW_HPP_INCLUDED | |||
| # define WEB_VIEW_NAMESPACE DISTRHO_NAMESPACE | |||
| # define WEB_VIEW_DISTRHO_NAMESPACE | |||
| @@ -70,11 +70,8 @@ END_NAMESPACE_DISTRHO | |||
| # include "../extra/WebViewImpl.cpp" | |||
| #endif | |||
| #if ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # include "src/TopLevelWidgetPrivateData.hpp" | |||
| # include "src/WindowPrivateData.hpp" | |||
| #endif | |||
| #include "src/TopLevelWidgetPrivateData.hpp" | |||
| #include "src/WindowPrivateData.hpp" | |||
| #include "DistrhoUIPrivateData.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| @@ -82,11 +79,7 @@ START_NAMESPACE_DISTRHO | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * Static data, see DistrhoUIInternal.hpp */ | |||
| const char* g_nextBundlePath = nullptr; | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| uintptr_t g_nextWindowId = 0; | |||
| double g_nextScaleFactor = 1.0; | |||
| #endif | |||
| const char* g_nextBundlePath = nullptr; | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * get global scale factor */ | |||
| @@ -177,12 +170,7 @@ static double getDesktopScaleFactor(const uintptr_t parentWindowHandle) | |||
| UI::PrivateData* UI::PrivateData::s_nextPrivateData = nullptr; | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| ExternalWindow::PrivateData | |||
| #else | |||
| PluginWindow& | |||
| #endif | |||
| UI::PrivateData::createNextWindow(UI* const ui, uint width, uint height, const bool adjustForScaleFactor) | |||
| PluginWindow& UI::PrivateData::createNextWindow(UI* const ui, uint width, uint height, const bool adjustForScaleFactor) | |||
| { | |||
| UI::PrivateData* const pData = s_nextPrivateData; | |||
| const double scaleFactor = d_isNotZero(pData->scaleFactor) ? pData->scaleFactor : getDesktopScaleFactor(pData->winId); | |||
| @@ -193,17 +181,6 @@ UI::PrivateData::createNextWindow(UI* const ui, uint width, uint height, const b | |||
| height *= scaleFactor; | |||
| } | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| pData->window = new PluginWindow(ui, pData->app); | |||
| ExternalWindow::PrivateData ewData; | |||
| ewData.parentWindowHandle = pData->winId; | |||
| ewData.width = width; | |||
| ewData.height = height; | |||
| ewData.scaleFactor = scaleFactor; | |||
| ewData.title = DISTRHO_PLUGIN_NAME; | |||
| ewData.isStandalone = DISTRHO_UI_IS_STANDALONE; | |||
| return ewData; | |||
| #else | |||
| d_stdout("createNextWindow %u %u %f %d", width, height, scaleFactor, adjustForScaleFactor); | |||
| pData->window = new PluginWindow(ui, pData->app, pData->winId, width, height, scaleFactor); | |||
| @@ -212,7 +189,6 @@ UI::PrivateData::createNextWindow(UI* const ui, uint width, uint height, const b | |||
| pData->window->setIgnoreIdleCallbacks(); | |||
| return pData->window.getObject(); | |||
| #endif | |||
| } | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| @@ -239,7 +215,6 @@ UI::UI(const uint width, const uint height, const bool automaticallyScaleAndSetA | |||
| )), | |||
| uiData(UI::PrivateData::s_nextPrivateData) | |||
| { | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| if (width != 0 && height != 0) | |||
| { | |||
| Widget::setSize(width, height); | |||
| @@ -253,10 +228,6 @@ UI::UI(const uint width, const uint height, const bool automaticallyScaleAndSetA | |||
| Widget::setSize(DISTRHO_UI_DEFAULT_WIDTH, DISTRHO_UI_DEFAULT_HEIGHT); | |||
| } | |||
| #endif | |||
| #else | |||
| // unused | |||
| (void)automaticallyScaleAndSetAsMinimumSize; | |||
| #endif | |||
| } | |||
| UI::~UI() | |||
| @@ -268,15 +239,11 @@ UI::~UI() | |||
| bool UI::isResizable() const noexcept | |||
| { | |||
| #if DISTRHO_UI_USER_RESIZABLE | |||
| # if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| return true; | |||
| # else | |||
| #if DISTRHO_UI_USER_RESIZABLE | |||
| return uiData->window->isResizable(); | |||
| # endif | |||
| #else | |||
| #else | |||
| return false; | |||
| #endif | |||
| #endif | |||
| } | |||
| uint UI::getBackgroundColor() const noexcept | |||
| @@ -347,28 +314,6 @@ void* UI::getPluginInstancePointer() const noexcept | |||
| } | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * External UI helpers (static calls) */ | |||
| const char* UI::getNextBundlePath() noexcept | |||
| { | |||
| return g_nextBundlePath; | |||
| } | |||
| double UI::getNextScaleFactor() noexcept | |||
| { | |||
| return g_nextScaleFactor; | |||
| } | |||
| # if DISTRHO_PLUGIN_HAS_EMBED_UI | |||
| uintptr_t UI::getNextWindowId() noexcept | |||
| { | |||
| return g_nextWindowId; | |||
| } | |||
| # endif | |||
| #endif // DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * DSP/Plugin Callbacks */ | |||
| @@ -402,7 +347,6 @@ void UI::uiScaleFactorChanged(double) | |||
| { | |||
| } | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| std::vector<DGL_NAMESPACE::ClipboardDataOffer> UI::getClipboardDataOfferTypes() | |||
| { | |||
| return uiData->window->getClipboardDataOfferTypes(); | |||
| @@ -431,7 +375,6 @@ void UI::uiReshape(const uint width, const uint height) | |||
| // NOTE this must be the same as Window::onReshape | |||
| pData->fallbackOnResize(width, height); | |||
| } | |||
| #endif // !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_UI_FILE_BROWSER | |||
| void UI::uiFileBrowserSelected(const char*) | |||
| @@ -442,14 +385,6 @@ void UI::uiFileBrowserSelected(const char*) | |||
| /* ------------------------------------------------------------------------------------------------------------ | |||
| * UI Resize Handling, internal */ | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| void UI::sizeChanged(const uint width, const uint height) | |||
| { | |||
| UIWidget::sizeChanged(width, height); | |||
| uiData->setSizeCallback(width, height); | |||
| } | |||
| #else | |||
| void UI::onResize(const ResizeEvent& ev) | |||
| { | |||
| UIWidget::onResize(ev); | |||
| @@ -478,7 +413,6 @@ void UI::requestSizeChange(const uint width, const uint height) | |||
| (void)height; | |||
| #endif | |||
| } | |||
| #endif | |||
| // ----------------------------------------------------------------------------------------------------------- | |||
| @@ -25,10 +25,6 @@ START_NAMESPACE_DISTRHO | |||
| // Static data, see DistrhoUI.cpp | |||
| extern const char* g_nextBundlePath; | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| extern uintptr_t g_nextWindowId; | |||
| extern double g_nextScaleFactor; | |||
| #endif | |||
| // ----------------------------------------------------------------------- | |||
| // UI exporter class | |||
| @@ -79,41 +75,25 @@ public: | |||
| uiData->setSizeCallbackFunc = setSizeCall; | |||
| uiData->fileRequestCallbackFunc = fileRequestCall; | |||
| g_nextBundlePath = bundlePath; | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| g_nextWindowId = winId; | |||
| g_nextScaleFactor = scaleFactor; | |||
| #endif | |||
| g_nextBundlePath = bundlePath; | |||
| UI::PrivateData::s_nextPrivateData = uiData; | |||
| UI* const uiPtr = createUI(); | |||
| g_nextBundlePath = nullptr; | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| g_nextWindowId = 0; | |||
| g_nextScaleFactor = 0.0; | |||
| #else | |||
| // enter context called in the PluginWindow constructor, see DistrhoUIPrivateData.hpp | |||
| uiData->window->leaveContext(); | |||
| #endif | |||
| UI::PrivateData::s_nextPrivateData = nullptr; | |||
| DISTRHO_SAFE_ASSERT_RETURN(uiPtr != nullptr,); | |||
| ui = uiPtr; | |||
| uiData->initializing = false; | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| // unused | |||
| (void)bundlePath; | |||
| #endif | |||
| } | |||
| ~UIExporter() | |||
| { | |||
| quit(); | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| uiData->window->enterContextForDeletion(); | |||
| #endif | |||
| delete ui; | |||
| delete uiData; | |||
| } | |||
| @@ -137,13 +117,9 @@ public: | |||
| bool getGeometryConstraints(uint& minimumWidth, uint& minimumHeight, bool& keepAspectRatio) const noexcept | |||
| { | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| uiData->window->getGeometryConstraints(minimumWidth, minimumHeight, keepAspectRatio); | |||
| #else | |||
| const DGL_NAMESPACE::Size<uint> size(uiData->window->getGeometryConstraints(keepAspectRatio)); | |||
| minimumWidth = size.getWidth(); | |||
| minimumHeight = size.getHeight(); | |||
| #endif | |||
| return true; | |||
| } | |||
| @@ -263,16 +239,14 @@ public: | |||
| uiData->app.quit(); | |||
| } | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| void repaint() | |||
| { | |||
| uiData->window->repaint(); | |||
| } | |||
| #endif | |||
| // ------------------------------------------------------------------- | |||
| #if defined(DISTRHO_OS_MAC) || defined(DISTRHO_OS_WINDOWS) | |||
| #if defined(DISTRHO_OS_MAC) || defined(DISTRHO_OS_WINDOWS) | |||
| void idleFromNativeIdle() | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); | |||
| @@ -282,7 +256,6 @@ public: | |||
| uiData->app.repaintIfNeeeded(); | |||
| } | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| void addIdleCallbackForNativeIdle(IdleCallback* const cb, const uint timerFrequencyInMs) | |||
| { | |||
| uiData->window->addIdleCallback(cb, timerFrequencyInMs); | |||
| @@ -293,28 +266,18 @@ public: | |||
| uiData->window->removeIdleCallback(cb); | |||
| } | |||
| #endif | |||
| #endif | |||
| // ------------------------------------------------------------------- | |||
| void setWindowOffset(const int x, const int y) | |||
| { | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| // TODO | |||
| (void)x; (void)y; | |||
| #else | |||
| uiData->window->setOffset(x, y); | |||
| #endif | |||
| } | |||
| #if DISTRHO_UI_USES_SIZE_REQUEST | |||
| void setWindowSizeFromHost(const uint width, const uint height) | |||
| { | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| ui->setSize(width, height); | |||
| #else | |||
| uiData->window->setSizeFromHost(width, height); | |||
| #endif | |||
| } | |||
| #endif | |||
| @@ -325,11 +288,7 @@ public: | |||
| void setWindowTransientWinId(const uintptr_t transientParentWindowHandle) | |||
| { | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| ui->setTransientWindowId(transientParentWindowHandle); | |||
| #else | |||
| uiData->window->setTransientParent(transientParentWindowHandle); | |||
| #endif | |||
| } | |||
| bool setWindowVisible(const bool yesNo) | |||
| @@ -339,7 +298,6 @@ public: | |||
| return ! uiData->app.isQuitting(); | |||
| } | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| bool handlePluginKeyboardVST(const bool press, const bool special, const uint keychar, const uint keycode, const uint16_t mods) | |||
| { | |||
| using namespace DGL_NAMESPACE; | |||
| @@ -372,7 +330,6 @@ public: | |||
| return ret; | |||
| } | |||
| #endif | |||
| // ------------------------------------------------------------------- | |||
| @@ -383,14 +340,12 @@ public: | |||
| ui->uiScaleFactorChanged(scaleFactor); | |||
| } | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| void notifyFocusChanged(const bool focus) | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); | |||
| ui->uiFocus(focus, DGL_NAMESPACE::kCrossingNormal); | |||
| } | |||
| #endif | |||
| void setSampleRate(const double sampleRate, const bool doCallback = false) | |||
| { | |||
| @@ -23,16 +23,11 @@ | |||
| # include "DistrhoPluginVST.hpp" | |||
| #endif | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # include "../extra/Sleep.hpp" | |||
| // TODO import and use file browser here | |||
| #else | |||
| # include "../../dgl/src/ApplicationPrivateData.hpp" | |||
| # include "../../dgl/src/WindowPrivateData.hpp" | |||
| # include "../../dgl/src/pugl.hpp" | |||
| #endif | |||
| #include "../../dgl/src/ApplicationPrivateData.hpp" | |||
| #include "../../dgl/src/WindowPrivateData.hpp" | |||
| #include "../../dgl/src/pugl.hpp" | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER | |||
| # include <map> | |||
| # include <string> | |||
| #endif | |||
| @@ -65,55 +60,6 @@ START_NAMESPACE_DISTRHO | |||
| // ----------------------------------------------------------------------- | |||
| // Plugin Application, will set class name based on plugin details | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| struct PluginApplication | |||
| { | |||
| DGL_NAMESPACE::IdleCallback* idleCallback; | |||
| UI* ui; | |||
| explicit PluginApplication(const char*) | |||
| : idleCallback(nullptr), | |||
| ui(nullptr) {} | |||
| void addIdleCallback(DGL_NAMESPACE::IdleCallback* const cb) | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(cb != nullptr,); | |||
| DISTRHO_SAFE_ASSERT_RETURN(idleCallback == nullptr,); | |||
| idleCallback = cb; | |||
| } | |||
| bool isQuitting() const noexcept | |||
| { | |||
| return ui->isQuitting(); | |||
| } | |||
| bool isStandalone() const noexcept | |||
| { | |||
| return DISTRHO_UI_IS_STANDALONE; | |||
| } | |||
| void exec() | |||
| { | |||
| while (ui->isRunning()) | |||
| { | |||
| d_msleep(30); | |||
| idleCallback->idleCallback(); | |||
| } | |||
| if (! ui->isQuitting()) | |||
| ui->close(); | |||
| } | |||
| // these are not needed | |||
| void idle() {} | |||
| void quit() {} | |||
| void triggerIdleCallbacks() {} | |||
| void repaintIfNeeeded() {} | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginApplication) | |||
| }; | |||
| #else | |||
| class PluginApplication : public DGL_NAMESPACE::Application | |||
| { | |||
| public: | |||
| @@ -151,47 +97,10 @@ public: | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginApplication) | |||
| }; | |||
| #endif | |||
| // ----------------------------------------------------------------------- | |||
| // Plugin Window, will pass some Window events to UI | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| class PluginWindow | |||
| { | |||
| UI* const ui; | |||
| public: | |||
| explicit PluginWindow(UI* const uiPtr, PluginApplication& app) | |||
| : ui(uiPtr) | |||
| { | |||
| app.ui = ui; | |||
| } | |||
| // fetch cached data | |||
| uint getWidth() const noexcept { return ui->pData.width; } | |||
| uint getHeight() const noexcept { return ui->pData.height; } | |||
| double getScaleFactor() const noexcept { return ui->pData.scaleFactor; } | |||
| // direct mappings | |||
| void close() { ui->close(); } | |||
| void focus() { ui->focus(); } | |||
| void show() { ui->show(); } | |||
| bool isResizable() const noexcept { return ui->isResizable(); } | |||
| bool isVisible() const noexcept { return ui->isVisible(); } | |||
| void setTitle(const char* const title) { ui->setTitle(title); } | |||
| void setVisible(const bool visible) { ui->setVisible(visible); } | |||
| uintptr_t getNativeWindowHandle() const noexcept { return ui->getNativeWindowHandle(); } | |||
| void getGeometryConstraints(uint& minimumWidth, uint& minimumHeight, bool& keepAspectRatio) const noexcept | |||
| { | |||
| minimumWidth = ui->pData.minWidth; | |||
| minimumHeight = ui->pData.minHeight; | |||
| keepAspectRatio = ui->pData.keepAspectRatio; | |||
| } | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginWindow) | |||
| }; | |||
| #else // DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| class PluginWindow : public DGL_NAMESPACE::Window | |||
| { | |||
| UI* const ui; | |||
| @@ -320,7 +229,6 @@ protected: | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginWindow) | |||
| }; | |||
| #endif // DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| // ----------------------------------------------------------------------- | |||
| // UI callbacks | |||
| @@ -350,7 +258,7 @@ struct UI::PrivateData { | |||
| uint fgColor; | |||
| double scaleFactor; | |||
| uintptr_t winId; | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER | |||
| char* uiStateFileKeyRequest; | |||
| std::map<std::string,std::string> lastUsedDirnames; | |||
| #endif | |||
| @@ -378,7 +286,7 @@ struct UI::PrivateData { | |||
| fgColor(0xffffffff), | |||
| scaleFactor(1.0), | |||
| winId(0), | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER | |||
| uiStateFileKeyRequest(nullptr), | |||
| #endif | |||
| bundlePath(nullptr), | |||
| @@ -414,7 +322,7 @@ struct UI::PrivateData { | |||
| ~PrivateData() noexcept | |||
| { | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER | |||
| std::free(uiStateFileKeyRequest); | |||
| #endif | |||
| std::free(bundlePath); | |||
| @@ -454,11 +362,7 @@ struct UI::PrivateData { | |||
| bool fileRequestCallback(const char* const key); | |||
| static UI::PrivateData* s_nextPrivateData; | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| static ExternalWindow::PrivateData createNextWindow(UI* ui, uint width, uint height, bool adjustForScaleFactor); | |||
| #else | |||
| static PluginWindow& createNextWindow(UI* ui, uint width, uint height, bool adjustForScaleFactor); | |||
| #endif | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| @@ -469,7 +373,7 @@ inline bool UI::PrivateData::fileRequestCallback(const char* const key) | |||
| if (fileRequestCallbackFunc != nullptr) | |||
| return fileRequestCallbackFunc(callbacksPtr, key); | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER | |||
| std::free(uiStateFileKeyRequest); | |||
| uiStateFileKeyRequest = strdup(key); | |||
| DISTRHO_SAFE_ASSERT_RETURN(uiStateFileKeyRequest != nullptr, false); | |||
| @@ -491,7 +395,7 @@ inline bool UI::PrivateData::fileRequestCallback(const char* const key) | |||
| // ----------------------------------------------------------------------- | |||
| // PluginWindow onFileSelected that require UI::PrivateData definitions | |||
| #if DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_UI_FILE_BROWSER | |||
| inline void PluginWindow::onFileSelected(const char* const filename) | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); | |||
| @@ -499,7 +403,7 @@ inline void PluginWindow::onFileSelected(const char* const filename) | |||
| if (initializing) | |||
| return; | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_WANT_STATE | |||
| if (char* const key = ui->uiData->uiStateFileKeyRequest) | |||
| { | |||
| ui->uiData->uiStateFileKeyRequest = nullptr; | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2012-2024 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -21,15 +21,6 @@ | |||
| #include "travesty/host.h" | |||
| #include "travesty/view.h" | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # if defined(DISTRHO_OS_MAC) | |||
| # include <CoreFoundation/CoreFoundation.h> | |||
| # elif defined(DISTRHO_OS_WINDOWS) | |||
| # include <winuser.h> | |||
| # define DPF_VST3_WIN32_TIMER_ID 1 | |||
| # endif | |||
| #endif | |||
| /* TODO items: | |||
| * - mousewheel event | |||
| * - file request? | |||
| @@ -110,7 +101,6 @@ static void applyGeometryConstraints(const uint minimumWidth, | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| static uint translateVST3Modifiers(const int64_t modifiers) noexcept | |||
| { | |||
| using namespace DGL_NAMESPACE; | |||
| @@ -134,115 +124,9 @@ static uint translateVST3Modifiers(const int64_t modifiers) noexcept | |||
| return dglmods; | |||
| } | |||
| #endif | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI && !DPF_VST3_USING_HOST_RUN_LOOP | |||
| /** | |||
| * Helper class for getting a native idle timer via native APIs. | |||
| */ | |||
| class NativeIdleHelper | |||
| { | |||
| public: | |||
| NativeIdleHelper(IdleCallback* const callback) | |||
| : fCallback(callback), | |||
| #ifdef DISTRHO_OS_MAC | |||
| fTimerRef(nullptr) | |||
| #else | |||
| fTimerWindow(nullptr), | |||
| fTimerWindowClassName() | |||
| #endif | |||
| { | |||
| } | |||
| void registerNativeIdleCallback() | |||
| { | |||
| #ifdef DISTRHO_OS_MAC | |||
| constexpr const CFTimeInterval interval = DPF_VST3_TIMER_INTERVAL * 0.0001; | |||
| CFRunLoopTimerContext context = {}; | |||
| context.info = this; | |||
| fTimerRef = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, interval, 0, 0, | |||
| platformIdleTimerCallback, &context); | |||
| DISTRHO_SAFE_ASSERT_RETURN(fTimerRef != nullptr,); | |||
| CFRunLoopAddTimer(CFRunLoopGetCurrent(), fTimerRef, kCFRunLoopCommonModes); | |||
| #else | |||
| /* | |||
| * Create an invisible window to handle a timer. | |||
| * There is no need for implementing a window proc because DefWindowProc already calls the | |||
| * callback function when processing WM_TIMER messages. | |||
| */ | |||
| fTimerWindowClassName = ( | |||
| #ifdef DISTRHO_PLUGIN_BRAND | |||
| DISTRHO_PLUGIN_BRAND | |||
| #else | |||
| DISTRHO_MACRO_AS_STRING(DISTRHO_NAMESPACE) | |||
| #endif | |||
| "-" DISTRHO_PLUGIN_NAME "-" | |||
| ); | |||
| char suffix[9]; | |||
| std::snprintf(suffix, sizeof(suffix), "%08x", std::rand()); | |||
| suffix[sizeof(suffix)-1] = '\0'; | |||
| fTimerWindowClassName += suffix; | |||
| WNDCLASSEX cls; | |||
| ZeroMemory(&cls, sizeof(cls)); | |||
| cls.cbSize = sizeof(WNDCLASSEX); | |||
| cls.cbWndExtra = sizeof(LONG_PTR); | |||
| cls.lpszClassName = fTimerWindowClassName.buffer(); | |||
| cls.lpfnWndProc = DefWindowProc; | |||
| RegisterClassEx(&cls); | |||
| fTimerWindow = CreateWindowEx(0, cls.lpszClassName, "DPF Timer Helper", | |||
| 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr); | |||
| DISTRHO_SAFE_ASSERT_RETURN(fTimerWindow != nullptr,); | |||
| SetWindowLongPtr(fTimerWindow, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(static_cast<void*>(this))); | |||
| SetTimer(fTimerWindow, DPF_VST3_WIN32_TIMER_ID, DPF_VST3_TIMER_INTERVAL, | |||
| static_cast<TIMERPROC>(platformIdleTimerCallback)); | |||
| #endif | |||
| } | |||
| void unregisterNativeIdleCallback() | |||
| { | |||
| #ifdef DISTRHO_OS_MAC | |||
| CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), fTimerRef, kCFRunLoopCommonModes); | |||
| CFRelease(fTimerRef); | |||
| #else | |||
| DISTRHO_SAFE_ASSERT_RETURN(fTimerWindow != nullptr,); | |||
| KillTimer(fTimerWindow, DPF_VST3_WIN32_TIMER_ID); | |||
| DestroyWindow(fTimerWindow); | |||
| UnregisterClass(fTimerWindowClassName, nullptr); | |||
| #endif | |||
| } | |||
| private: | |||
| IdleCallback* const fCallback; | |||
| #ifdef DISTRHO_OS_MAC | |||
| CFRunLoopTimerRef fTimerRef; | |||
| static void platformIdleTimerCallback(CFRunLoopTimerRef, void* const info) | |||
| { | |||
| static_cast<NativeIdleHelper*>(info)->fCallback->idleCallback(); | |||
| } | |||
| #else | |||
| HWND fTimerWindow; | |||
| String fTimerWindowClassName; | |||
| static void WINAPI platformIdleTimerCallback(const HWND hwnd, UINT, UINT_PTR, DWORD) | |||
| { | |||
| reinterpret_cast<NativeIdleHelper*>(GetWindowLongPtr(hwnd, GWLP_USERDATA))->fCallback->idleCallback(); | |||
| } | |||
| #endif | |||
| }; | |||
| #endif | |||
| /** | |||
| * Helper class for getting a native idle timer, either through pugl or via native APIs. | |||
| * Helper class for getting a native idle timer. | |||
| */ | |||
| #if !DPF_VST3_USING_HOST_RUN_LOOP | |||
| class NativeIdleCallback : public IdleCallback | |||
| @@ -250,49 +134,25 @@ class NativeIdleCallback : public IdleCallback | |||
| public: | |||
| NativeIdleCallback(UIExporter& ui) | |||
| : fCallbackRegistered(false), | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| fIdleHelper(this) | |||
| #else | |||
| fUI(ui) | |||
| #endif | |||
| { | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| // unused | |||
| (void)ui; | |||
| #endif | |||
| } | |||
| fUI(ui) {} | |||
| void registerNativeIdleCallback() | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(!fCallbackRegistered,); | |||
| fCallbackRegistered = true; | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| fIdleHelper.registerNativeIdleCallback(); | |||
| #else | |||
| fUI.addIdleCallbackForNativeIdle(this, DPF_VST3_TIMER_INTERVAL); | |||
| #endif | |||
| } | |||
| void unregisterNativeIdleCallback() | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(fCallbackRegistered,); | |||
| fCallbackRegistered = false; | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| fIdleHelper.unregisterNativeIdleCallback(); | |||
| #else | |||
| fUI.removeIdleCallbackForNativeIdle(this); | |||
| #endif | |||
| } | |||
| private: | |||
| bool fCallbackRegistered; | |||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| NativeIdleHelper fIdleHelper; | |||
| #else | |||
| UIExporter& fUI; | |||
| #endif | |||
| }; | |||
| #endif | |||
| @@ -392,7 +252,6 @@ public: | |||
| // ---------------------------------------------------------------------------------------------------------------- | |||
| // v3_plugin_view interface calls | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| v3_result onWheel(float /*distance*/) | |||
| { | |||
| // TODO | |||
| @@ -432,7 +291,6 @@ public: | |||
| fUI.notifyFocusChanged(state); | |||
| return V3_OK; | |||
| } | |||
| #endif | |||
| v3_result getSize(v3_view_rect* const rect) const noexcept | |||
| { | |||
| @@ -1464,7 +1322,6 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| static v3_result V3_API on_wheel(void* const self, const float distance) | |||
| { | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| d_debug("dpf_plugin_view::on_wheel => %p %f", self, distance); | |||
| dpf_plugin_view* const view = *static_cast<dpf_plugin_view**>(self); | |||
| @@ -1472,16 +1329,10 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); | |||
| return uivst3->onWheel(distance); | |||
| #else | |||
| return V3_NOT_IMPLEMENTED; | |||
| // unused | |||
| (void)self; (void)distance; | |||
| #endif | |||
| } | |||
| static v3_result V3_API on_key_down(void* const self, const int16_t key_char, const int16_t key_code, const int16_t modifiers) | |||
| { | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| d_debug("dpf_plugin_view::on_key_down => %p %i %i %i", self, key_char, key_code, modifiers); | |||
| dpf_plugin_view* const view = *static_cast<dpf_plugin_view**>(self); | |||
| @@ -1489,16 +1340,10 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); | |||
| return uivst3->onKeyDown(key_char, key_code, modifiers); | |||
| #else | |||
| return V3_NOT_IMPLEMENTED; | |||
| // unused | |||
| (void)self; (void)key_char; (void)key_code; (void)modifiers; | |||
| #endif | |||
| } | |||
| static v3_result V3_API on_key_up(void* const self, const int16_t key_char, const int16_t key_code, const int16_t modifiers) | |||
| { | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| d_debug("dpf_plugin_view::on_key_up => %p %i %i %i", self, key_char, key_code, modifiers); | |||
| dpf_plugin_view* const view = *static_cast<dpf_plugin_view**>(self); | |||
| @@ -1506,11 +1351,6 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); | |||
| return uivst3->onKeyUp(key_char, key_code, modifiers); | |||
| #else | |||
| return V3_NOT_IMPLEMENTED; | |||
| // unused | |||
| (void)self; (void)key_char; (void)key_code; (void)modifiers; | |||
| #endif | |||
| } | |||
| static v3_result V3_API get_size(void* const self, v3_view_rect* const rect) | |||
| @@ -1569,7 +1409,6 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| static v3_result V3_API on_focus(void* const self, const v3_bool state) | |||
| { | |||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| d_debug("dpf_plugin_view::on_focus => %p %u", self, state); | |||
| dpf_plugin_view* const view = *static_cast<dpf_plugin_view**>(self); | |||
| @@ -1577,11 +1416,6 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); | |||
| return uivst3->onFocus(state); | |||
| #else | |||
| return V3_NOT_IMPLEMENTED; | |||
| // unused | |||
| (void)self; (void)state; | |||
| #endif | |||
| } | |||
| static v3_result V3_API set_frame(void* const self, v3_plugin_frame** const frame) | |||
| @@ -23,16 +23,15 @@ | |||
| #define DISTRHO_PLUGIN_CLAP_ID "studio.kx.distrho.examples.embed-external-ui" | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_HAS_EMBED_UI 1 | |||
| #define DISTRHO_PLUGIN_HAS_EXTERNAL_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||
| #define DISTRHO_UI_FILE_BROWSER 0 | |||
| #define DISTRHO_UI_USE_WEBVIEW 1 | |||
| #define DISTRHO_UI_WEB_VIEW 1 | |||
| #define DISTRHO_UI_USE_EXTERNAL 1 | |||
| #define DISTRHO_UI_USER_RESIZABLE 1 | |||
| #define DISTRHO_UI_DEFAULT_WIDTH 1184 | |||
| #define DISTRHO_UI_DEFAULT_HEIGHT 768 | |||
| #define DISTRHO_UI_DEFAULT_WIDTH 768 | |||
| #define DISTRHO_UI_DEFAULT_HEIGHT 512 | |||
| // #ifdef _WIN32 | |||
| // #define WEB_VIEW_USING_CHOC 1 | |||
| @@ -15,17 +15,15 @@ | |||
| */ | |||
| #include "DistrhoUI.hpp" | |||
| #include "NativeWindow.hpp" | |||
| #include "Window.hpp" | |||
| #include "extra/WebView.hpp" | |||
| START_NAMESPACE_DISTRHO | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| class EmbedExternalExampleUI : public UI, | |||
| public NativeWindow::Callbacks | |||
| class EmbedExternalExampleUI : public UI | |||
| { | |||
| ScopedPointer<NativeWindow> window; | |||
| WebViewHandle webview; | |||
| public: | |||
| @@ -33,24 +31,19 @@ public: | |||
| : UI(), | |||
| webview(nullptr) | |||
| { | |||
| const bool standalone = isStandalone(); | |||
| const double scaleFactor = getScaleFactor(); | |||
| d_stdout("isStandalone %d", (int)standalone); | |||
| const uint width = DISTRHO_UI_DEFAULT_WIDTH * scaleFactor; | |||
| const uint height = DISTRHO_UI_DEFAULT_HEIGHT * scaleFactor; | |||
| window = new NativeWindow(this, getTitle(), getParentWindowHandle(), width, height, standalone); | |||
| webview = webViewCreate("https://distrho.github.io/DPF/", | |||
| window->getNativeWindowHandle(), | |||
| width, height, scaleFactor); | |||
| setGeometryConstraints(width, height); | |||
| if (d_isNotEqual(scaleFactor, 1.0)) | |||
| setSize(width, height); | |||
| d_stdout("created external window with size %u %u", getWidth(), getHeight()); | |||
| webview = webViewCreate("https://distrho.github.io/DPF/", | |||
| getWindow().getNativeWindowHandle(), | |||
| width, height, scaleFactor); | |||
| } | |||
| ~EmbedExternalExampleUI() | |||
| @@ -83,68 +76,18 @@ protected: | |||
| } | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * External Window callbacks */ | |||
| void nativeHide() override | |||
| { | |||
| d_stdout("nativeHide"); | |||
| UI::hide(); | |||
| } | |||
| void nativeResize(const uint width, const uint height) override | |||
| { | |||
| d_stdout("nativeResize"); | |||
| setSize(width, height); | |||
| } | |||
| /* -------------------------------------------------------------------------------------------------------- | |||
| * External Window overrides */ | |||
| void focus() override | |||
| { | |||
| d_stdout("focus"); | |||
| window->focus(); | |||
| } | |||
| uintptr_t getNativeWindowHandle() const noexcept override | |||
| { | |||
| return window->getNativeWindowHandle(); | |||
| } | |||
| * UI overrides */ | |||
| void sizeChanged(const uint width, const uint height) override | |||
| void onResize(const ResizeEvent& ev) override | |||
| { | |||
| d_stdout("sizeChanged %u %u", width, height); | |||
| UI::sizeChanged(width, height); | |||
| window->setSize(width, height); | |||
| UI::onResize(ev); | |||
| if (webview != nullptr) | |||
| webViewResize(webview, width, height, getScaleFactor()); | |||
| } | |||
| void titleChanged(const char* const title) override | |||
| { | |||
| d_stdout("titleChanged %s", title); | |||
| window->setTitle(title); | |||
| } | |||
| void transientParentWindowChanged(const uintptr_t winId) override | |||
| { | |||
| d_stdout("transientParentWindowChanged %lu", winId); | |||
| window->setTransientParentWindow(winId); | |||
| } | |||
| void visibilityChanged(const bool visible) override | |||
| { | |||
| d_stdout("visibilityChanged %d", visible); | |||
| window->setVisible(visible); | |||
| webViewResize(webview, ev.size.getWidth(), ev.size.getHeight(), getScaleFactor()); | |||
| } | |||
| void uiIdle() override | |||
| { | |||
| // d_stdout("uiIdle"); | |||
| window->idle(); | |||
| if (webview != nullptr) | |||
| webViewIdle(webview); | |||
| } | |||
| @@ -26,7 +26,6 @@ | |||
| #define DISTRHO_PLUGIN_UNIQUE_ID dSNo | |||
| #define DISTRHO_PLUGIN_HAS_UI 1 | |||
| #define DISTRHO_PLUGIN_HAS_EMBED_UI 1 | |||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||
| #define DISTRHO_PLUGIN_IS_SYNTH 1 | |||
| #define DISTRHO_PLUGIN_NUM_INPUTS 0 | |||