Salut !
Il est vraiment dans l'urgence que tu lise quelques tutorials sur GTK+, en voici:
Les meilleurs cours GTK+ de developpez.com
On ne passe surement pas un callback de cette manière et si tu était un peu expérimenté en C, tu le saurais sans aucun doute !
Lors du passage d'une fonction en paramètre à une autre, on ne passe que son nom histoire de fournir son adresse à la fonction appelante, le dernier paramètre de g_signal_connect est un pointeur générique qui sera transmis à ton callback.
Une chose importante à savoir dans GTK+, si tu veut assigner un callback à un widget, tu dois respecter les arguments du callback, on ne passe pas n'importe quel type de fonction en guise de callback !
Tu peux trouver les signature adéquates sur la ref du langage sur le site officiel et suivant ton widget: GTK+ Reference Manual, il sert à ca également ! Dans chaque lien de widgets, tu trouvera une partie Signals qui te permettra de savoir quels sont les signaux que tel ou tel widget prend en charge. Il va de soi qu'un widget prend également en charge les signaux de ses widgets parent, il faut donc prendre l'habitude de remonter dans la hiérarchie des widgets jusqu'à trouver ce que tu veux.
Bon passons les explication sinon j'arrête plus
Pour ton cas, il faut que tu trouve la signature pour le callback par rapport au signal clicked donc pour cela, tu vas sur la page du GtkButton soit: GtkButton puis, tu recherches la section des signaux et Ho ! Miracle, on trouve le signal clicked !
On peut désormais voir la signature exacte du callback qu'il convient de respecter:
1 2
| void user_function (GtkButton *button,
gpointer user_data) |
On a tout de même une certaine liberté, tu peux donner le nom que tu veux à la fonction ainsi qu'aux noms de chaque paramètre, par exemple:
void fonctiontest (GtkWidget * p_wid, gpointer p_data);
Mais il convient de respecter le type des arguments !
Bon dans ton cas, si tu veux passer plusieurs données au pointeur p_data, il te faut passer par une structure qui contiendra tout ce que tu veux lui transmettre, tu pourras ensuite passer son adresse dans le dernier argument de g_signal_connect.
Exemple:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| /* ... */
typedef struct
{
char * mot1;
char * mot2;
}
_st;
_st st;
/* ... Remplissage de la structure ... */
g_signal_connect (
G_OBJECT (pbutton_integrite), "clicked",
G_CALLBACK (fonctiontest), & st
); |
Petite remarque en passant... On passe NULL au dernier paramètre si on ne veut pas passer de valeur au pointeur p_data et non pas 0 !
Voilà, il te reste plus qu'à récupérer le contenu de p_data depuis ton callback et zouuu !
Wouw !! Fini, j'espère que tu as compris quelque chose
Partager