Signaux des événements X

La classe Widget possède certains signaux spéciaux correspondant aux événements de la fenêtre X sous-jacente. Il possèdent le suffixe _event ; par exemple, Widget::signal_button_pressed_event().

Vous pouvez trouver occasionnellement utile de gérer les événements X quand il y a quelque chose que vous ne pouvez pas réaliser avec les signaux normaux. Gtk::Button, par exemple, ne renvoie pas les coordonnées du pointeur de souris avec le signal clicked, mais en gérant button_pressed_event, vous pouvez obtenir cette information. Les événements X sont également souvent utilisés pour gérer les touches pressées.

Ces signaux se comportent de façon légèrement différente. La valeur renvoyée par le gestionnaire de signal indique si l'événement a été pleinement « géré ». Si la valeur est false, alors gtkmm passe l'événement au gestionnaire de signal suivant. Si la valeur est true, aucun autre gestionnaire de signal n'est appelé.

La gestion des événements X n'affecte pas les autres signaux de l'élément graphique. Si vous gérez button_pressed_event pour Gtk::Button, vous serez encore en mesure de gérer le signal clicked. Ils sont émis (pratiquement) simultanément.

Notez aussi que tous les éléments graphiques ne reçoivent pas tous les événements X par défaut. Pour recevoir des événements X supplémentaires, vous pouvez utiliser Gtk::Widget::set_events() avant d'afficher l'élément graphique ou Gtk::Widget::add_events() après. Toutefois, certains éléments graphiques doivent préalablement avoir été placés dans un élément graphique EventBox. Consultez le chapitre Éléments graphiques sans fenêtre-X.

Voici un exemple simple :

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

Quand la souris est au dessus du bouton et qu'un bouton de souris est pressé, on_button_press() est appelé.

GdkEventButton est une structure contenant les paramètres de l'événement, tels que les coordonnées du pointeur de souris et l'heure où le bouton a été pressé. Les structures GdkEvent sont différentes selon les événements.

B.VI.I. Séquencement des gestionnaires de signaux

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 );

The event is delivered first to the widget the event occurred in. If all signal handlers in that widget return false (indicating that the event has not been handled), then the signal will be propagated to the parent widget and emitted there. This continues all the way up to the top-level widget if no one handles the event.