diff --git a/libs/pbd/glib_event_source.cc b/libs/pbd/glib_event_source.cc index 3f4c58c7a6..cace0759e8 100644 --- a/libs/pbd/glib_event_source.cc +++ b/libs/pbd/glib_event_source.cc @@ -18,20 +18,41 @@ #include "pbd/glib_event_source.h" -bool -GlibEventLoopSource::prepare (int& timeout) +GlibEventLoopCallback::GlibEventLoopCallback (boost::function callback) + : _callback (callback) { - return false; + funcs.prepare = c_prepare;; + funcs.check = NULL; + funcs.dispatch = NULL; + funcs.finalize = NULL; + + gsource = (GSourceWithParent*) g_source_new (&funcs, sizeof (GSourceWithParent)); + gsource->cpp = this; +} + +GlibEventLoopCallback::~GlibEventLoopCallback () +{ + g_source_destroy ((GSource*) gsource); +} + +void +GlibEventLoopCallback::attach (Glib::RefPtr ctxt) +{ + g_source_attach ((GSource*) gsource, ctxt->gobj()); +} + +gboolean +GlibEventLoopCallback::c_prepare (GSource* gsrc, int* timeout) +{ + GSourceWithParent* gwp = reinterpret_cast (gsrc); + GlibEventLoopCallback* cpp = gwp->cpp; + return cpp->cpp_prepare (); } bool -GlibEventLoopSource::check () +GlibEventLoopCallback::cpp_prepare () { + _callback(); return false; } -bool -GlibEventLoopSource::dispatch (sigc::slot_base*) -{ - return false; -} diff --git a/libs/pbd/pbd/glib_event_source.h b/libs/pbd/pbd/glib_event_source.h index b4b630486a..e5377ab6ad 100644 --- a/libs/pbd/pbd/glib_event_source.h +++ b/libs/pbd/pbd/glib_event_source.h @@ -21,31 +21,29 @@ #include +#include #include #include "pbd/libpbd_visibility.h" -class LIBPBD_API GlibEventLoopSource : public Glib::Source +class LIBPBD_API GlibEventLoopCallback { public: - GlibEventLoopSource () {}; + GlibEventLoopCallback (boost::function callback); + ~GlibEventLoopCallback(); - bool prepare (int& timeout); - bool check(); - bool dispatch (sigc::slot_base*); -}; - - -class LIBPBD_API GlibEventLoopCallback : public GlibEventLoopSource -{ - public: - GlibEventLoopCallback (boost::function callback) : _callback (callback) {} - - bool check() { - _callback(); - return false; - } + static gboolean c_prepare (GSource*, gint* timeout); + void attach (Glib::RefPtr); private: + struct GSourceWithParent { + GSource c; + GlibEventLoopCallback* cpp; + }; + + bool cpp_prepare(); + + GSourceWithParent* gsource; + GSourceFuncs funcs; boost::function _callback; };