Bonjour à tous !

J'ai un petit souci avec un callback appelé lors de deux événements différents mais ne réagissant pas de la même façon. Le problème vient apparemment de la structure que je passe en argument supplémentaire ("data") qui ne contiendrais rien lors d'un appel, et ce qu'elle devrait lors de l'autre.

Voici donc mes deux fonctions servant à lier le signal au callback :

La première, pour la connexion du signal de déstruction de ma fenêtre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
g_signal_connect( G_OBJECT( pApp->pWindow ), "delete_event", G_CALLBACK( onExit ), (gpointer) pApp );
Avec cet appel au callback onExit, ma structure dont pApp est un pointeur ne contient rien, ou du moins pas ce qu'elle devrait (cf plus bas).

Par contre, lorsque j'utilise la création de menus avec GtkUiManager, je n'ai aucun problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part
gtk_action_group_add_actions( pApp->pActionGroup, menuEntries, G_N_ELEMENTS( menuEntries ), (gpointer) pApp );
voici ma fonction onExit (les différents tests m'ont servi à me rendre compte du problème) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void onExit( GtkWidget *widget, gpointer data ) {
   MainWindow *pApp = (MainWindow*) data;
 
   if ( GTK_IS_WINDOW( pApp->pWindow ) ) {
      /* si pApp->pWindow est bien une GTK_WINDOW, pas de pb */
      printf( "OK (window)\n" );
   }
   else {
      /* sinon, ça veux probablement dire que pApp n'est pas bon */
      fputs( "WW: pApp->pWindow is NOT a GtkWindow\n", stderr );
   }
   if ( GTK_IS_NOTEBOOK( pApp->pNotebook ) ) {
      /* si pApp->pNotebook est bien une GTK_NOTEBOOK, pas de pb */
      printf( "OK (notebook)\n" );
   }
   else {
      /* sinon, ça veux probablement dire que pApp n'est pas bon */
      fputs( "WW: pApp->pNotebook is NOT a GtkNotebook\n", stderr );
   }
 
   /* cette fonction n'est a besoin du paramètre data (pApp), d'où le problème réel */
   onCloseAll( widget, data ); 
 
   gtk_main_quit();
}

  • Si j'appelle cette fonction via le menu de mon application, je n'ai aucun problème ("OK (window)" et "OK (notebook)" s'affichent pour le confirmer) ;
  • Mais par contre, lors de la fermeture de la fenêtre par un "delete_event", pApp->pWindow et pApp->pNotebook ne contienne plus ce qu'ils devraient, et les erreurs s'affichent ("WW: pApp->"...).



Aurais-je fait une erreur dans la connexion du signal "delete_event" ?

Merci d'avance !