diff options
Diffstat (limited to 'libs/glibmm2/glibmm/signalproxy.cc')
-rw-r--r-- | libs/glibmm2/glibmm/signalproxy.cc | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/libs/glibmm2/glibmm/signalproxy.cc b/libs/glibmm2/glibmm/signalproxy.cc new file mode 100644 index 0000000000..67f7a9290b --- /dev/null +++ b/libs/glibmm2/glibmm/signalproxy.cc @@ -0,0 +1,105 @@ +// -*- c++ -*- + +/* $Id$ */ + +/* signalproxy.cc + * + * Copyright (C) 2002 The gtkmm Development Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <glib-object.h> +#include <glibmm/exceptionhandler.h> +#include <glibmm/object.h> +#include <glibmm/signalproxy.h> + + +namespace Glib +{ + +// SignalProxyBase implementation: + +SignalProxyBase::SignalProxyBase(Glib::ObjectBase* obj) +: + obj_ (obj) +{} + + +// SignalProxyNormal implementation: + +SignalProxyNormal::SignalProxyNormal(Glib::ObjectBase* obj, const SignalProxyInfo* info) +: + SignalProxyBase (obj), + info_ (info) +{} + +SignalProxyNormal::~SignalProxyNormal() +{} + +sigc::slot_base& +SignalProxyNormal::connect_(const sigc::slot_base& slot, bool after) +{ + return connect_impl_(info_->callback, slot, after); +} + +sigc::slot_base& +SignalProxyNormal::connect_notify_(const sigc::slot_base& slot, bool after) +{ + return connect_impl_(info_->notify_callback, slot, after); +} + +sigc::slot_base& +SignalProxyNormal::connect_impl_(GCallback callback, const sigc::slot_base& slot, bool after) +{ + // create a proxy to hold our connection info + SignalProxyConnectionNode *const pConnectionNode = + new SignalProxyConnectionNode(slot, obj_->gobj()); + + // connect it to glib + // pConnectionNode will be passed in the data argument to the callback. + pConnectionNode->connection_id_ = g_signal_connect_data( + obj_->gobj(), info_->signal_name, callback, pConnectionNode, + &SignalProxyConnectionNode::destroy_notify_handler, + static_cast<GConnectFlags>((after) ? G_CONNECT_AFTER : 0)); + + return pConnectionNode->slot_; +} + +void SignalProxyNormal::emission_stop() +{ + g_signal_stop_emission_by_name(obj_->gobj(), info_->signal_name); +} + +// static +void SignalProxyNormal::slot0_void_callback(GObject* self, void* data) +{ + // Do not try to call a signal on a disassociated wrapper. + if(Glib::ObjectBase::_get_current_wrapper(self)) + { + try + { + if(sigc::slot_base *const slot = data_to_slot(data)) + (*static_cast<sigc::slot<void>*>(slot))(); + } + catch(...) + { + Glib::exception_handlers_invoke(); + } + } +} + +} // namespace Glib + |