OSC is now driven by an event loop; fix up lifetime mgmt of Glib::Source to workaroun...
[ardour.git] / libs / pbd / pbd / shiva.h
index 53b613ea2b0cc14e1f66e1a096a477d31145b5f6..90adad62508a896d2bc41a7f2bbfa230fbdababb 100644 (file)
@@ -1,3 +1,22 @@
+/*
+    Copyright (C) 2000-2007 Paul Davis 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program 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 General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
 #ifndef __pbd_shiva_h__
 #define __pbd_shiva_h__
 
@@ -8,7 +27,8 @@ namespace PBD {
 /* named after the Hindu god Shiva, The Destroyer */
 
 template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed>
-class Shiva {
+class Shiva : public sigc::trackable 
+{
   public:
        Shiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver) {
 
@@ -39,15 +59,15 @@ class Shiva {
 };
 
 template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed>
-class ProxyShiva {
+class ProxyShiva : public sigc::trackable 
+{
   public:
        ProxyShiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver, void (*callback)(ObjectToBeDestroyed*, ObjectWithGoingAway*)) {
-
+               
                /* if the emitter goes away, destroy the receiver */
 
                _callback = callback;
-               _callback_argument1 = &receiver;
-               _callback_argument2 = &emitter;
+               _callback_argument = &emitter;
 
                _connection = emitter.GoingAway.connect 
                        (sigc::bind (sigc::mem_fun 
@@ -55,19 +75,18 @@ class ProxyShiva {
                                     &receiver));
        }
 
-       ~ProxyShiva() { 
+       ~ProxyShiva () {
                forget ();
        }
 
   private:
        sigc::connection _connection;
        void (*_callback) (ObjectToBeDestroyed*, ObjectWithGoingAway*);
-       ObjectToBeDestroyed* _callback_argument1;
-       ObjectWithGoingAway* _callback_argument2;
+       ObjectWithGoingAway* _callback_argument;
 
        void destroy (ObjectToBeDestroyed* obj) {
                /* callback must destroy obj if appropriate, not done here */
-               _callback (obj, _callback_argument2);
+               _callback (obj, _callback_argument);
                forget ();
        }
 
@@ -77,7 +96,8 @@ class ProxyShiva {
 };
 
 template<typename ObjectWithGoingAway, typename ObjectToBeDestroyed>
-class PairedShiva {
+class PairedShiva : public sigc::trackable 
+{
   public:
        PairedShiva (ObjectWithGoingAway& emitter, ObjectToBeDestroyed& receiver) {