diff --git a/src/wine-host/bridges/vst3-impls/component-handler-proxy.cpp b/src/wine-host/bridges/vst3-impls/component-handler-proxy.cpp index 5c40c8d4..f1f5c496 100644 --- a/src/wine-host/bridges/vst3-impls/component-handler-proxy.cpp +++ b/src/wine-host/bridges/vst3-impls/component-handler-proxy.cpp @@ -18,6 +18,8 @@ #include +#include "context-menu-proxy.h" + Vst3ComponentHandlerProxyImpl::Vst3ComponentHandlerProxyImpl( Vst3Bridge& bridge, Vst3ComponentHandlerProxy::ConstructArgs&& args) @@ -93,11 +95,23 @@ tresult PLUGIN_API Vst3ComponentHandlerProxyImpl::finishGroupEdit() { Steinberg::Vst::IContextMenu* PLUGIN_API Vst3ComponentHandlerProxyImpl::createContextMenu( - Steinberg::IPlugView* plugView, + Steinberg::IPlugView* /*plugView*/, const Steinberg::Vst::ParamID* paramID) { - // TODO: Implement - std::cerr << "TODO: IComponentHandler3::createContextMenu" << std::endl; - return nullptr; + // XXX: The does do not make it clear what `paramID` is, so my assumption + // that it really is a pointer to a parameter ID. I'll assume that 'the + // parameter being zero' was a typo and that they mean passign a null + // pointer. + CreateContextMenuResponse response = + bridge.send_message(YaComponentHandler3::CreateContextMenu{ + .owner_instance_id = owner_instance_id(), + .param_id = (paramID ? std::optional(*paramID) : std::nullopt)}); + + if (response.context_menu_args) { + return new Vst3ContextMenuProxyImpl( + bridge, std::move(*response.context_menu_args)); + } else { + return nullptr; + } } tresult PLUGIN_API Vst3ComponentHandlerProxyImpl::notifyUnitSelection( diff --git a/src/wine-host/bridges/vst3-impls/context-menu-proxy.h b/src/wine-host/bridges/vst3-impls/context-menu-proxy.h index 4d2fc6c0..9acc2cb5 100644 --- a/src/wine-host/bridges/vst3-impls/context-menu-proxy.h +++ b/src/wine-host/bridges/vst3-impls/context-menu-proxy.h @@ -37,19 +37,18 @@ class Vst3ContextMenuProxyImpl : public Vst3ContextMenuProxy { void** obj) override; // From `IContextMenu` - virtual int32 PLUGIN_API getItemCount() override = 0; - virtual tresult PLUGIN_API + int32 PLUGIN_API getItemCount() override; + tresult PLUGIN_API getItem(int32 index, Steinberg::Vst::IContextMenuItem& item /*out*/, - Steinberg::Vst::IContextMenuTarget** target /*out*/) override = 0; - virtual tresult PLUGIN_API + Steinberg::Vst::IContextMenuTarget** target /*out*/) override; + tresult PLUGIN_API addItem(const Steinberg::Vst::IContextMenuItem& item, - Steinberg::Vst::IContextMenuTarget* target) override = 0; - virtual tresult PLUGIN_API + Steinberg::Vst::IContextMenuTarget* target) override; + tresult PLUGIN_API removeItem(const Item& item, - Steinberg::Vst::IContextMenuTarget* target) override = 0; - virtual tresult PLUGIN_API popup(Steinberg::UCoord x, - Steinberg::UCoord y) override = 0; + Steinberg::Vst::IContextMenuTarget* target) override; + tresult PLUGIN_API popup(Steinberg::UCoord x, Steinberg::UCoord y) override; private: Vst3Bridge& bridge;