@@ -49,7 +49,7 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
// Host UI State | // Host UI State | ||||
void d_uiResize(uint width, uint height); | |||||
void d_setSize(uint width, uint height); | |||||
#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -89,6 +89,7 @@ private: | |||||
struct PrivateData; | struct PrivateData; | ||||
PrivateData* const pData; | PrivateData* const pData; | ||||
friend class UIExporter; | friend class UIExporter; | ||||
friend class UIExporterWindow; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI) | DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI) | ||||
}; | }; | ||||
@@ -43,7 +43,7 @@ public: | |||||
UICarla(const NativeHostDescriptor* const host, PluginExporter* const plugin) | UICarla(const NativeHostDescriptor* const host, PluginExporter* const plugin) | ||||
: fHost(host), | : fHost(host), | ||||
fPlugin(plugin), | fPlugin(plugin), | ||||
fUI(this, 0, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, uiResizeCallback, plugin->getInstancePointer()) | |||||
fUI(this, 0, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, plugin->getInstancePointer()) | |||||
{ | { | ||||
fUI.setTitle(host->uiName); | fUI.setTitle(host->uiName); | ||||
@@ -110,7 +110,7 @@ protected: | |||||
// TODO | // TODO | ||||
} | } | ||||
void handleUiResize(const uint width, const uint height) | |||||
void handleSetSize(const uint width, const uint height) | |||||
{ | { | ||||
fUI.setSize(width, height); | fUI.setSize(width, height); | ||||
} | } | ||||
@@ -154,9 +154,9 @@ private: | |||||
} | } | ||||
#endif | #endif | ||||
static void uiResizeCallback(void* ptr, uint width, uint height) | |||||
static void setSizeCallback(void* ptr, uint width, uint height) | |||||
{ | { | ||||
handlePtr->handleUiResize(width, height); | |||||
handlePtr->handleSetSize(width, height); | |||||
} | } | ||||
#undef handlePtr | #undef handlePtr | ||||
@@ -37,7 +37,7 @@ class PluginJack | |||||
public: | public: | ||||
PluginJack(jack_client_t* const client) | PluginJack(jack_client_t* const client) | ||||
: fPlugin(), | : fPlugin(), | ||||
fUI(this, 0, nullptr, nullptr, nullptr, nullptr, uiResizeCallback, fPlugin.getInstancePointer()), | |||||
fUI(this, 0, nullptr, nullptr, nullptr, nullptr, setSizeCallback, fPlugin.getInstancePointer()), | |||||
fClient(client) | fClient(client) | ||||
{ | { | ||||
char strBuf[0xff+1]; | char strBuf[0xff+1]; | ||||
@@ -217,7 +217,7 @@ protected: | |||||
fUI.quit(); | fUI.quit(); | ||||
} | } | ||||
void uiResize(const uint width, const uint height) | |||||
void setSize(const uint width, const uint height) | |||||
{ | { | ||||
fUI.setSize(width, height); | fUI.setSize(width, height); | ||||
} | } | ||||
@@ -271,9 +271,9 @@ private: | |||||
uiPtr->jackShutdown(); | uiPtr->jackShutdown(); | ||||
} | } | ||||
static void uiResizeCallback(void* ptr, uint width, uint height) | |||||
static void setSizeCallback(void* ptr, uint width, uint height) | |||||
{ | { | ||||
uiPtr->uiResize(width, height); | |||||
uiPtr->setSize(width, height); | |||||
} | } | ||||
#undef uiPtr | #undef uiPtr | ||||
@@ -119,7 +119,7 @@ public: | |||||
fEffect(effect), | fEffect(effect), | ||||
fUiHelper(uiHelper), | fUiHelper(uiHelper), | ||||
fPlugin(plugin), | fPlugin(plugin), | ||||
fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, uiResizeCallback, plugin->getInstancePointer()) | |||||
fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, plugin->getInstancePointer()) | |||||
{ | { | ||||
} | } | ||||
@@ -215,7 +215,7 @@ protected: | |||||
#endif | #endif | ||||
} | } | ||||
void uiResize(const uint width, const uint height) | |||||
void setSize(const uint width, const uint height) | |||||
{ | { | ||||
fUI.setSize(width, height); | fUI.setSize(width, height); | ||||
hostCallback(audioMasterSizeWindow, width, height, nullptr, 0.0f); | hostCallback(audioMasterSizeWindow, width, height, nullptr, 0.0f); | ||||
@@ -256,9 +256,9 @@ private: | |||||
handlePtr->sendNote(channel, note, velocity); | handlePtr->sendNote(channel, note, velocity); | ||||
} | } | ||||
static void uiResizeCallback(void* ptr, uint width, uint height) | |||||
static void setSizeCallback(void* ptr, uint width, uint height) | |||||
{ | { | ||||
handlePtr->uiResize(width, height); | |||||
handlePtr->setSize(width, height); | |||||
} | } | ||||
#undef handlePtr | #undef handlePtr | ||||
@@ -79,9 +79,9 @@ void UI::d_sendNote(uint8_t channel, uint8_t note, uint8_t velocity) | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Host UI State | // Host UI State | ||||
void UI::d_uiResize(uint width, uint height) | |||||
void UI::d_setSize(uint width, uint height) | |||||
{ | { | ||||
pData->uiResizeCallback(width, height); | |||||
pData->setSizeCallback(width, height); | |||||
} | } | ||||
#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | ||||
@@ -93,7 +93,7 @@ class UIDssi | |||||
{ | { | ||||
public: | public: | ||||
UIDssi(const OscData& oscData, const char* const uiTitle) | UIDssi(const OscData& oscData, const char* const uiTitle) | ||||
: fUI(this, 0, nullptr, setParameterCallback, setStateCallback, sendNoteCallback, uiResizeCallback), | |||||
: fUI(this, 0, nullptr, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback), | |||||
fHostClosed(false), | fHostClosed(false), | ||||
fOscData(oscData) | fOscData(oscData) | ||||
{ | { | ||||
@@ -188,7 +188,7 @@ protected: | |||||
fOscData.send_midi(mdata); | fOscData.send_midi(mdata); | ||||
} | } | ||||
void uiResize(const uint width, const uint height) | |||||
void setSize(const uint width, const uint height) | |||||
{ | { | ||||
fUI.setSize(width, height); | fUI.setSize(width, height); | ||||
} | } | ||||
@@ -219,9 +219,9 @@ private: | |||||
uiPtr->sendNote(channel, note, velocity); | uiPtr->sendNote(channel, note, velocity); | ||||
} | } | ||||
static void uiResizeCallback(void* ptr, uint width, uint height) | |||||
static void setSizeCallback(void* ptr, uint width, uint height) | |||||
{ | { | ||||
uiPtr->uiResize(width, height); | |||||
uiPtr->setSize(width, height); | |||||
} | } | ||||
#undef uiPtr | #undef uiPtr | ||||
@@ -40,7 +40,7 @@ typedef void (*editParamFunc) (void* ptr, uint32_t rindex, bool started); | |||||
typedef void (*setParamFunc) (void* ptr, uint32_t rindex, float value); | typedef void (*setParamFunc) (void* ptr, uint32_t rindex, float value); | ||||
typedef void (*setStateFunc) (void* ptr, const char* key, const char* value); | typedef void (*setStateFunc) (void* ptr, const char* key, const char* value); | ||||
typedef void (*sendNoteFunc) (void* ptr, uint8_t channel, uint8_t note, uint8_t velo); | typedef void (*sendNoteFunc) (void* ptr, uint8_t channel, uint8_t note, uint8_t velo); | ||||
typedef void (*uiResizeFunc) (void* ptr, uint width, uint height); | |||||
typedef void (*setSizeFunc) (void* ptr, uint width, uint height); | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// UI private data | // UI private data | ||||
@@ -58,7 +58,7 @@ struct UI::PrivateData { | |||||
setParamFunc setParamCallbackFunc; | setParamFunc setParamCallbackFunc; | ||||
setStateFunc setStateCallbackFunc; | setStateFunc setStateCallbackFunc; | ||||
sendNoteFunc sendNoteCallbackFunc; | sendNoteFunc sendNoteCallbackFunc; | ||||
uiResizeFunc uiResizeCallbackFunc; | |||||
setSizeFunc setSizeCallbackFunc; | |||||
void* ptr; | void* ptr; | ||||
PrivateData() noexcept | PrivateData() noexcept | ||||
@@ -71,7 +71,7 @@ struct UI::PrivateData { | |||||
setParamCallbackFunc(nullptr), | setParamCallbackFunc(nullptr), | ||||
setStateCallbackFunc(nullptr), | setStateCallbackFunc(nullptr), | ||||
sendNoteCallbackFunc(nullptr), | sendNoteCallbackFunc(nullptr), | ||||
uiResizeCallbackFunc(nullptr), | |||||
setSizeCallbackFunc(nullptr), | |||||
ptr(nullptr) | ptr(nullptr) | ||||
{ | { | ||||
DISTRHO_SAFE_ASSERT(sampleRate != 0.0); | DISTRHO_SAFE_ASSERT(sampleRate != 0.0); | ||||
@@ -117,26 +117,31 @@ struct UI::PrivateData { | |||||
sendNoteCallbackFunc(ptr, channel, note, velocity); | sendNoteCallbackFunc(ptr, channel, note, velocity); | ||||
} | } | ||||
void uiResizeCallback(const uint width, const uint height) | |||||
void setSizeCallback(const uint width, const uint height) | |||||
{ | { | ||||
if (uiResizeCallbackFunc != nullptr) | |||||
uiResizeCallbackFunc(ptr, width, height); | |||||
if (setSizeCallbackFunc != nullptr) | |||||
setSizeCallbackFunc(ptr, width, height); | |||||
} | } | ||||
}; | }; | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Plugin Window, needed to take care of resize properly | // Plugin Window, needed to take care of resize properly | ||||
class PluginWindow : public Window | |||||
class UIExporterWindow : public Window | |||||
{ | { | ||||
public: | public: | ||||
PluginWindow(App& app, const intptr_t winId) | |||||
UIExporterWindow(App& app, const intptr_t winId) | |||||
: Window(app, winId), | : Window(app, winId), | ||||
fUi(createUI()) | |||||
fUi(createUI()), | |||||
fIsReady(false) | |||||
{ | { | ||||
DISTRHO_SAFE_ASSERT_RETURN(fUi != nullptr,); | |||||
setResizable(false); | |||||
setSize(fUi->d_getWidth(), fUi->d_getHeight()); | |||||
} | } | ||||
~PluginWindow() | |||||
~UIExporterWindow() | |||||
{ | { | ||||
delete fUi; | delete fUi; | ||||
} | } | ||||
@@ -146,17 +151,25 @@ public: | |||||
return fUi; | return fUi; | ||||
} | } | ||||
bool isReady() const noexcept | |||||
{ | |||||
return fIsReady; | |||||
} | |||||
protected: | protected: | ||||
void onReshape(const int width, const int height) override | |||||
void onReshape(int width, int height) override | |||||
{ | { | ||||
DISTRHO_SAFE_ASSERT_RETURN(fUi != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(fUi != nullptr,); | ||||
fIsReady = true; | |||||
fUi->setSize(width, height); | fUi->setSize(width, height); | ||||
fUi->d_uiResize(width, height); | |||||
fUi->d_uiReshape(width, height); | |||||
} | } | ||||
private: | private: | ||||
UI* const fUi; | UI* const fUi; | ||||
bool fIsReady; | |||||
}; | }; | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
@@ -166,7 +179,7 @@ class UIExporter : public IdleCallback | |||||
{ | { | ||||
public: | public: | ||||
UIExporter(void* const ptr, const intptr_t winId, | UIExporter(void* const ptr, const intptr_t winId, | ||||
const editParamFunc editParamCall, const setParamFunc setParamCall, const setStateFunc setStateCall, const sendNoteFunc sendNoteCall, const uiResizeFunc uiResizeCall, | |||||
const editParamFunc editParamCall, const setParamFunc setParamCall, const setStateFunc setStateCall, const sendNoteFunc sendNoteCall, const setSizeFunc setSizeCall, | |||||
void* const dspPtr = nullptr) | void* const dspPtr = nullptr) | ||||
: glApp(), | : glApp(), | ||||
glWindow(glApp, winId), | glWindow(glApp, winId), | ||||
@@ -181,10 +194,7 @@ public: | |||||
fData->setParamCallbackFunc = setParamCall; | fData->setParamCallbackFunc = setParamCall; | ||||
fData->setStateCallbackFunc = setStateCall; | fData->setStateCallbackFunc = setStateCall; | ||||
fData->sendNoteCallbackFunc = sendNoteCall; | fData->sendNoteCallbackFunc = sendNoteCall; | ||||
fData->uiResizeCallbackFunc = uiResizeCall; | |||||
glWindow.setResizable(false); | |||||
glWindow.setSize(fUi->d_getWidth(), fUi->d_getHeight()); | |||||
fData->setSizeCallbackFunc = setSizeCall; | |||||
#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | ||||
fData->dspPtr = dspPtr; | fData->dspPtr = dspPtr; | ||||
@@ -270,7 +280,9 @@ public: | |||||
{ | { | ||||
DISTRHO_SAFE_ASSERT_RETURN(fUi != nullptr, false); | DISTRHO_SAFE_ASSERT_RETURN(fUi != nullptr, false); | ||||
fUi->d_uiIdle(); | |||||
if (glWindow.isReady()) | |||||
fUi->d_uiIdle(); | |||||
glApp.idle(); | glApp.idle(); | ||||
return ! glApp.isQuiting(); | return ! glApp.isQuiting(); | ||||
@@ -312,15 +324,16 @@ public: | |||||
protected: | protected: | ||||
void idleCallback() override | void idleCallback() override | ||||
{ | { | ||||
fUi->d_uiIdle(); | |||||
if (glWindow.isReady()) | |||||
fUi->d_uiIdle(); | |||||
} | } | ||||
private: | private: | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
// DGL Application and Window for this widget | // DGL Application and Window for this widget | ||||
App glApp; | |||||
PluginWindow glWindow; | |||||
App glApp; | |||||
UIExporterWindow glWindow; | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
// Widget and DistrhoUI data | // Widget and DistrhoUI data | ||||
@@ -37,7 +37,7 @@ public: | |||||
UiLv2(const intptr_t winId, | UiLv2(const intptr_t winId, | ||||
const LV2_Options_Option* options, const LV2_URID_Map* const uridMap, const LV2UI_Resize* const uiResz, const LV2UI_Touch* uiTouch, | const LV2_Options_Option* options, const LV2_URID_Map* const uridMap, const LV2UI_Resize* const uiResz, const LV2UI_Touch* uiTouch, | ||||
const LV2UI_Controller controller, const LV2UI_Write_Function writeFunc, void* const dspPtr) | const LV2UI_Controller controller, const LV2UI_Write_Function writeFunc, void* const dspPtr) | ||||
: fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, uiResizeCallback, dspPtr), | |||||
: fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, dspPtr), | |||||
fUridMap(uridMap), | fUridMap(uridMap), | ||||
fUiResize(uiResz), | fUiResize(uiResz), | ||||
fUiTouch(uiTouch), | fUiTouch(uiTouch), | ||||
@@ -193,7 +193,7 @@ protected: | |||||
{ | { | ||||
} | } | ||||
void uiResize(const uint width, const uint height) | |||||
void setSize(const uint width, const uint height) | |||||
{ | { | ||||
fUI.setSize(width, height); | fUI.setSize(width, height); | ||||
@@ -245,9 +245,9 @@ private: | |||||
uiPtr->sendNote(channel, note, velocity); | uiPtr->sendNote(channel, note, velocity); | ||||
} | } | ||||
static void uiResizeCallback(void* ptr, uint width, uint height) | |||||
static void setSizeCallback(void* ptr, uint width, uint height) | |||||
{ | { | ||||
uiPtr->uiResize(width, height); | |||||
uiPtr->setSize(width, height); | |||||
} | } | ||||
#undef uiPtr | #undef uiPtr | ||||