Gestion des GLibs en GTK+

Gestion des GLibs en GTK+ - C - Programmation

Marsh Posté le 05-03-2009 à 18:08:39    

Bonjour les gens,  
 
Je n'arrive pas à gérer les GList sur GTK (en C) et je ne trouve vraiment pas de bon exemple sur le net.
Je me tourne donc vers vous !!
 
En regardant la doc, je me dis : CHOUETTE, il existe une librairie qui me simplifie la vie.
 
En effet les fonctions ont l'air simples à souhait, je me lance donc avec les GList (doublement chainées) ...
 
Bah c'est raté pour la facilité, ca fait 3 heures que je me casse la tête la dessus :)
 
 
Pour être précis, je veux faire une liste chainée de structures, que je passe dans mes callbacks pour modifier mes widgets.
Bref plutot qu'un grand discours, voici de quoi je parle :
 

Code :
  1. typedef struct page{
  2. gint index;
  3. GtkWidget *HugeHbox;
  4. GtkWidget *FiltresVbox, *PicVbox, *ResultVbox;
  5. GtkWidget *OriginalPic, *ResultPic;
  6. GtkWidget *TabLabel;
  7. }page;
  8. GList *pages = NULL;
  9. // Fonction de création de nouvel onglet :
  10. void cb_new (GtkWidget *p_widget, gpointer user_data)
  11. {
  12. // Déclaration des variables :
  13. page *newp = NULL;
  14. apli *app = NULL;
  15. // On récupére l'application :
  16. app = (apli*)malloc(sizeof(apli));
  17. app = user_data;
  18. // On crée une nouvelle page :
  19. newp = (page*)malloc(sizeof(page));
  20. newp->index = 0;
  21. newp->HugeHbox = gtk_hbox_new(TRUE,0);
  22. newp->FiltresVbox = gtk_vbox_new(TRUE,0);
  23. newp->PicVbox = gtk_vbox_new(TRUE,0);
  24. newp->ResultVbox = gtk_vbox_new(TRUE,0);
  25. newp->OriginalPic = gtk_image_new_from_file("Pics/test_image13.jpg" );
  26. newp->ResultPic = gtk_image_new_from_file("Pics/test_image13.jpg" );;
  27. newp->TabLabel = create_label(g_strdup_printf("Doc %d", app->index));
  28. app->index ++;
  29. // On place les éléments dans les box correspondantes :
  30. gtk_box_pack_start(GTK_BOX(newp->PicVbox), newp->OriginalPic, FALSE, FALSE, 0);
  31. gtk_box_pack_start(GTK_BOX(newp->ResultVbox), newp->ResultPic, FALSE, FALSE, 0);
  32. // On empile les boxs :
  33. gtk_box_pack_start(GTK_BOX(newp->HugeHbox), newp->FiltresVbox, FALSE, FALSE, 0);
  34. gtk_box_pack_start(GTK_BOX(newp->HugeHbox), newp->PicVbox, FALSE, FALSE, 0);
  35. gtk_box_pack_start(GTK_BOX(newp->HugeHbox), newp->ResultVbox, FALSE, FALSE, 0);
  36. // On met la hugeHbox dans l'onglet :
  37. newp->index = gtk_notebook_append_page(GTK_NOTEBOOK(app->notebook), newp->HugeHbox, newp->TabLabel);
  38. // On affiche le tout :
  39. gtk_notebook_set_current_page(GTK_NOTEBOOK(app->notebook), newp->index - 1);
  40. gtk_widget_show_all(GTK_WIDGET(app->notebook));
  41. // Ajout de la page au document :
  42. g_list_append(app->pages, newp);
  43. printf("page : %d\n", newp->index);
  44. free(newp);
  45. newp = NULL;
  46. Pause(2);
  47. newp = g_list_nth_data(app->pages, 0);
  48. // C'est la que ca plante (erreur acces memoire)
  49. printf("page : %d\n", newp->index);
  50. }


Message édité par skip78 le 05-03-2009 à 18:10:59
Reply

Marsh Posté le 05-03-2009 à 18:08:39   

Reply

Marsh Posté le 05-03-2009 à 18:51:21    

Bon bah à tout hasard si qqun a le meme probleme, voici ce a coté de quoi je suis passé (fatigué moi hein :D)
Ca se résoud en une ligne ...  :lol:  
 

Code :
  1. app->pages = g_list_append(app->pages, newp);

Reply

Marsh Posté le 05-03-2009 à 22:32:35    

évite de mixer les malloc/free et g_malloc/g_free. Les variantes g_ sont mieux.
 
Sinon c'est quoi ton intérêt de stocker des widgets dans une liste ? je vois pas. Tu prends un notebook et voilà, ça te fait tout ?

Reply

Marsh Posté le 06-03-2009 à 09:50:09    

Taz a écrit :

évite de mixer les malloc/free et g_malloc/g_free. Les variantes g_ sont mieux.
 
Sinon c'est quoi ton intérêt de stocker des widgets dans une liste ? je vois pas. Tu prends un notebook et voilà, ça te fait tout ?


 
Tu veux dire transmettre juste ma box principale dans les callbacks, puis me servir de l'arborescence des widgets pour acceder à tous les éléments contenus dedans ?
Je sais que ca serait plus propre mais :
1/ Je m'y perd
2/ Je vois comment gérer ca avec des containers et des contenus, mais avec les box, c'est du gtk_box_pack_start, je sais pas si ca se traite de la même facon.
 
Si tu connais un peu, tu es ok pour me montrer à quoi ca ressemblerait ?  
 
Merci d'avance,
Skip

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed