// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*- /* * Copyright (C) 2011 Canonical Ltd * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authored by: Neil Jagdish Patel */ #ifndef UNITY_GLIB_SIGNAL_H #define UNITY_GLIB_SIGNAL_H #include #include #include #include #include #include namespace unity { namespace glib { using sigc::nil; class SignalBase { public: typedef boost::shared_ptr Ptr; SignalBase(); virtual ~SignalBase(); void Disconnect(); GObject* object() const; std::string const& name() const; protected: GObject* object_; guint32 connection_id_; std::string name_; }; template class Signal0 : public SignalBase { public: typedef sigc::slot SignalCallback; Signal0(); void Connect(G Object, std::string const& signal_name, SignalCallback cb); private: static R Callback(G object, Signal0* self); private: SignalCallback callback_; }; template class Signal1 : public SignalBase { public: typedef sigc::slot SignalCallback; Signal1(); void Connect(G Object, std::string const& signal_name, SignalCallback callback); private: static R Callback(G object, T data1, Signal1* self); private: SignalCallback callback_; }; template class Signal2 : public SignalBase { public: typedef sigc::slot SignalCallback; Signal2(); void Connect(G Object, std::string const& signal_name, SignalCallback callback); private: static R Callback(G Object, T1 data1, T2 data2, Signal2* self); private: SignalCallback callback_; }; template class Signal3 : public SignalBase { public: typedef sigc::slot SignalCallback; Signal3(); void Connect(G Object, std::string const& signal_name, SignalCallback callback); private: static R Callback(G Object, T1 data1, T2 data2, T3 data3, Signal3* self); private: SignalCallback callback_; }; template class Signal4 : public SignalBase { public: typedef sigc::slot SignalCallback; Signal4(); void Connect(G Object, std::string const& signal_name, SignalCallback callback); private: static R Callback(G Object, T1 data1, T2 data2, T3 data3, T4 data4, Signal4* self); private: SignalCallback callback_; }; template < typename R, typename G, typename T1, typename T2, typename T3, typename T4, typename T5 > class Signal5 : public SignalBase { public: typedef sigc::slot SignalCallback; Signal5(); void Connect(G Object, std::string const& signal_name, SignalCallback callback); private: static R Callback(G Object, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5, Signal5* self); private: SignalCallback callback_; }; template < typename R, typename G, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6 > class Signal6 : public SignalBase { public: typedef sigc::slot SignalCallback; Signal6(); void Connect(G Object, std::string const& signal_name, SignalCallback callback); private: static R Callback(G Object, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5, T6 data6, Signal6* self); private: SignalCallback callback_; }; template < typename R, typename G, typename T1 = nil, typename T2 = nil, typename T3 = nil, typename T4 = nil, typename T5 = nil, typename T6 = nil > class Signal : public Signal6 { public: typedef sigc::slot SignalCallback; inline Signal(); inline Signal(G Object, std::string const& signal_name, SignalCallback callback); }; template class Signal : public Signal0 { public: typedef sigc::slot SignalCallback; inline Signal(); inline Signal(G Object, std::string const& signal_name, SignalCallback callback); }; template class Signal : public Signal1 { public: typedef sigc::slot SignalCallback; inline Signal(); inline Signal(G Object, std::string const& signal_name, SignalCallback callback); }; template class Signal : public Signal2 { public: typedef sigc::slot SignalCallback; inline Signal(); inline Signal(G Object, std::string const& signal_name, SignalCallback callback); }; template class Signal : public Signal3 { public: typedef sigc::slot SignalCallback; inline Signal(); inline Signal(G Object, std::string const& signal_name, SignalCallback callback); }; template class Signal : public Signal4 { public: typedef sigc::slot SignalCallback; inline Signal(); inline Signal(G Object, std::string const& signal_name, SignalCallback callback); }; template class Signal : public Signal5 { public: typedef sigc::slot SignalCallback; inline Signal(); inline Signal(G Object, std::string const& signal_name, SignalCallback callback); }; class SignalManager : public boost::noncopyable { public: typedef std::vector ConnectionVector; SignalManager(); void Add(SignalBase* signal); void Disconnect(void* object, std::string const& signal_name = ""); private: ConnectionVector connections_; }; } } #include "GLibSignal-inl.h" #endif