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

Par défaut, les gestionnaires de signaux sont appelés successivement. Toutefois cela peut conduire à des difficultés avec les signaux des événements X. Par exemple, le gestionnaire de signal existant, ou le gestionnaire par défaut, peut renvoyer une valeur empêchant l'appel des autres gestionnaires de signal. Pour indiquer qu'un gestionnaire de signal doit être appelé avant les autres ou bien appelé dans tous les cas, vous pouvez indiquer false pour le paramètre optionnel after. Par exemple,

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