/** @file sample for sigc++ connection management
 *
 * Last CVS checkin:
 * $Date: $
 * $Author: scheff $
 */

/**************************************************************************/

// standard C/C++ header:
#include <iostream>
#include <string>

// Gnome header:
#include <sigc++/sigc++.h>
#include <glibmm/init.h>

using namespace std;

/**************************************************************************/

/// a signal handler
static void onSig(void) { cout << "onSig()" << endl; }

/**************************************************************************/

/** waits for user confirm.
 *
 * @param action text with next action
 */
static void pause(const char *action)
{
  cout << "Press [ENTER] to " << action << ": " << flush;
  string str; getline(cin, str);
}

/** provides the main function of application.
 *
 * @param argc number of command line arguments
 * @param argv pointer to array of pointers to strings with command line
 *        arguments
 * @return 0 ... application exited regularly\n
 *         else ... execution of application aborted
 */
int main(int argc, char *argv[])
{
  Glib::init();
  pause("start");
  {
    sigc::signal<void> sig;
    {
      cout << "1st connection:" << endl;
      sigc::connection connection = sig.connect(sigc::ptr_fun(&onSig));
      cout << "Emit signal:" << endl;
      sig();
      {
	cout << "2nd connection:" << endl;
	sigc::connection connection2 = connection;
	cout << "Emit signal:" << endl;
	sig();
      } cout << "Life time of 2nd connection ended" << endl;
      cout << "Emit signal:" << endl;
      sig();
    } cout << "Life time of 1st connection ended" << endl;
    cout << "Emit signal:" << endl;
    sig();
  }
  pause("continue");
  {
    sigc::signal<void> sig;
    {
      cout << "1st connection:" << endl;
      sigc::connection connection = sig.connect(sigc::ptr_fun(&onSig));
      cout << "Emit signal:" << endl;
      sig();
      {
	cout << "2nd connection:" << endl;
	sigc::connection connection2 = connection;
	cout << "Emit signal:" << endl;
	sig();
	cout << "Disconnect 2nd connection:" << endl;
	connection2.disconnect();
	cout << "Emit signal:" << endl;
	sig();
      } cout << "Life time of 2nd connection ended" << endl;
      cout << "Disconnect 1st connection:" << endl;
      connection.disconnect();
      cout << "Emit signal:" << endl;
      sig();
    } cout << "Life time of 1st connection ended" << endl;
    cout << "Emit signal:" << endl;
    sig();
  }
  // done
  pause("finish");
  return 0;
}


