diff options
Diffstat (limited to 'libs/pbd/pbd/signals.h')
-rw-r--r-- | libs/pbd/pbd/signals.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/libs/pbd/pbd/signals.h b/libs/pbd/pbd/signals.h index 0b44ee8051..ffb0dcebb6 100644 --- a/libs/pbd/pbd/signals.h +++ b/libs/pbd/pbd/signals.h @@ -102,6 +102,8 @@ public: typename SignalType::result_type operator()() { return _signal (); } + + bool empty() const { return _signal.empty(); } private: SignalType _signal; @@ -144,6 +146,8 @@ public: return _signal (arg1); } + bool empty() const { return _signal.empty(); } + private: SignalType _signal; }; @@ -184,6 +188,8 @@ public: return _signal (arg1, arg2); } + bool empty() const { return _signal.empty(); } + private: SignalType _signal; }; @@ -224,6 +230,50 @@ public: return _signal (arg1, arg2, arg3); } + bool empty() const { return _signal.empty(); } + +private: + SignalType _signal; +}; + +template<typename R, typename A1, typename A2, typename A3, typename A4> +class Signal4 { +public: + Signal4 () {} + typedef boost::signals2::signal<R(A1,A2,A3,A4)> SignalType; + + void connect_same_thread (ScopedConnectionList& clist, + const typename SignalType::slot_function_type& slot) { + clist.add_connection (_signal.connect (slot)); + } + + void connect_same_thread (Connection& c, + const typename SignalType::slot_function_type& slot) { + c = _signal.connect (slot); + } + + static void compositor (typename boost::function<void(A1,A2,A3)> f, PBD::EventLoop* event_loop, A1 arg1, A2 arg2, A3 arg3, A4 arg4) { + event_loop->call_slot (boost::bind (f, arg1, arg2, arg3, arg4)); + } + + void connect (ScopedConnectionList& clist, + const typename SignalType::slot_function_type& slot, + PBD::EventLoop* event_loop) { + clist.add_connection (_signal.connect (boost::bind (&compositor, slot, event_loop, _1, _2, _3, _4))); + } + + void connect (Connection& c, + const typename SignalType::slot_function_type& slot, + PBD::EventLoop* event_loop) { + c = _signal.connect (_signal.connect (boost::bind (&compositor, slot, event_loop, _1, _2, _3, _4))); + } + + typename SignalType::result_type operator()(A1 arg1, A2 arg2, A3 arg3, A4 arg4) { + return _signal (arg1, arg2, arg3, arg4); + } + + bool empty() const { return _signal.empty(); } + private: SignalType _signal; }; |