sabato 9 novembre 2013

Tutorial GTK+ 3.0 - Parte 1

Eccomi, mi accingo a creare un tutorial per GTK+ la versione 3.0, ovvero l'ultima in questa data, la quale è molto diversa dalle precedenti, molte funzioni, membri, macro, classi sono state deprecate, e i vari tutorial in italiano presenti sulla rete sono obsoleti (in parole povere, un  codice scritto per GTK+ 1.2, per esempio, non funzionerà più con GTK+ 3.0).
Nella stesura mi baserò sul tutorial ufficiale, ma aggiungendo magari anche qualcosa di mio, testato e provato. Bene, si inizia.

Cosa è GTK+

GTK+ è una libreria scritta in C che contiene un toolkit per creare applicazioni con interfaccia grafica, ma in realtà contiene tante altre librerie per la gestione del nostro ambiente desktop, quindi non si limita solo all'interfaccia grafica. Come ho già detto, è scritta nel linguaggio C implementando la programmazione a oggetti in maniera molto smart, è nato insieme il famoso programma GIMP ed è una libreria che si appoggia su un'altra libreria, GDK, la quale a sua volta si appoggia al Window Manager X Window System, già presente in sistemi operativi come Unix, FreeBSD e poi, Linux. Oggi è multipiattaforma, essendo compatibile quindi anche con Windows (dove si appoggia alle API Win32), MacOSX (dove si appoggia a Quartz) e DirectFB (libreria di funzioni di basso livello per Linux).

Installare GTK+ 

Una applicazione GTK+ è portabile, nel senso che una volta compilata, può essere distribuita per il sistema operativo da cui è stata compilata, includendo nell'installazione le librerie necessarie. Ma se vogliamo creare un'applicazione GTK+ dobbiamo scaricare il toolkit, cioè le librerie e gli header necessari per la compilazione. In questo tutorial si farà riferimento a GTK+ 3.6.4, disponibile per il download su http://www.gtk.org/download/, scegliendo il giusto sistema operativo. Con Windows bisogna configurare i vari pacchetti, ma è scritto tutto sul sito, basta scaricare "all in one bundle", un file zip con tutti i pacchetti necessari (su MacOS e Linux/Unix basta installare i vari pacchetti) , estrarlo in C:\GTK e seguire le istruzioni per la configurazione. Per verificare che tutto è stato installato correttamente, andare nella cartella "bin" e lanciare gtk3-demo, se funziona, allora potrete dormire sonni tranquilli :).

Il primo programma (non ancora Hello World)

Ci siamo. Questo programma creerà una finestra 200x200 pixel:


#include <gtk/gtk.h>
int main (int argc,char *argv[]) {
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_show (window);
return 0;
}
Per compilare, salvare come window-default.c e compilare con gcc da console inserendo questa stringa:
gcc `pkg-config --cflags gtk+-3.0` -o window-default window-default.c `pkg-config --libs gtk+-3.0`

Tutte le applicazioni GTK+ includonol'header <gtk/gtk.h> che provvede da sé a includere tutte gli header che conterranno tutte le funzioni usate da GTK+. Se si tenta di includere un header già incluso da gtk.h si avrà un errore di compilazione, quindi si include solamente gtk.h.

La prima cosa che facciamo è dichiarare la finestra "window" la quale è un puntatore del tipo GtkWidget.
gtk_init() è la chiamata che anch'essa dovremmo fare all'inizio di ogni applicazione. Questa funzione inizializza molte cose al posto nostro, e inoltre prende gli argomenti passati alla main() in modo che quelli che vengono riconosciuti da GTK ì+ vengono interpretati e successivamente eliminati, mentre quelli non riconosciuti vengono ignorati, rendendoli disponibili per noi. 
La chiamata a gtk_window_new()  creerà una nuova GtkWindow  e la memorizzerà nella variabile windowIl tipo di finestra è GTK_WINDOW_TOPLEVEL, il quale significa che GtkWindow sarà gestito dal gestore delle finestre: avrà una finestra, una barra del titolo e controlli della finestra, dipende dalla piattaforma.
Per terminare l'applicazione quando GtkWindow viene distrutta,effettuiamo una connessione del segnale "destroy" con la funzione gtk_main_quit()Questa funzione farà terminare il loop principale di GTK+ lanciato dalla chiamata alla gtk_main(). Il segnale "destroy" viene emesso quando un widget viene distrutto, o tramite una chiamata esplicita a  gtk_widget_destroy() oppure quando il widget non ha "genitori". Le  GtkWindowprincipali vengono pure distrutto quando viene premuto il pulsante "chiudi" della finestra.

Le GtkWidgets sono nascoste di default.Con la chiamata a  gtk_widget_show() su una GtkWidget chiediamo al GTK+ di impostare l'attributo della visibilità, mostrando appunto il widget stesso. Tutto questo effettivamente ha validità solamente dopo che il loop principale viene lanciato.
L'ultima riga che ci interessa è la chiamata gtk_main()Questa funzione farà partire il loop principale del GTK+ e bloccherà il flusso  main() fintantoché la funzione gtk_main_quit() non verrà chiamata.
Durante l'applicazione, GTK+ riceve degli eventiQuesti sono essenzialmente eventi di input generati dall'utente che interagisce con il programma, ma anche messaggi lanciati dal gestore delle finestre o da altri programmi. GTK+ processa questi messaggi e vengono emessi dei segnali sul widget(signals). Connettere degli handlers per questi segnali è praticamente decidere come si deve comportare il tuo programma in risposta all'input dell'utente.
P.S. se trovate di gradimento questo tutorial, lasciate pure un commento, verrebbe apprezzare e potrebbe motivarmi di più   a continuare


Nessun commento:

Posta un commento