diff --git a/dgl/Window.hpp b/dgl/Window.hpp index c2046153..181f0122 100644 --- 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 getMinimumSizeConstraint(bool& keepAspectRatio); + Size 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 index 776db8d6..c09106fa 100644 --- a/dgl/src/Window.cpp +++ b/dgl/src/Window.cpp @@ -346,7 +346,7 @@ void Window::runAsModal(bool blockWait) pData->runAsModal(blockWait); } -Size Window::getMinimumSizeConstraint(bool& keepAspectRatio) +Size Window::getGeometryConstraints(bool& keepAspectRatio) { keepAspectRatio = pData->keepAspectRatio; return Size(pData->minWidth, pData->minHeight); diff --git a/distrho/extra/ExternalWindow.hpp b/distrho/extra/ExternalWindow.hpp index 53b0f541..1f1c360b 100644 --- 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 index e22a5787..af2764e8 100644 --- a/distrho/src/DistrhoUIInternal.hpp +++ b/distrho/src/DistrhoUIInternal.hpp @@ -132,9 +132,16 @@ public: return uiData->window->getScaleFactor(); } - Size 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 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 index 1b63a33e..1371b9d2 100644 --- 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 index b156616e..81c1e868 100644 --- a/distrho/src/DistrhoUIVST3.cpp +++ b/distrho/src/DistrhoUIVST3.cpp @@ -75,10 +75,11 @@ struct ScopedUTF16String { // -------------------------------------------------------------------------------------------------------------------- -static bool checkSizeConstraint(const Size& 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(size.getWidth()); - const int32_t minHeight = static_cast(size.getHeight()); + const int32_t minWidth = static_cast(minimumWidth); + const int32_t minHeight = static_cast(minimumHeight); bool changed = false; if (keepAspectRatio) @@ -92,10 +93,10 @@ static bool checkSizeConstraint(const Size& size, const bool keepAspectRat // fix width if (reqRatio > ratio) - rect->right = static_cast(rect->bottom * ratio + 0.5); + rect->right = static_cast(rect->bottom * ratio + 0.5); // fix height else - rect->bottom = static_cast(static_cast(rect->right) / ratio + 0.5); + rect->bottom = static_cast(static_cast(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 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 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; } };