From 9bb90388c19c9c1d5d0a4a8901d04f7816b2f8d5 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Tue, 22 Dec 2020 15:42:41 +0100 Subject: [PATCH] Implement IPlugView::checkSizeConstraint() With this the whole of `IPlugView` and thus also `IEditController` is implemented. --- README.md | 1 - src/common/logging/vst3.cpp | 12 ++++++++++++ src/common/logging/vst3.h | 1 + src/common/serialization/vst3.h | 1 + .../serialization/vst3/plug-view/plug-view.h | 19 +++++++++++++++++++ .../bridges/vst3-impls/plug-view-proxy.cpp | 12 +++++++++--- src/wine-host/bridges/vst3.cpp | 5 +++++ 7 files changed, 47 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7b2338ae..4ea68487 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,6 @@ incomplete list of things that still have to be done before this can be used: - `IHostApplication::createComponent()` - `IConnectionPoint::notify()`, and support for indirectly connecting components through message passing proxies - - The rest of `IPlugView` - `IEditController2` - All other mandatory interfaces - All other optional interfaces diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index af419ffd..53e412c6 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -333,6 +333,18 @@ bool Vst3Logger::log_request(bool is_host_vst, }); } +bool Vst3Logger::log_request(bool is_host_vst, + const YaPlugView::CheckSizeConstraint& request) { + return log_request_base(is_host_vst, [&](auto& message) { + message << request.owner_instance_id + << ": IPlugView::checkSizeConstraint(rect = " + ")"; + }); +} + bool Vst3Logger::log_request(bool is_host_vst, const YaPluginBase::Initialize& request) { return log_request_base(is_host_vst, [&](auto& message) { diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index ca359e17..e317768c 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -99,6 +99,7 @@ class Vst3Logger { bool log_request(bool is_host_vst, const YaPlugView::OnFocus&); bool log_request(bool is_host_vst, const YaPlugView::SetFrame&); bool log_request(bool is_host_vst, const YaPlugView::CanResize&); + bool log_request(bool is_host_vst, const YaPlugView::CheckSizeConstraint&); bool log_request(bool is_host_vst, const YaPluginBase::Initialize&); bool log_request(bool is_host_vst, const YaPluginBase::Terminate&); bool log_request(bool is_host_vst, const YaPluginFactory::Construct&); diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index 3a6f1c89..fe6fe52f 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -90,6 +90,7 @@ using ControlRequest = std::variant + void serialize(S& s) { + s.value8b(owner_instance_id); + s.object(rect); + } + }; + virtual tresult PLUGIN_API checkSizeConstraint(Steinberg::ViewRect* rect) override = 0; diff --git a/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp b/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp index aaa14bbb..3485b73e 100644 --- a/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp @@ -145,7 +145,13 @@ tresult PLUGIN_API Vst3PlugViewProxyImpl::canResize() { tresult PLUGIN_API Vst3PlugViewProxyImpl::checkSizeConstraint(Steinberg::ViewRect* rect) { - // TODO: Implement - bridge.logger.log("TODO: IPlugView::checkSizeConstraint()"); - return Steinberg::kNotImplemented; + if (rect) { + return bridge.send_message(YaPlugView::CheckSizeConstraint{ + .owner_instance_id = owner_instance_id(), .rect = *rect}); + } else { + bridge.logger.log( + "WARNING: Null pointer passed to " + "'IPlugView::checkSizeConstraint()'"); + return Steinberg::kInvalidArgument; + } } diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 1b4b7276..0d77e751 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -425,6 +425,11 @@ void Vst3Bridge::run() { return object_instances[request.owner_instance_id] .plug_view->canResize(); }, + [&](YaPlugView::CheckSizeConstraint& request) + -> YaPlugView::CheckSizeConstraint::Response { + return object_instances[request.owner_instance_id] + .plug_view->checkSizeConstraint(&request.rect); + }, [&](YaPluginBase::Initialize& request) -> YaPluginBase::Initialize::Response { // We'll create a proxy object for the host context passed by