Articoli Manifesto Tools Links Canali Libri Contatti ?
Linguaggi / SmallTalk / Squeak

Introduzione a SqueakGtk

Abstract
SqueakGtk è un plugin che permette di utilizzare la libreria Gtk nell'ambiente di sviluppo SmallTalk Squeak. Attualmente lo stato di sviluppo è molto attivo (le funzioni wrappate dalle Gtk alle Glib si moltiplicano ad ogni versione) ma, essendo ancora incompleto, presenta diversi bugs e mancanza di oggetti non wrappati.
Data di stesura: 08/06/2006
Data di pubblicazione: 12/06/2006
Ultima modifica: 12/06/2006
di Luca Bruno Discuti sul forum   Stampa

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:

  1. | window popup | 
  2. window := GtkWindow new. 
  3. popup := GtkWindow type: #popup. 
  4. window showAll. popup showAll. 
  5. 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:

  1. createButton 
  2.   | button | 
  3.   button := GtkButton label: `Clicca qui'. 
  4.   button 
  5.     when: #clicked 
  6.     do: [ :b | GtkMessageDialog info: `Bottone cliccato' ]. 
  7.   button when: #clicked send: #onButtonClicked: to: self. 
  8.  
  9. onButtonClicked: aGtkButton 
  10.   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:

  1. header _ 'void        gtk_window_set_title            (GtkWindow *window, 
  2.                                              const gchar *title);'. 
  3.   (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:

  1.   headers _ 'void        gtk_window_set_title            (GtkWindow *window, 
  2.                                              const gchar *title); 
  3. void        gtk_window_set_wmclass          (GtkWindow *window, 
  4.                                              const gchar *wmclass_name, 
  5.                                              const gchar *wmclass_class); 
  6. void        gtk_window_set_policy           (GtkWindow *window, 
  7.                                              gint allow_shrink, 
  8.                                              gint allow_grow, 
  9.                                              gint auto_shrink); 
  10. void        gtk_window_set_resizable        (GtkWindow *window, 
  11.                                              gboolean resizable); 
  12. gboolean    gtk_window_get_resizable        (GtkWindow *window);'. 
  13.  
  14.   (GtkPrimGenerator fromMultipleHeaders: headers) do: [ :ea | 
  15.     ea install 

Se la funzione non necessita di acquisire e rilasciare il lock Gdk, si può ricorrere a #withoutThreads:

  1.   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.

La comunità squeak si è sempre dimostrata molto attiva, sia in America che in Europa.
Anche SIForge.org si è occupato di Squeak, un ambiente di sviluppo basato su SmallTalk con parecchie caratteristiche interessanti.
Un nostro connazionale, Bruno Luca, sta sviluppando SqueakGtk, un plugin per usare la libreria grafica Gtk dentro Squeak.
Se conoscete bene la libreria GTK (e sappiamo che tra i lettori di SIForge ci sono molti di tipi svegli!) contattate Bruno Luca attraverso il wiki del progetto.

Informazioni sull'autore

Luca Bruno, aka Lethalman, il sito personale www.lethalman.net raccoglie la maggior parte dei suoi progetti.

È possibile consultare l'elenco degli articoli scritti da Luca Bruno.

Altri articoli sul tema Linguaggi / SmallTalk / Squeak.

Risorse

  1. Il sito del progetto SqueakGtk.
    http://squeakgtk.pbwiki.com/
  2. Il toolkit grafico GTK+.
    http://www.gtk.org/
  3. Il sito ufficiale di Squeak.
    http://www.squeak.org/
Discuti sul forum   Stampa

Cosa ne pensi di questo articolo?

Discussioni

Questo articolo o l'argomento ti ha interessato? Parliamone.