Guida Gtk+ a puntate ( IV parte )
Inizia la quarta puntata, preparatevi i pop corn, lattine di opencola (
), compilatori, shell e tutto il resto. Oggi finiremo la terza puntata che avevo lasciato in sospeso altrimenti diventava poi troppo lunga.
Mettetevi comodi, e iniziamo!
Ora che abbiamo spiegato un po’ le basi, vediamo come risolvere il problema di prima: il programma che non si chiude dopo aver clickato sul pulsante di chiusura, e giacché ci siamo miglioriamo un po’ l’hello world inserendo un pulsantino e collegandoci un evento
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <gtk/gtk.h> int i = 0; static void button_func (GtkWidget * widget) { switch (i) { case 0: g_print ("E' la prima volta che clicki :)\n"); break; case 1: case 2: case 3: g_print ("Ci prendi la mano a clickare eh?\n"); break; default: g_print ("Ok, basta. Torna a studiar le gtk ;)\n"); break; } i++; } int main (int argc, char *argv[]) { GtkWidget *window, *button; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size (GTK_WINDOW (window), 250, 250); gtk_window_set_title (GTK_WINDOW (window), "Ciao Mondo delle Gtk+!"); gtk_widget_show (window); button = gtk_button_new_with_label ("Clickami!"); gtk_container_add (GTK_CONTAINER (window), button); gtk_widget_show (button); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (button_func), NULL); gtk_main (); return 0; } |
Dunque, analizziamo un attimo le nuove funzioni, quella più importante e una delle più usate in un programma che utilizza le Gtk+ è g_signal_connect il cui prototipo è:
gulong g_signal_connect (gpointer object, const gchar *signal_name,
GCallback handler, gpointer data);
Ovvero, riceve come primo parametro l’oggetto ( GObject ) a cui collegare il segnale, come secondo parametro il tipo di evento da intercettare ( gli eventi intercettabili cambiano da widget a widget ), come terzo la funzione da chiamare una volta che si verifica l’evento e infine un eventuale parametro da passarci, il parametro deve essere convertito in gpointer ( che equivale al void * ).
Una particolarità della funzione che verrà collegata è che può essere di qualunque tipo, accettare ciò che si vuole e ritornare ciò che vuole. Nel caso però si volesse ottenere nella funzione chiamata il parametro passato e il widget collegato solitamente si utilizza questo prototipo:
gpointer funzione_chiamata (GtkWidget *widget, gpointer data);
In widget sarà l’elemento a cui è collegata la funzione, e in data il parametro passato.
Andando avanti possiamo vedere oltre al classico bottone creato, una funzione particolare, gtk_container_add.
Le Gtk+ hanno una struttura di tipo gerarchico fatta ad esempio in questo modo:
Ora, questa gerarchia è messa un po’ così per far intuire meglio, quella vera delle Gtk+ la potete consultare qui.
Nel caso del nostro script noi abbiamo la finestra che oltre che una finestra è anche un contenitore e quindi al suo interno ci inseriamo direttamente il pulsante che, come si potrà vedere, si espanderà per tutta la dimensione del contenitore, per limitare la sua dimensione potevamo avvalerci o di una tabella o box, nel caso fossero stati presenti più elementi, oppure della funzione gtk_widget_set_usize che forza un widget ad avere esattamente la dimensione scelta. I parametri di quest’ultima funzione sono simili a quelli di gtk_window_set_default_size solo che il primo elemento al posto di essere una GtkWindow è un GtkWidget, quindi nella stragrande maggior parte dei casi non c’è bisogno di eseguire alcun cast.
Per finire quindi, abbiamo visto la funzione gtk_main_quit, che termina l’applicazione gtk ed esce dal programma.
Fine Quarta Putanta
Nella prossima puntata inizieremo ad andare più in profondità studiando i vari tipi di finestre, adesso abbiamo solo dato uno sguardo generale. Bye

ciao! è da un pò k studio gtk su windows ma ti volevo kiedere 1 cs anzi 2: a k serve static void?? 2. xk si dv mettere xforza int argc, char *argv[] e &arc, &argv??? spero k qnd avrai 1 pò di tmp mi risp grz mille. PS: lo so k dovrei saperlo studiando il c ma nn mi ricordo…….
1) Con l’attributo static si informa il compilatore che quella funzione è privata di quel file e quindi non può essere richiamata da altri file .c .
2) argc ( il numero di parametri passati al programma ) e argv ( l’array di stringhe contenente i parametri ) servono per la funzione gtk_init () che inizializza l’ambiente gtk+ e fa un breve parsing dei parametri alla ricerca delle opzioni private delle gtk+ che sono le seguenti:
Opzioni Gtk+:
–class=CLASSE Classe del programma come usato dal window manager
–name=NOME Nome del programma come usato dal window manager
–display=DISPLAY Display X da usare
–screen=SCHERMO Schermo X da usare
–sync Rende le chiamate a X sincrone
–gtk-module=MODULI Carica i moduli GTK+ addizionali
–g-fatal-warnings Rende tutti i warning critici
–gdk-debug=FLAG Flag Gdk di debug da attivare
–gdk-no-debug=FLAG Flag Gdk di debug da disattivare
–no-xshm Non usare le estensioni di X per la memoria condivisa
–gxid_host=HOST
–gxid_port=PORTA
–xim-preedit=STILE
–xim-status=STILE
–gtk-debug=FLAG Flag Gtk+ di debug da attivare
–gtk-no-debug=FLAG Flag Gtk+ di debug da disattivare
P.s.: Potresti evitare di scrivere abbreviato
?
ciao, volevo farti i complimenti per questa guida
è da poco che ho iniziato a leggerla ma già mi appassiona
è davvero fatta bene. Riguardo a questa IV parte l’unica cosa che non ho capito è “Nel caso però si volesse ottenere nella funzione chiamata il parametro passato e il widget collegato solitamente si utilizza questo prototipo: gpointer funzione_chiamata (GtkWidget *widget, gpointer data);”. Ciao e continua così
Vuol dire che ad esempio se si vuol collegare una funzione al click del mouse su un pulsante e a questa funzione vuoi passare sia il widget del pulsante sia magari una stringa da scrivere nel terminale devi dargli questa definizione:
Ciao sto seguendo questa guida e devo dire che è fantastica, però non capisco una cosa cosa serve nella riga 6 lo script: (GtkWidget * widget) ?