DPF

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

commit 2b3bf6625624890a7c930c8aa6a785583871f1d7
parent ce92fc723b5abcfe684c49c0f2a01494091da213
Author: falkTX <falktx@falktx.com>
Date:   Wed,  6 Oct 2021 12:22:07 +0100

Allow external UI to set geometry constraints, fix some warnings

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

Diffstat:
Mdgl/Window.hpp | 4++--
Mdgl/src/Window.cpp | 2+-
Mdistrho/extra/ExternalWindow.hpp | 37++++++++++++++++++++++++++++---------
Mdistrho/src/DistrhoUIInternal.hpp | 13+++++++++++--
Mdistrho/src/DistrhoUIPrivateData.hpp | 6++++++
Mdistrho/src/DistrhoUIVST3.cpp | 21++++++++++++---------
6 files changed, 60 insertions(+), 23 deletions(-)

diff --git a/dgl/Window.hpp b/dgl/Window.hpp @@ -397,10 +397,10 @@ public: void runAsModal(bool blockWait = false); /** - Get the size constraint set for the Window. + Get the geometry constraints set for the Window. @see setGeometryConstraints */ - Size<uint> getMinimumSizeConstraint(bool& keepAspectRatio); + Size<uint> getGeometryConstraints(bool& keepAspectRatio); /** Set geometry constraints for the Window when resized by the user, and optionally scale contents automatically. diff --git a/dgl/src/Window.cpp b/dgl/src/Window.cpp @@ -346,7 +346,7 @@ void Window::runAsModal(bool blockWait) pData->runAsModal(blockWait); } -Size<uint> Window::getMinimumSizeConstraint(bool& keepAspectRatio) +Size<uint> Window::getGeometryConstraints(bool& keepAspectRatio) { keepAspectRatio = pData->keepAspectRatio; return Size<uint>(pData->minWidth, pData->minHeight); diff --git a/distrho/extra/ExternalWindow.hpp b/distrho/extra/ExternalWindow.hpp @@ -295,7 +295,8 @@ public: */ void setSize(uint width, uint height) { - DISTRHO_SAFE_ASSERT_UINT2_RETURN(width > 1 && height > 1, width, height,); + DISTRHO_SAFE_ASSERT_UINT_RETURN(width > 1, width,); + DISTRHO_SAFE_ASSERT_UINT_RETURN(height > 1, height,); if (pData.width == width && pData.height == height) return; @@ -314,10 +315,24 @@ public: { if (pData.title == title) return; + pData.title = title; titleChanged(title); } + /** + Set geometry constraints for the Window when resized by the user. + */ + void setGeometryConstraints(uint minimumWidth, uint minimumHeight, bool keepAspectRatio = false) + { + DISTRHO_SAFE_ASSERT_UINT_RETURN(minimumWidth > 0, minimumWidth,); + DISTRHO_SAFE_ASSERT_UINT_RETURN(minimumHeight > 0, minimumHeight,); + + pData.minWidth = minimumWidth; + pData.minHeight = minimumHeight; + pData.keepAspectRatio = keepAspectRatio; + } + /* -------------------------------------------------------------------------------------------------------- * TopLevelWidget-like calls - actions called by the host */ @@ -339,6 +354,7 @@ public: { if (pData.visible == visible) return; + pData.visible = visible; visibilityChanged(visible); } @@ -351,6 +367,7 @@ public: { if (pData.transientWinId == winId) return; + pData.transientWinId = winId; transientParentWindowChanged(winId); } @@ -388,39 +405,35 @@ protected: A callback for when the window size changes. @note WIP this might need to get fed back into the host somehow. */ - virtual void sizeChanged(uint width, uint height) + virtual void sizeChanged(uint /* width */, uint /* height */) { // unused, meant for custom implementations - return; (void)width; (void)height; } /** A callback for when the window title changes. @note WIP this might need to get fed back into the host somehow. */ - virtual void titleChanged(const char* title) + virtual void titleChanged(const char* /* title */) { // unused, meant for custom implementations - return; (void)title; } /** A callback for when the window visibility changes. @note WIP this might need to get fed back into the host somehow. */ - virtual void visibilityChanged(bool visible) + virtual void visibilityChanged(bool /* visible */) { // unused, meant for custom implementations - return; (void)visible; } /** A callback for when the transient parent window changes. */ - virtual void transientParentWindowChanged(uintptr_t winId) + virtual void transientParentWindowChanged(uintptr_t /* winId */) { // unused, meant for custom implementations - return; (void)winId; } private: @@ -533,6 +546,9 @@ private: uint height; double scaleFactor; String title; + uint minWidth; + uint minHeight; + bool keepAspectRatio; bool isQuitting; bool isStandalone; bool visible; @@ -544,6 +560,9 @@ private: height(1), scaleFactor(1.0), title(), + minWidth(0), + minHeight(0), + keepAspectRatio(false), isQuitting(false), isStandalone(false), visible(false) {} diff --git a/distrho/src/DistrhoUIInternal.hpp b/distrho/src/DistrhoUIInternal.hpp @@ -132,9 +132,16 @@ public: return uiData->window->getScaleFactor(); } - Size<uint> getMinimumSizeConstraint(bool& keepAspectRatio) + bool getGeometryConstraints(uint& minimumWidth, uint& minimumHeight, bool& keepAspectRatio) const noexcept { - return uiData->window->getMinimumSizeConstraint(keepAspectRatio); +#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI + uiData->window->getGeometryConstraints(minimumWidth, minimumHeight, keepAspectRatio); +#else + const Size<uint> size(uiData->window->getGeometryConstraints(keepAspectRatio)); + minimumWidth = size.getWidth(); + minimumHeight = size.getHeight(); +#endif + return true; } bool isResizable() const noexcept @@ -272,8 +279,10 @@ public: void setWindowSizeForVST3(const uint width, const uint height) { ui->setSize(width, height); +#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI uiData->window->setSize(width, height); // uiData->app.idle(); +#endif } void setWindowTitle(const char* const uiTitle) diff --git a/distrho/src/DistrhoUIPrivateData.hpp b/distrho/src/DistrhoUIPrivateData.hpp @@ -152,6 +152,12 @@ public: 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) }; diff --git a/distrho/src/DistrhoUIVST3.cpp b/distrho/src/DistrhoUIVST3.cpp @@ -75,10 +75,11 @@ struct ScopedUTF16String { // -------------------------------------------------------------------------------------------------------------------- -static bool checkSizeConstraint(const Size<uint>& size, const bool keepAspectRatio, v3_view_rect* const rect) +static bool checkSizeConstraint(const uint minimumWidth, const uint minimumHeight, const bool keepAspectRatio, + v3_view_rect* const rect) { - const int32_t minWidth = static_cast<int32_t>(size.getWidth()); - const int32_t minHeight = static_cast<int32_t>(size.getHeight()); + const int32_t minWidth = static_cast<int32_t>(minimumWidth); + const int32_t minHeight = static_cast<int32_t>(minimumHeight); bool changed = false; if (keepAspectRatio) @@ -92,10 +93,10 @@ static bool checkSizeConstraint(const Size<uint>& size, const bool keepAspectRat // fix width if (reqRatio > ratio) - rect->right = static_cast<uint>(rect->bottom * ratio + 0.5); + rect->right = static_cast<int32_t>(rect->bottom * ratio + 0.5); // fix height else - rect->bottom = static_cast<uint>(static_cast<double>(rect->right) / ratio + 0.5); + rect->bottom = static_cast<int32_t>(static_cast<double>(rect->right) / ratio + 0.5); } } @@ -255,9 +256,10 @@ public: v3_result checkSizeConstraint(v3_view_rect* const rect) { + uint minimumWidth, minimumHeight; bool keepAspectRatio; - const Size<uint> size(fUI.getMinimumSizeConstraint(keepAspectRatio)); - return ::checkSizeConstraint(size, keepAspectRatio, rect) ? V3_FALSE : V3_TRUE; + fUI.getGeometryConstraints(minimumWidth, minimumHeight, keepAspectRatio); + return ::checkSizeConstraint(minimumWidth, minimumHeight, keepAspectRatio, rect) ? V3_FALSE : V3_TRUE; } // ---------------------------------------------------------------------------------------------------------------- @@ -1261,9 +1263,10 @@ struct dpf_plugin_view : v3_plugin_view_cpp { UIExporter tmpUI(nullptr, 0, view->sampleRate, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, view->instancePointer, scaleFactor); + uint minimumWidth, minimumHeight; bool keepAspectRatio; - const Size<uint> size(tmpUI.getMinimumSizeConstraint(keepAspectRatio)); - return ::checkSizeConstraint(size, keepAspectRatio, rect) ? V3_FALSE : V3_TRUE; + tmpUI.getGeometryConstraints(minimumWidth, minimumHeight, keepAspectRatio); + return ::checkSizeConstraint(minimumWidth, minimumHeight, keepAspectRatio, rect) ? V3_FALSE : V3_TRUE; } };