Signed-off-by: falkTX <falktx@falktx.com>pull/457/head
| @@ -48,10 +48,7 @@ if(DPF_EXAMPLES) | |||||
| add_subdirectory("examples/CairoUI") | add_subdirectory("examples/CairoUI") | ||||
| endif() | endif() | ||||
| 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/FileHandling") | ||||
| add_subdirectory("examples/Info") | add_subdirectory("examples/Info") | ||||
| add_subdirectory("examples/Latency") | add_subdirectory("examples/Latency") | ||||
| @@ -35,9 +35,9 @@ examples: dgl | |||||
| ifeq ($(HAVE_CAIRO),true) | ifeq ($(HAVE_CAIRO),true) | ||||
| $(MAKE) all -C examples/CairoUI | $(MAKE) all -C examples/CairoUI | ||||
| endif | 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) | ifeq ($(CAN_GENERATE_TTL),true) | ||||
| gen: examples utils/lv2_ttl_generator | gen: examples utils/lv2_ttl_generator | ||||
| @@ -185,6 +185,9 @@ ifeq ($(HAVE_OPENGL),true) | |||||
| UI_TYPE = opengl | UI_TYPE = opengl | ||||
| else ifeq ($(HAVE_CAIRO),true) | else ifeq ($(HAVE_CAIRO),true) | ||||
| UI_TYPE = cairo | UI_TYPE = cairo | ||||
| else | |||||
| HAVE_DGL = false | |||||
| UI_TYPE = none | |||||
| endif | endif | ||||
| endif | endif | ||||
| @@ -236,20 +239,11 @@ HAVE_DGL = false | |||||
| endif | endif | ||||
| 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) | 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) | ifeq ($(HAVE_STUB),true) | ||||
| DGL_FLAGS += $(STUB_FLAGS) | |||||
| DGL_LIBS += $(STUB_LIBS) | |||||
| DGL_LIB = $(DGL_BUILD_DIR)/libdgl-stub.a | DGL_LIB = $(DGL_BUILD_DIR)/libdgl-stub.a | ||||
| HAVE_DGL = true | HAVE_DGL = true | ||||
| else | else | ||||
| @@ -257,6 +251,13 @@ HAVE_DGL = false | |||||
| endif | endif | ||||
| 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) | ifeq ($(HAVE_DGL)$(LINUX)$(USE_WEBVIEW),truetruetrue) | ||||
| DGL_LIB_SHARED = $(shell $(CC) -print-file-name=Scrt1.o) | DGL_LIB_SHARED = $(shell $(CC) -print-file-name=Scrt1.o) | ||||
| endif | endif | ||||
| @@ -91,7 +91,8 @@ endif | |||||
| # --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
| OBJS_stub = $(OBJS_common) | |||||
| OBJS_stub = $(OBJS_common) \ | |||||
| $(BUILD_DIR)/dgl/Stub.cpp.o | |||||
| ifeq ($(MACOS),true) | ifeq ($(MACOS),true) | ||||
| OBJS_stub += $(BUILD_DIR)/dgl/pugl.mm.o | OBJS_stub += $(BUILD_DIR)/dgl/pugl.mm.o | ||||
| @@ -404,10 +404,12 @@ public: | |||||
| Window& getParentWindow() const noexcept { return getWindow(); } | Window& getParentWindow() const noexcept { return getWindow(); } | ||||
| protected: | protected: | ||||
| #if defined(DGL_CAIRO) || defined(DGL_OPENGL) || defined(DGL_VULKAN) | |||||
| /** | /** | ||||
| A function called to draw the widget contents. | A function called to draw the widget contents. | ||||
| */ | */ | ||||
| virtual void onDisplay() = 0; | virtual void onDisplay() = 0; | ||||
| #endif | |||||
| /** | /** | ||||
| A function called when a key is pressed or released. | A function called when a key is pressed or released. | ||||
| @@ -31,11 +31,7 @@ | |||||
| # include "Vulkan.hpp" | # include "Vulkan.hpp" | ||||
| #endif | #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 | # include DISTRHO_UI_CUSTOM_INCLUDE_PATH | ||||
| typedef DISTRHO_UI_CUSTOM_WIDGET_TYPE UIWidget; | typedef DISTRHO_UI_CUSTOM_WIDGET_TYPE UIWidget; | ||||
| #elif DISTRHO_UI_USE_CAIRO | #elif DISTRHO_UI_USE_CAIRO | ||||
| @@ -44,9 +40,6 @@ typedef DGL_NAMESPACE::CairoTopLevelWidget UIWidget; | |||||
| #elif DISTRHO_UI_USE_NANOVG | #elif DISTRHO_UI_USE_NANOVG | ||||
| # include "../dgl/NanoVG.hpp" | # include "../dgl/NanoVG.hpp" | ||||
| typedef DGL_NAMESPACE::NanoTopLevelWidget UIWidget; | typedef DGL_NAMESPACE::NanoTopLevelWidget UIWidget; | ||||
| #elif DISTRHO_UI_USE_WEBVIEW | |||||
| # include "../dgl/Web.hpp" | |||||
| typedef DGL_NAMESPACE::WebViewWidget UIWidget; | |||||
| #else | #else | ||||
| # include "../dgl/TopLevelWidget.hpp" | # include "../dgl/TopLevelWidget.hpp" | ||||
| typedef DGL_NAMESPACE::TopLevelWidget UIWidget; | typedef DGL_NAMESPACE::TopLevelWidget UIWidget; | ||||
| @@ -55,9 +48,8 @@ typedef DGL_NAMESPACE::TopLevelWidget UIWidget; | |||||
| #if DISTRHO_UI_FILE_BROWSER | #if DISTRHO_UI_FILE_BROWSER | ||||
| # include "extra/FileBrowserDialog.hpp" | # include "extra/FileBrowserDialog.hpp" | ||||
| #endif | #endif | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| # include <vector> | |||||
| #endif | |||||
| #include <vector> | |||||
| START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
| @@ -217,34 +209,6 @@ public: | |||||
| void* getPluginInstancePointer() const noexcept; | void* getPluginInstancePointer() const noexcept; | ||||
| #endif | #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: | protected: | ||||
| /* -------------------------------------------------------------------------------------------------------- | /* -------------------------------------------------------------------------------------------------------- | ||||
| * DSP/Plugin Callbacks */ | * DSP/Plugin Callbacks */ | ||||
| @@ -300,7 +264,6 @@ protected: | |||||
| */ | */ | ||||
| virtual void uiScaleFactorChanged(double scaleFactor); | virtual void uiScaleFactorChanged(double scaleFactor); | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| /** | /** | ||||
| Get the types available for the data in a clipboard. | Get the types available for the data in a clipboard. | ||||
| Must only be called within the context of uiClipboardDataOffer. | 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. | The most common exception is custom OpenGL setup, but only really needed for custom OpenGL drawing code. | ||||
| */ | */ | ||||
| virtual void uiReshape(uint width, uint height); | virtual void uiReshape(uint width, uint height); | ||||
| #endif // !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| #if DISTRHO_UI_FILE_BROWSER | #if DISTRHO_UI_FILE_BROWSER | ||||
| /** | /** | ||||
| @@ -355,21 +317,12 @@ protected: | |||||
| /* -------------------------------------------------------------------------------------------------------- | /* -------------------------------------------------------------------------------------------------------- | ||||
| * UI Resize Handling, internal */ | * 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. | Widget resize function, called when the widget is resized. | ||||
| This is overriden here so the host knows when the UI is resized by you. | This is overriden here so the host knows when the UI is resized by you. | ||||
| @see Widget::onResize(const ResizeEvent&) | @see Widget::onResize(const ResizeEvent&) | ||||
| */ | */ | ||||
| void onResize(const ResizeEvent& ev) override; | void onResize(const ResizeEvent& ev) override; | ||||
| #endif | |||||
| // ------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------- | ||||
| @@ -378,10 +331,8 @@ private: | |||||
| PrivateData* const uiData; | PrivateData* const uiData; | ||||
| friend class PluginWindow; | friend class PluginWindow; | ||||
| friend class UIExporter; | friend class UIExporter; | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| /** @internal */ | /** @internal */ | ||||
| void requestSizeChange(uint width, uint height) override; | void requestSizeChange(uint width, uint height) override; | ||||
| #endif | |||||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI) | DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI) | ||||
| }; | }; | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO Plugin Framework (DPF) | * 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 | * 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 | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
| @@ -18,8 +18,8 @@ | |||||
| # error bad include | # error bad include | ||||
| #endif | #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 | #endif | ||||
| // -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO Plugin Framework (DPF) | * 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 | * 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 | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
| @@ -29,7 +29,7 @@ | |||||
| # error DISTRHO_PLUGIN_CLAP_ID undefined! | # error DISTRHO_PLUGIN_CLAP_ID undefined! | ||||
| #endif | #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 | # undef DISTRHO_PLUGIN_HAS_UI | ||||
| # define DISTRHO_PLUGIN_HAS_UI 0 | # define DISTRHO_PLUGIN_HAS_UI 0 | ||||
| #endif | #endif | ||||
| @@ -57,7 +57,7 @@ | |||||
| #include "clap/ext/thread-check.h" | #include "clap/ext/thread-check.h" | ||||
| #include "clap/ext/timer-support.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 | # define DPF_CLAP_USING_HOST_TIMER 0 | ||||
| #else | #else | ||||
| # define DPF_CLAP_USING_HOST_TIMER 1 | # define DPF_CLAP_USING_HOST_TIMER 1 | ||||
| @@ -49,10 +49,6 @@ | |||||
| # define DISTRHO_PLUGIN_HAS_UI 0 | # define DISTRHO_PLUGIN_HAS_UI 0 | ||||
| #endif | #endif | ||||
| #ifndef DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| # define DISTRHO_PLUGIN_HAS_EXTERNAL_UI 0 | |||||
| #endif | |||||
| #ifndef DISTRHO_PLUGIN_IS_RT_SAFE | #ifndef DISTRHO_PLUGIN_IS_RT_SAFE | ||||
| # define DISTRHO_PLUGIN_IS_RT_SAFE 0 | # define DISTRHO_PLUGIN_IS_RT_SAFE 0 | ||||
| #endif | #endif | ||||
| @@ -110,6 +106,10 @@ | |||||
| # define DISTRHO_UI_USER_RESIZABLE 0 | # define DISTRHO_UI_USER_RESIZABLE 0 | ||||
| #endif | #endif | ||||
| #ifndef DISTRHO_UI_USE_EXTERNAL | |||||
| # define DISTRHO_UI_USE_EXTERNAL 0 | |||||
| #endif | |||||
| #ifndef DISTRHO_UI_USE_NANOVG | #ifndef DISTRHO_UI_USE_NANOVG | ||||
| # define DISTRHO_UI_USE_NANOVG 0 | # define DISTRHO_UI_USE_NANOVG 0 | ||||
| #endif | #endif | ||||
| @@ -118,17 +118,6 @@ | |||||
| # define DISTRHO_UI_USE_WEBVIEW 0 | # define DISTRHO_UI_USE_WEBVIEW 0 | ||||
| #endif | #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 | // Define DISTRHO_UI_WEB_VIEW if needed | ||||
| @@ -147,16 +136,20 @@ | |||||
| // -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
| // Test for wrong compiler macros | // 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 | #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 | #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 | #endif | ||||
| #if DISTRHO_UI_FILE_BROWSER && defined(DGL_FILE_BROWSER_DISABLED) | #if DISTRHO_UI_FILE_BROWSER && defined(DGL_FILE_BROWSER_DISABLED) | ||||
| @@ -205,25 +198,14 @@ | |||||
| #endif | #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)) | #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 | # undef DISTRHO_PLUGIN_HAS_UI | ||||
| # define DISTRHO_PLUGIN_HAS_UI 0 | # define DISTRHO_PLUGIN_HAS_UI 0 | ||||
| # ifdef HAVE_DGL | |||||
| # error HAVE_DGL is defined in a wrong configuration | |||||
| # endif | |||||
| #endif | #endif | ||||
| // -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
| @@ -74,7 +74,7 @@ | |||||
| # define DISTRHO_PLUGIN_USES_CUSTOM_MODGUI 0 | # define DISTRHO_PLUGIN_USES_CUSTOM_MODGUI 0 | ||||
| #endif | #endif | ||||
| #if DISTRHO_PLUGIN_HAS_EMBED_UI | |||||
| #if DISTRHO_PLUGIN_HAS_UI | |||||
| # if defined(DISTRHO_OS_HAIKU) | # if defined(DISTRHO_OS_HAIKU) | ||||
| # define DISTRHO_LV2_UI_TYPE "BeUI" | # define DISTRHO_LV2_UI_TYPE "BeUI" | ||||
| # elif defined(DISTRHO_OS_MAC) | # elif defined(DISTRHO_OS_MAC) | ||||
| @@ -155,7 +155,7 @@ static constexpr const char* const lv2ManifestUiExtensionData[] = { | |||||
| }; | }; | ||||
| static constexpr const char* const lv2ManifestUiOptionalFeatures[] = { | static constexpr const char* const lv2ManifestUiOptionalFeatures[] = { | ||||
| #if DISTRHO_PLUGIN_HAS_EMBED_UI | |||||
| #if DISTRHO_PLUGIN_HAS_UI | |||||
| #if !DISTRHO_UI_USER_RESIZABLE | #if !DISTRHO_UI_USER_RESIZABLE | ||||
| "ui:noUserResize", | "ui:noUserResize", | ||||
| #endif | #endif | ||||
| @@ -1550,7 +1550,7 @@ void lv2_generate_ttl(const char* const basename) | |||||
| stylesheetFile.close(); | stylesheetFile.close(); | ||||
| std::cout << " done!" << std::endl; | 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) | * 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 | * 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 | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
| @@ -23,17 +23,7 @@ | |||||
| #include <algorithm> | #include <algorithm> | ||||
| #include <cmath> | #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" | # include "Base.hpp" | ||||
| #endif | #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); | 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 | // translate a vstgui-based key character and code to matching values used by DPF | ||||
| @@ -178,10 +178,8 @@ public: | |||||
| nullptr, // TODO file request | nullptr, // TODO file request | ||||
| d_nextBundlePath, | d_nextBundlePath, | ||||
| plugin->getInstancePointer(), | plugin->getInstancePointer(), | ||||
| scaleFactor) | |||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| , fKeyboardModifiers(0) | |||||
| #endif | |||||
| scaleFactor), | |||||
| fKeyboardModifiers(0) | |||||
| #if DISTRHO_PLUGIN_WANT_MIDI_INPUT | #if DISTRHO_PLUGIN_WANT_MIDI_INPUT | ||||
| , fNotesRingBuffer() | , fNotesRingBuffer() | ||||
| #endif | #endif | ||||
| @@ -242,7 +240,6 @@ public: | |||||
| } | } | ||||
| #endif | #endif | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| int handlePluginKeyEvent(const bool down, const int32_t index, const intptr_t value) | 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); | d_stdout("handlePluginKeyEvent %i %i %li\n", down, index, (long int)value); | ||||
| @@ -281,7 +278,6 @@ public: | |||||
| value >= 0 ? static_cast<uint>(value) : 0, | value >= 0 ? static_cast<uint>(value) : 0, | ||||
| fKeyboardModifiers) ? 1 : 0; | fKeyboardModifiers) ? 1 : 0; | ||||
| } | } | ||||
| #endif // !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| // ---------------------------------------------------------------------------------------------------------------- | // ---------------------------------------------------------------------------------------------------------------- | ||||
| @@ -347,9 +343,7 @@ private: | |||||
| // Plugin UI | // Plugin UI | ||||
| UIExporter fUI; | UIExporter fUI; | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| uint16_t fKeyboardModifiers; | uint16_t fKeyboardModifiers; | ||||
| #endif | |||||
| #if DISTRHO_PLUGIN_WANT_MIDI_INPUT | #if DISTRHO_PLUGIN_WANT_MIDI_INPUT | ||||
| RingBufferControl<SmallStackBuffer> fNotesRingBuffer; | RingBufferControl<SmallStackBuffer> fNotesRingBuffer; | ||||
| #endif | #endif | ||||
| @@ -678,7 +672,6 @@ public: | |||||
| fVstUI->idle(); | fVstUI->idle(); | ||||
| break; | break; | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| case VST_EFFECT_OPCODE_3B: // key down | case VST_EFFECT_OPCODE_3B: // key down | ||||
| if (fVstUI != nullptr) | if (fVstUI != nullptr) | ||||
| return fVstUI->handlePluginKeyEvent(true, index, value); | return fVstUI->handlePluginKeyEvent(true, index, value); | ||||
| @@ -688,7 +681,6 @@ public: | |||||
| if (fVstUI != nullptr) | if (fVstUI != nullptr) | ||||
| return fVstUI->handlePluginKeyEvent(false, index, value); | return fVstUI->handlePluginKeyEvent(false, index, value); | ||||
| break; | break; | ||||
| #endif | |||||
| #endif // DISTRHO_PLUGIN_HAS_UI | #endif // DISTRHO_PLUGIN_HAS_UI | ||||
| #if DISTRHO_PLUGIN_WANT_STATE | #if DISTRHO_PLUGIN_WANT_STATE | ||||
| @@ -60,7 +60,7 @@ END_NAMESPACE_DISTRHO | |||||
| # include "../extra/FileBrowserDialogImpl.cpp" | # include "../extra/FileBrowserDialogImpl.cpp" | ||||
| #endif | #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 DISTRHO_WEB_VIEW_HPP_INCLUDED | ||||
| # define WEB_VIEW_NAMESPACE DISTRHO_NAMESPACE | # define WEB_VIEW_NAMESPACE DISTRHO_NAMESPACE | ||||
| # define WEB_VIEW_DISTRHO_NAMESPACE | # define WEB_VIEW_DISTRHO_NAMESPACE | ||||
| @@ -70,11 +70,8 @@ END_NAMESPACE_DISTRHO | |||||
| # include "../extra/WebViewImpl.cpp" | # include "../extra/WebViewImpl.cpp" | ||||
| #endif | #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" | #include "DistrhoUIPrivateData.hpp" | ||||
| START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
| @@ -82,11 +79,7 @@ START_NAMESPACE_DISTRHO | |||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| * Static data, see DistrhoUIInternal.hpp */ | * 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 */ | * get global scale factor */ | ||||
| @@ -177,12 +170,7 @@ static double getDesktopScaleFactor(const uintptr_t parentWindowHandle) | |||||
| UI::PrivateData* UI::PrivateData::s_nextPrivateData = nullptr; | 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; | UI::PrivateData* const pData = s_nextPrivateData; | ||||
| const double scaleFactor = d_isNotZero(pData->scaleFactor) ? pData->scaleFactor : getDesktopScaleFactor(pData->winId); | 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; | 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); | d_stdout("createNextWindow %u %u %f %d", width, height, scaleFactor, adjustForScaleFactor); | ||||
| pData->window = new PluginWindow(ui, pData->app, pData->winId, width, height, scaleFactor); | 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(); | pData->window->setIgnoreIdleCallbacks(); | ||||
| return pData->window.getObject(); | 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) | uiData(UI::PrivateData::s_nextPrivateData) | ||||
| { | { | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| if (width != 0 && height != 0) | if (width != 0 && height != 0) | ||||
| { | { | ||||
| Widget::setSize(width, height); | 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); | Widget::setSize(DISTRHO_UI_DEFAULT_WIDTH, DISTRHO_UI_DEFAULT_HEIGHT); | ||||
| } | } | ||||
| #endif | #endif | ||||
| #else | |||||
| // unused | |||||
| (void)automaticallyScaleAndSetAsMinimumSize; | |||||
| #endif | |||||
| } | } | ||||
| UI::~UI() | UI::~UI() | ||||
| @@ -268,15 +239,11 @@ UI::~UI() | |||||
| bool UI::isResizable() const noexcept | 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(); | return uiData->window->isResizable(); | ||||
| # endif | |||||
| #else | |||||
| #else | |||||
| return false; | return false; | ||||
| #endif | |||||
| #endif | |||||
| } | } | ||||
| uint UI::getBackgroundColor() const noexcept | uint UI::getBackgroundColor() const noexcept | ||||
| @@ -347,28 +314,6 @@ void* UI::getPluginInstancePointer() const noexcept | |||||
| } | } | ||||
| #endif | #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 */ | * DSP/Plugin Callbacks */ | ||||
| @@ -402,7 +347,6 @@ void UI::uiScaleFactorChanged(double) | |||||
| { | { | ||||
| } | } | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| std::vector<DGL_NAMESPACE::ClipboardDataOffer> UI::getClipboardDataOfferTypes() | std::vector<DGL_NAMESPACE::ClipboardDataOffer> UI::getClipboardDataOfferTypes() | ||||
| { | { | ||||
| return uiData->window->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 | // NOTE this must be the same as Window::onReshape | ||||
| pData->fallbackOnResize(width, height); | pData->fallbackOnResize(width, height); | ||||
| } | } | ||||
| #endif // !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| #if DISTRHO_UI_FILE_BROWSER | #if DISTRHO_UI_FILE_BROWSER | ||||
| void UI::uiFileBrowserSelected(const char*) | void UI::uiFileBrowserSelected(const char*) | ||||
| @@ -442,14 +385,6 @@ void UI::uiFileBrowserSelected(const char*) | |||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| * UI Resize Handling, internal */ | * 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) | void UI::onResize(const ResizeEvent& ev) | ||||
| { | { | ||||
| UIWidget::onResize(ev); | UIWidget::onResize(ev); | ||||
| @@ -478,7 +413,6 @@ void UI::requestSizeChange(const uint width, const uint height) | |||||
| (void)height; | (void)height; | ||||
| #endif | #endif | ||||
| } | } | ||||
| #endif | |||||
| // ----------------------------------------------------------------------------------------------------------- | // ----------------------------------------------------------------------------------------------------------- | ||||
| @@ -25,10 +25,6 @@ START_NAMESPACE_DISTRHO | |||||
| // Static data, see DistrhoUI.cpp | // Static data, see DistrhoUI.cpp | ||||
| extern const char* g_nextBundlePath; | extern const char* g_nextBundlePath; | ||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| extern uintptr_t g_nextWindowId; | |||||
| extern double g_nextScaleFactor; | |||||
| #endif | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // UI exporter class | // UI exporter class | ||||
| @@ -79,41 +75,25 @@ public: | |||||
| uiData->setSizeCallbackFunc = setSizeCall; | uiData->setSizeCallbackFunc = setSizeCall; | ||||
| uiData->fileRequestCallbackFunc = fileRequestCall; | 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::PrivateData::s_nextPrivateData = uiData; | ||||
| UI* const uiPtr = createUI(); | UI* const uiPtr = createUI(); | ||||
| g_nextBundlePath = nullptr; | 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 | // enter context called in the PluginWindow constructor, see DistrhoUIPrivateData.hpp | ||||
| uiData->window->leaveContext(); | uiData->window->leaveContext(); | ||||
| #endif | |||||
| UI::PrivateData::s_nextPrivateData = nullptr; | UI::PrivateData::s_nextPrivateData = nullptr; | ||||
| DISTRHO_SAFE_ASSERT_RETURN(uiPtr != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(uiPtr != nullptr,); | ||||
| ui = uiPtr; | ui = uiPtr; | ||||
| uiData->initializing = false; | uiData->initializing = false; | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| // unused | |||||
| (void)bundlePath; | |||||
| #endif | |||||
| } | } | ||||
| ~UIExporter() | ~UIExporter() | ||||
| { | { | ||||
| quit(); | quit(); | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| uiData->window->enterContextForDeletion(); | uiData->window->enterContextForDeletion(); | ||||
| #endif | |||||
| delete ui; | delete ui; | ||||
| delete uiData; | delete uiData; | ||||
| } | } | ||||
| @@ -137,13 +117,9 @@ public: | |||||
| bool getGeometryConstraints(uint& minimumWidth, uint& minimumHeight, bool& keepAspectRatio) const noexcept | 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)); | const DGL_NAMESPACE::Size<uint> size(uiData->window->getGeometryConstraints(keepAspectRatio)); | ||||
| minimumWidth = size.getWidth(); | minimumWidth = size.getWidth(); | ||||
| minimumHeight = size.getHeight(); | minimumHeight = size.getHeight(); | ||||
| #endif | |||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -263,16 +239,14 @@ public: | |||||
| uiData->app.quit(); | uiData->app.quit(); | ||||
| } | } | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| void repaint() | void repaint() | ||||
| { | { | ||||
| uiData->window->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() | void idleFromNativeIdle() | ||||
| { | { | ||||
| DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); | ||||
| @@ -282,7 +256,6 @@ public: | |||||
| uiData->app.repaintIfNeeeded(); | uiData->app.repaintIfNeeeded(); | ||||
| } | } | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| void addIdleCallbackForNativeIdle(IdleCallback* const cb, const uint timerFrequencyInMs) | void addIdleCallbackForNativeIdle(IdleCallback* const cb, const uint timerFrequencyInMs) | ||||
| { | { | ||||
| uiData->window->addIdleCallback(cb, timerFrequencyInMs); | uiData->window->addIdleCallback(cb, timerFrequencyInMs); | ||||
| @@ -293,28 +266,18 @@ public: | |||||
| uiData->window->removeIdleCallback(cb); | uiData->window->removeIdleCallback(cb); | ||||
| } | } | ||||
| #endif | #endif | ||||
| #endif | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| void setWindowOffset(const int x, const int y) | 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); | uiData->window->setOffset(x, y); | ||||
| #endif | |||||
| } | } | ||||
| #if DISTRHO_UI_USES_SIZE_REQUEST | #if DISTRHO_UI_USES_SIZE_REQUEST | ||||
| void setWindowSizeFromHost(const uint width, const uint height) | void setWindowSizeFromHost(const uint width, const uint height) | ||||
| { | { | ||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| ui->setSize(width, height); | |||||
| #else | |||||
| uiData->window->setSizeFromHost(width, height); | uiData->window->setSizeFromHost(width, height); | ||||
| #endif | |||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -325,11 +288,7 @@ public: | |||||
| void setWindowTransientWinId(const uintptr_t transientParentWindowHandle) | void setWindowTransientWinId(const uintptr_t transientParentWindowHandle) | ||||
| { | { | ||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| ui->setTransientWindowId(transientParentWindowHandle); | |||||
| #else | |||||
| uiData->window->setTransientParent(transientParentWindowHandle); | uiData->window->setTransientParent(transientParentWindowHandle); | ||||
| #endif | |||||
| } | } | ||||
| bool setWindowVisible(const bool yesNo) | bool setWindowVisible(const bool yesNo) | ||||
| @@ -339,7 +298,6 @@ public: | |||||
| return ! uiData->app.isQuitting(); | 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) | bool handlePluginKeyboardVST(const bool press, const bool special, const uint keychar, const uint keycode, const uint16_t mods) | ||||
| { | { | ||||
| using namespace DGL_NAMESPACE; | using namespace DGL_NAMESPACE; | ||||
| @@ -372,7 +330,6 @@ public: | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| #endif | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| @@ -383,14 +340,12 @@ public: | |||||
| ui->uiScaleFactorChanged(scaleFactor); | ui->uiScaleFactorChanged(scaleFactor); | ||||
| } | } | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| void notifyFocusChanged(const bool focus) | void notifyFocusChanged(const bool focus) | ||||
| { | { | ||||
| DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); | ||||
| ui->uiFocus(focus, DGL_NAMESPACE::kCrossingNormal); | ui->uiFocus(focus, DGL_NAMESPACE::kCrossingNormal); | ||||
| } | } | ||||
| #endif | |||||
| void setSampleRate(const double sampleRate, const bool doCallback = false) | void setSampleRate(const double sampleRate, const bool doCallback = false) | ||||
| { | { | ||||
| @@ -23,16 +23,11 @@ | |||||
| # include "DistrhoPluginVST.hpp" | # include "DistrhoPluginVST.hpp" | ||||
| #endif | #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 <map> | ||||
| # include <string> | # include <string> | ||||
| #endif | #endif | ||||
| @@ -65,55 +60,6 @@ START_NAMESPACE_DISTRHO | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // Plugin Application, will set class name based on plugin details | // 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 | class PluginApplication : public DGL_NAMESPACE::Application | ||||
| { | { | ||||
| public: | public: | ||||
| @@ -151,47 +97,10 @@ public: | |||||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginApplication) | DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginApplication) | ||||
| }; | }; | ||||
| #endif | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // Plugin Window, will pass some Window events to UI | // 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 | class PluginWindow : public DGL_NAMESPACE::Window | ||||
| { | { | ||||
| UI* const ui; | UI* const ui; | ||||
| @@ -320,7 +229,6 @@ protected: | |||||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginWindow) | DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginWindow) | ||||
| }; | }; | ||||
| #endif // DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // UI callbacks | // UI callbacks | ||||
| @@ -350,7 +258,7 @@ struct UI::PrivateData { | |||||
| uint fgColor; | uint fgColor; | ||||
| double scaleFactor; | double scaleFactor; | ||||
| uintptr_t winId; | 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; | char* uiStateFileKeyRequest; | ||||
| std::map<std::string,std::string> lastUsedDirnames; | std::map<std::string,std::string> lastUsedDirnames; | ||||
| #endif | #endif | ||||
| @@ -378,7 +286,7 @@ struct UI::PrivateData { | |||||
| fgColor(0xffffffff), | fgColor(0xffffffff), | ||||
| scaleFactor(1.0), | scaleFactor(1.0), | ||||
| winId(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), | uiStateFileKeyRequest(nullptr), | ||||
| #endif | #endif | ||||
| bundlePath(nullptr), | bundlePath(nullptr), | ||||
| @@ -414,7 +322,7 @@ struct UI::PrivateData { | |||||
| ~PrivateData() noexcept | ~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); | std::free(uiStateFileKeyRequest); | ||||
| #endif | #endif | ||||
| std::free(bundlePath); | std::free(bundlePath); | ||||
| @@ -454,11 +362,7 @@ struct UI::PrivateData { | |||||
| bool fileRequestCallback(const char* const key); | bool fileRequestCallback(const char* const key); | ||||
| static UI::PrivateData* s_nextPrivateData; | 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); | 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) | if (fileRequestCallbackFunc != nullptr) | ||||
| return fileRequestCallbackFunc(callbacksPtr, key); | 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); | std::free(uiStateFileKeyRequest); | ||||
| uiStateFileKeyRequest = strdup(key); | uiStateFileKeyRequest = strdup(key); | ||||
| DISTRHO_SAFE_ASSERT_RETURN(uiStateFileKeyRequest != nullptr, false); | 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 | // 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) | inline void PluginWindow::onFileSelected(const char* const filename) | ||||
| { | { | ||||
| DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); | ||||
| @@ -499,7 +403,7 @@ inline void PluginWindow::onFileSelected(const char* const filename) | |||||
| if (initializing) | if (initializing) | ||||
| return; | 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) | if (char* const key = ui->uiData->uiStateFileKeyRequest) | ||||
| { | { | ||||
| ui->uiData->uiStateFileKeyRequest = nullptr; | ui->uiData->uiStateFileKeyRequest = nullptr; | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO Plugin Framework (DPF) | * 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 | * 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 | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
| @@ -21,15 +21,6 @@ | |||||
| #include "travesty/host.h" | #include "travesty/host.h" | ||||
| #include "travesty/view.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: | /* TODO items: | ||||
| * - mousewheel event | * - mousewheel event | ||||
| * - file request? | * - 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 | static uint translateVST3Modifiers(const int64_t modifiers) noexcept | ||||
| { | { | ||||
| using namespace DGL_NAMESPACE; | using namespace DGL_NAMESPACE; | ||||
| @@ -134,115 +124,9 @@ static uint translateVST3Modifiers(const int64_t modifiers) noexcept | |||||
| return dglmods; | 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 | #if !DPF_VST3_USING_HOST_RUN_LOOP | ||||
| class NativeIdleCallback : public IdleCallback | class NativeIdleCallback : public IdleCallback | ||||
| @@ -250,49 +134,25 @@ class NativeIdleCallback : public IdleCallback | |||||
| public: | public: | ||||
| NativeIdleCallback(UIExporter& ui) | NativeIdleCallback(UIExporter& ui) | ||||
| : fCallbackRegistered(false), | : 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() | void registerNativeIdleCallback() | ||||
| { | { | ||||
| DISTRHO_SAFE_ASSERT_RETURN(!fCallbackRegistered,); | DISTRHO_SAFE_ASSERT_RETURN(!fCallbackRegistered,); | ||||
| fCallbackRegistered = true; | fCallbackRegistered = true; | ||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| fIdleHelper.registerNativeIdleCallback(); | |||||
| #else | |||||
| fUI.addIdleCallbackForNativeIdle(this, DPF_VST3_TIMER_INTERVAL); | fUI.addIdleCallbackForNativeIdle(this, DPF_VST3_TIMER_INTERVAL); | ||||
| #endif | |||||
| } | } | ||||
| void unregisterNativeIdleCallback() | void unregisterNativeIdleCallback() | ||||
| { | { | ||||
| DISTRHO_SAFE_ASSERT_RETURN(fCallbackRegistered,); | DISTRHO_SAFE_ASSERT_RETURN(fCallbackRegistered,); | ||||
| fCallbackRegistered = false; | fCallbackRegistered = false; | ||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| fIdleHelper.unregisterNativeIdleCallback(); | |||||
| #else | |||||
| fUI.removeIdleCallbackForNativeIdle(this); | fUI.removeIdleCallbackForNativeIdle(this); | ||||
| #endif | |||||
| } | } | ||||
| private: | private: | ||||
| bool fCallbackRegistered; | bool fCallbackRegistered; | ||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| NativeIdleHelper fIdleHelper; | |||||
| #else | |||||
| UIExporter& fUI; | UIExporter& fUI; | ||||
| #endif | |||||
| }; | }; | ||||
| #endif | #endif | ||||
| @@ -392,7 +252,6 @@ public: | |||||
| // ---------------------------------------------------------------------------------------------------------------- | // ---------------------------------------------------------------------------------------------------------------- | ||||
| // v3_plugin_view interface calls | // v3_plugin_view interface calls | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| v3_result onWheel(float /*distance*/) | v3_result onWheel(float /*distance*/) | ||||
| { | { | ||||
| // TODO | // TODO | ||||
| @@ -432,7 +291,6 @@ public: | |||||
| fUI.notifyFocusChanged(state); | fUI.notifyFocusChanged(state); | ||||
| return V3_OK; | return V3_OK; | ||||
| } | } | ||||
| #endif | |||||
| v3_result getSize(v3_view_rect* const rect) const noexcept | 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) | 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); | d_debug("dpf_plugin_view::on_wheel => %p %f", self, distance); | ||||
| dpf_plugin_view* const view = *static_cast<dpf_plugin_view**>(self); | 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); | DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); | ||||
| return uivst3->onWheel(distance); | 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) | 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); | 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); | 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); | DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); | ||||
| return uivst3->onKeyDown(key_char, key_code, modifiers); | 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) | 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); | 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); | 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); | DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); | ||||
| return uivst3->onKeyUp(key_char, key_code, modifiers); | 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) | 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) | 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); | d_debug("dpf_plugin_view::on_focus => %p %u", self, state); | ||||
| dpf_plugin_view* const view = *static_cast<dpf_plugin_view**>(self); | 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); | DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); | ||||
| return uivst3->onFocus(state); | 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) | 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_CLAP_ID "studio.kx.distrho.examples.embed-external-ui" | ||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #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_IS_RT_SAFE 1 | ||||
| #define DISTRHO_PLUGIN_NUM_INPUTS 2 | #define DISTRHO_PLUGIN_NUM_INPUTS 2 | ||||
| #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | ||||
| #define DISTRHO_UI_FILE_BROWSER 0 | #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_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 | // #ifdef _WIN32 | ||||
| // #define WEB_VIEW_USING_CHOC 1 | // #define WEB_VIEW_USING_CHOC 1 | ||||
| @@ -15,17 +15,15 @@ | |||||
| */ | */ | ||||
| #include "DistrhoUI.hpp" | #include "DistrhoUI.hpp" | ||||
| #include "NativeWindow.hpp" | |||||
| #include "Window.hpp" | |||||
| #include "extra/WebView.hpp" | #include "extra/WebView.hpp" | ||||
| START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
| // -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
| class EmbedExternalExampleUI : public UI, | |||||
| public NativeWindow::Callbacks | |||||
| class EmbedExternalExampleUI : public UI | |||||
| { | { | ||||
| ScopedPointer<NativeWindow> window; | |||||
| WebViewHandle webview; | WebViewHandle webview; | ||||
| public: | public: | ||||
| @@ -33,24 +31,19 @@ public: | |||||
| : UI(), | : UI(), | ||||
| webview(nullptr) | webview(nullptr) | ||||
| { | { | ||||
| const bool standalone = isStandalone(); | |||||
| const double scaleFactor = getScaleFactor(); | const double scaleFactor = getScaleFactor(); | ||||
| d_stdout("isStandalone %d", (int)standalone); | |||||
| const uint width = DISTRHO_UI_DEFAULT_WIDTH * scaleFactor; | const uint width = DISTRHO_UI_DEFAULT_WIDTH * scaleFactor; | ||||
| const uint height = DISTRHO_UI_DEFAULT_HEIGHT * 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); | setGeometryConstraints(width, height); | ||||
| if (d_isNotEqual(scaleFactor, 1.0)) | if (d_isNotEqual(scaleFactor, 1.0)) | ||||
| setSize(width, height); | 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() | ~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) | 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 | void uiIdle() override | ||||
| { | { | ||||
| // d_stdout("uiIdle"); | |||||
| window->idle(); | |||||
| if (webview != nullptr) | if (webview != nullptr) | ||||
| webViewIdle(webview); | webViewIdle(webview); | ||||
| } | } | ||||
| @@ -26,7 +26,6 @@ | |||||
| #define DISTRHO_PLUGIN_UNIQUE_ID dSNo | #define DISTRHO_PLUGIN_UNIQUE_ID dSNo | ||||
| #define DISTRHO_PLUGIN_HAS_UI 1 | #define DISTRHO_PLUGIN_HAS_UI 1 | ||||
| #define DISTRHO_PLUGIN_HAS_EMBED_UI 1 | |||||
| #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | #define DISTRHO_PLUGIN_IS_RT_SAFE 1 | ||||
| #define DISTRHO_PLUGIN_IS_SYNTH 1 | #define DISTRHO_PLUGIN_IS_SYNTH 1 | ||||
| #define DISTRHO_PLUGIN_NUM_INPUTS 0 | #define DISTRHO_PLUGIN_NUM_INPUTS 0 | ||||