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_Out = 96.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;
CarlaModule* const module;
bool idleCallbackActive = false;
bool visible = false;
CarlaModuleWidget(CarlaModule* const m)
@ -393,21 +394,6 @@ struct CarlaModuleWidget : ModuleWidget {
for (uint i=0; i<CarlaModule::NUM_OUTPUTS; ++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
@ -427,25 +413,80 @@ struct CarlaModuleWidget : ModuleWidget {
void onContextCreate(const ContextCreateEvent& e) override
{
ModuleWidget::onContextCreate(e);
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;
widgetCreated();
}
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;
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
visible = false;
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)
@ -488,14 +529,6 @@ struct CarlaModuleWidget : ModuleWidget {
ModuleWidget::draw(args);
}
void step() override
{
if (module != nullptr && module->fCarlaHostHandle != nullptr && visible)
module->fCarlaPluginDescriptor->ui_idle(module->fCarlaPluginHandle);
ModuleWidget::step();
}
void showUI()
{
visible = true;

View file

@ -357,7 +357,7 @@ static intptr_t host_dispatcher(const NativeHostHandle handle, const NativeHostD
// --------------------------------------------------------------------------------------------------------------------
#ifndef HEADLESS
struct IldaeilWidget : ImGuiWidget, Thread {
struct IldaeilWidget : ImGuiWidget, IdleCallback, Thread {
static constexpr const uint kButtonHeight = 20;
struct PluginInfoCache {
@ -440,13 +440,14 @@ struct IldaeilWidget : ImGuiWidget, Thread {
String fPopupError;
bool idleCallbackActive = false;
IldaeilModule* const module;
IldaeilWidget(IldaeilModule* const m)
: ImGuiWidget(),
module(m)
{
if (module == nullptr || module->fCarlaHostHandle == nullptr)
if (module->fCarlaHostHandle == nullptr)
{
fDrawingState = kDrawingErrorInit;
fPopupError = "Ildaeil backend failed to init properly, cannot continue.";
@ -460,13 +461,6 @@ struct IldaeilWidget : ImGuiWidget, Thread {
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)
{
const uint hints = carla_get_plugin_info(handle, 0)->hints;
@ -479,10 +473,12 @@ struct IldaeilWidget : ImGuiWidget, Thread {
~IldaeilWidget() override
{
if (module != nullptr && module->fCarlaHostHandle != nullptr)
if (module->fCarlaHostHandle != nullptr)
{
module->fUI = nullptr;
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
module->pcontext->removeIdleCallback(this);
}
if (isThreadRunning())
@ -661,28 +657,66 @@ struct IldaeilWidget : ImGuiWidget, Thread {
void onContextCreate(const ContextCreateEvent& e) override
{
ImGuiWidget::onContextCreate(e);
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);
widgetCreated();
}
void onContextDestroy(const ContextDestroyEvent& e) override
{
if (module != nullptr && module->fCarlaHostHandle != nullptr)
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
widgetDestroyed();
ImGuiWidget::onContextDestroy(e);
}
void step() override
void onAdd(const AddEvent& e) override
{
ImGuiWidget::step();
setDirty(true);
ImGuiWidget::onAdd(e);
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)
{
case kDrawingInit:

View file

@ -20,6 +20,10 @@
#include "plugin.hpp"
#include "DistrhoUtils.hpp"
#ifndef HEADLESS
# include "dgl/Base.hpp"
#endif
// -----------------------------------------------------------------------------------------------------------
// from PluginContext.hpp
@ -44,6 +48,10 @@ struct CardinalPluginContext : rack::Context {
float** dataOuts;
Plugin* const plugin;
CardinalPluginContext(Plugin* const p);
#ifndef HEADLESS
bool addIdleCallback(IdleCallback* cb);
void removeIdleCallback(IdleCallback* cb);
#endif
};
END_NAMESPACE_DISTRHO