Use host idle call to give idle to Carla and Ildaeil, fixes GL UIs
Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
parent
e76a8024e1
commit
d13e354728
5 changed files with 172 additions and 61 deletions
|
|
@ -366,7 +366,7 @@ static intptr_t host_dispatcher(const NativeHostHandle handle, const NativeHostD
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
struct CarlaModuleWidget : ModuleWidget {
|
struct CarlaModuleWidget : ModuleWidget, IdleCallback {
|
||||||
static constexpr const float startX_In = 14.0f;
|
static constexpr const float startX_In = 14.0f;
|
||||||
static constexpr const float startX_Out = 96.0f;
|
static constexpr const float startX_Out = 96.0f;
|
||||||
static constexpr const float startY = 74.0f;
|
static constexpr const float startY = 74.0f;
|
||||||
|
|
@ -374,6 +374,7 @@ struct CarlaModuleWidget : ModuleWidget {
|
||||||
static constexpr const float middleX = startX_In + (startX_Out - startX_In) * 0.5f + padding * 0.25f;
|
static constexpr const float middleX = startX_In + (startX_Out - startX_In) * 0.5f + padding * 0.25f;
|
||||||
|
|
||||||
CarlaModule* const module;
|
CarlaModule* const module;
|
||||||
|
bool idleCallbackActive = false;
|
||||||
bool visible = false;
|
bool visible = false;
|
||||||
|
|
||||||
CarlaModuleWidget(CarlaModule* const m)
|
CarlaModuleWidget(CarlaModule* const m)
|
||||||
|
|
@ -393,21 +394,6 @@ struct CarlaModuleWidget : ModuleWidget {
|
||||||
|
|
||||||
for (uint i=0; i<CarlaModule::NUM_OUTPUTS; ++i)
|
for (uint i=0; i<CarlaModule::NUM_OUTPUTS; ++i)
|
||||||
addOutput(createOutput<PJ301MPort>(Vec(startX_Out, startY + padding * i), module, i));
|
addOutput(createOutput<PJ301MPort>(Vec(startX_Out, startY + padding * i), module, i));
|
||||||
|
|
||||||
if (module != nullptr && module->fCarlaHostHandle != nullptr)
|
|
||||||
{
|
|
||||||
const CarlaHostHandle handle = module->fCarlaHostHandle;
|
|
||||||
|
|
||||||
char winIdStr[24];
|
|
||||||
std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)module->pcontext->nativeWindowId);
|
|
||||||
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr);
|
|
||||||
module->fCarlaHostDescriptor.uiParentId = module->pcontext->nativeWindowId;
|
|
||||||
/*
|
|
||||||
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_UI_SCALE, getScaleFactor()*1000, nullptr);
|
|
||||||
*/
|
|
||||||
|
|
||||||
module->fUI = this;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~CarlaModuleWidget() override
|
~CarlaModuleWidget() override
|
||||||
|
|
@ -427,25 +413,80 @@ struct CarlaModuleWidget : ModuleWidget {
|
||||||
void onContextCreate(const ContextCreateEvent& e) override
|
void onContextCreate(const ContextCreateEvent& e) override
|
||||||
{
|
{
|
||||||
ModuleWidget::onContextCreate(e);
|
ModuleWidget::onContextCreate(e);
|
||||||
|
widgetCreated();
|
||||||
if (module == nullptr || module->pcontext == nullptr || module->fCarlaHostHandle == nullptr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
char winIdStr[24];
|
|
||||||
std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)module->pcontext->nativeWindowId);
|
|
||||||
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr);
|
|
||||||
module->fCarlaHostDescriptor.uiParentId = module->pcontext->nativeWindowId;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void onContextDestroy(const ContextDestroyEvent& e) override
|
void onContextDestroy(const ContextDestroyEvent& e) override
|
||||||
{
|
{
|
||||||
if (module != nullptr && module->fCarlaHostHandle != nullptr)
|
widgetDestroyed();
|
||||||
|
ModuleWidget::onContextDestroy(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
void onAdd(const AddEvent& e) override
|
||||||
|
{
|
||||||
|
ModuleWidget::onAdd(e);
|
||||||
|
widgetCreated();
|
||||||
|
}
|
||||||
|
|
||||||
|
void onRemove(const RemoveEvent& e) override
|
||||||
|
{
|
||||||
|
widgetDestroyed();
|
||||||
|
ModuleWidget::onRemove(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
void widgetCreated()
|
||||||
|
{
|
||||||
|
if (module == nullptr || module->pcontext == nullptr || module->fCarlaHostHandle == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const CarlaHostHandle handle = module->fCarlaHostHandle;
|
||||||
|
CardinalPluginContext* const pcontext = module->pcontext;
|
||||||
|
|
||||||
|
char winIdStr[24];
|
||||||
|
std::snprintf(winIdStr, sizeof(winIdStr), "%llx", (ulonglong)pcontext->nativeWindowId);
|
||||||
|
|
||||||
|
module->fCarlaHostDescriptor.uiParentId = pcontext->nativeWindowId;
|
||||||
|
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr);
|
||||||
|
|
||||||
|
if (pcontext->window != nullptr)
|
||||||
|
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_UI_SCALE, pcontext->window->pixelRatio*1000, nullptr);
|
||||||
|
|
||||||
|
if (! idleCallbackActive)
|
||||||
|
idleCallbackActive = pcontext->addIdleCallback(this);
|
||||||
|
|
||||||
|
module->fUI = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void widgetDestroyed()
|
||||||
|
{
|
||||||
|
if (module == nullptr || module->pcontext == nullptr || module->fCarlaHostHandle == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const CarlaHostHandle handle = module->fCarlaHostHandle;
|
||||||
|
CardinalPluginContext* const pcontext = module->pcontext;
|
||||||
|
|
||||||
|
module->fUI = nullptr;
|
||||||
|
|
||||||
|
if (visible)
|
||||||
{
|
{
|
||||||
module->fCarlaHostDescriptor.uiParentId = 0;
|
visible = false;
|
||||||
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
|
module->fCarlaPluginDescriptor->ui_show(module->fCarlaPluginHandle, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
ModuleWidget::onContextDestroy(e);
|
if (idleCallbackActive)
|
||||||
|
{
|
||||||
|
idleCallbackActive = false;
|
||||||
|
pcontext->removeIdleCallback(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
module->fCarlaHostDescriptor.uiParentId = 0;
|
||||||
|
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
|
||||||
|
}
|
||||||
|
|
||||||
|
void idleCallback() override
|
||||||
|
{
|
||||||
|
if (module != nullptr && module->fCarlaHostHandle != nullptr && visible)
|
||||||
|
module->fCarlaPluginDescriptor->ui_idle(module->fCarlaPluginHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawTextLine(NVGcontext* const vg, const uint offset, const char* const text)
|
void drawTextLine(NVGcontext* const vg, const uint offset, const char* const text)
|
||||||
|
|
@ -488,14 +529,6 @@ struct CarlaModuleWidget : ModuleWidget {
|
||||||
ModuleWidget::draw(args);
|
ModuleWidget::draw(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
void step() override
|
|
||||||
{
|
|
||||||
if (module != nullptr && module->fCarlaHostHandle != nullptr && visible)
|
|
||||||
module->fCarlaPluginDescriptor->ui_idle(module->fCarlaPluginHandle);
|
|
||||||
|
|
||||||
ModuleWidget::step();
|
|
||||||
}
|
|
||||||
|
|
||||||
void showUI()
|
void showUI()
|
||||||
{
|
{
|
||||||
visible = true;
|
visible = true;
|
||||||
|
|
|
||||||
|
|
@ -357,7 +357,7 @@ static intptr_t host_dispatcher(const NativeHostHandle handle, const NativeHostD
|
||||||
// --------------------------------------------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
#ifndef HEADLESS
|
#ifndef HEADLESS
|
||||||
struct IldaeilWidget : ImGuiWidget, Thread {
|
struct IldaeilWidget : ImGuiWidget, IdleCallback, Thread {
|
||||||
static constexpr const uint kButtonHeight = 20;
|
static constexpr const uint kButtonHeight = 20;
|
||||||
|
|
||||||
struct PluginInfoCache {
|
struct PluginInfoCache {
|
||||||
|
|
@ -440,13 +440,14 @@ struct IldaeilWidget : ImGuiWidget, Thread {
|
||||||
|
|
||||||
String fPopupError;
|
String fPopupError;
|
||||||
|
|
||||||
|
bool idleCallbackActive = false;
|
||||||
IldaeilModule* const module;
|
IldaeilModule* const module;
|
||||||
|
|
||||||
IldaeilWidget(IldaeilModule* const m)
|
IldaeilWidget(IldaeilModule* const m)
|
||||||
: ImGuiWidget(),
|
: ImGuiWidget(),
|
||||||
module(m)
|
module(m)
|
||||||
{
|
{
|
||||||
if (module == nullptr || module->fCarlaHostHandle == nullptr)
|
if (module->fCarlaHostHandle == nullptr)
|
||||||
{
|
{
|
||||||
fDrawingState = kDrawingErrorInit;
|
fDrawingState = kDrawingErrorInit;
|
||||||
fPopupError = "Ildaeil backend failed to init properly, cannot continue.";
|
fPopupError = "Ildaeil backend failed to init properly, cannot continue.";
|
||||||
|
|
@ -460,13 +461,6 @@ struct IldaeilWidget : ImGuiWidget, Thread {
|
||||||
|
|
||||||
const CarlaHostHandle handle = module->fCarlaHostHandle;
|
const CarlaHostHandle handle = module->fCarlaHostHandle;
|
||||||
|
|
||||||
char winIdStr[24];
|
|
||||||
std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)module->pcontext->nativeWindowId);
|
|
||||||
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr);
|
|
||||||
/*
|
|
||||||
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_UI_SCALE, getScaleFactor()*1000, nullptr);
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (carla_get_current_plugin_count(handle) != 0)
|
if (carla_get_current_plugin_count(handle) != 0)
|
||||||
{
|
{
|
||||||
const uint hints = carla_get_plugin_info(handle, 0)->hints;
|
const uint hints = carla_get_plugin_info(handle, 0)->hints;
|
||||||
|
|
@ -479,10 +473,12 @@ struct IldaeilWidget : ImGuiWidget, Thread {
|
||||||
|
|
||||||
~IldaeilWidget() override
|
~IldaeilWidget() override
|
||||||
{
|
{
|
||||||
if (module != nullptr && module->fCarlaHostHandle != nullptr)
|
if (module->fCarlaHostHandle != nullptr)
|
||||||
{
|
{
|
||||||
module->fUI = nullptr;
|
module->fUI = nullptr;
|
||||||
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
|
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
|
||||||
|
|
||||||
|
module->pcontext->removeIdleCallback(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isThreadRunning())
|
if (isThreadRunning())
|
||||||
|
|
@ -661,28 +657,66 @@ struct IldaeilWidget : ImGuiWidget, Thread {
|
||||||
void onContextCreate(const ContextCreateEvent& e) override
|
void onContextCreate(const ContextCreateEvent& e) override
|
||||||
{
|
{
|
||||||
ImGuiWidget::onContextCreate(e);
|
ImGuiWidget::onContextCreate(e);
|
||||||
|
widgetCreated();
|
||||||
if (module == nullptr || module->pcontext == nullptr || module->fCarlaHostHandle == nullptr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
char winIdStr[24];
|
|
||||||
std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)module->pcontext->nativeWindowId);
|
|
||||||
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void onContextDestroy(const ContextDestroyEvent& e) override
|
void onContextDestroy(const ContextDestroyEvent& e) override
|
||||||
{
|
{
|
||||||
if (module != nullptr && module->fCarlaHostHandle != nullptr)
|
widgetDestroyed();
|
||||||
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
|
|
||||||
|
|
||||||
ImGuiWidget::onContextDestroy(e);
|
ImGuiWidget::onContextDestroy(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void step() override
|
void onAdd(const AddEvent& e) override
|
||||||
{
|
{
|
||||||
ImGuiWidget::step();
|
ImGuiWidget::onAdd(e);
|
||||||
setDirty(true);
|
widgetCreated();
|
||||||
|
}
|
||||||
|
|
||||||
|
void onRemove(const RemoveEvent& e) override
|
||||||
|
{
|
||||||
|
widgetDestroyed();
|
||||||
|
ImGuiWidget::onRemove(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
void widgetCreated()
|
||||||
|
{
|
||||||
|
if (const CarlaHostHandle handle = module->fCarlaHostHandle)
|
||||||
|
{
|
||||||
|
CardinalPluginContext* const pcontext = module->pcontext;
|
||||||
|
|
||||||
|
char winIdStr[24];
|
||||||
|
std::snprintf(winIdStr, sizeof(winIdStr), "%llx", (ulonglong)pcontext->nativeWindowId);
|
||||||
|
|
||||||
|
module->fCarlaHostDescriptor.uiParentId = pcontext->nativeWindowId;
|
||||||
|
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr);
|
||||||
|
|
||||||
|
if (pcontext->window != nullptr)
|
||||||
|
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_UI_SCALE, pcontext->window->pixelRatio*1000, nullptr);
|
||||||
|
|
||||||
|
if (! idleCallbackActive)
|
||||||
|
idleCallbackActive = pcontext->addIdleCallback(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void widgetDestroyed()
|
||||||
|
{
|
||||||
|
if (const CarlaHostHandle handle = module->fCarlaHostHandle)
|
||||||
|
{
|
||||||
|
CardinalPluginContext* const pcontext = module->pcontext;
|
||||||
|
|
||||||
|
module->fCarlaHostDescriptor.uiParentId = 0;
|
||||||
|
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
|
||||||
|
|
||||||
|
if (idleCallbackActive)
|
||||||
|
{
|
||||||
|
idleCallbackActive = false;
|
||||||
|
pcontext->removeIdleCallback(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void idleCallback() override
|
||||||
|
{
|
||||||
switch (fDrawingState)
|
switch (fDrawingState)
|
||||||
{
|
{
|
||||||
case kDrawingInit:
|
case kDrawingInit:
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,10 @@
|
||||||
#include "plugin.hpp"
|
#include "plugin.hpp"
|
||||||
#include "DistrhoUtils.hpp"
|
#include "DistrhoUtils.hpp"
|
||||||
|
|
||||||
|
#ifndef HEADLESS
|
||||||
|
# include "dgl/Base.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------------------------------
|
||||||
// from PluginContext.hpp
|
// from PluginContext.hpp
|
||||||
|
|
||||||
|
|
@ -44,6 +48,10 @@ struct CardinalPluginContext : rack::Context {
|
||||||
float** dataOuts;
|
float** dataOuts;
|
||||||
Plugin* const plugin;
|
Plugin* const plugin;
|
||||||
CardinalPluginContext(Plugin* const p);
|
CardinalPluginContext(Plugin* const p);
|
||||||
|
#ifndef HEADLESS
|
||||||
|
bool addIdleCallback(IdleCallback* cb);
|
||||||
|
void removeIdleCallback(IdleCallback* cb);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
END_NAMESPACE_DISTRHO
|
END_NAMESPACE_DISTRHO
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,25 @@ START_NAMESPACE_DISTRHO
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool CardinalPluginContext::addIdleCallback(IdleCallback* const cb)
|
||||||
|
{
|
||||||
|
if (ui == nullptr)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ui->addIdleCallback(cb);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CardinalPluginContext::removeIdleCallback(IdleCallback* const cb)
|
||||||
|
{
|
||||||
|
if (ui == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ui->removeIdleCallback(cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
class CardinalUI : public CardinalBaseUI,
|
class CardinalUI : public CardinalBaseUI,
|
||||||
public WindowParametersCallback
|
public WindowParametersCallback
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,9 @@ struct CardinalPluginContext : rack::Context {
|
||||||
const float** dataIns;
|
const float** dataIns;
|
||||||
float** dataOuts;
|
float** dataOuts;
|
||||||
Plugin* const plugin;
|
Plugin* const plugin;
|
||||||
|
#ifndef HEADLESS
|
||||||
|
UI* ui;
|
||||||
|
#endif
|
||||||
|
|
||||||
CardinalPluginContext(Plugin* const p)
|
CardinalPluginContext(Plugin* const p)
|
||||||
: bufferSize(p->getBufferSize()),
|
: bufferSize(p->getBufferSize()),
|
||||||
|
|
@ -79,9 +82,17 @@ struct CardinalPluginContext : rack::Context {
|
||||||
dataIns(nullptr),
|
dataIns(nullptr),
|
||||||
dataOuts(nullptr),
|
dataOuts(nullptr),
|
||||||
plugin(p)
|
plugin(p)
|
||||||
|
#ifndef HEADLESS
|
||||||
|
, ui(nullptr)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
std::memset(parameters, 0, sizeof(parameters));
|
std::memset(parameters, 0, sizeof(parameters));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef HEADLESS
|
||||||
|
bool addIdleCallback(IdleCallback* cb);
|
||||||
|
void removeIdleCallback(IdleCallback* cb);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------------------------------
|
||||||
|
|
@ -121,8 +132,14 @@ public:
|
||||||
CardinalBaseUI(const uint width, const uint height)
|
CardinalBaseUI(const uint width, const uint height)
|
||||||
: UI(width, height),
|
: UI(width, height),
|
||||||
context(getRackContextFromPlugin(getPluginInstancePointer())),
|
context(getRackContextFromPlugin(getPluginInstancePointer())),
|
||||||
saving(false) {}
|
saving(false)
|
||||||
~CardinalBaseUI() override {}
|
{
|
||||||
|
context->ui = this;
|
||||||
|
}
|
||||||
|
~CardinalBaseUI() override
|
||||||
|
{
|
||||||
|
context->ui = nullptr;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue