diff --git a/src/common/serialization/clap/host.cpp b/src/common/serialization/clap/host.cpp index 418eac02..0fa7a200 100644 --- a/src/common/serialization/clap/host.cpp +++ b/src/common/serialization/clap/host.cpp @@ -17,6 +17,7 @@ #include "host.h" #include +#include #include #include #include @@ -33,9 +34,10 @@ Host::Host(const clap_host_t& original) url(original.url ? std::optional(original.url) : std::nullopt), version((assert(original.version), original.version)) {} -std::array, 6> SupportedHostExtensions::list() +std::array, 7> SupportedHostExtensions::list() const noexcept { return {std::pair(supports_audio_ports, CLAP_EXT_AUDIO_PORTS), + std::pair(supports_gui, CLAP_EXT_GUI), std::pair(supports_latency, CLAP_EXT_LATENCY), std::pair(supports_note_ports, CLAP_EXT_NOTE_PORTS), std::pair(supports_params, CLAP_EXT_PARAMS), diff --git a/src/common/serialization/clap/host.h b/src/common/serialization/clap/host.h index 9c9b08ed..033ff299 100644 --- a/src/common/serialization/clap/host.h +++ b/src/common/serialization/clap/host.h @@ -82,6 +82,7 @@ struct Host { struct SupportedHostExtensions { // Don't forget to add new extensions to below method bool supports_audio_ports = false; + bool supports_gui = false; bool supports_latency = false; bool supports_note_ports = false; bool supports_params = false; @@ -92,11 +93,12 @@ struct SupportedHostExtensions { * Get a list of `` tuples for the supported * extensions. Used during logging. */ - std::array, 6> list() const noexcept; + std::array, 7> list() const noexcept; template void serialize(S& s) { s.value1b(supports_audio_ports); + s.value1b(supports_gui); s.value1b(supports_latency); s.value1b(supports_note_ports); s.value1b(supports_params); diff --git a/src/plugin/bridges/clap-impls/plugin-proxy.cpp b/src/plugin/bridges/clap-impls/plugin-proxy.cpp index 34760f49..5285bf8b 100644 --- a/src/plugin/bridges/clap-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/clap-impls/plugin-proxy.cpp @@ -21,6 +21,8 @@ ClapHostExtensions::ClapHostExtensions(const clap_host& host) noexcept : audio_ports(static_cast( host.get_extension(&host, CLAP_EXT_AUDIO_PORTS))), + gui(static_cast( + host.get_extension(&host, CLAP_EXT_GUI))), latency(static_cast( host.get_extension(&host, CLAP_EXT_LATENCY))), note_ports(static_cast( @@ -38,6 +40,7 @@ clap::host::SupportedHostExtensions ClapHostExtensions::supported() const noexcept { return clap::host::SupportedHostExtensions{ .supports_audio_ports = audio_ports != nullptr, + .supports_gui = gui != nullptr, .supports_latency = latency != nullptr, .supports_note_ports = note_ports != nullptr, .supports_params = params != nullptr, diff --git a/src/plugin/bridges/clap-impls/plugin-proxy.h b/src/plugin/bridges/clap-impls/plugin-proxy.h index 99503e86..b68ffd01 100644 --- a/src/plugin/bridges/clap-impls/plugin-proxy.h +++ b/src/plugin/bridges/clap-impls/plugin-proxy.h @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -62,6 +63,7 @@ struct ClapHostExtensions { clap::host::SupportedHostExtensions supported() const noexcept; const clap_host_audio_ports_t* audio_ports = nullptr; + const clap_host_gui_t* gui = nullptr; const clap_host_latency_t* latency = nullptr; const clap_host_note_ports_t* note_ports = nullptr; const clap_host_params_t* params = nullptr; diff --git a/src/plugin/bridges/clap.cpp b/src/plugin/bridges/clap.cpp index 9aaa97b0..7a524608 100644 --- a/src/plugin/bridges/clap.cpp +++ b/src/plugin/bridges/clap.cpp @@ -115,6 +115,55 @@ ClapPluginBridge::ClapPluginBridge(const ghc::filesystem::path& plugin_path) return Ack{}; }, + [&](const clap::ext::gui::host::ResizeHintsChanged& request) + -> clap::ext::gui::host::ResizeHintsChanged::Response { + const auto& [plugin_proxy, _] = + get_proxy(request.owner_instance_id); + + // This callback is thread-safe + plugin_proxy.host_extensions_.gui->resize_hints_changed( + plugin_proxy.host_); + + return Ack{}; + }, + [&](const clap::ext::gui::host::RequestResize& request) + -> clap::ext::gui::host::RequestResize::Response { + const auto& [plugin_proxy, _] = + get_proxy(request.owner_instance_id); + + // This callback is thread-safe + return plugin_proxy.host_extensions_.gui->request_resize( + plugin_proxy.host_, request.width, request.height); + }, + [&](const clap::ext::gui::host::RequestShow& request) + -> clap::ext::gui::host::RequestShow::Response { + const auto& [plugin_proxy, _] = + get_proxy(request.owner_instance_id); + + // This callback is thread-safe + return plugin_proxy.host_extensions_.gui->request_show( + plugin_proxy.host_); + }, + [&](const clap::ext::gui::host::RequestHide& request) + -> clap::ext::gui::host::RequestHide::Response { + const auto& [plugin_proxy, _] = + get_proxy(request.owner_instance_id); + + // This callback is thread-safe + return plugin_proxy.host_extensions_.gui->request_hide( + plugin_proxy.host_); + }, + [&](const clap::ext::gui::host::Closed& request) + -> clap::ext::gui::host::Closed::Response { + const auto& [plugin_proxy, _] = + get_proxy(request.owner_instance_id); + + // This callback is thread-safe + plugin_proxy.host_extensions_.gui->closed( + plugin_proxy.host_, request.was_destroyed); + + return Ack{}; + }, [&](const clap::ext::latency::host::Changed& request) -> clap::ext::latency::host::Changed::Response { const auto& [plugin_proxy, _] =