Open Source im professionellen Einsatz
Linux-Magazin 03/2010
© se.scho, Photocase.com

© se.scho, Photocase.com

GUI-Programmierung mit Fltk, Wx-Widgets und EFL

Alternativ-Baukästen

Kommt das Gespräch auf GUI-Toolkits, drängen sich in Linux-Kreisen meist die Marktführer Qt und GTK+ auf. Dieser Artikel stellt drei Alternativen vor, die sich mit ihren Stärken nicht zu verstecken brauchen.

1440

Wer seine Anwendung als Teil einer der großen Desktopumgebungen sieht, wird als GUI-Toolkit Qt oder GTK+ benutzen. Für ein singuläres kleines Tool mit grafischer Oberfläche oder eine separat vertriebene Anwendung kommen aber auch alternative Bibliotheken in Frage.

Leicht: Fltk

In einem solchen Szenario ist die leichtgewichtige C++-Library Fltk ein vielversprechender Kandidat [1]. Das Fast Light Toolkit, gesprochen "fulltick", beschränkt sich im Gegensatz zur mächtigeren Konkurrenz ausschließlich auf das Liefern des GUI. Es sorgt für eine kleine Bibliothek, die sich auch statisch gelinkt zusammen mit der Anwendung ausliefern lässt. So kann der Anwender das Programm auf einem durchschnittlichen Linux-System installieren, ohne die GUI-Bibliothek selbst nachrüsten zu müssen. Die Lizenz enthält neben dem Text der LGPL 2 eine Ausnahmeregelung, die das statische Linken selbst für proprietäre Anwendungen erlaubt.

Fltk-Quelltext ist portabel und lässt sich unter Linux, BSD, Mac OS X sowie Windows kompilieren. Zu den Fltk-Anwendungen gehört der Software-Synthesizer Zyn Add Sub Fx, und das Projekt Equinox Desktop Environment erstellt mit dem Toolkit eine leichtgewichtige Desktopumgebung [2]. Die derzeit stabile Fltk-Version 1.1 lässt sich aus dem Paketbestand der meisten Desktop-Linuxe installieren.

Die ersten Schritte mit dem Toolkit sind mit C++-Grundkenntnissen rasch erledigt (Listing 1). Eine dreizeilige Main-Methode genügt, um ein Fenster auf den Bildschirm zu malen. Fltk-Widgets liegen als Klassen vor, die der Programmierer instanziert. Die Methode »show()« ist zum Anzeigen erforderlich. Zudem gibt es neben dem obligatorischen »Fl.H« pro Klasse eine eigene Headerdatei, die der Programmierer einbinden muss, hier »Fl_Window.H«. Der Aufruf der Event-Loop »Fl::run()« muss jede Main-Methode abschließen. Die Schleife wartet, bis das letzte Fenster der Anwendung geschlossen ist, dann gibt sie »0« zurück.

Listing 1:
»fenster.cpp«

01 #include <FL/Fl.H> 02 #include <FL/Fl_Window.H> 03
04 int main() 05 { 06 Fl_Window *Fenster = new
Fl_Window(300,200,"Mein Fenster"); 07 Fenster->show(); 08
return(Fl::run()); 09 }
Listing 2 zeigt, wie sich Funktionen an die Widgets binden lassen: Der Button erhält einen Callback an »MeineFunktion()«, die beim Knopfdruck eine Meldung auf die Standardausgabe schreibt. Auch an das Windows-Objekt lässt sich ein Callback binden. Er wird beim Schließen des Fensters aufgerufen, eine sinnvolle Funktion wäre es hier beispielsweise, den Anwender zu fragen, ob er ungespeicherte Daten vor dem Schließen der Anwendung speichern möchte.

Listing 2:
»callback.cpp«

01 #include <FL/Fl.H> 02 #include <FL/Fl_Window.H> 03
#include <FL/Fl_Button.H> 04 #include <stdio.h> 05 06
void MeineFunktion(Fl_Widget*w) 07 { 08 fprintf(stdout, "Knopf
gedrückt!n"); 09 } 10 11 int main() 12 { 13 Fl_Window
*Fenster = new Fl_Window(300,200,"Mein Fenster"); 14 Fl_Button
*Knopf = new Fl_Button(30,30,200,30, "Test"); 15
Knopf->callback(MeineFunktion); 16 Fenster->show(); 17
return(Fl::run()); 18 }

Zusammengeklickt

Für die Gestaltung komplexer GUI-Layouts bringt Fltk das grafische Programm Fluid mit (Abbildung 1). Dort kann der Entwickler Widgets per Drag&Drop platzieren und ihre Eigenschaften in Dialogen festlegen. Diese Einstellungen speichert das Tool in Dateien mit der Endung ».fl«. Außerdem erzeugt es aus den Layouts die benötigten Header- und C++-Dateien, die sich gut im Programmiereditor weiterverarbeiten lassen.

Der Befehl »fltk-config --compile Programm.cpp« kompiliert das Programm dynamisch gelinkt. Der Aufruf »fltk-config --ldstaticflags« liefert die erforderlichen Optionen, um die Toolkit-Bibliotheken statisch zu linken.

Neben der Dokumentation auf der Fltk-Homepage empfehlen sich die Beispielprogramme des Entwicklers Greg Ercolano [3]. Er hat sie außerdem um zwei Screencasts bereichert, die den Einstieg in die Anwendungsentwicklung mit Fltk einfach machen.

Abbildung 1: Der Interface-Designer Fluid hilft dem Fltk-Entwickler beim GUI-Layout und spuckt außerdem ein nützliches Code-Skelett für die Programmierung aus.

Polyglott: Wx-Widgets

Ebenfalls in C++ umgesetzt ist Wx-Widgets (ehemals Wx-Windows genannt, [4]), das aber Bindings für eine enorme Zahl an Programmiersprachen bietet: Die Wx-Familie reicht von Python und Ruby bis Erlang und Haskell. Die unterstützten Plattformen reichen vom Betriebssystem-Mainstream bis zu Windows Mobile und zum I-Phone. Das Toolkit erlaubt außerdem Crosscompiling, also beispielsweise eine Windows-Anwendung unter Linux zu übersetzen. Eine der bekanntesten Open-Source-Anwendungen, die auf Wx-Widgets setzen, ist der freie Audio-Editor Audacity.

Unauffällig

Wx-Widgets bildet eine dünne Abstraktionsschicht zu den auf einem System vorhandenen Widgets. Auf diese Weise passen sich Wx-Widgets-Anwendungen optisch in das vorhandene GUI ein. Unter Linux ist daher ein installiertes GTK+, Motif oder Lesstif Voraussetzung. Lediglich die Variante Wx-X11 verlangt nur nach einem X-Window-System.

Die stabile Version 2.8 lässt sich aus den Repositories aktueller Linux-Distributionen installieren, wobei sich das Toolkit auf mehrere »wx«-Pakete aufteilt. Die benötigten Header zum Beispiel finden sich unter Ubuntu im Paket »libwxgtk2.8-dev«.

Daneben ist es ratsam, auch die Code-Samples zu installieren. Schon am Beispiel »minimal.cpp«, das in stolzen 200 C++-Zeilen ein Fenster und einen About-Kasten erzeugt, wird deutlich: Wx-Widgets ist komplizierter als Fltk. Dafür bietet es aber auch mehr Features, beispielsweise Widgets für ganze Kalender oder HTML-Viewer.

Auch für Wx-Widgets existiert ein freier GUI-Layouter: Wx-Formbuilder [5] steht unter GPL und enthält einen Wysiwyg-Editor für Programmfenster, den zahlreiche Eigenschaften-Paletten ergänzen (Abbildung 2). Die Platzierung der Elemente erfolgt nicht absolut in Pixeln, sondern durch flexible Container, die andere Komponenten aufnehmen und ausrichten. So bleiben die Oberflächen beispielsweise auch bei sehr großen Schriftgraden noch les- und benutzbar.

Wx-Formbuilder generiert automatisch C++- und Headerdateien, die der Programmierer allerdings nicht antasten darf, möchte er sein Projekt weiterhin mit dem Layout-Tool bearbeiten. Der Königsweg besteht darin, eigene Klassen per Vererbung von den aus dem Formbuilder exportierten abzuleiten.

Abbildung 2: Wx-Formbuilder bringt alles mit, was der GUI-Layouter bei der Arbeit mit Wx-Widgets braucht.

Sag's in XML

Das Werkzeug exportiert noch ein weiteres, höchst interessantes Datenformat: Mit XRC bezeichnet das Wx-Widgets-Projekt Ressourcendateien in XML, die ein GUI beschreiben. Das Mozilla-Projekt beispielsweise verwendet mit seinem XML-Format XUL das gleich Prinzip. Der Vorteil: Wx-Widgets-Anwendungen können XRC-Dateien zur Laufzeit laden. Layoutänderungen lassen sich somit ohne Neukompilieren durchführen. Weitere Informationen zu XRC gibt es im Wx-Widgets-Wiki [6].

Wx-Widgets bietet noch einiges darüber hinaus, beispielsweise Unicode-Unterstützung, Open GL, Netzwerkprogrammierung sowie auf Wunsch statisches Linken. Die an die LGPL angelehnte Lizenz gestattet es auch, das Toolkit in proprietären Programmen zu verwenden, weshalb die Software-Industrie offenbar gerne zugreift. Eine der vielen auf der Homepage aufgelisteten Wx-Widgets-Anwendungen ist Caedium (Abbildung 3) der Firma Syscape, eine professionelle Suite von Programmen für das Computer-aided Engineering (CAE, [7]).

Abbildung 3: Wx-Widgets lässt sich auch in proprietären Programmen einsetzen, hier in der Windows-Version von Caedium, einer Softwaresuite für Computer-aided Engineering.

Esoterisch: EFL

Offiziell noch im Betastadium befinden sich die Enlightenment Foundation Libraries (EFL), die Carsten "Rasterman" Haitzler für die Entwicklerversion 0.17 des Enlightenment-Desktops [8] geschaffen hat. Stellenweise sind sie aber schon im Produktiveinsatz: In Openinkpot [9], einer freien Linux-Distribution für E-Book-Reader, finden die Bibliotheken für Anwendungen wie Bücherregal, Systemeinstellungen und Spiele Verwendung (Abbildung 4).

Das Reader-Projekt baut seine EFL-Pakete aus den regelmäßig veröffentlichten Snapshots der Bibliotheken. Diese sind laut Openinkpot-Gründer Mikhail Gusarov ausreichend stabil. Die Anwendungen laufen auf dem Framebuffer-X-Server Xfbdev und sind in C geschrieben, EFL bietet daneben Bindings für C++, Python, Perl und Ruby.

Zu den Enlightenment Foundation Libraries gehört beispielsweise die Layoutbibliothek Edje, die als Zwischenschicht zwischen Programmcode und auswechselbaren Themes dient. Sie lässt sich sogar mit Lua oder der Eigenentwicklung Embryo skripten. Die Canvas-Bibliothek Evas stellt die Fenster zur Verfügung, in die die Anwendungen malen, und Ecore kümmert sich um die Grundversorgung mit Events und Timern. Auf diesen Komponenten baut Elementary auf, das eine Widget-Sammlung anbietet.

Abbildung 4: Auch auf einem E-Book-Reader mit E-Ink-Display und bescheidener Rechenleistung lassen sich EFL-Anwendungen einsetzen.

Steiniger Weg

Die EFL-Komponenten stehen in komplexer Beziehung zueinander, sie existieren hauptsächlich im Quelltext-Repository, die dazugehörige Dokumentation ist lückenhaft und über das Web verstreut. Für außenstehende Entwickler ist es daher derzeit nicht leicht, einen Einstieg in die Arbeit mit den esoterischen Bibliotheken zu finden. Als Anfangspunkt bietet sich der EFL-Eintrag im Enlightenment-Wiki unter [10] an.

Dass die Enlightenment-Technologie aber gerade für Embedded-Geräte tauglich ist, zeigt folgendes Beispiel: Seit Ende 2009 läuft EFL auf über 2 Millionen Settop-Boxen des französischen Netzwerk-Anbieters Free.fr. Es wäre schön, wenn die Open-Source-Bibliotheken, die unter einer BSD-artigen Lizenz stehen, für ein größeres Publikum reif würden.

Infos

[1] Fltk-Homepage: [http://fltk.org]

[2] Equinox Desktop Environment: [http://equinox-project.org]

[3] Greg Ercolanos FLTK Cheat Page:[http://seriss.com/people/erco/fltk/]

[4] Wx-Widgets: [http://www.wxwidgets.org]

[5] Wx-Formbuilder: [http://www.wxformbuilder.org]

[6] XRC: [http://wiki.wxwidgets.org/Using_XML_Resources_with_XRC]

[7] CAE-Suite Caedium: [http://www.symscape.com/product/caedium]

[8] Enlightenment: [http://enlightenment.org]

[9] Openinkpot: [http://openinkpot.org]

[10] Wiki-Eintrag zu EFL: [http://wiki.enlightenment.org/index.php/Enlightenment_Foundation_Libraries]

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 3 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

comments powered by Disqus

Ausgabe 10/2016

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.