diff options
author | Marcin Kolny <marcin.kolny@gmail.com> | 2015-08-08 14:45:12 +0200 |
---|---|---|
committer | Marcin Kolny <marcin.kolny@gmail.com> | 2015-08-08 14:45:59 +0200 |
commit | 0d5f63b18f5766760cf39e82ee11482984e0a938 (patch) | |
tree | e3f74b9b37e7618c92840024077dff43e6d08f0d /glib/src/signalproxy.h.m4 | |
parent | dce7a844e48a582e42eb2b60eef5c1f2527540ac (diff) | |
parent | d94115843f38967b5e883f5f7d8057882ae364cb (diff) | |
download | glibmm-gir-gmmproc.tar.gz |
Merge branch 'master' into glibmm-gir-gmmprocglibmm-gir-gmmproc
Diffstat (limited to 'glib/src/signalproxy.h.m4')
-rw-r--r-- | glib/src/signalproxy.h.m4 | 105 |
1 files changed, 81 insertions, 24 deletions
diff --git a/glib/src/signalproxy.h.m4 b/glib/src/signalproxy.h.m4 index 69db201d..2f275f99 100644 --- a/glib/src/signalproxy.h.m4 +++ b/glib/src/signalproxy.h.m4 @@ -1,5 +1,3 @@ -// -*- c++ -*- -dnl dnl Glib SignalProxy Templates dnl dnl Copyright 2001 Free Software Foundation @@ -19,7 +17,6 @@ dnl You should have received a copy of the GNU Lesser General Public dnl License along with this library; if not, write to the Free dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. dnl -dnl Ignore the next line /* This is a generated file, do not edit. Generated from __file__ */ include(template.macros.m4) #ifndef __header__ @@ -33,7 +30,7 @@ extern "C" #include <sigc++/sigc++.h> #include <glibmm/signalproxy_connectionnode.h> - +#include <glibmm/ustring.h> namespace Glib { @@ -52,7 +49,7 @@ struct SignalProxyInfo #endif //DOXYGEN_SHOULD_SKIP_THIS -// This base class is used by SignalProxyNormal and SignalProxyProperty. +// This base class is used by SignalProxyNormal, SignalProxyDetailed and SignalProxyProperty. class SignalProxyBase { public: @@ -61,7 +58,7 @@ public: #ifndef DOXYGEN_SHOULD_SKIP_THIS static inline sigc::slot_base* data_to_slot(void* data) { - SignalProxyConnectionNode *const pConnectionNode = static_cast<SignalProxyConnectionNode*>(data); + const auto pConnectionNode = static_cast<SignalProxyConnectionNode*>(data); // Return 0 if the connection is blocked. return (!pConnectionNode->slot_.blocked()) ? &pConnectionNode->slot_ : 0; @@ -76,7 +73,7 @@ private: }; -// shared portion of a Signal +// Shared portion of a Signal without detail /** The SignalProxy provides an API similar to sigc::signal that can be used to * connect sigc::slots to glib signals. * @@ -84,6 +81,8 @@ private: * which might emit it. Actually, proxies are controlled by * the template derivatives, which serve as gatekeepers for the * types allowed on a particular signal. + * + * For signals with a detailed name (signal_name::detail_name) see SignalProxyDetailed. */ class SignalProxyNormal : public SignalProxyBase { @@ -136,27 +135,77 @@ private: SignalProxyNormal& operator=(const SignalProxyNormal&); }; +// Shared portion of a Signal with detail +/** The SignalProxy provides an API similar to sigc::signal that can be used to + * connect sigc::slots to glib signals. + * + * This holds the name of the glib signal, including the detail name if any, + * and the object which might emit it. Actually, proxies are controlled by + * the template derivatives, which serve as gatekeepers for the + * types allowed on a particular signal. + */ +class SignalProxyDetailed : public SignalProxyBase +{ +public: + ~SignalProxyDetailed(); + + /// Stops the current signal emission (not in libsigc++) + void emission_stop(); + +protected: + + /** Creates a proxy for a signal that can be emitted by @a obj. + * @param obj The object that can emit the signal. + * @param info Information about the signal, including its name + * and the C callbacks that should be called by glib. + * @param detail_name The detail name, if any. + */ + SignalProxyDetailed(Glib::ObjectBase* obj, const SignalProxyInfo* info, const Glib::ustring& detail_name); + + /** Connects a signal handler to a signal. + * This is called by connect() and connect_notify() in derived SignalProxy classes. + * + * @param notify Whether this method is called by connect_notify() or by connect(). + * @param slot The signal handler, usually created with sigc::mem_fun() or sigc::ptr_fun(). + * @param after Whether this signal handler should be called before or after the default signal handler. + */ + sigc::slot_base& connect_impl_(bool notify, const sigc::slot_base& slot, bool after); + +private: + const SignalProxyInfo* info_; // Pointer to statically allocated structure. + const Glib::ustring detailed_name_; // signal_name[[::detail_name]]dnl one pair of [] in the generated .h file + + + // no copy assignment + SignalProxyDetailed& operator=(const SignalProxyDetailed&); +}; + dnl -dnl GLIB_SIGNAL_PROXY([P1, P2, ...],return type) +dnl GLIB_SIGNAL_PROXY([P1, P2, ...], Normal or Detailed) dnl define([GLIB_SIGNAL_PROXY],[dnl LINE(]__line__[)dnl -/**** Glib::[SignalProxy]NUM($1) ***************************************************/ +/**** Glib::[SignalProxy]ifelse($2,Normal,,$2)[]NUM($1) ***************************************************/ -/** Proxy for signals with NUM($1) arguments. +/** Proxy for signals with NUM($1) arguments[]ifelse($2,Normal,,[ and possibly a detailed name]). * Use the connect() or connect_notify() method, with sigc::mem_fun() or sigc::ptr_fun() * to connect signal handlers to signals. */ template <LIST(class R,ARG_CLASS($1))> -class [SignalProxy]NUM($1) : public SignalProxyNormal +class [SignalProxy]ifelse($2,Normal,,$2)[]NUM($1) : public SignalProxy$2 { public: typedef sigc::slot<LIST(R,ARG_TYPE($1))> SlotType; typedef sigc::slot<LIST(void,ARG_TYPE($1))> VoidSlotType; - [SignalProxy]NUM($1)(ObjectBase* obj, const SignalProxyInfo* info) +ifelse($2,Normal,dnl + [SignalProxy]NUM($1)[(ObjectBase* obj, const SignalProxyInfo* info) : SignalProxyNormal(obj, info) {} +],dnl Detailed + [SignalProxyDetailed]NUM($1)[(ObjectBase* obj, const SignalProxyInfo* info, const Glib::ustring& detail_name) + : SignalProxyDetailed(obj, info, detail_name) {} +])dnl /** Connects a signal handler to a signal. * @@ -166,7 +215,7 @@ public: * @param after Whether this signal handler should be called before or after the default signal handler. */ sigc::connection connect(const SlotType& slot, bool after = true) - { return sigc::connection(connect_(slot, after)); } + { return sigc::connection(ifelse($2,Normal,[connect_(slot, after)],[connect_impl_(false, slot, after)])); } /** Connects a signal handler without a return value to a signal. * By default, the signal handler will be called before the default signal handler. @@ -190,20 +239,28 @@ public: * @param after Whether this signal handler should be called before or after the default signal handler. */ sigc::connection connect_notify(const VoidSlotType& slot, bool after = false) - { return sigc::connection(connect_notify_(slot, after)); } + { return sigc::connection(ifelse($2,Normal,[connect_notify_(slot, after)],[connect_impl_(true, slot, after)])); } }; ])dnl - +dnl dnl Template forms of SignalProxy - -GLIB_SIGNAL_PROXY(ARGS(P,0)) -GLIB_SIGNAL_PROXY(ARGS(P,1)) -GLIB_SIGNAL_PROXY(ARGS(P,2)) -GLIB_SIGNAL_PROXY(ARGS(P,3)) -GLIB_SIGNAL_PROXY(ARGS(P,4)) -GLIB_SIGNAL_PROXY(ARGS(P,5)) -GLIB_SIGNAL_PROXY(ARGS(P,6)) - +dnl +GLIB_SIGNAL_PROXY(ARGS(P,0), Normal) +GLIB_SIGNAL_PROXY(ARGS(P,1), Normal) +GLIB_SIGNAL_PROXY(ARGS(P,2), Normal) +GLIB_SIGNAL_PROXY(ARGS(P,3), Normal) +GLIB_SIGNAL_PROXY(ARGS(P,4), Normal) +GLIB_SIGNAL_PROXY(ARGS(P,5), Normal) +GLIB_SIGNAL_PROXY(ARGS(P,6), Normal) +dnl +GLIB_SIGNAL_PROXY(ARGS(P,0), Detailed) +GLIB_SIGNAL_PROXY(ARGS(P,1), Detailed) +GLIB_SIGNAL_PROXY(ARGS(P,2), Detailed) +GLIB_SIGNAL_PROXY(ARGS(P,3), Detailed) +GLIB_SIGNAL_PROXY(ARGS(P,4), Detailed) +GLIB_SIGNAL_PROXY(ARGS(P,5), Detailed) +GLIB_SIGNAL_PROXY(ARGS(P,6), Detailed) +dnl } // namespace Glib #endif /* __header__ */ |