Señales de eventos de X

La clase Widget tiene algunas señales especiales que corresponden a los eventos de X-Window subyacentes. Estas tienen el sufijo _event; por ejemplo, Widget::signal_button_press_event().

You might occasionally find it useful to handle X events when there's something you can't accomplish with normal signals. Gtk::Button, for example, does not send mouse-pointer coordinates with its clicked signal, but you could handle button_press_event if you needed this information. X events are also often used to handle key-presses.

Estas señales se comportan levemente diferentes. El valor que devuelve el gestor de señales indica si ha «manejado» completamente el evento. Si el valor es false, entonces gtkmm pasará el evento al próximo gestor de señales. Si el valor es true, entonces no se necesitará llamar a ningún otro gestor de señales.

Handling an X event doesn't affect the Widget's other signals. If you handle button_press_event for Gtk::Button, you'll still be able to get the clicked signal. They are emitted at (nearly) the same time.

Here's a simple example:

bool on_button_press(GdkEventButton* event);
Gtk::Button button("label");
button.signal_button_press_event().connect( sigc::ptr_fun(&on_button_press) );

Cuando el ratón esté sobre el botón y el botón del ratón se presione, se llamará a on_button_press().

GdkEventButton es una estructura que contiene los parámetros del evento, como las coordenadas del puntero del ratón en el momento en el que se presionó el botón. Hay varios tipos diferentes de estructuras GdkEvent para la variedad de eventos.

B.6.1. Secuencia de los gestores de señales

By default, your signal handlers are called after any previously-connected signal handlers. However, this can be a problem with the X Event signals. For instance, the existing signal handlers, or the default signal handler, might return true to stop other signal handlers from being called. To specify that your signal handler should be called before the other signal handlers, so that it will always be called, you can specify false for the optional after parameter. For instance,

button.signal_button_press_event().connect( sigc::ptr_fun(&on_mywindow_button_press), false );

El evento se entrega primero al widget en el que ocurrió. Si todos los gestores de señales de ese widget devuelven false (indicando que el evento no se ha manejado), entonces la señal se propagará al widget padre y se emitirá allí. Esto continúa hasta el widget de nivel superior si ninguno maneja el evento.