| @@ -49,7 +49,7 @@ public: | |||
| // ------------------------------------------------------------------- | |||
| // Host UI State | |||
| void d_uiResize(uint width, uint height); | |||
| void d_setSize(uint width, uint height); | |||
| #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | |||
| // ------------------------------------------------------------------- | |||
| @@ -89,6 +89,7 @@ private: | |||
| struct PrivateData; | |||
| PrivateData* const pData; | |||
| friend class UIExporter; | |||
| friend class UIExporterWindow; | |||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI) | |||
| }; | |||
| @@ -43,7 +43,7 @@ public: | |||
| UICarla(const NativeHostDescriptor* const host, PluginExporter* const plugin) | |||
| : fHost(host), | |||
| 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); | |||
| @@ -110,7 +110,7 @@ protected: | |||
| // TODO | |||
| } | |||
| void handleUiResize(const uint width, const uint height) | |||
| void handleSetSize(const uint width, const uint height) | |||
| { | |||
| fUI.setSize(width, height); | |||
| } | |||
| @@ -154,9 +154,9 @@ private: | |||
| } | |||
| #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 | |||
| @@ -37,7 +37,7 @@ class PluginJack | |||
| public: | |||
| PluginJack(jack_client_t* const client) | |||
| : fPlugin(), | |||
| fUI(this, 0, nullptr, nullptr, nullptr, nullptr, uiResizeCallback, fPlugin.getInstancePointer()), | |||
| fUI(this, 0, nullptr, nullptr, nullptr, nullptr, setSizeCallback, fPlugin.getInstancePointer()), | |||
| fClient(client) | |||
| { | |||
| char strBuf[0xff+1]; | |||
| @@ -217,7 +217,7 @@ protected: | |||
| fUI.quit(); | |||
| } | |||
| void uiResize(const uint width, const uint height) | |||
| void setSize(const uint width, const uint height) | |||
| { | |||
| fUI.setSize(width, height); | |||
| } | |||
| @@ -271,9 +271,9 @@ private: | |||
| 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 | |||
| @@ -119,7 +119,7 @@ public: | |||
| fEffect(effect), | |||
| fUiHelper(uiHelper), | |||
| 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 | |||
| } | |||
| void uiResize(const uint width, const uint height) | |||
| void setSize(const uint width, const uint height) | |||
| { | |||
| fUI.setSize(width, height); | |||
| hostCallback(audioMasterSizeWindow, width, height, nullptr, 0.0f); | |||
| @@ -256,9 +256,9 @@ private: | |||
| 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 | |||
| @@ -79,9 +79,9 @@ void UI::d_sendNote(uint8_t channel, uint8_t note, uint8_t velocity) | |||
| // ----------------------------------------------------------------------- | |||
| // 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 | |||
| @@ -93,7 +93,7 @@ class UIDssi | |||
| { | |||
| public: | |||
| 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), | |||
| fOscData(oscData) | |||
| { | |||
| @@ -188,7 +188,7 @@ protected: | |||
| fOscData.send_midi(mdata); | |||
| } | |||
| void uiResize(const uint width, const uint height) | |||
| void setSize(const uint width, const uint height) | |||
| { | |||
| fUI.setSize(width, height); | |||
| } | |||
| @@ -219,9 +219,9 @@ private: | |||
| 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 | |||
| @@ -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 (*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 (*uiResizeFunc) (void* ptr, uint width, uint height); | |||
| typedef void (*setSizeFunc) (void* ptr, uint width, uint height); | |||
| // ----------------------------------------------------------------------- | |||
| // UI private data | |||
| @@ -58,7 +58,7 @@ struct UI::PrivateData { | |||
| setParamFunc setParamCallbackFunc; | |||
| setStateFunc setStateCallbackFunc; | |||
| sendNoteFunc sendNoteCallbackFunc; | |||
| uiResizeFunc uiResizeCallbackFunc; | |||
| setSizeFunc setSizeCallbackFunc; | |||
| void* ptr; | |||
| PrivateData() noexcept | |||
| @@ -71,7 +71,7 @@ struct UI::PrivateData { | |||
| setParamCallbackFunc(nullptr), | |||
| setStateCallbackFunc(nullptr), | |||
| sendNoteCallbackFunc(nullptr), | |||
| uiResizeCallbackFunc(nullptr), | |||
| setSizeCallbackFunc(nullptr), | |||
| ptr(nullptr) | |||
| { | |||
| DISTRHO_SAFE_ASSERT(sampleRate != 0.0); | |||
| @@ -117,26 +117,31 @@ struct UI::PrivateData { | |||
| 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 | |||
| class PluginWindow : public Window | |||
| class UIExporterWindow : public Window | |||
| { | |||
| public: | |||
| PluginWindow(App& app, const intptr_t winId) | |||
| UIExporterWindow(App& app, const intptr_t 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; | |||
| } | |||
| @@ -146,17 +151,25 @@ public: | |||
| return fUi; | |||
| } | |||
| bool isReady() const noexcept | |||
| { | |||
| return fIsReady; | |||
| } | |||
| protected: | |||
| void onReshape(const int width, const int height) override | |||
| void onReshape(int width, int height) override | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(fUi != nullptr,); | |||
| fIsReady = true; | |||
| fUi->setSize(width, height); | |||
| fUi->d_uiResize(width, height); | |||
| fUi->d_uiReshape(width, height); | |||
| } | |||
| private: | |||
| UI* const fUi; | |||
| bool fIsReady; | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| @@ -166,7 +179,7 @@ class UIExporter : public IdleCallback | |||
| { | |||
| public: | |||
| 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) | |||
| : glApp(), | |||
| glWindow(glApp, winId), | |||
| @@ -181,10 +194,7 @@ public: | |||
| fData->setParamCallbackFunc = setParamCall; | |||
| fData->setStateCallbackFunc = setStateCall; | |||
| 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 | |||
| fData->dspPtr = dspPtr; | |||
| @@ -270,7 +280,9 @@ public: | |||
| { | |||
| DISTRHO_SAFE_ASSERT_RETURN(fUi != nullptr, false); | |||
| fUi->d_uiIdle(); | |||
| if (glWindow.isReady()) | |||
| fUi->d_uiIdle(); | |||
| glApp.idle(); | |||
| return ! glApp.isQuiting(); | |||
| @@ -312,15 +324,16 @@ public: | |||
| protected: | |||
| void idleCallback() override | |||
| { | |||
| fUi->d_uiIdle(); | |||
| if (glWindow.isReady()) | |||
| fUi->d_uiIdle(); | |||
| } | |||
| private: | |||
| // ------------------------------------------------------------------- | |||
| // DGL Application and Window for this widget | |||
| App glApp; | |||
| PluginWindow glWindow; | |||
| App glApp; | |||
| UIExporterWindow glWindow; | |||
| // ------------------------------------------------------------------- | |||
| // Widget and DistrhoUI data | |||
| @@ -37,7 +37,7 @@ public: | |||
| 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 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), | |||
| fUiResize(uiResz), | |||
| 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); | |||
| @@ -245,9 +245,9 @@ private: | |||
| 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 | |||