commit 1b1b068389662881b48efd088ca8f361f52719c4
parent 2497744774dafaf16d83077a6be82b4dcdf71e56
Author: falkTX <falktx@gmail.com>
Date: Tue, 18 Nov 2014 01:30:31 +0000
NTK fixes
Diffstat:
2 files changed, 31 insertions(+), 37 deletions(-)
diff --git 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<Fl_Double_Window*>::reverse_iterator rit = fWindows.rbegin(), rite = fWindows.rend(); rit != rite; ++rit)
{
diff --git 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)