Uno dei punti forti di gnome/gtk sono i binding delle librerie per altri linguaggi.
Non che KDE/QT non ne abbiano, ma la mia impressione è che non siano apprezzati quanto quelli in gnome-landia, forse perché QT/C++ forniscono già un’ambiente di lavoro di livello più alto rispetto al C liscio.

Colgo l’occasione dell’uscita di questo articolo per parlare un po’ del mio binding preferito, ruby-gtk2 (e ruby-atk e ruby-glib e ruby-pango etc)..

Si tratta di un toolkit poco conosciuto rispetto ai vari Gtk# o pygtk ma secondo me è quello con l’api migliore, per due motivi:

  • si accede alle proprietà in modo semplice come obj.foo=bar
  • si usano i blocchi per i callback

Prendendo spunto dal codice del secondo articolo su developerworks, un porting dell’esempio in ruby sarebbe sostanzialmente identico alla versione python, solo che i callback usano i blocchi direttamente in linea, una cosa del tipo

foo.signal_connect \"clicked\" do
 print \"clicccato!\"
end

Io personalmente ho un alias “on” per signal_connect perché ritengo che

window.on \"signal\" do ...

sia molto meglio..

Colgo l’occasione invece per fare un port dell’applicazione che aveva tradotto lawrence da C a python, per mostrare come usare insieme Cairo e Gtk. Io ho fatto le prove su ubuntu breezy badger e su win32 e funzionano, per altre distro non garantisco

	
require cairo
require gtk2
include Math
class EggClockFace <Gtk::DrawingArea
  def initialize
    super
    signal_connect "expose_event" do |widget,event|
      ctx= widget.window.create_cairo_context
      ctx.rectangle event.area.x, event.area.y,
                    event.area.width, event.area.height
      ctx.clip
      draw(ctx)
      false
    end
  end
  def draw(ctx)
        rect = allocation()
        x = rect.x + rect.width / 2.0
        y = rect.y + rect.height / 2.0
	
        radius = [rect.width / 2.0, rect.height / 2.0].min - 5
	
        # clock back
        ctx.arc(x, y, radius, 0, 2.0 * PI)
        ctx.set_source_rgb(1, 1, 1)
        ctx.fill_preserve
        ctx.set_source_rgb(0, 0, 0)
        ctx.stroke
	
        for i in 0..11
            outset = 0.9 * radius
            ctx.move_to x + outset * cos(i * PI / 6.0),
                        y + outset * sin(i * PI / 6.0)
            ctx.line_to x + radius * cos(i * PI / 6.0),
                        y + radius * sin(i * PI / 6.0)
            ctx.stroke
        end
        ctx.stroke
  end
end
	
Gtk.init
window = Gtk::Window.new
clock = EggClockFace.new
	
window.add clock
window.signal_connect "destroy" do
 Gtk.main_quit
end
window.show_all
	
Gtk.main
	

Free Image Hosting at www.ImageShack.usScreensoht