Programmation GTK/Bonjour tout le monde

Un livre de Wikilivres.
Programmation GTK
Programmation GTK
Programmation GTK
Sommaire
Modifier ce modèle ce sommaire


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