DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit 27d3046a7b3027e794f9b90ca66788c87439992f
parent 3f405e0b312c3165d027b4e94a4c5a3fe38e85cb
Author: falkTX <falktx@falktx.com>
Date:   Thu, 31 Dec 2020 10:08:28 +0000

Add background/foreground UI color from host, implemented for LV2

Diffstat:
Mdistrho/DistrhoUI.hpp | 14+++++++++++++-
Mdistrho/src/DistrhoPluginJack.cpp | 5+++--
Mdistrho/src/DistrhoPluginVST.cpp | 9+++++----
Mdistrho/src/DistrhoUI.cpp | 10++++++++++
Mdistrho/src/DistrhoUIInternal.hpp | 27+++++++++++++++++++++++++--
Mdistrho/src/DistrhoUILV2.cpp | 36+++++++++++++++++++++++++++++++-----
Mexamples/Parameters/ExampleUIParameters.cpp | 23+++++++++++++++++++++++
7 files changed, 110 insertions(+), 14 deletions(-)

diff --git a/distrho/DistrhoUI.hpp b/distrho/DistrhoUI.hpp @@ -82,6 +82,18 @@ public: * Host state */ /** + Get the color used for UI background (i.e. window color) in RGBA format. + Returns 0 by default, in case of error or lack of host support. + */ + uint getBackgroundColor() const noexcept; + + /** + Get the color used for UI foreground (i.e. text color) in RGBA format. + Returns 0xffffffff by default, in case of error or lack of host support. + */ + uint getForegroundColor() const noexcept; + + /** Get the current sample rate used in plugin processing. @see sampleRateChanged(double) */ @@ -92,7 +104,7 @@ public: Touch/pressed-down event. Lets the host know the user is tweaking a parameter. - Required in some hosts to record automation. + Required in some hosts to record automation. */ void editParameter(uint32_t index, bool started); diff --git a/distrho/src/DistrhoPluginJack.cpp b/distrho/src/DistrhoPluginJack.cpp @@ -108,8 +108,9 @@ public: nullptr, // send note setSizeCallback, nullptr, // file request - getDesktopScaleFactor(), - fPlugin.getInstancePointer()), + nullptr, // bundle + fPlugin.getInstancePointer(), + getDesktopScaleFactor()), #endif fClient(client) { diff --git a/distrho/src/DistrhoPluginVST.cpp b/distrho/src/DistrhoPluginVST.cpp @@ -178,8 +178,9 @@ public: sendNoteCallback, setSizeCallback, nullptr, // TODO file request - scaleFactor, - plugin->getInstancePointer()), + nullptr, + plugin->getInstancePointer(), + scaleFactor), fShouldCaptureVstKeys(false) { // FIXME only needed for windows? @@ -593,8 +594,8 @@ public: d_lastUiSampleRate = fPlugin.getSampleRate(); UIExporter tmpUI(nullptr, 0, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - fLastScaleFactor, fPlugin.getInstancePointer()); + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + fPlugin.getInstancePointer(), fLastScaleFactor); fVstRect.right = tmpUI.getWidth(); fVstRect.bottom = tmpUI.getHeight(); tmpUI.quit(); diff --git a/distrho/src/DistrhoUI.cpp b/distrho/src/DistrhoUI.cpp @@ -81,6 +81,16 @@ void UI::setGeometryConstraints(uint minWidth, uint minHeight, bool keepAspectRa /* ------------------------------------------------------------------------------------------------------------ * Host state */ +uint UI::getBackgroundColor() const noexcept +{ + return pData->bgColor; +} + +uint UI::getForegroundColor() const noexcept +{ + return pData->fgColor; +} + double UI::getSampleRate() const noexcept { return pData->sampleRate; diff --git a/distrho/src/DistrhoUIInternal.hpp b/distrho/src/DistrhoUIInternal.hpp @@ -71,6 +71,8 @@ struct UI::PrivateData { bool resizeInProgress; uint minWidth; uint minHeight; + uint bgColor; + uint fgColor; // Callbacks void* callbacksPtr; @@ -91,6 +93,8 @@ struct UI::PrivateData { resizeInProgress(false), minWidth(0), minHeight(0), + bgColor(0), + fgColor(0), callbacksPtr(nullptr), editParamCallbackFunc(nullptr), setParamCallbackFunc(nullptr), @@ -272,9 +276,11 @@ public: const sendNoteFunc sendNoteCall, const setSizeFunc setSizeCall, const fileRequestFunc fileRequestCall, - const float scaleFactor = 1.0f, + const char* const bundlePath = nullptr, void* const dspPtr = nullptr, - const char* const bundlePath = nullptr) + const float scaleFactor = 1.0f, + const uint32_t bgColor = 0, + const uint32_t fgColor = 0xffffffff) #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI : fUI(createUiWrapper(dspPtr, winId, scaleFactor, bundlePath)), #else @@ -288,6 +294,9 @@ public: DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + fData->bgColor = bgColor; + fData->fgColor = fgColor; + fData->callbacksPtr = callbacksPtr; fData->editParamCallbackFunc = editParamCall; fData->setParamCallbackFunc = setParamCall; @@ -356,6 +365,20 @@ public: } #endif + uint getBackgroundColor() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); + + return fData->bgColor; + } + + uint getForegroundColor() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0xffffffff); + + return fData->fgColor; + } + // ------------------------------------------------------------------- uint32_t getParameterOffset() const noexcept diff --git a/distrho/src/DistrhoUILV2.cpp b/distrho/src/DistrhoUILV2.cpp @@ -70,9 +70,11 @@ public: const LV2_Feature* const* const features, const LV2UI_Controller controller, const LV2UI_Write_Function writeFunc, - const float scaleFactor, LV2UI_Widget* const widget, - void* const dspPtr) + void* const dspPtr, + const float scaleFactor, + const uint32_t bgColor, + const uint32_t fgColor) : fUI(this, winId, editParameterCallback, setParameterCallback, @@ -80,7 +82,11 @@ public: sendNoteCallback, setSizeCallback, fileRequestCallback, - scaleFactor, dspPtr, bundlePath), + bundlePath, + dspPtr, + scaleFactor, + bgColor, + fgColor), fUridMap(uridMap), fUiRequestValue(getLv2Feature<LV2UI_Request_Value>(features, LV2_UI__requestValue)), fUiResize(getLv2Feature<LV2UI_Resize>(features, LV2_UI__resize)), @@ -515,13 +521,18 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, } #endif + const intptr_t winId = (intptr_t)parentId; float scaleFactor = 1.0f; - const intptr_t winId((intptr_t)parentId); + uint32_t bgColor = 0; + uint32_t fgColor = 0xffffffff; if (options != nullptr) { + const LV2_URID uridAtomInt = uridMap->map(uridMap->handle, LV2_ATOM__Int); const LV2_URID uridAtomFloat = uridMap->map(uridMap->handle, LV2_ATOM__Float); const LV2_URID uridSampleRate = uridMap->map(uridMap->handle, LV2_PARAMETERS__sampleRate); + const LV2_URID uridBgColor = uridMap->map(uridMap->handle, LV2_UI__backgroundColor); + const LV2_URID uridFgColor = uridMap->map(uridMap->handle, LV2_UI__foregroundColor); const LV2_URID uridScaleFactor = uridMap->map(uridMap->handle, LV2_UI__scaleFactor); for (int i=0; options[i].key != 0; ++i) @@ -540,6 +551,20 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, else d_stderr("Host provides UI scale factor but has wrong value type"); } + else if (options[i].key == uridBgColor) + { + if (options[i].type == uridAtomInt) + bgColor = (uint32_t)*(const int32_t*)options[i].value; + else + d_stderr("Host provides UI background color but has wrong value type"); + } + else if (options[i].key == uridFgColor) + { + if (options[i].type == uridAtomInt) + fgColor = (uint32_t)*(const int32_t*)options[i].value; + else + d_stderr("Host provides UI foreground color but has wrong value type"); + } } } @@ -550,7 +575,8 @@ static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, } return new UiLv2(bundlePath, winId, options, uridMap, features, - controller, writeFunction, scaleFactor, widget, instance); + controller, writeFunction, widget, instance, + scaleFactor, bgColor, fgColor); } #define uiPtr ((UiLv2*)ui) diff --git a/examples/Parameters/ExampleUIParameters.cpp b/examples/Parameters/ExampleUIParameters.cpp @@ -105,9 +105,32 @@ protected: const uint width = getWidth(); const uint height = getHeight(); const uint minwh = std::min(width, height); + const uint bgColor = getBackgroundColor(); Rectangle<int> r; + // if host doesn't respect aspect-ratio but supports ui background, draw out-of-bounds color from it + if (width != height && bgColor != 0) + { + const GLubyte red = (bgColor >> 24) & 0xff; + const GLubyte green = (bgColor >> 16) & 0xff; + const GLubyte blue = (bgColor >> 8) & 0xff; + glColor3ub(red, green, blue); + + if (width > height) + { + r.setPos(height, 0); + r.setSize(width-height, height); + } + else + { + r.setPos(0, width); + r.setSize(width, height-width); + } + + r.draw(); + } + r.setWidth(minwh/3 - 6); r.setHeight(minwh/3 - 6);