ekiga r6231 - in trunk: . lib/engine/protocol/skel src/endpoints src/gui



Author: dsandras
Date: Sun Apr 27 13:17:38 2008
New Revision: 6231
URL: http://svn.gnome.org/viewvc/ekiga?rev=6231&view=rev

Log:
Moved more stuff from the GMManager to the CallManager's.
Added signal in the call manager for message waiting indications.
Most protocols support MWIs. If they do not support it, then the
signal is not emitted.


Modified:
   trunk/ChangeLog
   trunk/lib/engine/protocol/skel/call-core.cpp
   trunk/lib/engine/protocol/skel/call-core.h
   trunk/lib/engine/protocol/skel/call-manager.h
   trunk/src/endpoints/manager.cpp
   trunk/src/endpoints/manager.h
   trunk/src/endpoints/opal-call.cpp
   trunk/src/endpoints/sip.cpp
   trunk/src/endpoints/sip.h
   trunk/src/gui/main.cpp

Modified: trunk/lib/engine/protocol/skel/call-core.cpp
==============================================================================
--- trunk/lib/engine/protocol/skel/call-core.cpp	(original)
+++ trunk/lib/engine/protocol/skel/call-core.cpp	Sun Apr 27 13:17:38 2008
@@ -56,6 +56,8 @@
   manager.im_received.connect (sigc::bind (sigc::mem_fun (this, &CallCore::on_im_received), &manager));
   manager.im_sent.connect (sigc::bind (sigc::mem_fun (this, &CallCore::on_im_sent), &manager));
   manager.new_chat.connect (sigc::bind (sigc::mem_fun (this, &CallCore::on_new_chat), &manager));
+
+  manager.mwi_event.connect (sigc::bind (sigc::mem_fun (this, &CallCore::on_mwi_event), &manager));
 }
 
 
@@ -214,3 +216,9 @@
 {
   new_chat.emit (*manager, display_name, uri);
 }
+
+
+void CallCore::on_mwi_event (std::string account, std::string info, CallManager *manager)
+{
+  mwi_event.emit (*manager, account, info);
+}

Modified: trunk/lib/engine/protocol/skel/call-core.h
==============================================================================
--- trunk/lib/engine/protocol/skel/call-core.h	(original)
+++ trunk/lib/engine/protocol/skel/call-core.h	Sun Apr 27 13:17:38 2008
@@ -162,12 +162,18 @@
       bool send_message (const std::string uri, 
                          const std::string message);
 
+      /** See call-manager.h for API 
+       */
       sigc::signal<void, CallManager &, std::string, std::string> im_failed;
       sigc::signal<void, CallManager &, std::string, std::string, std::string> im_received;
       sigc::signal<void, CallManager &, std::string, std::string> im_sent;
       sigc::signal<void, CallManager &, std::string, std::string> new_chat;
 
 
+      /*** MWI ***/
+      sigc::signal<void, CallManager &, std::string, std::string> mwi_event;
+
+
       /*** Accounts ***/
       /* TODO should move out of here */
       typedef enum { Processing, Registered, Unregistered, RegistrationFailed, UnregistrationFailed } RegistrationState;
@@ -192,6 +198,8 @@
       void on_im_received (std::string, std::string, std::string, CallManager *manager);
       void on_new_chat (std::string, std::string, CallManager *manager);
 
+      void on_mwi_event (std::string, std::string, CallManager *manager);
+
       std::set<CallManager *> managers;
     };
 

Modified: trunk/lib/engine/protocol/skel/call-manager.h
==============================================================================
--- trunk/lib/engine/protocol/skel/call-manager.h	(original)
+++ trunk/lib/engine/protocol/skel/call-manager.h	Sun Apr 27 13:17:38 2008
@@ -155,6 +155,16 @@
       sigc::signal<void, std::string, std::string> new_chat;
 
 
+      /*
+       * MESSAGE WAITING INDICATION
+       */
+
+      /** This signal is emitted when a chat conversation should be initiated
+       * @param: account is the voicemail account
+       *         mwi is the message waiting indication
+       */
+      sigc::signal<void, std::string, std::string> mwi_event;
+
   private :
       std::string uri_type;
     };

Modified: trunk/src/endpoints/manager.cpp
==============================================================================
--- trunk/src/endpoints/manager.cpp	(original)
+++ trunk/src/endpoints/manager.cpp	Sun Apr 27 13:17:38 2008
@@ -27,8 +27,8 @@
 
 
 /*
- *                         endpoint.cpp  -  description
- *                         ----------------------------
+ *                         manager.cpp  -  description
+ *                         ---------------------------
  *   begin                : Sat Dec 23 2000
  *   copyright            : (C) 2000-2006 by Damien Sandras
  *   description          : This file contains the Endpoint class.
@@ -39,38 +39,17 @@
 #include "config.h"
 
 #include "manager.h"
+
 #include "h323.h"
 #include "sip.h"
-
-#include "ekiga.h"
-#include "misc.h"
-#include "main.h"
-
-#include "gmconf.h"
+#include "pcss.h"
 
 #include "call-core.h"
 #include "opal-gmconf-bridge.h"
 #include "opal-call.h"
 #include "opal-codec-description.h"
-#include "pcss.h"
-
 #include "vidinput-info.h"
 
-#include <opal/transcoders.h>
-#include <ptclib/http.h>
-#include <ptclib/html.h>
-#include <ptclib/pstun.h>
-
-#include <math.h>
-
-#define new PNEW
-
-
-extern "C" {
-  unsigned char linear2ulaw(int pcm_val);
-  int ulaw2linear(unsigned char u_val);
-};
-
 
 static  bool same_codec_desc (Ekiga::CodecDescription a, Ekiga::CodecDescription b)
 { 
@@ -104,24 +83,24 @@
 };
 
 
+// FIXME: we shouldnt call sound events here but signal to the frontend which then triggers them
+
 /* The class */
 GMManager::GMManager (Ekiga::ServiceCore & _core)
 : core (_core), 
   runtime (*(dynamic_cast<Ekiga::Runtime *> (core.get ("runtime")))),
   audiooutput_core (*(dynamic_cast<Ekiga::AudioOutputCore *> (_core.get ("audiooutput-core")))) 
-  //FIXME: we shouldnt call sound events here but signal to the frontend which then triggers them
 {
   /* Initialise the endpoint paramaters */
-  gk = NULL;
-  sc = NULL;
-
   PIPSocket::SetDefaultIpAddressFamilyV4();
+  autoStartTransmitVideo = autoStartReceiveVideo = true;
   
   manager = NULL;
 
   h323EP = NULL;
   sipEP = NULL;
   pcssEP = NULL;
+  sc = NULL;
 
   // Create video devices
   PVideoDevice::OpenArgs video = GetVideoOutputDevice();
@@ -148,13 +127,6 @@
   pcssEP->SetSoundChannelRecordDevice("EKIGA");
   AddRouteEntry("h323:.* = pc:<db>");
   AddRouteEntry("sip:.* = pc:<db>");
-  
-  autoStartTransmitVideo = autoStartReceiveVideo = true;
-
-  // Set ports
-  unsigned a, b, c, d, e, f = 0;
-  get_port_ranges (a, b, c, d, e, f);
-  set_port_ranges (a, b, c, d, e, f);
 
   // Media formats
   SetMediaFormatOrder (PStringArray ());
@@ -170,7 +142,9 @@
 
 GMManager::~GMManager ()
 {
-  Exit ();
+  ClearAllCalls (OpalConnection::EndedByLocalUser, TRUE);
+  RemoveAccountsEndpoint ();
+  RemoveSTUNClient ();
 
   delete bridge;
 }
@@ -198,7 +172,6 @@
   return false;
 }
 
-
 void GMManager::set_fullname (const std::string name)
 {
   SetDefaultDisplayName (name.c_str ());
@@ -213,15 +186,6 @@
   return (const char*) GetDefaultDisplayName ();
 }
 
-
-void GMManager::get_jitter_buffer_size (unsigned & min_val,
-                                        unsigned & max_val)
-{
-  min_val = gm_conf_get_int (AUDIO_CODECS_KEY "minimum_jitter_buffer");
-  max_val = gm_conf_get_int (AUDIO_CODECS_KEY "maximum_jitter_buffer");
-}
-
-
 void GMManager::set_jitter_buffer_size (unsigned min_val,
                                         unsigned max_val)
 {
@@ -255,13 +219,13 @@
   }
 }
 
-
-bool GMManager::get_echo_cancelation ()
+void GMManager::get_jitter_buffer_size (unsigned & min_val,
+                                        unsigned & max_val)
 {
-  return gm_conf_get_bool (AUDIO_CODECS_KEY "enable_silence_detection");
+  min_val = GetMinAudioJitterDelay (); 
+  max_val = GetMaxAudioJitterDelay (); 
 }
 
-
 void GMManager::set_echo_cancelation (bool enabled)
 {
   OpalEchoCanceler::Params ec;
@@ -295,17 +259,13 @@
   }
 }
 
-
-bool GMManager::get_silence_detection ()
+bool GMManager::get_echo_cancelation ()
 {
-  OpalSilenceDetector::Params sd;
+  OpalEchoCanceler::Params ec = GetEchoCancelParams ();
 
-  sd = GetSilenceDetectParams ();
-
-  return (sd.m_mode != OpalSilenceDetector::NoSilenceDetection);
+  return (ec.m_mode == OpalEchoCanceler::Cancelation); 
 }
 
-
 void GMManager::set_silence_detection (bool enabled)
 {
   OpalSilenceDetector::Params sd;
@@ -339,69 +299,36 @@
   }
 }
 
+bool GMManager::get_silence_detection ()
+{
+  OpalSilenceDetector::Params sd;
 
-void GMManager::get_port_ranges (unsigned & min_udp_port, 
-                                 unsigned & max_udp_port,
-                                 unsigned & min_tcp_port, 
-                                 unsigned & max_tcp_port,
-                                 unsigned & min_rtp_port, 
-                                 unsigned & max_rtp_port)
-{
-  std::string key [3] = { 
-    PORTS_KEY "udp_port_range",
-    PORTS_KEY "rtp_port_range",
-    PORTS_KEY "tcp_port_range"
-  };
-
-  gchar *port_range = NULL;
-  gchar **couple = NULL;
-
-  for (int i = 0;
-       i < 3;
-       i++) {
-
-    port_range = gm_conf_get_string (key [i].c_str ());
-    if (port_range) {
-
-      couple = g_strsplit (port_range, ":", 2);
-
-      if (i == 0) {
-
-        min_udp_port = atoi (couple [0]);
-        max_udp_port = atoi (couple [1]);
-      }
-      else if (i == 1) {
-
-        min_tcp_port = atoi (couple [0]);
-        max_tcp_port = atoi (couple [1]);
-      }
-      else {
-
-        min_rtp_port = atoi (couple [0]);
-        max_rtp_port = atoi (couple [1]);
-      }
-    }
+  sd = GetSilenceDetectParams ();
 
-    g_free (port_range);
-    g_strfreev (couple);
-    port_range = NULL;
-    couple = NULL;
-  }
+  return (sd.m_mode != OpalSilenceDetector::NoSilenceDetection);
 }
 
-
 void GMManager::set_port_ranges (unsigned min_udp_port, 
                                  unsigned max_udp_port,
                                  unsigned min_tcp_port, 
-                                 unsigned max_tcp_port,
-                                 unsigned min_rtp_port, 
-                                 unsigned max_rtp_port)
+                                 unsigned max_tcp_port)
 {
   SetTCPPorts (min_tcp_port, max_tcp_port);
-  SetRtpIpPorts (min_rtp_port, max_rtp_port);
+  SetRtpIpPorts (min_udp_port, max_udp_port);
   SetUDPPorts (min_udp_port, max_udp_port);
 }
 
+void GMManager::get_port_ranges (unsigned & min_udp_port, 
+                                 unsigned & max_udp_port,
+                                 unsigned & min_tcp_port, 
+                                 unsigned & max_tcp_port)
+{
+  min_udp_port = GetUDPPortBase ();
+  max_udp_port = GetUDPPortMax ();
+
+  min_tcp_port = GetTCPPortBase ();
+  max_tcp_port = GetTCPPortMax ();
+}
 
 void GMManager::set_video_options (const GMManager::VideoOptions & options)
 {
@@ -522,17 +449,6 @@
 }
 
 
-void
-GMManager::Exit ()
-{
-  ClearAllCalls (OpalConnection::EndedByLocalUser, TRUE);
-
-  RemoveAccountsEndpoint ();
-
-  RemoveSTUNClient ();
-}
-
-
 Ekiga::CodecList GMManager::get_codecs ()
 {
   return codecs;
@@ -589,7 +505,6 @@
   // 
   // Update OPAL
   //
-
   Ekiga::CodecList::iterator codecs_it;
   for (codecs_it = codecs.begin () ;
        codecs_it != codecs.end () ;
@@ -715,38 +630,6 @@
 }
 
 
-void 
-GMManager::OnEstablished (OpalConnection &connection)
-{
-  RTP_Session *audio_session = NULL;
-  RTP_Session *video_session = NULL;
-
-  /* Do nothing for the PCSS connection */
-  if (PIsDescendant(&connection, OpalPCSSConnection)) {
-    
-    PTRACE (3, "GMManager\t Will establish the connection");
-    OpalManager::OnEstablished (connection);
-    return;
-  }
-
-  if (PIsDescendant(&connection, OpalRTPConnection)) {
-
-    audio_session = PDownCast (OpalRTPConnection, &connection)->GetSession (OpalMediaFormat::DefaultAudioSessionID);
-    video_session = PDownCast (OpalRTPConnection, &connection)->GetSession (OpalMediaFormat::DefaultVideoSessionID);
-    if (audio_session) {
-      audio_session->SetIgnorePayloadTypeChanges (TRUE);
-    }
-
-    if (video_session) {
-      video_session->SetIgnorePayloadTypeChanges (TRUE);
-    }
-  }
-  
-  PTRACE (3, "GMManager\t Will establish the connection");
-  OpalManager::OnEstablished (connection);
-}
-
-
 void
 GMManager::OnClosedMediaStream (const OpalMediaStream & stream)
 {
@@ -772,60 +655,6 @@
   return TRUE;
 }
 
-
-void
-GMManager::OnMWIReceived (const PString & account,
-                          const PString & mwi)
-{
-  PINDEX i = 0;
-  PINDEX j = 0;
-  int total = 0;
-
-  PString key;
-  PString val;
-  PString *value = NULL;
-  
-  PWaitAndSignal m(mwi_access_mutex);
-
-  /* Add MWI information for given account */
-  value = mwiData.GetAt (key);
-
-  /* Something changed for that account */
-  if (value && *value != mwi) {
-    mwiData.SetAt (account, new PString (mwi));
-
-    /* Compute the total number of new voice mails */
-    while (i < mwiData.GetSize ()) {
-
-      value = NULL;
-      key = mwiData.GetKeyAt (i);
-      value = mwiData.GetAt (key);
-      if (value) {
-
-        val = *value;
-        j = val.Find ("/");
-        if (j != P_MAX_INDEX)
-          val = value->Left (j);
-        else 
-          val = *value;
-
-        total += val.AsInteger ();
-      }
-      i++;
-    }
-
-    runtime.run_in_main (sigc::bind (mwi_event.make_slot (), 
-                                      (const char *) account, 
-                                      (const char *) mwi,
-                                      total));
-
-    /* Sound event if new voice mail */
-    audiooutput_core.play_event("new_voicemail_sound");
-
-  }
-}
-
-
 void
 GMManager::OnRegistered (const PString & aor,
                          bool wasRegistering)

Modified: trunk/src/endpoints/manager.h
==============================================================================
--- trunk/src/endpoints/manager.h	(original)
+++ trunk/src/endpoints/manager.h	Sun Apr 27 13:17:38 2008
@@ -68,10 +68,6 @@
 class GMSIPEndpoint;
 class GMPCSSEndpoint;
 
-
-PDICTIONARY (mwiDict, PString, PString);
-
-
 /**
  * COMMON NOTICE: The Endpoint must be initialized with Init after its
  * creation.
@@ -111,29 +107,29 @@
   const std::string get_description () const
     { return "\tObject bringing in Opal support (calls, text messaging, sip, h323, ...)"; }
 
-  void get_jitter_buffer_size (unsigned & min_val,
-                               unsigned & max_val);
   void set_jitter_buffer_size (unsigned min_val,
                                unsigned max_val);
+  
+  void get_jitter_buffer_size (unsigned & min_val,
+                               unsigned & max_val);
 
-  bool get_silence_detection ();
   void set_silence_detection (bool enabled);
 
-  bool get_echo_cancelation ();
+  bool get_silence_detection ();
+
   void set_echo_cancelation (bool enabled);
+  
+  bool get_echo_cancelation ();
 
-  void get_port_ranges (unsigned & min_udp_port, 
-                        unsigned & max_udp_port,
-                        unsigned & min_tcp_port, 
-                        unsigned & max_tcp_port,
-                        unsigned & min_rtp_port, 
-                        unsigned & max_rtp_port);
   void set_port_ranges (unsigned min_udp_port, 
                         unsigned max_udp_port,
                         unsigned min_tcp_port, 
-                        unsigned max_tcp_port,
-                        unsigned min_rtp_port, 
-                        unsigned max_rtp_port);
+                        unsigned max_tcp_port);
+
+  void get_port_ranges (unsigned & min_udp_port, 
+                        unsigned & max_udp_port,
+                        unsigned & min_tcp_port, 
+                        unsigned & max_tcp_port);
 
   struct VideoOptions 
     {
@@ -163,26 +159,8 @@
   void set_fullname (const std::string name);
   const std::string get_fullname () const;
 
-  
-  /* DESCRIPTION  :  /
-   * BEHAVIOR     :  Prepare the endpoint to exit by removing all
-   * 		     associated threads and components.
-   * PRE          :  /
-   */
-  void Exit ();
-
   OpalCall *CreateCall ();
 
-  
-  /* DESCRIPTION  :  This callback is called when the connection is 
-   *                 established and everything is ok.
-   * BEHAVIOR     :  Sets the proper values for the current connection 
-   *                 parameters and updates the GUI.
-   *                 Notice there are 2 connections for each call.
-   * PRE          :  /
-   */
-  void OnEstablished (OpalConnection &);
-
 
   /** Return the list of available codecs
    * @return a set of the codecs and their descriptions
@@ -282,16 +260,7 @@
   virtual void OnClosedMediaStream (const OpalMediaStream &);
 
 
-  sigc::signal<void, std::string, std::string, unsigned int> mwi_event;
-
- private:
-
-  
  protected:
-  
-  
-  void OnMWIReceived (const PString & account, 
-                      const PString & mwi);
 
   void OnRegistering (const PString & aor,
                       bool isRegistering);
@@ -306,9 +275,6 @@
  private:
   void GetAllowedFormats (OpalMediaFormatList & full_list);
 
-  /* MWI */
-  mwiDict mwiData;
-
   /* Different channels */
   bool is_transmitting_video;
   bool is_transmitting_audio;
@@ -324,7 +290,6 @@
 
   /* The various components of the endpoint */
   GMAccountsEndpoint *manager;
-  GMH323Gatekeeper *gk;
   GMStunClient *sc;
 
 
@@ -333,7 +298,6 @@
   PMutex vg_access_mutex;
   PMutex tct_access_mutex;
   PMutex lid_access_mutex;
-  PMutex mwi_access_mutex;
   PMutex rc_access_mutex;
   PMutex manager_access_mutex;
   PMutex sc_mutex;

Modified: trunk/src/endpoints/opal-call.cpp
==============================================================================
--- trunk/src/endpoints/opal-call.cpp	(original)
+++ trunk/src/endpoints/opal-call.cpp	Sun Apr 27 13:17:38 2008
@@ -44,6 +44,7 @@
 #include <ptlib.h>
 
 #include <opal/manager.h>
+#include <opal/rtpconn.h>
 #include <opal/pcss.h>
 
 #include "config.h"
@@ -289,6 +290,17 @@
     runtime.run_in_main (established.make_slot ());
   }
 
+  if (PIsDescendant(&connection, OpalRTPConnection)) {
+
+    RTP_Session *audio_session = PDownCast (OpalRTPConnection, &connection)->GetSession (OpalMediaFormat::DefaultAudioSessionID);
+    RTP_Session *video_session = PDownCast (OpalRTPConnection, &connection)->GetSession (OpalMediaFormat::DefaultVideoSessionID);
+    if (audio_session)
+      audio_session->SetIgnorePayloadTypeChanges (TRUE);
+
+    if (video_session)
+      video_session->SetIgnorePayloadTypeChanges (TRUE);
+  }
+  
   return OpalCall::OnEstablished (connection);
 }
 
@@ -436,7 +448,9 @@
 }
 
 
-void Opal::Call::OnHold (OpalConnection & connection, bool from_remote, bool on_hold)
+void Opal::Call::OnHold (OpalConnection & /*connection*/, 
+                         bool /*from_remote*/, 
+                         bool on_hold)
 {
   if (on_hold)
     runtime.run_in_main (held.make_slot ());

Modified: trunk/src/endpoints/sip.cpp
==============================================================================
--- trunk/src/endpoints/sip.cpp	(original)
+++ trunk/src/endpoints/sip.cpp	Sun Apr 27 13:17:38 2008
@@ -768,11 +768,13 @@
 
 
 void 
-GMSIPEndpoint::OnMWIReceived (const PString & to,
+GMSIPEndpoint::OnMWIReceived (const PString & account,
                               G_GNUC_UNUSED SIPSubscribe::MWIType type,
                               const PString & msgs)
 {
-  endpoint.OnMWIReceived (to, msgs);
+  runtime.run_in_main (sigc::bind (mwi_event.make_slot (), 
+                                   (const char *) account, 
+                                   (const char *) msgs));
 }
 
 
@@ -804,9 +806,6 @@
     std::string message_uri = (const char *) uri.AsString ();
     std::string message = (const char *) pdu.GetEntityBody ();
 
-    // FIXME should be a signal
-    //audiooutput_core.play_event("new_message_sound");
-
     runtime.run_in_main (sigc::bind (im_received.make_slot (), display_name, message_uri, message));
   }
 }

Modified: trunk/src/endpoints/sip.h
==============================================================================
--- trunk/src/endpoints/sip.h	(original)
+++ trunk/src/endpoints/sip.h	Sun Apr 27 13:17:38 2008
@@ -51,10 +51,8 @@
 
 PDICTIONARY (msgDict, PString, PString);
 
-
 class Ekiga::PersonalDetails;
 
-
 class GMSIPEndpoint 
 :   public SIPEndPoint, 
     public Ekiga::PresenceFetcher,
@@ -242,11 +240,11 @@
                    std::string uri);
 
 
-  GMManager & endpoint;
-
   PMutex msgDataMutex;
   msgDict msgData;
 
+  GMManager & endpoint;
+
   std::list<std::string> subscribed_uris;    // List of subscribed uris
   std::list<std::string> domains; // List of registered domains
   std::list<std::string> aors;     // List of registered aor

Modified: trunk/src/gui/main.cpp
==============================================================================
--- trunk/src/gui/main.cpp	(original)
+++ trunk/src/gui/main.cpp	Sun Apr 27 13:17:38 2008
@@ -565,9 +565,9 @@
 /* 
  * Engine Callbacks 
  */
-static void on_mwi_event_cb (G_GNUC_UNUSED std::string account,
+static void on_mwi_event_cb (G_GNUC_UNUSED Ekiga::CallManager & manager,
+                             G_GNUC_UNUSED std::string account,
                              G_GNUC_UNUSED std::string mwi,
-                             unsigned int total,
                              gpointer self)
 {
   GmMainWindow *mw = NULL;
@@ -576,8 +576,6 @@
   mw = gm_mw_get_mw (GTK_WIDGET (self));
   g_return_if_fail (mw != NULL);
 
-  mw->total_mwi = total;
-
   gm_main_window_push_message (GTK_WIDGET (self),
                                mw->missed_calls,
                                mw->total_mwi);
@@ -3871,10 +3869,6 @@
                       (gpointer) g_new0 (GmIdleTime, 1), 
                       (GDestroyNotify) g_free);
 
-  /* Engine Signals callbacks */
-  conn = ep->mwi_event.connect (sigc::bind (sigc::ptr_fun (on_mwi_event_cb), (gpointer) window));
-  mw->connections.push_back (conn);
-
   /* New Display Engine signals */
   Ekiga::DisplayCore *display_core = dynamic_cast<Ekiga::DisplayCore *> (mw->core.get ("display-core"));
 
@@ -3932,6 +3926,10 @@
   /* New Call Engine signals */
   Ekiga::CallCore *call_core = dynamic_cast<Ekiga::CallCore *> (mw->core.get ("call-core"));
 
+  /* Engine Signals callbacks */
+  conn = call_core->mwi_event.connect (sigc::bind (sigc::ptr_fun (on_mwi_event_cb), (gpointer) window));
+  mw->connections.push_back (conn);
+
   conn = call_core->registration_event.connect (sigc::bind (sigc::ptr_fun (on_registration_event_cb), (gpointer) window));
   mw->connections.push_back (conn);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]