Skapa dina egna signaler

Nu då du sett signaler och signalhanterare i gtkmm kanske du vill använda samma teknik för att tillåta interaktion mellan dina egna klasser. Det är faktiskt väldigt enkelt genom att direkt använda libsigc++-biblioteket.

This isn't purely a gtkmm or GUI issue. gtkmm uses libsigc++ to implement its proxy wrappers for the GTK signal system, but for new, non-GTK signals, you can create pure C++ signals, using the sigc::signal<> template.

För att exempelvis skapa en signal som skickar 2 parametrar, en bool och en int, deklarerar du bara en sigc::signal, så här:

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:
  using type_signal_something = sigc::signal<void(bool, int)>;
  type_signal_something signal_something();

protected:
  type_signal_something m_signal_something;
};

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

Du kan sedan ansluta till signalen med samma syntax som du använder när du ansluter till gtkmm-signaler. Till exempel,

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