[Cairo] Ruby/Cairo 0.1

Evan Martin martine at danga.com
Mon Oct 27 07:53:28 PST 2003

I've been working on Ruby bindings for Cairo.  I think I have most of
the hard part done, but I have a few functions/enums left.  (Most of it
is autogenerated from cairo.h-- thanks for such a consistent header!)

I'm mostly posting this so there's less possibility of duplicating
effort, because it's not complete.  However, I have written a bunch of
test programs with it.

I'm especially unsure of how to handle the API that deals with X,
because I'm not sure what the popular way to wrap X in Ruby is.  If
anyone could point me at a definitive package (Google reveals two) I'll
work with that.  For now, I have a super-simple X wrapper that's just
enough to put up a window.

In the future, I also hope to add a module to Ruby/GNOME2 (the GTK
wrappers) for a "cairo" widget (isn't there something like that in one
of the sample programs?).

Anyway, here's a snapshot of what I have:


And here's the obligatory small sample program (this one randomly draws
splines over the window whenever it refreshes).  It demonstrates some of
the Rubyisms I've tried to fit the API to (see the lines with
"line_width" and "stroke"):

require 'cairo'

class SplineWindow < Cairo::Xlib::Window
  def initialize(dpy)
    @width = @height = 400
    super(dpy, @width, @height, false)

  def randx
    10 + rand(@width-20)
  def randy
    10 + rand(@height-20)

  def draw
    @cairo.set_rgb_color(1, 1, 1)
    @cairo.line_width = 2 + ((rand**2.0) * 50)
    @cairo.stroke {
      @cairo.move_to(randx, randy)
      @cairo.curve_to(randx, randy, randx, randy, randx, randy)

  def keypress(key)
    case key.chr
    when 'q'

dpy = Cairo::Xlib::Display.new
sw = SplineWindow.new(dpy)

Evan Martin
martine at danga.com

More information about the cairo mailing list