Programmation GTK+/Bonjour tout le monde

Un livre de Wikibooks.

Bon maintenant, écrivons un programme avec un widget (bouton). C'est le classique « Bonjour tout le monde » à la sauce GTK.

    #include <gtk/gtk.h>
 
    /* fonction de rappel. Dans cet exemple, les paramètres sont ignorés...
     *  Les fonctions de rappel sont détaillées plus loin. */
 
    void hello (GtkWidget *widget, gpointer data)
    {
        g_print ("Bonjour tout le monde.\n");
    }
 
    gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
    {
        g_print ("le signal delete_event est survenu.\n");
 
        /* Si l'on renvoit FALSE dans le gestionnaire du signal "delete_event",
         * GTK émettra le signal "destroy". Retourner TRUE signifie que l'on
         * ne veut pas que la fenêtre soit détruite. 
         * Utilisé pour faire apparaître des boîtes de dialogue du type
         * « Êtes-vous sûr de vouloir quitter ? » */
 
        /* Remplacez TRUE par FALSE et la fenêtre principale sera détruite par
         * un signal « delete_event ». */
 
        return TRUE; 
    }
 
    /* Autre fonction de rappel */
    void destroy (GtkWidget *widget, gpointer data)
    {
        gtk_main_quit ();
    }
 
    int main (int argc, char *argv[])
    {
        /* GtkWidget est le type pour déclarer les widgets. */
 
        GtkWidget *window;
        GtkWidget *button;
 
        /* Cette fonction est appelée dans toutes les applications GTK. 
         * Les paramètres 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);
 
        /* Lorsque la fenêtre reçoit le signal "delete_event" 
         * (envoyé par le gestionnaire de fenêtres en utilisant l'option
         * « close » ou la barre de titre), on lui demande d'appeler la
         * fonction delete_event() définie plus haut. La donnée passée en
         * paramètre à la fonction de rappel est NULL et est ignoré dans le
         * rappel. */
 
        gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                            GTK_SIGNAL_FUNC (delete_event), NULL);
 
        /* Ici, on connecte l'évenement "destroy" à un gestionnaire de signal.
         * Cet événement arrive lorsqu'on appelle gtk_widget_destroy() sur la
         * fenêtre, ou si l'on retourne TRUE dans le rappel "delete_event". */
 
        gtk_signal_connect (GTK_OBJECT (window), "destroy",
                            GTK_SIGNAL_FUNC (destroy), NULL);
 
        /* Configuration de la largeur du contour de la fenêtre. */
        gtk_container_border_width (GTK_CONTAINER (window), 10);
 
        /* Création d'un nouveau bouton portant le label 
         * "Bonjour tout le monde". */
 
        button = gtk_button_new_with_label ("Bonjour tout le monde");
 
        /* Quand le bouton recevra le signal "clicked", il appellera la
         * fonction hello() définie plus haut en lui passant NULL en paramètre. */
 
        gtk_signal_connect (GTK_OBJECT (button), "clicked",
                            GTK_SIGNAL_FUNC (hello), NULL);
 
        /* Ceci provoquera la destruction de la fenêtre par appel de la
         * fonction gtk_widget_destroy(window) lors du signal "clicked".  
         * Le signal de destruction pourrait venir de là, ou du 
         * gestionnaire de fenêtres. */
 
        gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                                   GTK_SIGNAL_FUNC (gtk_widget_destroy),
                                   GTK_OBJECT (window));
 
        /* Insertion du bouton dans la fenêtre (container gtk). */
 
        gtk_container_add (GTK_CONTAINER (window), button);
 
        /* L'étape finale consiste à afficher ce nouveau widget... */
 
        gtk_widget_show (button);
 
        /* ... et la fenêtre. */
 
        gtk_widget_show (window);
 
        /* Toutes les applications GTK doivent avoir un gtk_main(). 
         * Le déroulement du programme se termine là et attend qu'un
         * événement survienne (touche pressée ou événement souris). */
 
        gtk_main ();
 
        return 0;
    }