diff --git a/src/common/serialization/vst3/component-handler/component-handler-3.h b/src/common/serialization/vst3/component-handler/component-handler-3.h index 5860c982..f9301736 100644 --- a/src/common/serialization/vst3/component-handler/component-handler-3.h +++ b/src/common/serialization/vst3/component-handler/component-handler-3.h @@ -17,9 +17,11 @@ #pragma once #include +#include "bitsery/ext/std_optional.h" #include "../../common.h" #include "../base.h" +#include "../context-menu-proxy.h" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" @@ -61,6 +63,48 @@ class YaComponentHandler3 : public Steinberg::Vst::IComponentHandler3 { inline bool supported() const { return arguments.supported; } + /** + * The arguments needed to create a proxy object for the context menu + * returned by the host resulting from a call to + * `IComponentHandler3::createContextMenu(, param_id)`, if the + * call succeeded. + */ + struct CreateContextMenuResponse { + std::optional context_menu_args; + + template + void serialize(S& s) { + s.ext(context_menu_args, bitsery::ext::StdOptional{}); + } + }; + + /** + * Message to pass through a call to + * `IComponentHandler3::createContextMenu(, param_id)` to the + * component handler provided by the host. + * + * XXX: Since we don't support multiple `IPlugView`s right now (as it's not + * used the SDK's current version), we'll just assume that `view` is + * the view stored in `Vst3PluginProxyImpl::plug_view` + */ + struct CreateContextMenu { + using Response = CreateContextMenuResponse; + + native_size_t owner_instance_id; + + // XXX: Why do they pass a pointer to the parameter ID? The docs that + // when the parameter ID is zero, the host should create a generic + // context menu. Did they mean to write 'a null pointer' here? + std::optional param_id; + + template + void serialize(S& s) { + s.value8b(owner_instance_id); + s.ext(param_id, bitsery::ext::StdOptional{}, + [](S& s, Steinberg::Vst::ParamID& id) { s.value4b(id); }); + } + }; + virtual Steinberg::Vst::IContextMenu* PLUGIN_API createContextMenu(Steinberg::IPlugView* plugView, const Steinberg::Vst::ParamID* paramID) override = 0; diff --git a/src/common/serialization/vst3/plug-frame/plug-frame.h b/src/common/serialization/vst3/plug-frame/plug-frame.h index e682a471..fb810b1a 100644 --- a/src/common/serialization/vst3/plug-frame/plug-frame.h +++ b/src/common/serialization/vst3/plug-frame/plug-frame.h @@ -62,8 +62,8 @@ class YaPlugFrame : public Steinberg::IPlugFrame { inline bool supported() const { return arguments.supported; } /** - * Message to pass through a call to `IPlugFrame::resizeView` to the - * `IPlugView` object provided by the host. + * Message to pass through a call to `IPlugFrame::resizeView(, + * new_size)` to the `IPlugView` object provided by the host. * * XXX: Since we don't support multiple `IPlugView`s right now (as it's not * used the SDK's current version), we'll just assume that `view` is