commit 93d1d56e56a66432af4f8f4dcb5e0b50c3b8e5d4
parent bd702d408d541bdb3e706bc7e4ac8fa953d0a296
Author: falkTX <falktx@falktx.com>
Date: Fri, 9 Sep 2022 21:38:22 +0100
Deal with plugin UI side resizes for clap
Signed-off-by: falkTX <falktx@falktx.com>
Diffstat:
2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/distrho/src/DistrhoPluginCLAP.cpp b/distrho/src/DistrhoPluginCLAP.cpp
@@ -37,6 +37,8 @@
#include "clap/ext/note-ports.h"
#include "clap/ext/gui.h"
#include "clap/ext/params.h"
+#include "clap/ext/state.h"
+#include "clap/ext/timer-support.h"
START_NAMESPACE_DISTRHO
@@ -160,11 +162,17 @@ static constexpr const sendNoteFunc sendNoteCallback = nullptr;
class ClapUI : public DGL_NAMESPACE::IdleCallback
{
public:
- ClapUI(PluginExporter& plugin, ClapEventQueue* const eventQueue, const bool isFloating)
+ ClapUI(PluginExporter& plugin,
+ ClapEventQueue* const eventQueue,
+ const clap_host_t* const host,
+ const clap_host_gui_t* const hostGui,
+ const bool isFloating)
: fPlugin(plugin),
fPluinEventQueue(eventQueue),
fEventQueue(eventQueue->fEventQueue),
fCachedParameters(eventQueue->fCachedParameters),
+ fHost(host),
+ fHostGui(hostGui),
fIsFloating(isFloating),
fCallbackRegistered(false),
fScaleFactor(0.0),
@@ -352,7 +360,10 @@ public:
bool show()
{
if (fUI == nullptr)
+ {
createUI();
+ fHostGui->resize_hints_changed(fHost);
+ }
if (fIsFloating)
fUI->setWindowVisible(true);
@@ -386,6 +397,8 @@ private:
ClapEventQueue* const fPluinEventQueue;
ClapEventQueue::Queue& fEventQueue;
ClapEventQueue::CachedParameters& fCachedParameters;
+ const clap_host_t* const fHost;
+ const clap_host_gui_t* const fHostGui;
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT
RingBufferControl<SmallStackBuffer> fNotesRingBuffer;
#endif
@@ -479,8 +492,10 @@ private:
static_cast<ClapUI*>(ptr)->setParameterValue(rindex, value);
}
- void setSizeFromPlugin(uint, uint)
+ void setSizeFromPlugin(const uint width, const uint height)
{
+ if (fHostGui->request_resize(fHost, width, height) && fUI != nullptr)
+ fUI->setWindowSizeFromHost(width, height);
}
static void setSizeCallback(void* const ptr, const uint width, const uint height)
@@ -1012,7 +1027,10 @@ public:
#if DISTRHO_PLUGIN_HAS_UI
bool createUI(const bool isFloating)
{
- fUI = new ClapUI(fPlugin, this, isFloating);
+ const clap_host_gui_t* const hostGui = getHostExtension<clap_host_gui_t>(CLAP_EXT_GUI);
+ DISTRHO_SAFE_ASSERT_RETURN(hostGui != nullptr, false);
+
+ fUI = new ClapUI(fPlugin, this, fHost, hostGui, isFloating);
return true;
}
diff --git a/distrho/src/DistrhoUI.cpp b/distrho/src/DistrhoUI.cpp
@@ -405,14 +405,14 @@ void UI::onResize(const ResizeEvent& ev)
{
UIWidget::onResize(ev);
-#ifndef DISTRHO_PLUGIN_TARGET_VST3
+ #if !(defined(DISTRHO_PLUGIN_TARGET_VST3) || defined(DISTRHO_PLUGIN_TARGET_CLAP))
if (uiData->initializing)
return;
const uint width = ev.size.getWidth();
const uint height = ev.size.getHeight();
uiData->setSizeCallback(width, height);
-#endif
+ #endif
}
// NOTE: only used for VST3 and CLAP