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:
falkTX 2021-11-13 12:56:08 +00:00
parent e76a8024e1
commit d13e354728
No known key found for this signature in database
GPG key ID: CDBAA37ABC74FBA0
5 changed files with 172 additions and 61 deletions

View file

@ -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;

View file

@ -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:

View file

@ -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

View file

@ -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
{ {

View file

@ -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