Création de vos propres signaux

Maintenant que nous avons vu les signaux et les gestionnaires de signal dans gtkmm, vous aimeriez peut-être utiliser la même technique pour interagir entre vos propres classes. C'est vraiment très simple en utilisant directement la bibliothèque libsigc++.

Ce n'est pas à proprement parler un problème gtkmm ou d'interface utilisateur. gtkmm utilise libsigc++ pour implémenter ses habillages mandataires du système de signaux GTK+, mais pour des nouveaux signaux non GTK+, vous pouvez créer des signaux C++ purs en utilisant le modèle sigc::signal<>.

For instance, to create a signal that sends 2 parameters, a bool and an int, just declare a sigc::signal, like so:

sigc::signal<void, bool, int> signal_something;

You could just declare that signal as a public member variable, but some people find that distasteful and prefer to make it available via an accessor method, like so:

class Server
{
public:
  //signal accessor:
  typedef sigc::signal<void, bool, int> type_signal_something;
  type_signal_something signal_something();

protected:
  type_signal_something m_signal_something;
};

Server::type_signal_something Server::signal_something()
{
  return m_signal_something;
}

You can then connect to the signal using the same syntax used when connecting to gtkmm signals. For instance,

server.signal_something().connect(
  sigc::mem_fun(client, &Client::on_server_something) );