| @@ -249,7 +249,8 @@ public: | |||
| const float scaleFactor, | |||
| const double sampleRate, | |||
| void* const instancePointer, | |||
| const bool willResizeFromHost) | |||
| const bool willResizeFromHost, | |||
| const bool needsResizeFromPlugin) | |||
| : | |||
| #if !DPF_VST3_USING_HOST_RUN_LOOP | |||
| NativeIdleCallback(fUI), | |||
| @@ -258,10 +259,11 @@ public: | |||
| fHostApplication(host), | |||
| fConnection(connection), | |||
| fFrame(frame), | |||
| fReadyForPluginData(false), | |||
| fScaleFactor(scaleFactor), | |||
| fReadyForPluginData(false), | |||
| fIsResizingFromPlugin(false), | |||
| fIsResizingFromHost(willResizeFromHost), | |||
| fNeedsResizeFromPlugin(needsResizeFromPlugin), | |||
| fNextPluginRect(), | |||
| fUI(this, winId, sampleRate, | |||
| editParameterCallback, | |||
| @@ -302,6 +304,11 @@ public: | |||
| fUI.setWindowSizeForVST3(nextWidth, nextHeight); | |||
| } | |||
| } | |||
| else if (fNeedsResizeFromPlugin) | |||
| { | |||
| fNeedsResizeFromPlugin = false; | |||
| setSize(fUI.getWidth(), fUI.getHeight()); | |||
| } | |||
| if (fConnection != nullptr) | |||
| connect(fConnection); | |||
| @@ -685,10 +692,11 @@ private: | |||
| v3_plugin_frame** fFrame; | |||
| // Temporary data | |||
| bool fReadyForPluginData; | |||
| float fScaleFactor; | |||
| bool fReadyForPluginData; | |||
| bool fIsResizingFromPlugin; | |||
| bool fIsResizingFromHost; | |||
| bool fNeedsResizeFromPlugin; | |||
| v3_view_rect fNextPluginRect; // for when plugin requests a new size | |||
| // Plugin UI (after VST3 stuff so the UI can call into us during its constructor) | |||
| @@ -1128,6 +1136,7 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| v3_plugin_frame** frame; | |||
| v3_run_loop** runloop; | |||
| uint32_t nextWidth, nextHeight; | |||
| bool sizeRequestedBeforeBeingAttached; | |||
| dpf_plugin_view(v3_host_application** const host, void* const instance, const double sr) | |||
| : refcounter(1), | |||
| @@ -1137,7 +1146,8 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| frame(nullptr), | |||
| runloop(nullptr), | |||
| nextWidth(0), | |||
| nextHeight(0) | |||
| nextHeight(0), | |||
| sizeRequestedBeforeBeingAttached(false) | |||
| { | |||
| d_stdout("dpf_plugin_view() with hostApplication %p", hostApplication); | |||
| @@ -1337,11 +1347,13 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| lastScaleFactor, | |||
| view->sampleRate, | |||
| view->instancePointer, | |||
| view->nextWidth > 0 && view->nextHeight > 0); | |||
| view->nextWidth > 0 && view->nextHeight > 0, | |||
| view->sizeRequestedBeforeBeingAttached); | |||
| view->uivst3->postInit(view->nextWidth, view->nextHeight); | |||
| view->nextWidth = 0; | |||
| view->nextHeight = 0; | |||
| view->sizeRequestedBeforeBeingAttached = false; | |||
| #if DPF_VST3_USING_HOST_RUN_LOOP | |||
| // register a timer host run loop stuff | |||
| @@ -1451,11 +1463,15 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| if (UIVst3* const uivst3 = view->uivst3) | |||
| return uivst3->getSize(rect); | |||
| d_stdout("dpf_plugin_view::get_size => %p | V3_NOT_INITIALIZED", self); | |||
| view->sizeRequestedBeforeBeingAttached = true; | |||
| return V3_NOT_INITIALIZED; | |||
| } | |||
| static v3_result V3_API on_size(void* const self, v3_view_rect* const rect) | |||
| { | |||
| d_stdout("dpf_plugin_view::on_size => %p {%d,%d,%d,%d}", | |||
| self, rect->top, rect->left, rect->right, rect->bottom); | |||
| DISTRHO_SAFE_ASSERT_INT2_RETURN(rect->right > rect->left, rect->right, rect->left, V3_INVALID_ARG); | |||
| DISTRHO_SAFE_ASSERT_INT2_RETURN(rect->bottom > rect->top, rect->bottom, rect->top, V3_INVALID_ARG); | |||
| @@ -1488,6 +1504,7 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| static v3_result V3_API set_frame(void* const self, v3_plugin_frame** const frame) | |||
| { | |||
| d_stdout("dpf_plugin_view::set_frame => %p %p", self, frame); | |||
| dpf_plugin_view* const view = *static_cast<dpf_plugin_view**>(self); | |||
| view->frame = frame; | |||
| @@ -1495,7 +1512,7 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| if (UIVst3* const uivst3 = view->uivst3) | |||
| return uivst3->setFrame(frame); | |||
| return V3_NOT_INITIALIZED; | |||
| return V3_OK; | |||
| } | |||
| static v3_result V3_API can_resize(void* const self) | |||
| @@ -1517,6 +1534,8 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| static v3_result V3_API check_size_constraint(void* const self, v3_view_rect* const rect) | |||
| { | |||
| d_stdout("dpf_plugin_view::check_size_constraint => %p {%d,%d,%d,%d}", | |||
| self, rect->top, rect->left, rect->right, rect->bottom); | |||
| dpf_plugin_view* const view = *static_cast<dpf_plugin_view**>(self); | |||
| if (UIVst3* const uivst3 = view->uivst3) | |||
| @@ -1536,7 +1555,7 @@ struct dpf_plugin_view : v3_plugin_view_cpp { | |||
| minimumHeight /= scaleFactor; | |||
| #endif | |||
| applyGeometryConstraints(minimumWidth, minimumHeight, keepAspectRatio, rect); | |||
| return V3_TRUE; | |||
| return V3_NOT_INITIALIZED; | |||
| } | |||
| }; | |||