summaryrefslogtreecommitdiff
path: root/glib/glibmm/main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'glib/glibmm/main.cc')
-rw-r--r--glib/glibmm/main.cc39
1 files changed, 39 insertions, 0 deletions
diff --git a/glib/glibmm/main.cc b/glib/glibmm/main.cc
index f6707b7c..1d9d9152 100644
--- a/glib/glibmm/main.cc
+++ b/glib/glibmm/main.cc
@@ -1064,6 +1064,40 @@ void Source::destroy_notify_callback(void* data)
}
}
+// static
+sigc::connection Source::attach_signal_source(const sigc::slot_base& slot, int priority,
+ GSource* source, GMainContext* context, GSourceFunc callback_func)
+{
+ SourceConnectionNode* const conn_node = new SourceConnectionNode(slot);
+ const sigc::connection connection(*conn_node->get_slot());
+
+ if (priority != G_PRIORITY_DEFAULT)
+ g_source_set_priority(source, priority);
+
+ g_source_set_callback(source, callback_func, conn_node,
+ &SourceConnectionNode::destroy_notify_callback);
+
+ conn_node->install(source);
+ g_source_attach(source, context);
+ g_source_unref(source); // GMainContext holds a reference
+
+ return connection;
+}
+
+// static
+sigc::slot_base* Source::get_slot_from_connection_node(void* data)
+{
+ return static_cast<SourceConnectionNode*>(data)->get_slot();
+}
+
+// static
+sigc::slot_base* Source::get_slot_from_callback_data(void* data)
+{
+ SourceCallbackData* const callback_data = static_cast<SourceCallbackData*>(data);
+ g_return_val_if_fail(callback_data->node != 0, 0);
+ return callback_data->node->get_slot();
+}
+
/**** Glib::TimeoutSource **************************************************/
@@ -1229,6 +1263,11 @@ IOSource::IOSource(const Glib::RefPtr<IOChannel>& channel, IOCondition condition
(GSourceFunc) &glibmm_iosource_callback)
{}
+IOSource::IOSource(GSource* cast_item, GSourceFunc callback_func)
+:
+ Source(cast_item, callback_func)
+{}
+
IOSource::~IOSource()
{}