Programmation GTK/Bonjour tout le monde
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;
}