Browse Source

Deal with vst3 hosts that only get size before attaching view

pull/321/head
falkTX 2 years ago
parent
commit
5de60bb6d9
1 changed files with 26 additions and 7 deletions
  1. +26
    -7
      distrho/src/DistrhoUIVST3.cpp

+ 26
- 7
distrho/src/DistrhoUIVST3.cpp View File

@@ -249,7 +249,8 @@ public:
const float scaleFactor, const float scaleFactor,
const double sampleRate, const double sampleRate,
void* const instancePointer, void* const instancePointer,
const bool willResizeFromHost)
const bool willResizeFromHost,
const bool needsResizeFromPlugin)
: :
#if !DPF_VST3_USING_HOST_RUN_LOOP #if !DPF_VST3_USING_HOST_RUN_LOOP
NativeIdleCallback(fUI), NativeIdleCallback(fUI),
@@ -258,10 +259,11 @@ public:
fHostApplication(host), fHostApplication(host),
fConnection(connection), fConnection(connection),
fFrame(frame), fFrame(frame),
fReadyForPluginData(false),
fScaleFactor(scaleFactor), fScaleFactor(scaleFactor),
fReadyForPluginData(false),
fIsResizingFromPlugin(false), fIsResizingFromPlugin(false),
fIsResizingFromHost(willResizeFromHost), fIsResizingFromHost(willResizeFromHost),
fNeedsResizeFromPlugin(needsResizeFromPlugin),
fNextPluginRect(), fNextPluginRect(),
fUI(this, winId, sampleRate, fUI(this, winId, sampleRate,
editParameterCallback, editParameterCallback,
@@ -302,6 +304,11 @@ public:
fUI.setWindowSizeForVST3(nextWidth, nextHeight); fUI.setWindowSizeForVST3(nextWidth, nextHeight);
} }
} }
else if (fNeedsResizeFromPlugin)
{
fNeedsResizeFromPlugin = false;
setSize(fUI.getWidth(), fUI.getHeight());
}


if (fConnection != nullptr) if (fConnection != nullptr)
connect(fConnection); connect(fConnection);
@@ -685,10 +692,11 @@ private:
v3_plugin_frame** fFrame; v3_plugin_frame** fFrame;


// Temporary data // Temporary data
bool fReadyForPluginData;
float fScaleFactor; float fScaleFactor;
bool fReadyForPluginData;
bool fIsResizingFromPlugin; bool fIsResizingFromPlugin;
bool fIsResizingFromHost; bool fIsResizingFromHost;
bool fNeedsResizeFromPlugin;
v3_view_rect fNextPluginRect; // for when plugin requests a new size 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) // 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_plugin_frame** frame;
v3_run_loop** runloop; v3_run_loop** runloop;
uint32_t nextWidth, nextHeight; uint32_t nextWidth, nextHeight;
bool sizeRequestedBeforeBeingAttached;


dpf_plugin_view(v3_host_application** const host, void* const instance, const double sr) dpf_plugin_view(v3_host_application** const host, void* const instance, const double sr)
: refcounter(1), : refcounter(1),
@@ -1137,7 +1146,8 @@ struct dpf_plugin_view : v3_plugin_view_cpp {
frame(nullptr), frame(nullptr),
runloop(nullptr), runloop(nullptr),
nextWidth(0), nextWidth(0),
nextHeight(0)
nextHeight(0),
sizeRequestedBeforeBeingAttached(false)
{ {
d_stdout("dpf_plugin_view() with hostApplication %p", hostApplication); d_stdout("dpf_plugin_view() with hostApplication %p", hostApplication);


@@ -1337,11 +1347,13 @@ struct dpf_plugin_view : v3_plugin_view_cpp {
lastScaleFactor, lastScaleFactor,
view->sampleRate, view->sampleRate,
view->instancePointer, view->instancePointer,
view->nextWidth > 0 && view->nextHeight > 0);
view->nextWidth > 0 && view->nextHeight > 0,
view->sizeRequestedBeforeBeingAttached);


view->uivst3->postInit(view->nextWidth, view->nextHeight); view->uivst3->postInit(view->nextWidth, view->nextHeight);
view->nextWidth = 0; view->nextWidth = 0;
view->nextHeight = 0; view->nextHeight = 0;
view->sizeRequestedBeforeBeingAttached = false;


#if DPF_VST3_USING_HOST_RUN_LOOP #if DPF_VST3_USING_HOST_RUN_LOOP
// register a timer host run loop stuff // 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) if (UIVst3* const uivst3 = view->uivst3)
return uivst3->getSize(rect); return uivst3->getSize(rect);


d_stdout("dpf_plugin_view::get_size => %p | V3_NOT_INITIALIZED", self);
view->sizeRequestedBeforeBeingAttached = true;
return V3_NOT_INITIALIZED; return V3_NOT_INITIALIZED;
} }


static v3_result V3_API on_size(void* const self, v3_view_rect* const rect) 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->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); 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) 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); dpf_plugin_view* const view = *static_cast<dpf_plugin_view**>(self);


view->frame = frame; view->frame = frame;
@@ -1495,7 +1512,7 @@ struct dpf_plugin_view : v3_plugin_view_cpp {
if (UIVst3* const uivst3 = view->uivst3) if (UIVst3* const uivst3 = view->uivst3)
return uivst3->setFrame(frame); return uivst3->setFrame(frame);


return V3_NOT_INITIALIZED;
return V3_OK;
} }


static v3_result V3_API can_resize(void* const self) 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) 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); dpf_plugin_view* const view = *static_cast<dpf_plugin_view**>(self);


if (UIVst3* const uivst3 = view->uivst3) if (UIVst3* const uivst3 = view->uivst3)
@@ -1536,7 +1555,7 @@ struct dpf_plugin_view : v3_plugin_view_cpp {
minimumHeight /= scaleFactor; minimumHeight /= scaleFactor;
#endif #endif
applyGeometryConstraints(minimumWidth, minimumHeight, keepAspectRatio, rect); applyGeometryConstraints(minimumWidth, minimumHeight, keepAspectRatio, rect);
return V3_TRUE;
return V3_NOT_INITIALIZED;
} }
}; };




Loading…
Cancel
Save