ruby, gnome, gtk January 12, 2006 3:07 pm (Save post)
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
Screensoht

Purtroppo hai ragione, ruby-gnome2 sono “binding dimenticati”. Le killer app in rg2 non arrivano (a parte Alexandria) e Python è sempre più “ufficiale” in Gnome (vedi estensioni per Epiphany e Nautilus).
Nonostante questo Rails va avanti; il mondo è proprio strano.
Ho aggiornato sulle pagine italiane di ruby-gnome2 il link a Ruby-it
Ciao
Luigi
Comment by Luigi Maselli — January 13, 2006 @ 11:30 pm
beh per me nihongo benkyo potrebbe essere una killer app, se solo capissi come usarla..
Ah ottima cosa aggiornare i link, bravissimo
Comment by gabriele — January 14, 2006 @ 12:44 am
sempre su python come “linguaggio ufficiale” di GNOME: le pygtk hanno dalla loro un sistema di build molto più facilmente integrabile con gli auto-tools, e un generatore di bindings che, praticamente, fa tutto lui. perl e ruby devono fare un po’ più di fatica, e per il perl il sistema di build è un inferno.
ah, e adesso anche gedit è scriptabile in perl.
Comment by zefram — January 16, 2006 @ 3:35 pm
pardon, s/perl/python/ nell’affermazione su gedit.
il plugin perl arriverà nella prossima release (si spera).
Comment by zefram — January 16, 2006 @ 3:51 pm
Well done, it was not exactly the same, so I changed some parts of code :
require ‘cairo’
require ‘gtk2′
include Math
class EggClockFace
Comment by Kib — January 25, 2006 @ 9:11 pm