Scrivere un GtkWidget

Questo capitolo mostra come scrivere un nuovo GtkWidget. Un widget è un qualunque GtkObject derivato da GtkWidget. Prima di leggere questo capitolo, dovreste prima comprendere a fondo il . Questo capitolo espone in dettaglio la strutturazione di GtkWidget, ma non spiega nuovamente GtkObject in generale. È necessario anche aver appreso i fondamenti di GDK per poter scrivere un widget. Assicuratevi di leggere il il capitolo I fondamenti di GDK se ancora non lo avete fatto!

I widget sono molto semplici da creare. Basta copiare le basi di un normale GtkObject (inizializzatori di istanza e della classe, la funzione get_type() e così via), e quindi implementare le funzionalità del vostro widget. Scrivere nuovi widget è una tecnica molto importante per lo sviluppo di applicazioni.

Dopo una breve introduzione, questo capitolo passa direttamente alla implementazione di un semplice widget, chiamato GtkEv. Successivamente faremo un piccolo passo indietro, descrivendo l'implementazione in modo più dettagliato. Fineremo quindi apportando esempi dal codice di GTK+ stesso (è importante diventare pratici del codice sorgente di GTK+, spesso risulta più semplice implementare un nuovo widget modificandone uno già presente piuttosto che scriverlo per intero partendo da zero. Ovviamente, è necessario rispettare i termini della licenza di GTK+ se copiate esattamente il codice dalla libreria.)

Introduzione

Questa sezione è una breve introduzione alle funzionalità generali che GtkWidget deve possedere.

Tipi di widget

Il termine widget è molto, molto generico, dato che si applica a tutti gli oggetti che implementano una interfaccia GtkWidget. Esistono svariati modi per classificare i widget:

  • Contenitori: sono widget che contengono altri widget, come le scatole e le tabelle descritte nel il capitolo Fondamenti di GTK+. Questi possono essere suddivisi fra quelli che gestiscono un singolo widget al loro interno (GtkButton, GtkFrame, GtkEventBox etc.) e quelli che possono gestirne un numero indefinito (GtkBox, GtkTable, etc). I widget contenitori sono particolarmente difficili da implementare rispetto ai widget "normali", poiché deve essere implementata l'interfaccia di GtkContainer in aggiunta a quella per GtkWidget.

  • Compositi: sono dei contenitori che già contengono una serie di altri widget posizionati corretamente. Ad esempio, il widget GtkFileSelection è una sottoclasse di GtkWindow e così via. Widget come questi risultano molto semplici da implementare, e risultano inoltre essere un modo molto comodo per scrivere le applicazioni. Ad esempio, potrete implementare un widget "FinestraPrincipale" per la vostra applicazione, e quindi creare una nuova istanza del widget ogni qual volta l'utente apre un documento. GnomeApp e GnomeDialog sono due widget compositi molto importanti all'interno di Gnome.

  • I widget non contenitori posso essere controlli (pulsanti, barre di scorrimento, etc), visualizzatori di informazioni (GtkLabel), oppure semplici decorazioni (GtkSeparator, ad esempio). Come abbiamo visto nelil capitolo Fondamenti di GTK+, esistono due metodi principali per implementare i widget: la maggior parte di questi (quelli che devono ricevere eventi oppure disegnare il proprio sfondo) hanno una GdkWindow associata. I widget "senza finestra" disegnano sé stessi sul proprio contenitore. Quest'ultimo tipo di widget viene implementato in un modo molto particolare. Tutti i contenitori hanno una GdkWindow (dato che i widget "senza finestra" devono disegnare sopra di essa, fra le altre motivazioni).

Questo capitolo presenta alcuni widget come esempi, incluso il widget GtkEv (scritto appositamente per questo libro), GtkVBox di GTK+ e GnomeAppBar di libgnomeui.

Come opera un widget

Un widget minimo implementa il seguente codice (anche l'implementazione default di GtkWidget risulta essere sufficiente in molti casi) :