Newsgroup: it.comp.lang.c
Titolo: Combo box con le gtk+ 2

Ciao NG!
Sto lavorando con le gtk+ 2 su piattaforma windows. Ho creato con Glade
la mia interfaccia e ora sto aggiungendo il mio codice. Ho delle difficoltà
ad ottenere il testo digitato contenuto in un combobox. Questo è il codice
(dal file callbacks.c, creato da Glade):
1       void
2       on_bt_ok_clicked                       (GtkButton       *button,
3                                               gpointer         user_data)
4      {
5           GtkWidget *entry1 = lookup_widget(GTK_WIDGET(button), "committente");
6           gchar *committente = gtk_entry_get_text(GTK_ENTRY(entry1));
[...]
7           GtkWidget *entry4 = lookup_widget(GTK_WIDGET(button), "comune_combo");
8           gchar *comune_combo = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO (entry4)->entry));
[...]
9      }
Questo codice viene eseguito alla pressione di un bottone.
lookup_widget() è una funzione fornita da Glade, che ritorna il
puntatore a un widget, passando il nome del widget.
Nelle linee 5-6 recupero l'input di un campo testo e fin qui funziona.
Nelle linee 7-8 provo a fare la stessa cosa con un combo box. La
compilazione va a buon fine e posso eseguire il programma, ma quando
clicco il bottone ottengo un errore: "Gtk-CRIRTICAL **: file gtkentry.c:
line 3437 <gtk_entry_get_text>: assertion 'GTK_IS_ENTRY <entry>' failed"
Ho trovato il codice sul tutorial ufficiale delle gtk, per cui credo
che sia corretto. Qualcuno ha idea di perchè non funzoni?
Ciao e grazie, Gio

 che sia corretto. Qualcuno ha idea di perchè non funzoni?
Penso di si: dato che le GTK si sono leggermente alterate perché hai
tentato di far passare un puntatore a qualcosa per un oggetto di tipo
GTK_TYPE_ENTRY, sei sicuro che il lookup_widget della linea 7 ritorni il
tipo giusto?
Prova a fare:
  entry4 = lookup_widget (button, "comune_combo");
  g_assert (GTK_IS_COMBO (entry4));
E vedere che succede.
Ciao,
 Emmanuele.
-- 
Emmanuele Bassi (Zefram)                 [ 
http://www.emmanuelebassi.net
 ]
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4

   g_assert (GTK_IS_COMBO (entry4));
Mi dà sempre lo stesso errore...

 Mi dà sempre lo stesso errore...
Si, ma dove? Nel senso: adesso fallisce sull'assert o no?
Nel caso, aggiungi sotto prima dell'assert:
	fprintf (stderr, "entry4.type: %s\n", g_type_name (entry4));
E leggi il tipo ritornato.


 Si, ma dove? Nel senso: adesso fallisce sull'assert o no?
No, sull'assert passa liscio.
Ho fatto delle prove:
- Se uso questa espressione:
gchar *comune_combo = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO (entry4)->entry));
posso compilare, ma non c'è vero di ottenere il contenuto del combo.
- Se uso quest'altra espressione (tolgo GTK_COMBO):
gchar *comune_combo = gtk_entry_get_text(GTK_ENTRY(entry4)->entry);
Non posso nemmeno compilare, perchè il compilatore dice che la struttura
non contiene un elemento di tipo entry.
Dunque, lookup_widget() ritorna un tipo GtkWidget, che poi viene convertito in
un tipo GtkCombo da GTK_COMBO. Poi con l'espressione (entry4)->entry si *dovrebbe*
accedere al membro entry della struttura GtkCombo (ho controlltao nell'header,
GtkCombo ha, tra gli altri, un membro di nome entry), ma qua ottengo quel famoso
errore ("Gtk-CRIRTICAL **: file gtkentry.c:
line 3437 <gtk_entry_get_text>: assertion 'GTK_IS_ENTRY <entry>' failed") per
cui non riesco a leggere il contenuto del combo.
Ah, quando si verifica l'errore il programma non si blocca.
Ciao, Gio

 cui non riesco a leggere il contenuto del combo.
Al momento, non mi viene in mente alcun motivo per cui questo dovrebbe
accadere, se non che lookup_widget() ritorni il widget sbagliato.
A questo punto, invece di usare lookup_widget, prova a passare il widget
all'inteno del callback (come "user_data"), oppure crea una struct
contenente i vari widget a cui vuoi accedere all'interno dei callback, e
passa quella struct come "user_data".
Tra parentesi, ecco un motivo per cui non si dovrebbe *mai* usare codice
auto-generato.


 contenuto della entry, che *sicuramente* sarà accessibile.
In effetti sono nuovo con le gtk e man mano scopro cose nuove.
Ad esempio ho notato che assieme al mio widget "comune_combo" è
stata creata una entry "comune_entry" che forse risolve i miei problemi.
Comunque per ora sto imparando e ho lasciato perdere questo combo che per
quello che sto facendo (sostanzialmente prove) non è essenziale.
Probabilmente quando imparerò un po' meglio l'uso di queste librerie mi
renderò conto di quanto banale sia il mio errore.
Grazie mille lo stesso!
Gio