diff --git a/dgl/ntk/NtkApp.hpp b/dgl/ntk/NtkApp.hpp index 28c2e5e8..c820810d 100644 --- a/dgl/ntk/NtkApp.hpp +++ b/dgl/ntk/NtkApp.hpp @@ -37,30 +37,19 @@ # undef override_defined #endif -// Is this really needed? -// fails on renoise -struct ScopedDisplayLock { - ScopedDisplayLock() - { -#if 0 //def DISTRHO_OS_LINUX - XLockDisplay(fl_display); -#endif - } - - ~ScopedDisplayLock() - { -#if 0 //def DISTRHO_OS_LINUX - XUnlockDisplay(fl_display); -#endif - } -}; - // ----------------------------------------------------------------------- namespace DISTRHO_NAMESPACE { - class UI; + class UI; } +struct FlScopedLock { + FlScopedLock() { Fl::lock(); } + ~FlScopedLock() { Fl::unlock(); } +}; + +// ----------------------------------------------------------------------- + START_NAMESPACE_DGL class NtkWindow; @@ -232,7 +221,7 @@ private: if (fWindows.size() == 0 && ! isThreadRunning()) startThread(); - const d_MutexLocker sl(fWindowMutex); + const d_MutexLocker cml(fWindowMutex); fWindows.push_back(window); } @@ -241,7 +230,7 @@ private: { DISTRHO_SAFE_ASSERT_RETURN(window != nullptr,); - const d_MutexLocker sl(fWindowMutex); + const d_MutexLocker cml(fWindowMutex); fWindows.remove(window); if (fWindows.size() == 0) @@ -266,22 +255,24 @@ private: for (; ! shouldThreadExit();) { - if (fDoNextUI) { - const ScopedDisplayLock csdl; - fNextUI.run(); - fDoNextUI = false; - } + const FlScopedLock csl; - const ScopedDisplayLock csdl; - Fl::check(); - Fl::flush(); + if (fDoNextUI) + { + fNextUI.run(); + fDoNextUI = false; + } + + Fl::check(); + Fl::flush(); + } d_msleep(20); } - const d_MutexLocker sl(fWindowMutex); - const ScopedDisplayLock csdl; + const FlScopedLock csl; + const d_MutexLocker cml(fWindowMutex); for (std::list::reverse_iterator rit = fWindows.rbegin(), rite = fWindows.rend(); rit != rite; ++rit) { diff --git a/dgl/ntk/NtkWindow.hpp b/dgl/ntk/NtkWindow.hpp index 47e9f104..436f5b2f 100644 --- a/dgl/ntk/NtkWindow.hpp +++ b/dgl/ntk/NtkWindow.hpp @@ -166,20 +166,20 @@ public: { DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,); - if (fIdleCallbacks.size() == 0) - Fl::add_idle(_idleHandler, this); - fIdleCallbacks.push_back(callback); + + if (fIdleCallbacks.size() == 1) + Fl::add_timeout(0.030, _idleHandler, this); } void removeIdleCallback(IdleCallback* const callback) { DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,); - fIdleCallbacks.remove(callback); + if (fIdleCallbacks.size() == 1) + Fl::remove_timeout(_idleHandler, this); - if (fIdleCallbacks.size() == 0) - Fl::remove_idle(_idleHandler, this); + fIdleCallbacks.remove(callback); } private: @@ -203,6 +203,9 @@ private: IdleCallback* const idleCallback(*it); idleCallback->idleCallback(); } + + if (fIdleCallbacks.size() > 0 && ! self->getApp().isQuiting()) + Fl::repeat_timeout(0.030, _idleHandler, self); } DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NtkWindow)