HELLO WORLD
IN DETTAGLIO
La prima funzione che troviamo nel listato è la callback che viene chiamata quando il bottone viene
clikkato.
void hello( GtkWidget *widget,
gpointer data )
{
g_print ("Hello World\n");
}
La chiamata seguente è un po' speciale. L'evento
"delete_event" occorre quando viene inviato dal window manager alla applicazione. Noi a questo punto abbiamo la scelta di ignorarlo o terminare l'applicazione.
Il valore che facciamo ritornare dalla callback informa GTK di cosa vogliamo. Se ritorniamo TRUE l'applicazione continuerà il suo ciclo se ritorniamo FALSE sara' invece emesso il segnale
"destroy"
gint delete_event( GtkWidget
*widget,
GdkEvent *event,
gpointer data )
{
g_print ("delete event occurred\n");
return (TRUE);
}
Ecco la callback che viene attivata quando viene emesso appunto il segnale
"destroy". Questa causa la terminazione dell'applicazione chiamando gtk_main_quit().
void destroy( GtkWidget *widget,
gpointer data )
{
gtk_main_quit ();
}
Abbiamo ora la funzione main tipica di una qualunque applicazione.
int main( int argc,
char *argv[] )
{
Qui dichiaramo due puntatori ad una struttura GtkWidget che conterranno il riferimento alla finestra ed al bottone che stiamo per creare.
GtkWidget *window;
GtkWidget *button;
Qui inizializziamo GTK.
gtk_init (&argc, &argv);
Qui invece creiamo una nuova finestra. La funzione di creazione ci ritorna un puntatore all'oggetto creato (struttura in memoria) che viene associato a "window" che abbiamo dichiarato sopra. La finestra viene creata ma non viene visualizzata. Questo avverra' più avanti con la funzione gtk_widget_show (window);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Qui invece connettiamo il segnale
"destroy" alla finestra.
gtk_signal_connect (GTK_OBJECT (window),
"destroy",
GTK_SIGNAL_FUNC (destroy), NULL);
La funzione successiva è usata per settare il
border. In pratica vogliamo un'area di 10 pixel all'interno della finestra in cui non ci siano altri
widget.
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
Con la chiamata successiva creiamo un nuovo bottone come abbiamo fatto sopra con la finestra ed anche qui ci viene ritornato il puntatore che sarà contenuto in
"button" che abbiamo dichiarato sopra. Il bottone conterra' la label
"hello world".
button = gtk_button_new_with_label
("Hello World");
Qui connettiamo il segnale "clicked" del bottone alla
callback. Questo fa sì che quando clikkeremo con il puntatore del mouse sul bottone verrà chiamata la funzione
hello()
gtk_signal_connect (GTK_OBJECT
(button), "clicked",
GTK_SIGNAL_FUNC (hello), NULL);
Qui connettiamo sempre al segnale
"clicked" del bottone un'altra chiamata (gtk_widget_destroy).
Questo fa sì che quando clikkiamo sarà chiamata prima la funzione
hello() e poi (gtk_widget_destroy).
Come si vede possiamo associare ad un segnale più chiamate che verranno invocate nell'ordine.
A causa del fatto che la chiamata gtk_widget_destroy() accetta come argomento solo una GtkWidget in questo caso useremo la funzione gtk_signal_connect_object() invece della più semplice gtk_signal_connect().
gtk_signal_connect_object (GTK_OBJECT
(button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (window));
La chiamata successiva è semplice da capire e specifica che il bottone deve essere inserito nella finestra. Ricordate che GTK container può contenere solo una
widget. Ci sono altri widget che abbiamo descritto nella apposita sezione del tutorial che possono contenere piu' di una
widget.
gtk_container_add (GTK_CONTAINER (window),
button);
Una volta creati gli oggetti e collegati ai segnali e agli eventi che ci interessano possiamo visualizzarli.
Cio' avviene appunto con le due funzioni successive che visualizzano bottone e finestra.
gtk_widget_show (button);
gtk_widget_show (window);
Ed ecco infine che entriamo nel ciclo principale gtk che attende gli eventi provenienti dal window manager e chiama i segnali collegati alle
widget.
gtk_main ();
E qiesto e' il ritorno finale. Il controllo torna in questo punto dopo che è stao chiamata
gtk_quit().
return 0;
Compilare Hello World.
Per compilare hello world si può usare:
gcc -Wall -g helloworld.c -o helloworld `gtk-config --cflags` \
`gtk-config --libs`
Questa linea compila il programma con i settaggi compresi in
gtk-config.
Le librerie normalmente linkate con la precedente linea di comando sono:
The GTK library (-lgtk)
The GDK library (-lgdk)
The gmodule library
The glib library (-lglib)
The Xlib library (-lX11)
The Xext library (-lXext)
The math library (-lm)