Projects:GTK on DirectFB

From DirectFB

Jump to: navigation, search
Error creating thumbnail: convert: unable to open image `/var/lib/mediawiki/images/8/8d/Gimp.png': @ error/blob.c/OpenBlob/2587.
convert: unable to open file `/var/lib/mediawiki/images/8/8d/Gimp.png' @ error/png.c/ReadPNGImage/3238.
convert: missing an image filename `/var/lib/mediawiki/images/thumb/8/8d/Gimp.png/200px-Gimp.png' @ error/convert.c/ConvertImageCommand/3011.
Error creating thumbnail: convert: unable to open image `/var/lib/mediawiki/images/3/34/Gimp-multi.png': @ error/blob.c/OpenBlob/2587.
convert: unable to open file `/var/lib/mediawiki/images/3/34/Gimp-multi.png' @ error/png.c/ReadPNGImage/3238.
convert: missing an image filename `/var/lib/mediawiki/images/thumb/3/34/Gimp-multi.png/200px-Gimp-multi.png' @ error/convert.c/ConvertImageCommand/3011.



The GTK on DirectFB (shortly GTK-DFB from now on) project consists in a GDK library which acts as a glue between the GTK+ toolkit and the DirectFB windowing system (similarly, the GTK-X11 libary acts as a glue between GTK+ and X11 and GDK-WIN32 does the same for Windows GDI).

Because GTK-DFB is meant for use in embedded applications rather than desktop, it has not all the features the X11 or WIN32 GDK backends do, but it is mature enough to run even complex applications like the GIMP.

This wiki page contains an howto about building the GTK+ libraries with the DirectFB backend enabled, in order to operate atop of the DirectFramebuffer windowing system.

At the moment of the writing of this document, the most recent stable release of gtk+ was 2.10.13: because newer versions may be available when you read this page, please make sure to always build a recent gtk+ release.

For historical reasons information has been left at the bottom of this page for people who want to get the old GTK-DFB 2.0.9 running: please notice that that GTK-DFB version is really out of date and is no longer maintained.

If you find any bug in GTK-DFB ping the gtk+ maintainers on gtk-devel-list or file a bugreport against the directfb component in Gnome BTS, user feedback is very important!

Precompiled Packages

The DirectFB flavour of GTK+ can be found precompiled in the packages repositories of some Linux distributions. If your distribution is not listed among those below, you need to build everything by hand as explained in the successive sections.


If you're a Debian user, you can install the libgtk-directfb-2.0-0 binary package and its -dev companion libgtk-directfb-2.0-dev.


If you're an ArchLinux user, you can try the gtk2-dfb package available in the ArchLinux User-community Repository [1]. Note that you will also need the linux-fusion, directfb and cairo-dfb packages availables in that repository too.

Building from sources


In order to get everything working you need a working framebuffer: make sure that framebuffer support is built into your kernel ( kernels provided today by the many popular Linux distributions include framebuffer support ) and that it is properly turned on at boot time by passing the appropriate parameters to the kernel.

On i386s, you should pass something similar to the kernel

video=vesa vga=788

while on PowerPC systems you should pass something like


GTK-DFB Requirements

Other than a recent DirectFB version ( you need DirectFB >= 0.9.25 ), a complete GTK-DFB environment is composed by the following libraries (system libraries like libc are of course needed but are not listed here):

  • GTK+ - The GTK+ library which includes the GTK-DFB backend
  • Cairo - The 2D vectorial drawing library that GTK relies upon starting from version 2.8.0
  • Pango - GTK+ font rendering library
  • GLib - A Library that extends libc functions
  • ATK - GTK+ accessibility toolkit

Notice that the while Glib and ATK are indipendent from the windowing system underlying GTK+, so you don't need to recompile them and stock òibraries provided by your distribution will do.

Building the Requirements

First, make sure you have DirectFB ( >=0.9.25 ), ATK ( >=1.0.1 ) and Glib ( >=2.13.1 ) installed togheter with all the development stuff.

In a Debian system you must install the
libglib2.0-0 libglib2.0-dev libatk1.0-0 libatk1.0-dev libdirectfb-0.9-25 libdirectfb-dev
set of packages.

Then open a new terminal and set up the following variables:

export PREFIX=/usr/gtkdfb
export CFLAGS="-g"

This allows to install GTK-DFB runtime-libraries and developement files in a place (/usr/gtkdfb in this case) where they don't mess up with the standard set of GTK+ libraries.

Next, get cairo and build it with the DirectFB backend enabled:

mkdir -p $PREFIX/src
cd $PREFIX/src
tar -xvzf cairo-1.4.6.tar.gz
cd cairo-1.4.6
sh configure --prefix=$PREFIX --enable-directfb --disable-xlib --disable-win32
make install

Do the same for PanGO

tar -xvjf pango-x.y.z.tar.bz2
cd pango-x.y.z
./configure --prefix=$PREFIX --without-x
make install

Building GTK-DFB

You can now build GTK-DFB

cd $PREFIX/src
tar -xvjf gtk+-2.10.13.tar.bz2
cd gtk+
./configure --prefix=$PREFIX --with-gdktarget=directfb --without-x
make install

Hey presto! If everything went according to plan, you have compiled GTK-DFB, congratulations!


To see if it worked, try running (*as root*, unless you've compiled DFB with a specific option which allows unprivileged users to access the framebuffer):

export LD_LIBRARY_PATH=/usr/gtkdfb/lib

If all went well you should see a GTK window on a blue background. Don't be worried that the window has no Frame - after all you are not running a Window Manager, right? The following commands are provided by DFB to help you handle the windows:

  • Meta + Mouse Movement = Move the window
  • Meta + C = close the window
  • Meta + X + Mouse Movement = Change Window stacking order

Meta = Windows Key on most desktop Systems. Use the Meta + C command on the main window to quit the demo.

Chinese Beta Testing on Directfb

If you get directfb and gtk setup, now you can move on the vte and scim so you can get a chinese terminal.

here are some screenshot <img src=> <img src="">

Compiling applications against GTK-DFB - the GIMP

To compile a generic GTK+ application against your freshly built GTK-DFB libraries, always remember to issue

export PREFIX=/usr/gtkdfb

before launching configuration scripts. You may also need to replace all the occourrences of <gtk/gtkx.h> with <gtk/gtk.h> in your headers/source files and make sure you use the gtk+-directfb-2.0.pc file when calling pkg-config to get the correct compiler and linker flags for GTK+-DirectFB:

pkg-config --cflags gtk+-directfb-2.0
pkg-config --libs gtk+-directfb-2.0

The GIMP is one of the most complex GTK+ application ever written, so it is a good testbench to evaluate the capabilities and the soundness of GTK-DFB. Proceed as following:

export PREFIX=/usr/gtkdfb
tar -xvjf gimp-2.2.10.tar.bz2
cd gimp-2.2.10
./configure --prefix=$PREFIX --without-x --without-libtiff --without-libmng --without-libexif --without-aa --without-gtkhtml2 --without-librsvg --without-lcms --disable-print --enable-debug
make install

Now run /usr/gtkdfb/bin/gimp and have fun!

GTK-DFB: Older Information

2.0.9 Version

Some infos on the 2.0.9 version of GTK-DFB here: [2]


This is a very out of date version of GTK-DFB full of bugs and no longer maintained and is mentioned here for historic reasons only; you should definitely use GTK mainline sources

How it works

-- The Gdk-directfb implementation is using GetSubsurface to create all CHILD widgets ( button, etc ).

Yes, each GdkWindow that is not a top level window is realized via GetSubSurface(). A sub surface is just another graphics context with a fixed x/y offset and a limited clipping region. This limited region is defined during GetSubSurface() and is limited to the region of the (sub) surface which is used to create the new sub surface.

-- I was wondering what is the plan to deal with layered widgets ( i.e. widgets that cover each other ) ? Currently this doesn't seem to work, and some gtk code that works fine in X11 is not working with dfb. I couldn't find the code implementing z-order for subsurfaces or surfaces.

There's no code in DirectFB dealing with the z-order of sub surfaces, because there is neither an order nor any hierarchy except the capability to be a sub surface.

The order is defined by the application, or in this case by GDK.

-- I tried to change the code to use CreateSurface or CreateWindow for the childs - but so far I get the same problem, no layering works.

CreateWindow() and CreateSurface() allocate extra memory which would grow quickly if they are called for each child window. In X11 only the root window is allocated in memory, other windows are embedded in this window like the sub surfaces are in DirectFB toplevel windows.

For further information see the directfb-dev mailing list archives here:

Performance and memory requirements

No serious testing has been done yet about GTK-DFB >= 2.8.0 performance and requirements, but old datas are still available about GTK-DFB 2.0.x here.

References for the GTK-DFB project

Here is a list of useful resources on the web related to the GTK-DFB project

Personal tools