In questo capitolo esamineremo GDK, una delle librerie su cui si basa GTK+. Per implementare widget personalizzati e oggetti canvas dovrete capire a fondo alcuni dei dettagli a basso livello che verranno esposti. Come i capitoli due e tre, questo capitolo è un veloce sommario; non c'e modo di descrivere tutta GDK in un singolo capitolo. Ad ogni modo, il capitolo tenterà di coprire i concetti e i tipi di dato piú importanti in GDK; dovrebbe rendersi utile come riferimento per certi argomenti. Quando troverete dei dettagli nei capitoli successivi, potrete utilizzare queste basi per capirli. Questo capitolo non è un tentativo di catalogare in modo esaustivo la API di GDK.
Il sistema X Window fornisce una libreria di basso livello non molto piacevole da utilizzare, chiamata Xlib. La maggior parte delle funzioni di GDK sono dei piccoli wrapper alle corrispondenti funzioni di Xlib, ma nascondono in parte la complessità (e funzionalità) di essa, per semplificare la programmazione e rendere facile il port di GDK su altre piattaforme. (Esiste un port di GDK su piattaforma Win32.) Le funzionalità di Xlib che vengono nascoste da GDK sono raramente utilizzate dagli sviluppatori di applicazioni. Ad esempio, molte caratteristiche utilizzate soltanto dai window manager non sono esposte in GDK. Se necessario, potete utilizzare direttamente Xlib includendo i file header appropriati gdk/gdkx.h. (Controllate il codice sorgente di GDK per vedere come estrarre le strutture di dati a basso livello di Xlib dai loro wrapper corrispondenti in GDK).
Se avete bisogno di dettagli su una funzione di GDK, potete consultare direttamente il codice sorgente per determinare la funzione di Xlib interfacciata per poi leggere la pagina di manuale di quest'ultima. Ad esempio, ecco l'implementazione di gdk_draw_point():
void
gdk_draw_point (GdkDrawable *drawable,
GdkGC *gc,
gint x,
gint y)
{
GdkWindowPrivate *drawable_private;
GdkGCPrivate *gc_private;
g_return_if_fail (drawable != NULL);
g_return_if_fail (gc != NULL);
drawable_private = (GdkWindowPrivate*) drawable;
if (drawable_private->destroyed)
return;
gc_private = (GdkGCPrivate*) gc;
XDrawPoint (drawable_private->xdisplay, drawable_private->xwindow,
gc_private->xgc, x, y);
}
|
Ogni struttura dati ha un cast per portarla nella sua versione privata, la quale contiene informazioni relative al particolare sistema su cui GDK viene utilizzata; questo permette di escludere le dichiarazioni specifiche di un windows system dal file header gdk/gdk.h. La versione privata di ogni struttura dati contiene una struttura dati di Xlib, la quale viene passata in argomento a XDrawPoint(). La documentazione di XDrawPoint() rimane quindi valida per gdk_draw_point().