Chapter 3. Writing your own signals
Prev |  | Next

# Chapter 3. Writing your own signals

## Quick recap

If all you want to do is use gtkmm, and connect your functionality to its signals, you can probably stop reading here.

You might benefit from reading on anyway though, as this section is going to be quite simple, and the 'Rebinding' technique from the next section is occasionally useful.

We've already covered the way the types of signals are made up, but lets recap:

A signal is an instance of a template, named `sigc::signal`. The template arguments are the types, in the order they appear in the function signature that can be connected to that signal; that is the return type, then the argument types in parentheses.

To provide a signal for people to connect to, you must make available an instance of that `sigc::signal`. In `AlienDetector` this was done with a public data member. That's not considered good practice usually, so you might want to consider making a member function that returns the signal by reference. (This is what gtkmm does.)

Once you've done this, all you have to do is emit the signal when you're ready. Look at the code for `AlienDetector::run()`:

    void AlienDetector::run()
    {
        sleep(3); // wait for aliens
        signal_detected.emit(); // panic!
    }

As a shortcut, `sigc::signal` defines `operator()` as a synonym for `emit()`, so you could just write `signal_detected();` as in the second example version:

    void AlienDetector::run()
    {
        sleep(3);                // wait for aliens
        signal_detected("the carpark"); // this is the std::string version, looks like
                                 // they landed in the carpark after all.
    }

Prev |  | Next
Disconnecting | Home | What about return values?