Playing with gtkNode, a GTK+ 2.0 wrapper library for Erlang

gtkNode is part of Jungerl, the “the Jungle of Erlang code,” i.e. a bag of unrelated pieces of Erlang code. gtkNode is a wrapper for the native GTK+ library, version 2.x. gtkNode is intended as a replacement for Erlang’s standard gs GUI application which is based onTcl/Tk. I am not a fan of GTK+ or Gnome (I am a happy user of KDE), but there is still no KDE wrapping library for Erlang. So let’s give gtkNode a try!

First, download all the Jungerl libraries source code from the Jungerl project’s CVSrepository:

> cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/jungerl login
> cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/jungerl co -P jungerl

To build the gtkNode library, you need to install some packages, in addition to Erlang/OTP (package erlang on Debian). Since only bare Makefile files are provided with gtkNode, and sources are not “autotool’d,” we have to guess which packages are necessary. I have guessed that at least the GCC compiler and the development headers for GTK+ and Glade are necessary (and all their dependencies):

> sudo apt-get install bash gcc-4.0 make pkg-config libgtk2.0-dev libglade2-dev

In addition, if wrapper code for your installed version of GTK+ (e.g. Debian sid provides GTK+ version 2.8.10) are not provided in the gtkNode sources (only wrapper code for GTK+ versions 2.4.9 and 2.6.8 are provided by default, cf. files in the gtkNode/priv/gendirectory), you must also build the wrapper generator. However, this may not be necessary if you apply my patch that adds the generated wrapper code for GTK+ 2.8.10, see below.

Anyway, you must apply my patch, which rewrites a few shell scripts to avoid the use of tcsh, and to correctly determine the path to installed Erlang applications:

> cd jungerl
> wget -O - http://www.berabera.info/wp-content/uploads/2015/06/gtkNode_2006-01-26.patch | patch -p1
> cd lib/gtkNode

That patch also includes the generated wrapper code for GTK+ 2.8.10. However, if you still want to build the generator (e.g. you have a different version of GTK+), packages for Python must be installed, and you must manually create a missing directory:

> sudo apt-get install python2.3
> cd priv/generator
> mkdir ebin
> make

This generates the proper wrapper files for your installed version of GTK+. Those files must be moved to be usable to build the gtkNode library:

> cp gen/*.h ../gen
> make clean

Now, it is possible to actually build gtkNode:

> cd ../../src
> make

If you don’t have emacs installed, like me, and hence don’t have the etags program installed, the make command above fails. You must edit the Makefile file and remove TAGS dependency from the all: target line, and execute make again. The TAGS file generated by etags is not essential here.

To build and execute the two provided examples (simple and points):

> cd ../examples
> make
> (cd simple ; erl -sname test -pa ../../ebin -s simple start)
> (cd points ; erl -sname test -pa ../../ebin -s points start)

It is important to name the started Erlang node, by giving a -sname or -name option, since it must communicate with the independent gtkNode-linux native node, implemented by the priv/bin/gtkNode-linux binary program just compiled above, and which handles all GUI stuff using GTK+. The -pa option gives the path to gtkNode’s compiled Erlang modules.

The simple example is a sort of graphical top. Here is what it looks like:

gtkNode simple example

The points example displays colored dots at random coordinates in a canvas, with the color of the clicked button (red, blue or green). Here is what it looks like:

gtkNode points example

About the appearance of those applications: I am using KDE’s window manager’s “Soft fusion” theme for window decoration, and the Plastik theme for widget decoration. GTK+ applications, including the ones above, use KDE’s Plastik theme through the gtk-qt theme engine (package gtk2-engines-gtk-qt on Debian). Erlang GUI applications never looked so nice!