Newsgroup: it.comp.os.linux.development
Titolo: GTK: problemi da principiante

Siccome 'ste callback e gestori di segnali non li ho capiti un granche' 
(teoricamente credo di si... praticamente non so fare una mazza :( ) ho 
provato a scrivere un programma semplice che alla pressione del bottone 
stampi "CIAO MONDO!!!" nella casella per l'inserimento testi.
Il programma viene compilato (anche se mandandolo in esecuzione da 
terminale da degli errori) ma ovviamente non ottengo i risultati 
desiderati :(
Dove sbaglio?
==========INIZIO==========
#include <gtk/gtk.h>
/* Callback per chiudere finestra */
void chiudi (GtkWidget *widget)
{
	gtk_main_quit();
}
/* Callback per far apparire "CIAO MONDO!!!"
mi gioco la casa che il problema e' qui :( */
void ciao_mondo(GtkWidget *widget, GtkWidget *testo)
{
	gtk_entry_set_text(GTK_ENTRY(testo), "CIAO MONDO!!!");
}
int main(int argc, char *argv[])
{
         GtkWidget       *finestra;
         GtkWidget       *bottone;
         GtkWidget       *scatola;
	GtkWidget	*testo;
         gtk_init(&argc, &argv);
/* Crea e assegna il titolo alla finestra */
         finestra = gtk_window_new(GTK_WINDOW_TOPLEVEL);
         gtk_window_set_title(GTK_WINDOW(finestra), "Prova");
/* GESTORI dei SEGNALI */
/* La finestra viene distrutta premendo la X della "barra" */
         gtk_signal_connect(GTK_OBJECT(finestra), "destroy",
			   GTK_SIGNAL_FUNC(chiudi), NULL);
/* Dovrebbe far comparire la scritta "Ciao Mondo!!!" :( */
	gtk_signal_connect(GTK_OBJECT(bottone), "clicked",
			   GTK_SIGNAL_FUNC(ciao_mondo), testo);
/* Crea e inserisce la box nella finestra */
         scatola = gtk_hbox_new(FALSE, 0);
         gtk_container_add(GTK_CONTAINER(finestra), scatola);
/* Crea "testo" che puo' contenere massimo 20 caratteri
    e lo inserisce nella box */
	testo = gtk_entry_new_with_max_length(20);
	gtk_box_pack_start(GTK_BOX(scatola), testo, TRUE, TRUE, 0);
/* Crea il bottone con l'etichetta e lo inserisce nella box*/
         bottone = gtk_button_new_with_label("Ciao");
         gtk_box_pack_start(GTK_BOX(scatola), bottone, TRUE, TRUE, 0);
/* Permette la visualizzazione dei widget */
	gtk_widget_show(scatola);
	gtk_widget_show(testo);
	gtk_widget_show(bottone);
	gtk_widget_show(finestra);
         gtk_main();
         return (0);
}
=========== FINE ===========
CIAO e GRAZIE :-)
-- 
/***** GiUsEpPe ***************************************************
* e-mail: 
g_luc...@libero.it
 Linux Registered User     #179148 *
* ICQ:          #85370161       Linux Registered Machine  #99282  *
*********************************************** LiNuX iNsIdE *****/

=========== FINE ===========
In pratica, passavi al gestore dei segnali della spazzatura, e
utilizzavi come oggetto chiamante della spazzatura (chissa' cosa
contiene testo e bottone prima di essere inizializzati, probabilmente
il gcc ti dira' che vengono utilizzati senza una inizializzazione -
che e' un warning a meno di non dargli -Werror).
La connessione la devi fare dopo la creazione degli oggetti.
In pratica il codice e' corretto, solo che hai sbagliato i tempi ;-)
-- 
+---- | Un OS per domarli, Un OS per trovarli,             |  -o)
+---+ | Un OS per ghermirli e nel buio incatenarli         |  /\\
 O  | | Nella terra di Redmond, ove l'ombra cupa scende... | _\_V
                    raffaele punto salmaso presso libero punto it

 			   GTK_SIGNAL_FUNC(ciao_mondo), testo);
...
Inizia ad inizializzare il puntatore testo con il costruttore del widget
prima di impostare il callback con un puntatore che punta a merda.
Questa e' la prima cosa che mi veniva in mente. Se non va ne riparliamo.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail** 
  -<! Where's the warrior in you And the spirit he got? You say - "lost" No!
		It's somewhere inside !>- Lost Horizon - Sworn In The Metal Wind


Ti conviene mettere tutti i gtk_signal_connect dopo aver creato tutti i widget
perchè altrimenti utilizzano valori ancora non creati dal gtk.

 
Grazie :-)
Adesso e' tutto ok!!!
CIAO