Al momento, il plugin è presente solo per piattaforme Unix ma è previsto il porting per Windows per la prima release ufficiale.
Con questo plugin si ha la possibilità di utilizzare la libreria in oggetto e allo stesso tempo avere a disposizione l'environment squeak; ciò significa che è possibile gestire e modificare le callback dei segnali in contemporanea con il mainloop delle Gtk. Questo permette:
- innanzitutto di mantenere lo stato dell'applicazione durante il suo sviluppo
- avere a disposizione gli strumenti di debugging offerti da Squeak in caso di errori nell'applicazione
- avere un livello discreto di manutenzione dopo il deploying del prodotto finito al cliente finale
In caso di applicazioni multi-threading, ancora non testato, si presume che il controllo dei processi in Squeak sia sufficiente a garantire il corretto funzionamento di questo tipo di applicazioni. Inoltre, il threading delle Gdk è controllato da ogni funzione (primitive) in maniera "atomica" e non si ha quindi bisogno di acquisire/rilasciare il lock manualmente se si avesse bisogno di utilizzare i threads.
Di seguito vi mostrerò alcuni esempi di codice per mostrare l'eleganza e l'organizzazione delle SqueakGtk attuali.
Creazione di una finestra:
| window popup |
window := GtkWindow new.
popup := GtkWindow type: #popup.
window showAll. popup showAll.
Gtk main
Potrete notare come il naming e le operazioni rispecchiano fedelmente quello delle Gtk e allo stesso tempo lo stile Smalltalk.
Per terminare il mainloop è necessario eseguire `Gtk mainQuit'.
I segnali tendono ad avere uno stile puramente orientato a Squeak. Ipottiziamo i seguenti metodi all'interno di una classe:
createButton
| button |
button := GtkButton label: `Clicca qui'.
button
when: #clicked
do: [ :b | GtkMessageDialog info: `Bottone cliccato' ].
button when: #clicked send: #onButtonClicked: to: self.
onButtonClicked: aGtkButton
GtkMessageDialog info: `Bottone cliccato'
Codice estremamente semplice ed intuitivo a come potrete notare.
La documentazione è abbastanza scarsa, ma vi sono commenti per i metodi meno intuitivi, il resto dovrebbe essere abbastanza fedele al naming dell'API.
Dopo questa breve introduzione, passo a ciò che è più importante in questo momento nella linea di sviluppo di SqueakGtk.
Per quanto riguarda l'enhancement di nuovi wrapper methods nel plugin, esiste una classe che crea automaticamente le funzioni primitive dando l'header di una funzione C. Un esempio preso dal mio Workspace:
header _ 'void gtk_window_set_title (GtkWindow *window,
const gchar *title);'.
(GtkPrimGenerator fromHeader: header) install
Noterete #primGtkWindowSetTitle:title: e #primitiveGtkWindowSetTitle:title: rispettivamente in GtkWindow e GtkPlugin. Purtroppo la creazione del metodo #title: è difficile non per il contenuto quanto per il naming, ma probabilmente in futuro ci sarà supporto anche per questo.
Per wrappare più funzioni basta usare #fromMultipleHeaders:
headers _ 'void gtk_window_set_title (GtkWindow *window,
const gchar *title);
void gtk_window_set_wmclass (GtkWindow *window,
const gchar *wmclass_name,
const gchar *wmclass_class);
void gtk_window_set_policy (GtkWindow *window,
gint allow_shrink,
gint allow_grow,
gint auto_shrink);
void gtk_window_set_resizable (GtkWindow *window,
gboolean resizable);
gboolean gtk_window_get_resizable (GtkWindow *window);'.
(GtkPrimGenerator fromMultipleHeaders: headers) do: [ :ea |
ea install
]
Se la funzione non necessita di acquisire e rilasciare il lock Gdk, si può ricorrere a #withoutThreads:
aGtkPrimGenerator withoutThreads: false
Morale della favola: il tempo di wrapping di un GObject corposo (quale GtkWindow) non è maggiore di 20 minuti tra 1 tazzina di caffè ed un paio di messaggi al cellulare!!
È da molto poco che utilizzo Squeak, quindi per qualunque suggerimento o errore (sicuramente molti) vi prego di contattarmi al seguente indirizzo: lethalman88 at gmail dot com.