Aller au contenu

Programmation GTK/Bonjour tout le monde

Un livre de Wikilivres.


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