summaryrefslogtreecommitdiff
path: root/glib/src/signalproxy.h.m4
diff options
context:
space:
mode:
Diffstat (limited to 'glib/src/signalproxy.h.m4')
-rw-r--r--glib/src/signalproxy.h.m4105
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__ */