Browse Source

NTK fixes

gh-pages
falkTX 10 years ago
parent
commit
1b1b068389
2 changed files with 31 additions and 37 deletions
  1. +22
    -31
      dgl/ntk/NtkApp.hpp
  2. +9
    -6
      dgl/ntk/NtkWindow.hpp

+ 22
- 31
dgl/ntk/NtkApp.hpp View File

@@ -37,30 +37,19 @@
# undef override_defined # undef override_defined
#endif #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 { namespace DISTRHO_NAMESPACE {
class UI;
class UI;
} }


struct FlScopedLock {
FlScopedLock() { Fl::lock(); }
~FlScopedLock() { Fl::unlock(); }
};

// -----------------------------------------------------------------------

START_NAMESPACE_DGL START_NAMESPACE_DGL


class NtkWindow; class NtkWindow;
@@ -232,7 +221,7 @@ private:
if (fWindows.size() == 0 && ! isThreadRunning()) if (fWindows.size() == 0 && ! isThreadRunning())
startThread(); startThread();


const d_MutexLocker sl(fWindowMutex);
const d_MutexLocker cml(fWindowMutex);
fWindows.push_back(window); fWindows.push_back(window);
} }


@@ -241,7 +230,7 @@ private:
{ {
DISTRHO_SAFE_ASSERT_RETURN(window != nullptr,); DISTRHO_SAFE_ASSERT_RETURN(window != nullptr,);


const d_MutexLocker sl(fWindowMutex);
const d_MutexLocker cml(fWindowMutex);
fWindows.remove(window); fWindows.remove(window);


if (fWindows.size() == 0) if (fWindows.size() == 0)
@@ -266,22 +255,24 @@ private:


for (; ! shouldThreadExit();) 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); 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) for (std::list<Fl_Double_Window*>::reverse_iterator rit = fWindows.rbegin(), rite = fWindows.rend(); rit != rite; ++rit)
{ {


+ 9
- 6
dgl/ntk/NtkWindow.hpp View File

@@ -166,20 +166,20 @@ public:
{ {
DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,); DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,);


if (fIdleCallbacks.size() == 0)
Fl::add_idle(_idleHandler, this);

fIdleCallbacks.push_back(callback); fIdleCallbacks.push_back(callback);

if (fIdleCallbacks.size() == 1)
Fl::add_timeout(0.030, _idleHandler, this);
} }


void removeIdleCallback(IdleCallback* const callback) void removeIdleCallback(IdleCallback* const callback)
{ {
DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,); 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: private:
@@ -203,6 +203,9 @@ private:
IdleCallback* const idleCallback(*it); IdleCallback* const idleCallback(*it);
idleCallback->idleCallback(); idleCallback->idleCallback();
} }

if (fIdleCallbacks.size() > 0 && ! self->getApp().isQuiting())
Fl::repeat_timeout(0.030, _idleHandler, self);
} }


DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NtkWindow) DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NtkWindow)


Loading…
Cancel
Save