Programmation GTK/Théorie des signaux et des rappels
Avant de voir en détail le programme « Bonjour tout le monde », nous parlerons d'abord des événements et des fonctions de rappel. GTK est dirigé par les événements, ce qui signifie qu'il restera inactif dans gtk_main jusqu'à ce qu'un événement survienne et que le contrôle soit passé à la fonction appropriée.
Ce passage du contrôle est réalisé en utilisant le concept de « signal ». Lorsqu'un événement survient, comme l'appui sur un bouton, le signal approprié sera « émis » par le widget qui a été pressé. C'est de cette façon que GTK réalise la plupart de son travail. Pour qu'un bouton réalise une action, on configure un gestionnaire de signal pour capturer ces signaux et appeler la fonction adéquate. Ceci est fait en utilisant une fonction comme :
gint gtk_signal_connect (GtkObject *object,
gchar *name,
GtkSignalFunc func,
gpointer func_data);
Où le premier paramètre est le widget qui émettra le signal, et le deuxième est le nom du signal que l'on souhaite intercepter. Le troisième paramètre est la fonction que l'on veut appeler quand le signal est capturé, et le quatrième sont les données que l'on souhaite passer à cette fonction.
La fonction spécifiée par le troisième paramètre s'appelle une « fonction de rappel » et doit être de la forme :
void callback_func(GtkWidget *widget, gpointer callback_data);
Où le premier paramètre sera un pointeur vers le widget qui a émis le signal, et le second un pointeur vers les données passées par le dernier paramètre de la fonction gtk_signal_connect()
décrite plus haut.
Un autre appel utilisé dans l'exemple « Bonjour tout le monde » est :
gint gtk_signal_connect_object (GtkObject *object,
gchar *name,
GtkSignalFunc func,
GtkObject *slot_object);
gtk_signal_connect_object()
est la même chose que gtk_signal_connect()
sauf que la fonction de rappel utilise un seul paramètre : un pointeur vers un objet GTK. Lorsqu'on utilise cette fonction pour connecter des signaux, le rappel doit être de cette forme :
void callback_func (GtkObject *object);
Où l'objet est d'ordinaire un widget. En général, on ne configure pas de rappels pour gtk_signal_connect_object. D'habitude, ceux-ci sont utilisés pour appeler une fonction GTK acceptant un simple widget ou objet comme paramètre, comme dans notre exemple.
La raison pour laquelle il y a deux fonctions pour connecter les signaux est simplement de permettre aux fonctions de rappel d'avoir un nombre différent de paramètres. De nombreuses fonctions de la bibliothèque GTK n'acceptent qu'un simple pointeur vers un GtkWidget comme paramètre et vous pouvez donc utiliser gtk_signal_connect_object()
pour celles-ci, tandis que pour vos fonctions vous pouvez avoir besoin de fournir plus de données aux fonctions de rappel.