Programmation GTK2 en Pascal/La gestion des évènements

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche
Programmation GTK2 en Pascal

La programmation des applications avec interface graphique est également nommée programmation événementielle. Contrairement à un programme séquentiel qui traite un ensemble de tâches puis s'arrête, le programme événementiel attend les ordres de l'utilisateur, un clic de souris, la frappe d'une touche, etc. pour exécuter ce qui est demandé et se replace en attente.

Dans un premier temps, lorsque l'utilisateur interagit avec l'application par l'entremise d'un contrôle (un bouton sur lequel on clique, une fenêtre que l'on ferme, etc.), ce dernier émet un signal (par exemple destroy lorsque l'on ferme une fenêtre). Chaque contrôle est associé à un ou plusieurs signaux et permet donc ainsi de programmer toutes les actions possibles.

Ce signal va ensuite être intercepté par une boucle évènementielle qui va vérifier qu'une action spécifique à ce signal et ce contrôle a bien été définie. Si tel est le cas, la fonction associée sera exécutée. Ce type de fonction s'appelle fonction callback en anglais qu'on peut traduire par fonction ou procédure de rappel.

Il faut donc créer une fonction de rappel pour chacun des évènements susceptible d'avoir lieu pendant l'exécution du programme et associer (ou connecter) cette fonction à un signal.

La première étape consiste donc à créer une fonction de rappel. Dans la majorité des cas, une fonction de rappel sera de cette forme :

procedure nom_de_la_fonction(widget : PGtkwidget; data : pgpointer);

Le paramètre widget est le contrôle qui a émis le signal, et data est une donnée supplémentaire qui peut être utilisée.

Ensuite, pour connecter un signal à une fonction de rappel, Gtk+ utilise une fonction de la bibliothèque GLib qui est :

function g_signal_connect(instance : gpointer; detailed_signal : Pgchar; 
  c_handler : TGCallback; data : gpointer) : gulong;

Le premier paramètre instance, correspond au contrôle qui émet le signal. Cependant, la variable demandée par g_signal_connect étant de type gpointer (correspond à pointer du Pascal) et le contrôle de type PGtkWidget, il faut convertir ce dernier pour ne pas provoquer d'erreur lors de la compilation. Pour cela Gtk+ (ou dans ce cas GLib) fournit une fonction de conversion (pGTKOBJECT) qui sera à utiliser à chaque utilisation de cette fonction.

Le second paramètre detailed_signal, est le signal qui doit être intercepté par la boucle évènementielle. Dans ce livre, certains signaux seront utilisés dans les exemples, mais la rubrique « En savoir plus » donnera une liste complète des signaux qui peuvent être émis par un contrôle.

Le troisième paramètre c_handler, définit la fonction de rappel à associer au signal. Cette fois encore, il faudra utiliser une fonction de conversion qui est GTK_SIGNAL_FUNC(@fonction).

Le dernier paramètre data, permet de spécifier une donnée quelconque à laquelle la fonction de rappel peut avoir accès pour effectuer son travail correctement.

Une fois que les signaux sont connectés, il faut lancer la boucle évènementielle en appelant cette fonction :

procedure gtk_main;

Cela aura pour effet de faire entrer Gtk+ dans une boucle infinie qui ne pourra être stoppée que par l'appel de la fonction de fin de boucle qui est :

procedure gtk_main_quit;

Ces fonctions correspondent au minimum nécessaire afin de pouvoir créer une application Gtk+ correcte. D'autres fonctions permettent une utilisation avancée des signaux et de la boucle évènementielle et sont traitées dans le chapitre GSignal du livre.

Un exemple simple de mise en place d'un signal destroy émis par une fenêtre quand elle se ferme, est fournit dans le chapitre GtkWindow.