From d9044f27fe462d1827a8fcd2a2fa0bf988c0067f Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 2 Oct 2021 03:34:29 +0100 Subject: [PATCH] Prevent crashes when UI initializes too early Signed-off-by: falkTX --- dgl/src/WindowPrivateData.cpp | 6 +++++- distrho/src/DistrhoUIInternal.hpp | 2 ++ distrho/src/DistrhoUIPrivateData.hpp | 12 ++++++++++++ distrho/src/DistrhoUIVST3.cpp | 22 +++++++++++----------- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/dgl/src/WindowPrivateData.cpp b/dgl/src/WindowPrivateData.cpp index 27705e63..15a1d280 100644 --- a/dgl/src/WindowPrivateData.cpp +++ b/dgl/src/WindowPrivateData.cpp @@ -33,7 +33,11 @@ #define DGL_DEBUG_EVENTS #if defined(DEBUG) && defined(DGL_DEBUG_EVENTS) -# include +# ifdef DISTRHO_PROPER_CPP11_SUPPORT +# include +# else +# include +# endif #endif START_NAMESPACE_DGL diff --git a/distrho/src/DistrhoUIInternal.hpp b/distrho/src/DistrhoUIInternal.hpp index 35606a98..65c9d93d 100644 --- a/distrho/src/DistrhoUIInternal.hpp +++ b/distrho/src/DistrhoUIInternal.hpp @@ -99,6 +99,8 @@ public: DISTRHO_SAFE_ASSERT_RETURN(uiPtr != nullptr,); ui = uiPtr; + uiData->initializing = false; + #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI // unused (void)bundlePath; diff --git a/distrho/src/DistrhoUIPrivateData.hpp b/distrho/src/DistrhoUIPrivateData.hpp index 93a8a89a..80894ce0 100644 --- a/distrho/src/DistrhoUIPrivateData.hpp +++ b/distrho/src/DistrhoUIPrivateData.hpp @@ -285,6 +285,7 @@ struct UI::PrivateData { void* dspPtr; // UI + bool initializing; uint bgColor; uint fgColor; double scaleFactor; @@ -308,6 +309,7 @@ struct UI::PrivateData { sampleRate(0), parameterOffset(0), dspPtr(nullptr), + initializing(true), bgColor(0), fgColor(0xffffffff), scaleFactor(1.0), @@ -358,30 +360,40 @@ struct UI::PrivateData { void editParamCallback(const uint32_t rindex, const bool started) { + DISTRHO_SAFE_ASSERT_RETURN(!initializing,); + if (editParamCallbackFunc != nullptr) editParamCallbackFunc(callbacksPtr, rindex, started); } void setParamCallback(const uint32_t rindex, const float value) { + DISTRHO_SAFE_ASSERT_RETURN(!initializing,); + if (setParamCallbackFunc != nullptr) setParamCallbackFunc(callbacksPtr, rindex, value); } void setStateCallback(const char* const key, const char* const value) { + DISTRHO_SAFE_ASSERT_RETURN(!initializing,); + if (setStateCallbackFunc != nullptr) setStateCallbackFunc(callbacksPtr, key, value); } void sendNoteCallback(const uint8_t channel, const uint8_t note, const uint8_t velocity) { + DISTRHO_SAFE_ASSERT_RETURN(!initializing,); + if (sendNoteCallbackFunc != nullptr) sendNoteCallbackFunc(callbacksPtr, channel, note, velocity); } void setSizeCallback(const uint width, const uint height) { + DISTRHO_SAFE_ASSERT_RETURN(!initializing,); + if (setSizeCallbackFunc != nullptr) setSizeCallbackFunc(callbacksPtr, width, height); } diff --git a/distrho/src/DistrhoUIVST3.cpp b/distrho/src/DistrhoUIVST3.cpp index f0eee106..20217169 100644 --- a/distrho/src/DistrhoUIVST3.cpp +++ b/distrho/src/DistrhoUIVST3.cpp @@ -486,17 +486,17 @@ private: DISTRHO_SAFE_ASSERT_RETURN(fFrame != nullptr,); d_stdout("from UI setSize %u %u | %p %p", width, height, fView, fFrame); -// #ifdef DISTRHO_OS_MAC -// const double scaleFactor = fUI.getScaleFactor(); -// width /= scaleFactor; -// height /= scaleFactor; -// #endif -// -// v3_view_rect rect; -// std::memset(&rect, 0, sizeof(rect)); -// rect.right = width; -// rect.bottom = height; -// v3_cpp_obj(fFrame)->resize_view(fFrame, fView, &rect); +#ifdef DISTRHO_OS_MAC + const double scaleFactor = fUI.getScaleFactor(); + width /= scaleFactor; + height /= scaleFactor; +#endif + + v3_view_rect rect; + std::memset(&rect, 0, sizeof(rect)); + rect.right = width; + rect.bottom = height; + v3_cpp_obj(fFrame)->resize_view(fFrame, fView, &rect); } static void setSizeCallback(void* ptr, uint width, uint height)