From 063b480fd09d3a3cdea4d72290e8873f41a28296 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Mon, 21 Dec 2020 19:10:29 +0100 Subject: [PATCH] Implement IPlugView onKey{Up,Down} --- src/common/logging/vst3.cpp | 24 ++++++++++ src/common/logging/vst3.h | 2 + src/common/serialization/vst3.h | 2 + .../serialization/vst3/plug-view/plug-view.h | 46 +++++++++++++++++++ .../bridges/vst3-impls/plug-view-proxy.cpp | 16 ++++--- src/wine-host/bridges/vst3.cpp | 12 +++++ 6 files changed, 96 insertions(+), 6 deletions(-) diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index 7eee5a95..5dcf5be9 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -273,6 +273,30 @@ bool Vst3Logger::log_request(bool is_host_vst, }); } +bool Vst3Logger::log_request(bool is_host_vst, + const YaPlugView::OnKeyDown& request) { + return log_request_base(is_host_vst, [&](auto& message) { + // This static cast is technically not correct of course but it's + // UTF-16, so everything's allowed + message << request.owner_instance_id << ": IPlugView::onKeyDown(key = " + << static_cast(request.key) + << ", keyCode = " << request.key_code + << ", modifiers = " << request.modifiers << ")"; + }); +} + +bool Vst3Logger::log_request(bool is_host_vst, + const YaPlugView::OnKeyUp& request) { + return log_request_base(is_host_vst, [&](auto& message) { + // This static cast is technically not correct of course but it's + // UTF-16, so everything's allowed + message << request.owner_instance_id << ": IPlugView::onKeyUp(key = " + << static_cast(request.key) + << ", keyCode = " << request.key_code + << ", modifiers = " << request.modifiers << ")"; + }); +} + bool Vst3Logger::log_request(bool is_host_vst, const YaPlugView::GetSize& 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 3fd03cde..bfe3879f 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -92,6 +92,8 @@ class Vst3Logger { bool log_request(bool is_host_vst, const YaPlugView::Attached&); bool log_request(bool is_host_vst, const YaPlugView::Removed&); bool log_request(bool is_host_vst, const YaPlugView::OnWheel&); + bool log_request(bool is_host_vst, const YaPlugView::OnKeyDown&); + bool log_request(bool is_host_vst, const YaPlugView::OnKeyUp&); 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&); diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index e8707f28..4ae0dbfe 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -81,6 +81,8 @@ using ControlRequest = std::variant + void serialize(S& s) { + s.value8b(owner_instance_id); + s.value2b(key); + s.value2b(key_code); + s.value2b(modifiers); + } + }; + virtual tresult PLUGIN_API onKeyDown(char16 key, int16 keyCode, int16 modifiers) override = 0; + + /** + * Message to pass through a call to `IPlugView::onKeyUp(key, keyCode, + * modifiers)` to the Wine plugin host. + */ + struct OnKeyUp { + using Response = UniversalTResult; + + native_size_t owner_instance_id; + + char16 key; + int16 key_code; + int16 modifiers; + + template + void serialize(S& s) { + s.value8b(owner_instance_id); + s.value2b(key); + s.value2b(key_code); + s.value2b(modifiers); + } + }; + virtual tresult PLUGIN_API onKeyUp(char16 key, int16 keyCode, int16 modifiers) 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 130d5fad..bf6fabb0 100644 --- a/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp @@ -71,17 +71,21 @@ tresult PLUGIN_API Vst3PlugViewProxyImpl::onWheel(float distance) { tresult PLUGIN_API Vst3PlugViewProxyImpl::onKeyDown(char16 key, int16 keyCode, int16 modifiers) { - // TODO: Implement - bridge.logger.log("TODO: IPlugView::onKeyDown()"); - return Steinberg::kNotImplemented; + return bridge.send_message( + YaPlugView::OnKeyDown{.owner_instance_id = owner_instance_id(), + .key = key, + .key_code = keyCode, + .modifiers = modifiers}); } tresult PLUGIN_API Vst3PlugViewProxyImpl::onKeyUp(char16 key, int16 keyCode, int16 modifiers) { - // TODO: Implement - bridge.logger.log("TODO: IPlugView::onKeyUp()"); - return Steinberg::kNotImplemented; + return bridge.send_message( + YaPlugView::OnKeyUp{.owner_instance_id = owner_instance_id(), + .key = key, + .key_code = keyCode, + .modifiers = modifiers}); } tresult PLUGIN_API Vst3PlugViewProxyImpl::getSize(Steinberg::ViewRect* size) { diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 179c4574..63643bb3 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -375,6 +375,18 @@ void Vst3Bridge::run() { return object_instances[request.owner_instance_id] .plug_view->onWheel(request.distance); }, + [&](const YaPlugView::OnKeyDown& request) + -> YaPlugView::OnKeyDown::Response { + return object_instances[request.owner_instance_id] + .plug_view->onKeyDown(request.key, request.key_code, + request.modifiers); + }, + [&](const YaPlugView::OnKeyUp& request) + -> YaPlugView::OnKeyUp::Response { + return object_instances[request.owner_instance_id] + .plug_view->onKeyUp(request.key, request.key_code, + request.modifiers); + }, [&](YaPlugView::GetSize& request) -> YaPlugView::GetSize::Response { const tresult result = object_instances[request.owner_instance_id]