diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index cec028f2..d747b314 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -461,6 +461,13 @@ bool Vst3Logger::log_request(bool is_host_vst, }); } +bool Vst3Logger::log_request(bool is_host_vst, + const YaPlugView::GetSize& request) { + return log_request_base(is_host_vst, [&](auto& message) { + message << request.owner_instance_id << ": IPlugView::getSize(size*)"; + }); +} + bool Vst3Logger::log_request(bool is_host_vst, const YaPluginBase::Initialize& request) { return log_request_base(is_host_vst, [&](auto& message) { @@ -725,6 +732,19 @@ void Vst3Logger::log_response( }); } +void Vst3Logger::log_response(bool is_host_vst, + const YaPlugView::GetSizeResponse& response) { + log_response_base(is_host_vst, [&](auto& message) { + message << response.result.string(); + if (response.result == Steinberg::kResultOk) { + message << ", "; + } + }); +} + void Vst3Logger::log_response(bool is_host_vst, const YaPluginFactory::ConstructArgs& args) { log_response_base(is_host_vst, [&](auto& message) { diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index 68f7c9ed..689375f3 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -111,6 +111,7 @@ class Vst3Logger { bool log_request(bool is_host_vst, const YaPlugView::IsPlatformTypeSupported&); bool log_request(bool is_host_vst, const YaPlugView::Attached&); + bool log_request(bool is_host_vst, const YaPlugView::GetSize&); 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&); @@ -147,6 +148,7 @@ class Vst3Logger { const YaEditController::GetParamValueByStringResponse&); void log_response(bool is_host_vst, const YaEditController::CreateViewResponse&); + void log_response(bool is_host_vst, const YaPlugView::GetSizeResponse&); void log_response(bool is_host_vst, const YaPluginFactory::ConstructArgs&); void log_response(bool is_host_vst, const Configuration&); diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index 697c5dba..8b4d4f05 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -94,6 +94,7 @@ using ControlRequest = std::variant + void serialize(S& s) { + s.object(result); + s.object(updated_size); + } + }; + + /** + * Message to pass through a call to `IPlugView::getSize(&size)`. + */ + struct GetSize { + using Response = GetSizeResponse; + + native_size_t owner_instance_id; + + Steinberg::ViewRect size; + + template + void serialize(S& s) { + s.value8b(owner_instance_id); + s.object(size); + } + }; + virtual tresult PLUGIN_API getSize(Steinberg::ViewRect* size) override = 0; virtual tresult PLUGIN_API onSize(Steinberg::ViewRect* newSize) override = 0; @@ -135,3 +168,13 @@ class YaPlugView : public Steinberg::IPlugView { }; #pragma GCC diagnostic pop + +namespace Steinberg { +template +void serialize(S& s, ViewRect& rect) { + s.value4b(rect.left); + s.value4b(rect.top); + s.value4b(rect.right); + s.value4b(rect.bottom); +} +} // namespace Steinberg diff --git a/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp b/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp index 0976c3a5..e71f7d03 100644 --- a/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp @@ -87,9 +87,19 @@ tresult PLUGIN_API Vst3PlugViewProxyImpl::onKeyUp(char16 key, } tresult PLUGIN_API Vst3PlugViewProxyImpl::getSize(Steinberg::ViewRect* size) { - // TODO: Implement - bridge.logger.log("TODO: IPlugView::getSize()"); - return Steinberg::kNotImplemented; + if (size) { + const GetSizeResponse response = + bridge.send_message(YaPlugView::GetSize{ + .owner_instance_id = owner_instance_id(), .size = *size}); + + *size = response.updated_size; + + return response.result; + } else { + bridge.logger.log( + "WARNING: Null pointer passed to 'IPlugView::getSize()'"); + return Steinberg::kInvalidArgument; + } } tresult PLUGIN_API Vst3PlugViewProxyImpl::onSize(Steinberg::ViewRect* newSize) { diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index ecf91f48..f8e51287 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -446,6 +446,14 @@ void Vst3Bridge::run() { return result; }, + [&](YaPlugView::GetSize& request) -> YaPlugView::GetSize::Response { + const tresult result = + object_instances[request.owner_instance_id] + .plug_view->getSize(&request.size); + + return YaPlugView::GetSizeResponse{ + .result = result, .updated_size = request.size}; + }, [&](YaPluginBase::Initialize& request) -> YaPluginBase::Initialize::Response { // If we got passed a host context, we'll create a proxy object