From 87a9ac75b929fc0c6aa7416af90a988222de37cc Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Thu, 29 Sep 2022 18:15:02 +0200 Subject: [PATCH] Fully implement the host side GUI extension --- src/common/serialization/clap.h | 5 ++ .../bridges/clap-impls/host-proxy.cpp | 61 +++++++++++++++++++ src/wine-host/bridges/clap-impls/host-proxy.h | 11 ++++ 3 files changed, 77 insertions(+) diff --git a/src/common/serialization/clap.h b/src/common/serialization/clap.h index 85c9306c..10c8eb54 100644 --- a/src/common/serialization/clap.h +++ b/src/common/serialization/clap.h @@ -152,6 +152,11 @@ using ClapMainThreadCallbackRequest = clap::ext::latency::host::Changed, clap::ext::audio_ports::host::IsRescanFlagSupported, clap::ext::audio_ports::host::Rescan, + clap::ext::gui::host::ResizeHintsChanged, + clap::ext::gui::host::RequestResize, + clap::ext::gui::host::RequestShow, + clap::ext::gui::host::RequestHide, + clap::ext::gui::host::Closed, clap::ext::note_ports::host::SupportedDialects, clap::ext::note_ports::host::Rescan, clap::ext::params::host::Rescan, diff --git a/src/wine-host/bridges/clap-impls/host-proxy.cpp b/src/wine-host/bridges/clap-impls/host-proxy.cpp index f9544b06..3ec4689b 100644 --- a/src/wine-host/bridges/clap-impls/host-proxy.cpp +++ b/src/wine-host/bridges/clap-impls/host-proxy.cpp @@ -48,6 +48,13 @@ clap_host_proxy::clap_host_proxy(ClapBridge& bridge, .is_rescan_flag_supported = ext_audio_ports_is_rescan_flag_supported, .rescan = ext_audio_ports_rescan, }), + ext_gui_vtable(clap_host_gui_t{ + .resize_hints_changed = ext_gui_resize_hints_changed, + .request_resize = ext_gui_request_resize, + .request_show = ext_gui_request_show, + .request_hide = ext_gui_request_hide, + .closed = ext_gui_closed, + }), ext_latency_vtable(clap_host_latency_t{ .changed = ext_latency_changed, }), @@ -77,6 +84,9 @@ clap_host_proxy::host_get_extension(const struct clap_host* host, if (self->supported_extensions_.supports_audio_ports && strcmp(extension_id, CLAP_EXT_AUDIO_PORTS) == 0) { extension_ptr = &self->ext_audio_ports_vtable; + } else if (self->supported_extensions_.supports_gui && + strcmp(extension_id, CLAP_EXT_GUI) == 0) { + extension_ptr = &self->ext_gui_vtable; } else if (self->supported_extensions_.supports_latency && strcmp(extension_id, CLAP_EXT_LATENCY) == 0) { extension_ptr = &self->ext_latency_vtable; @@ -169,6 +179,57 @@ void CLAP_ABI clap_host_proxy::ext_audio_ports_rescan(const clap_host_t* host, .owner_instance_id = self->owner_instance_id(), .flags = flags}); } +void CLAP_ABI +clap_host_proxy::ext_gui_resize_hints_changed(const clap_host_t* host) { + assert(host && host->host_data); + auto self = static_cast(host->host_data); + + self->bridge_.send_main_thread_message( + clap::ext::gui::host::ResizeHintsChanged{ + .owner_instance_id = self->owner_instance_id()}); +} + +bool CLAP_ABI clap_host_proxy::ext_gui_request_resize(const clap_host_t* host, + uint32_t width, + uint32_t height) { + assert(host && host->host_data); + auto self = static_cast(host->host_data); + + return self->bridge_.send_main_thread_message( + clap::ext::gui::host::RequestResize{ + .owner_instance_id = self->owner_instance_id(), + .width = width, + .height = height}); +} + +bool CLAP_ABI clap_host_proxy::ext_gui_request_show(const clap_host_t* host) { + assert(host && host->host_data); + auto self = static_cast(host->host_data); + + return self->bridge_.send_main_thread_message( + clap::ext::gui::host::RequestShow{.owner_instance_id = + self->owner_instance_id()}); +} + +bool CLAP_ABI clap_host_proxy::ext_gui_request_hide(const clap_host_t* host) { + assert(host && host->host_data); + auto self = static_cast(host->host_data); + + return self->bridge_.send_main_thread_message( + clap::ext::gui::host::RequestHide{.owner_instance_id = + self->owner_instance_id()}); +} + +void CLAP_ABI clap_host_proxy::ext_gui_closed(const clap_host_t* host, + bool was_destroyed) { + assert(host && host->host_data); + auto self = static_cast(host->host_data); + + self->bridge_.send_main_thread_message(clap::ext::gui::host::Closed{ + .owner_instance_id = self->owner_instance_id(), + .was_destroyed = was_destroyed}); +} + void CLAP_ABI clap_host_proxy::ext_latency_changed(const clap_host_t* host) { assert(host && host->host_data); auto self = static_cast(host->host_data); diff --git a/src/wine-host/bridges/clap-impls/host-proxy.h b/src/wine-host/bridges/clap-impls/host-proxy.h index 080d50d1..04782047 100644 --- a/src/wine-host/bridges/clap-impls/host-proxy.h +++ b/src/wine-host/bridges/clap-impls/host-proxy.h @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -82,6 +83,15 @@ class clap_host_proxy { static void CLAP_ABI ext_audio_ports_rescan(const clap_host_t* host, uint32_t flags); + static void CLAP_ABI ext_gui_resize_hints_changed(const clap_host_t* host); + static bool CLAP_ABI ext_gui_request_resize(const clap_host_t* host, + uint32_t width, + uint32_t height); + static bool CLAP_ABI ext_gui_request_show(const clap_host_t* host); + static bool CLAP_ABI ext_gui_request_hide(const clap_host_t* host); + static void CLAP_ABI ext_gui_closed(const clap_host_t* host, + bool was_destroyed); + static void CLAP_ABI ext_latency_changed(const clap_host_t* host); static uint32_t CLAP_ABI @@ -116,6 +126,7 @@ class clap_host_proxy { // depends on whether the plugin supported this extension when the host // called `clap_plugin::init()`. const clap_host_audio_ports_t ext_audio_ports_vtable; + const clap_host_gui_t ext_gui_vtable; const clap_host_latency_t ext_latency_vtable; const clap_host_note_ports_t ext_note_ports_vtable; const clap_host_params_t ext_params_vtable;