diff options
Diffstat (limited to 'glib/glibmm/main.cc')
-rw-r--r-- | glib/glibmm/main.cc | 39 |
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() {} |