- GTK+
-
GTK+ Entwickler Das GTK+-Team[1] Aktuelle Version 3.2.2
(12. November 2011)Aktuelle Vorabversion 3.3.2
(25. Oktober 2011)Betriebssystem Unix, GNU/Linux, Mac OS X (beta), Windows Programmiersprache C Kategorie Komponentenbibliothek Lizenz LGPL Deutschsprachig ja, mehrsprachig www.gtk.org GTK+ (GIMP Toolkit) ist eine freie Komponentenbibliothek unter der LGPL, mit der grafische Benutzeroberflächen (GUI) für Software erstellt werden können.
Sie wurde anfangs von Peter Mattis, Spencer Kimball und Josh MacDonald entwickelt, um abseits von Motif eine Benutzeroberfläche für das Grafikprogramm GIMP zu schaffen. Mittlerweile wird GTK+ jedoch von einer Vielzahl von Anwendungen sowie in der Arbeitsumgebung GNOME oder auch Xfce verwendet und ist somit, neben Qt von Nokias Qt Development Frameworks Sparte, eines der erfolgreichsten Grafik-Toolkits für das X Window System.
Inhaltsverzeichnis
Geschichte und Entwicklung
GTK+ ist in der Programmiersprache C geschrieben. Die erste Version von GTK+ enthielt einige Hilfsroutinen zur Lösung grundlegender Programmieraufgaben, etwa zum Speichern diverser Daten. Diese sind, insbesondere bei der wiederholten Entwicklung von Programmen, für den Programmierer recht zeitintensiv. So enthielten die ersten Versionen von GTK+ etwa Datenstrukturen für verkettete Listen, Binärbäume oder „mitwachsende“ Strings. Außerdem wurde mit GTK+ ein System entwickelt, um in C objektorientiert zu programmieren. Diese Hilfsmittel erwiesen sich auch für Programme ohne grafische Oberfläche als nützlich und wurden daher später in eine separate Bibliothek ausgelagert, die GLib library of C functions. Das objektorientierte System wurde in die GObject-Bibliothek ausgelagert, systemnahe Zeichenmethoden in die GDK-Bibliothek (GTK+ Drawing Kit). Letztere ermöglicht es, dass GTK+ plattformübergreifend identisch unter anderem auf Windows, X Window System und Mac OS X laufen kann.
Die Version GTK+ 2 erhielt neue, verbesserte Funktionen zum Rendern von Text mit Hilfe der Pango-Bibliothek, eine neue Theme-Engine, eine flexiblere API und eine neuartige Bibliothek (ATK) zur Verbesserung der Zugänglichkeit des Toolkits für behinderte Menschen, mit der zum Beispiel Vorlese-Software, Vergrößerungstools und alternative Eingabegeräte angesprochen werden können. GTK+ 2 ist nicht kompatibel zu GTK+ 1, daher mussten bestehende Anwendungen portiert werden.
Seit der Version 2.8 verwendet GTK+ die vektorbasierte Bibliothek Cairo, die zum Rendern nach Möglichkeit Hardwarebeschleunigung nutzt. GTK+ 2.24 ist die letzte Version der 2.x-Serie.
Am 10. Februar 2011 wurde die Version 3.0 veröffentlicht[2]. Viele als veraltet eingestufte Funktionen wurden entfernt sowie existierende Schnittstellen verbessert. GTK+ 3 ist nicht abwärtskompatibel zu GTK+ 2.x. Bibliotheken beider Versionen sind jedoch parallel installierbar.
GTK+ 3.0 beinhaltet unter Anderem eine neue Schnittstelle für das Zeichnen von Widgets, die nun vollständig auf Cairo basiert, eine CSS-basierte Theming-Engine, die auch animierte Zustandsübergänge erlaubt, verbesserte Layoutmöglichkeiten, ein neues Schiebeschalter-Widget, eine Applikations-Klasse, Unterstützung für mehrere Zeigegeräte (Multi-Pointer) und symbolische Icons, die ihre Farbe nach Zustand ändern können. Interne Strukturen wurden von der öffentlichen Schnittstelle getrennt und verborgen, so dass es in Zukunft leichter sein wird, Änderungen durchzuführen, ohne dass ein Schnittstellenbruch entstehen muss. Des Weiteren werden mehrere GDK-Backends gleichzeitig innerhalb der selben Bibliothek unterstützt.[3] Bisher waren dafür verschiedene Bibliotheken notwendig.
Mit GTK+ 3.2 wurden zwei neue Backends eingeführt: eines für den Anzeige-Server Wayland und ein HTML5-Backend Namens Broadway, mit dem GTK+-Anwendungen übers Netz ferngesteuert im Browser bedient werden können.[4]
Programmierbeispiel
Der klassische Weg, um mit GTK+ zu programmieren, ist, zunächst die Eigenschaften der verwendeten Grafikelemente festzulegen, sie dann zu gruppieren und mit bestimmten Ereignisbehandlungsroutinen zu verknüpfen (ein mögliches Ereignis wäre zum Beispiel der Klick auf eine Schaltfläche). Es existieren allerdings auch grafische Designwerkzeuge für GTK+-Oberflächen wie Glade oder das in MonoDevelop enthaltene Stetic, die einem die ersten beiden Schritte ersparen können, GTK+ um Prototyping-Fähigkeiten erweitern und es ermöglichen, Änderungen an der Oberfläche eines Programms vornehmen zu können, ohne den Quellcode der Software ändern zu müssen.
Ein typisches Hallo-Welt-Programm, welches das Fenster rechts anzeigt, könnte etwa wie folgt aussehen:
#include <gtk/gtk.h> /* Rückruffunktion - aufgerufen, wenn die Schaltfläche geklickt wurde */ void on_button_clicked (GtkButton *button, gpointer data) { g_print ("Knopf '%s' geklickt!\n", gtk_button_get_label (button)); gtk_main_quit (); /* Beendet das Programm */ } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; /* GTK+ initialisieren */ gtk_init (&argc, &argv); /* Hauptfenster erstellen, Titel setzen, Rahmenabstand setzen */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Hallo Welt!"); gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* Schaltfläche erstellen und dem Fenster hinzufügen */ button = gtk_button_new_with_label ("Hallo Wikipedia!"); gtk_container_add (GTK_CONTAINER (window), button); /* Signale mit Rückruffunktionen verbinden */ g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); g_signal_connect (button, "clicked", G_CALLBACK (on_button_clicked), NULL); /* Fenster und all seine Unterelemente anzeigen */ gtk_widget_show_all (window); /* Haupt-Ereignisschleife starten */ gtk_main (); return 0; }
Dabei wird zunächst in der Hauptroutine main ein neues Fenster erzeugt und dessen Titel sowie der Rahmenabstand zu den inneren Elementen gesetzt. Danach wird eine Schaltfläche mit entsprechender Beschriftung erzeugt und in das Fenster eingefügt. Ein Fenster ist immer auch ein Container, also ein Element, das andere Steuerelemente (Widgets) enthalten kann.
Anschließend wird das destroy-Signal, welches das Fenster-Widget z. B. beim Klick auf dessen "Schließen"-Knopf erzeugt, mit der GTK+-Funktion gtk_main_quit verknüpft, die das Programm beendet. Auch die zuvor angelegte Schaltfläche wird mit einer Rückruffunktion Namens on_button_clicked verbunden, die weiter oben implementiert ist. Für das Verbinden von Signalen mit Rückruffunktionen wird direkt auf Funktionen der GLib zurückgegriffen, deren Namenspräfix g_ statt gtk_ ist.
Da alle Steuerelemente zunächst unsichtbar sind, müssen sie sichtbar gemacht werden, entweder einzeln oder alle zusammen, durch den Aufruf von gtk_widget_show_all. Mit dem Aufruf von gtk_main wird schließlich die Haupt-Ereignisschleife gestartet, die auf Ereignisse wartet und diese dann an die entsprechenden Signale verteilt.
Die Funktion, die bei einem Klick auf die Schaltfläche ausgeführt wird, stellt exemplarisch dar, wie auf das aufrufende Steuerelement zurückgegriffen werden kann, indem dort die Beschriftung der Schaltfläche ausgelesen und in der Standardausgabe ausgegeben wird. Anschließend wird das Programm beendet. Der zweite Parameter data der Rückruffunktion kann beliebige Daten enthalten, die beim Verbinden angegeben wurden. In diesem Beispiel wird dort jedoch nur der Wert NULL, also nichts, übergeben.
Das Beispielprogramm wird mit dem Aufruf von
cc gtkhello.c -o gtkhello `pkg-config gtk+-3.0 --cflags --libs`
innerhalb des Ordners kompiliert, in dem sich die Datei befindet.Anbindungen an andere Programmiersprachen
Da GTK+ eine reine C-Bibliothek ist, lässt sie sich einfach an viele andere Programmiersprachen anbinden. Bei objektorientierten Programmiersprachen entfällt die Nutzung der GObjects, üblicherweise lassen sich dort GTK+-Objekte wie native Objekte der Programmiersprache verwenden. Die Programmiersprache Vala verwendet GObject direkt als Objektsystem und benötigt daher keine Laufzeitbibliothek für die Sprachanbindung.
Programmiersprache Name der Anbindung Programm-Beispiele C++ gtkmm Inkscape, Solang, GParted, GNote Python PyGTK (bis GTK+ 2.24.0)[5] OpenShot, PiTiVi, gPodder, Ubuntu Tweak PyGObject (ab GTK+ 3.0.0)[5] C# (Mono) GTK# Tomboy, F-Spot, Banshee, Pinta, MonoDevelop, gbrainy Vala - Shotwell, Pino, Gwibber, libunity Vorhanden, jedoch bisher seltener verwendet: Ada GtkAda Common Lisp cl-gtk2 D gtkD[6] FreeBASIC GladeToBac[7] Data2App[8], GTK+tobac[9] Fortran Pilib[10], gtk-fortran[11] Haskell Gtk2Hs Java java-gnome GNOME Split JavaScript Seed Pascal LCL Lazarus Perl gtk2-perl QEMU, slimrat, odot, Shutter PHP PHP-GTK Phoronix Test Suite Ruby Ruby-GNOME2 Alexandria Tcl Gnocl Look and Feel
Das Aussehen des Toolkits ist zum größten Teil durch den Benutzer konfigurierbar. Dazu stehen verschiedene Themes zur Auswahl, von denen einige das Aussehen anderer Benutzeroberflächen nachahmen, zum Beispiel Windows, Motif oder NextStep.
Umgebungen, die GTK+ benutzen
GNOME, Xfce, LXDE und der ROX-Desktop nutzen GTK+ als Grundlage, was bedeutet, dass die jeweiligen Programme auf GTK+ beim Zeichnen der Fensterelemente zurückgreifen. GTK+ ist aber nicht nur auf diese Desktops beschränkt; jedes GTK+-Programm kann auf einer beliebigen anderen Desktop-Umgebung, wie zum Beispiel KDE oder CDE ausgeführt werden, wenn dort die GTK+-Bibliotheken installiert sind. Um die optische Integration in Qt-basierte Desktops (z. B. KDE) zu verbessern, gibt es gtk-qt.[12] GTK+ ist auch für Microsoft Windows und Apple Mac OS X (nativ/X11) verfügbar und ermöglicht es damit, Anwendungen zu schreiben, die verhältnismäßig leicht zwischen Unix, Windows und Mac OS X portiert werden können.
Alternativen
Literatur
- Matthias Warkus: Das GTK+/GNOME-Entwicklerhandbuch, dpunkt.verlag, 2008, ISBN 978-3-89864-512-6
- Andrew Krause: Foundations of GTK+ Development, Apress, 2007, ISBN 978-1-59059-793-4
- Scott Mattocks: Pro PHP-GTK, Apress, 2006, ISBN 978-1-59059-613-5
Weblinks
Wikibooks: GTK+ mit Builder – Lern- und LehrmaterialienCommons: Bildschirmfotos von freien GTK-Programmen – Sammlung von Bildern, Videos und Audiodateien- Webseite des Projekts. Abgerufen am 16. Oktober 2011 (englisch).
- Referenzdokumentation für die aktuelle stabile Version. Abgerufen am 2011 (englisch).
- GTK+. Ein deutschsprachiges Tutorial. Abgerufen am 2011 (deutsch).
- GTK+ and Glade 3 GUI Programming Tutorial. Abgerufen am 2011 (englisch).
- Windows-Installationsprogramme auf den SourceForge-Seiten von:
- Pidgin Pidgin. Abgerufen am 2011 (englisch). ,
- gtk-win GTK+ for Windows Runtime Environment. Abgerufen am 2011 (englisch).
- Projekte zur Anbindungen für die Programmiersprachen Ada GtkAda: a complete Ada graphical toolkit. Abgerufen am 2011 (englisch). ,
- C++ gtkmm: C++ Interfaces for GTK+ and GNOME. Abgerufen am 2011 (englisch). ,
- C-Sharp GtkSharp. Abgerufen am 2011 (englisch). ,
- Common Lisp cl-gtk2. Abgerufen am 2011 (englisch). ,
- D Welcome to GtkD. Abgerufen am 2011 (englisch). ,
- FreeBasic GladeToBac. Abgerufen am 2011 (englisch). ,
- Haskell Gtk2Hs 0.12.1 pre-release packages available. Abgerufen am 2011 (englisch). ,
- Java The java-gnome User Interface Library. Abgerufen am 2011 (englisch). ,
- JavaScript Seed - GObject JavaScriptCore bridge. Abgerufen am 2011 (englisch). ,
- Perl gtk2-perl. Abgerufen am 2011 (englisch). ,
- PHP PHP-GTK. Abgerufen am 2011 (englisch). ,
- Python PyGTK: GTK+ for Python. Abgerufen am 2011 (englisch). ,
- Ruby Ruby-GNOME2 Project Website. Abgerufen am 2011 (englisch). ,
- Tcl Tcl meets GTK+ and Gnome. Abgerufen am 2011 (englisch).
Einzelnachweise
- ↑ The GTK+ Project: Team. Abgerufen am 2011 (englisch).
- ↑ GTK+ 3.0.0 released. Abgerufen am 16. Oktober 2011 (englisch).
- ↑ Multiple backends for GTK+. Abgerufen am 16. Oktober 2011 (englisch).
- ↑ Demonstration des HTML5 Broadway Backends. Abgerufen am 16. Oktober 2011 (englisch).
- ↑ a b [ANNOUNCE PyGTK 2.24.0.] 8. April 2011, abgerufen am 2011 (englisch).
- ↑ gtkD. Abgerufen am 2011 (englisch).
- ↑ GladeToBac. Abgerufen am 2011 (englisch).
- ↑ Data2App. Abgerufen am 2011 (englisch).
- ↑ GTK+tobac. Abgerufen am 2011 (englisch).
- ↑ Pilib. Abgerufen am 2011 (englisch).
- ↑ gtk-fortran. Abgerufen am 2011 (englisch).
- ↑ gtk-qt. Abgerufen am 2011 (englisch).
Wikimedia Foundation.