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_pressed_event().
Tal vez encuentre útil manejar los eventos de X cuando haya algo que no pueda resolver con señales normales. Gtk::Button, por ejemplo, no envía coordenadas del puntero del ratón con su señal clicked, pero puede manejar button_pressed_event si necesita esta información. Los eventos de X también se usan a menudo para manejar pulsaciones de teclas.
Estas señales se comportan levemente diferentes. El valor que devuelve el manejador de señales indica si ha «manejado» completamente el evento. Si el valor es false, entonces gtkmm pasará el evento al próximo manejador de señales. Si el valor es true, entonces no se necesitará llamar a ningún otro manejador de señales.
Manejar un evento de X no afecta a las otras señales del widget. Si maneja button_pressed_event para Gtk::Button, igualmente podrá obtener la señal clicked. Se emiten (casi) al mismo tiempo.
Tenga también en cuenta que no todos los widgets reciben todos los eventos de X de manera predeterminada. Para recibir eventos de X adicionales, puede usar Gtk::Widget::set_events() antes de mostrar al widget, o Gtk::Widget::add_events() después de haberlo mostrado. Sin embargo, algunos widgets deben ponerse dentro de un widget EventBox primero. Consulte el capítulo Widgets sin X-Windows.
Un ejemplo sencillo:
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 manejadores de señales
De manera predeterminada, sus manejadores de señales se llaman después de cualquier manejador de señales conectado previamente. Sin embargo, esto puede ser un problema con las señales de eventos de X. Por ejemplo, los manejadores de señales existentes, o el manejador de señales predeterminado, podrían devolver true para que no se llamen a otros manejadores. Para especificar que el suyo debe llamarse antes que los otros, y que de esta manera siempre se llame, puede asignar false al parámetro opcional after. Por ejemplo,
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 manejadores 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.