Programmation GTK/Un Bonjour tout le monde amélioré


3.3 Un « Bonjour tout le monde » amélioré

Étudions une version légèrement améliorée avec de meilleurs exemples de fonctions de rappel. Ceci permettra aussi d'introduire le sujet suivant : le placement des wigdets.

 #include <gtk/gtk.h>
 
 /* Notre nouveau rappel amélioré. La donnée passée à cette fonction est
  * imprimée sur stdout. */
 
 void rappel (GtkWidget *widget, gpointer *data)
 {
     g_print ("Re-Bonjour - %s a été pressé\n", (char *) data);
 }
 
 /* Un autre rappel */
 
 void delete_event (GtkWidget *widget, GdkEvent *event, gpointer *data)
 {
     gtk_main_quit ();
 }
 
 int main (int argc, char *argv[])
 {
     /* GtkWidget est le type pour déclarer les widgets */
 
     GtkWidget *window;
     GtkWidget *button;
     GtkWidget *box1;
 
     /* Cette fonction est appelée dans toutes les applications GTK. 
      * Les paramètre passés en ligne de commande sont analysés et 
      * retournés à l'application. */
 
     gtk_init (&argc, &argv);
 
     /* Création d'une nouvelle fenêtre. */
 
     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
     /* Nouvel appel qui intitule notre nouvelle fenêtre 
      * "Salut les boutons !" */
 
     gtk_window_set_title (GTK_WINDOW (window), "Salut les boutons !");
 
     /* Configuration d'un gestionnaire pour "delete_event" afin de
      * quitter immédiatement GTK. */
 
     gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                         GTK_SIGNAL_FUNC (delete_event), NULL);
 
 
     /* Configuration de la largeur du contour de la fenêtre. */
     
     gtk_container_border_width (GTK_CONTAINER (window), 10);
 
     /* Création d'une boîte pour y placer les widgets.
      * Ceci est décrit en détails plus loin dans la section 
      * « placement ». La boîte n'est pas matérialisée, elle est juste
      * utilisée comme moyen d'arranger les widgets. */
 
     box1 = gtk_hbox_new(FALSE, 0);
 
     /* On met la boîte dans la fenêtre principale. */
 
     gtk_container_add (GTK_CONTAINER (window), box1);
 
     /* On crée un nouveau bouton portant le label « Bouton 1 ». */
 
     button = gtk_button_new_with_label ("Bouton 1");
 
     /* Lorsque le bouton est cliqué, on appelle la fonction « rappel » 
      * avec un pointeur sur la chaîne « Bouton 1 » comme paramètre. */
 
     gtk_signal_connect (GTK_OBJECT (button), "clicked",
                         GTK_SIGNAL_FUNC (rappel), (gpointer) "Bouton 1");
 
     /* Au lieu d'utiliser gtk_container_add, on place ce bouton dans
      * la boîte invisible qui a été placée dans la fenêtre. */
 
     gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0);
 
     /* N'oubliez jamais cette étape qui indique à GTK que la configuration
      * de ce bouton est terminée et qu'il peut être affiché. */
 
     gtk_widget_show(button);
 
     /* On fait la même chose pour créer un deuxième bouton. */
 
     button = gtk_button_new_with_label ("Bouton 2");
 
     /* On appelle la même fonction de rappel avec un paramètre différent,
      * un pointeur sur la chaîne « Bouton 2 ». */
 
     gtk_signal_connect (GTK_OBJECT (button), "clicked",
                         GTK_SIGNAL_FUNC (rappel), (gpointer) "Bouton 2");
 
     gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0);
 
     /* L'ordre dans lequel on affiche les boutons n'est pas vraiment
      * important, mais il est préférable d'afficher la fenêtre en dernier
      * pour qu'elle surgisse d'un coup. */
 
     gtk_widget_show(button);
 
     gtk_widget_show(box1);
 
     gtk_widget_show (window);
 
     /* Le reste est dans gtk_main et on attend que la fête commence ! */
 
     gtk_main ();
 
     return 0;
 }

Compilez ce programme en utilisant les mêmes paramètres que pour l'exemple précédent. Vous remarquerez que, maintenant, il est plus difficile de quitter le programme&nbsp: vous devez utiliser le gestionnaire de fenêtres ou une commande shell pour le détruire. Un bon exercice pour le lecteur serait d'insérer un troisième bouton « Quitter » qui permettrait de sortir du programme. Vous pouvez aussi jouer avec les options de gtk_box_pack_start() en lisant la section suivante. Essayez de redimensionner la fenêtre, et observez son comportement.

Juste une remarque : il existe une autre constante utilisable avec gtk_window_new() - GTK_WINDOW_DIALOG. Ceci permet d'interagir de façon un peu différente avec le gestionnaire de fenêtres et doit être utilisé pour les fenêtres temporaires comme les boîtes de dialogue, par exemple.