Heim

GTK+

GIMP-Toolkit
Basisdaten
Entwickler: Das GTK+-Team
Aktuelle Version: 2.12.10
(4. Juni 2008)
Aktuelle Vorabversion: 2.13.3
(13. Juni 2008)
Betriebssystem: UNIX, GNU/Linux, Mac OS X (beta), Windows
Kategorie: Komponentenbibliothek
Lizenz: LGPL
Deutschsprachig: ja
Website: www.gtk.org

Das GIMP-Toolkit (abgekürzt: GTK+) 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 Trolltechs Qt, 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, die grundlegende Programmieraufgaben, wie das Speichern von diversen Daten, welches mit der Grafikdarstellung nichts zu tun hat, beinhalteten, da dies insbesondere bei der ständig wiederkehrenden Programmierung von Programmen für den Programmierer recht zeitintensiv ist.

So enthielten die ersten Version 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 als nützlich, die gar keine grafische Oberfläche verwenden 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. Außerdem wurden die low-level-Zeichenmethoden in die GDK-Bibliothek (GIMP Drawing Kit) ausgelagert, die es ermöglicht, dass GTK+ plattformübergreifend identisch u. a. auf Windows, X Window System und Mac OS X laufen kann.

Die neue 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 müssen bestehende Anwendungen portiert werden.

Seit der Version 2.8 verwendet GTK die vektorbasierte Bibliothek Cairo, die zum Rendern nach Möglichkeit Hardwarebeschleunigung nutzt.

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 einen Button). Es existieren allerdings auch drei grafische Designer für GTK-Oberflächen, Glade, Gazpacho und Guikachu, die einem die ersten beiden Schritte ersparen können, GTK um Prototyping-Fähigkeiten erweitern und es ermöglichen, Änderungen an der GTK-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:

  1. #include <gtk/gtk.h>
  2. #include <stdio.h>
  3.  
  4. void button_geklickt(GtkWidget *button_widget, gpointer data) {
  5.     printf("Button \"%s\" geklickt!\n",
  6.        gtk_button_get_label(GTK_BUTTON(button_widget)) );
  7.     gtk_main_quit();
  8. }
  9.  
  10. int main (int argc, char *argv[]) {
  11.     gtk_init(&argc, &argv);
  12.  
  13.     GtkWidget *window;
  14.     GtkWidget *button;
  15.  
  16.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  17.     gtk_window_set_title(GTK_WINDOW(window), "Hallo Welt!");
  18.     gtk_container_set_border_width(GTK_CONTAINER(window), 10);
  19.     g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
  20.  
  21.     button = gtk_button_new_with_label("Hallo Wikipedia!");
  22.     g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(button_geklickt), NULL);
  23.     gtk_widget_show(button);
  24.  
  25.     gtk_container_add(GTK_CONTAINER(window), button);
  26.     gtk_widget_show(window);
  27.  
  28.     gtk_main();
  29.     return 0;
  30. }

Dabei wird zunächst (in der Hauptroutine main) ein neues GTK-Fenster erzeugt (Zeile 16), außerdem Titel (Zeile 17) und Rahmenabstand (Zeile 18) gesetzt. Anschließend wird das destroy-Signal, welches das Fenster-Widget z.B. beim Klick auf die "Schließen"-Schaltfläche erzeugt, mit der GTK-Funktion gtk_main_quit verknüpft (Zeile 19). Seit Gtk+ 2 wird dabei direkt auf Funktionen der Glib zurückgegriffen (angedeutet durch den Funktionspräfix g_...).

In Zeile 21 wird eine Schaltfläche mit entsprechender Beschriftung erzeugt, der in Zeile 22 mit der Callback-Funktion button_geklickt verbunden wird, die in dem Programm in Zeile 4 implementiert wurde. Diese Funktion, die bei einem Klick auf die Schaltfläche ausgeführt wird, stellt exemplarisch dar, wie auf das aufrufende Widget zurückgegriffen werden kann, in dem es die Beschriftung des Buttons ausliest und in der Standardausgabe ausgibt. Anschließend beendet das Programm.

In Zeile 23 wird das Button-Widget allgemein sichtbar gemacht (Zeile 23), damit es – nachdem es dem Fenster-Container hinzugefügt wurde (Zeile 25), welches seinerseits auch sichtbar gemacht wird (Zeile 26) – auch angezeigt wird. Mit dem Aufruf von gtk_main in Zeile 28 wird schließlich die GTK Main Loop aufgerufen, welche ihrerseits, wie erwähnt, in neueren GTK+-Versionen auf die Implementierung in der Glib zurückgreift.

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. Unter anderem existieren Bindungen für Ruby, Ada, C++, Java, C#, D, Perl, Python, PHP, CLOS, FreeBasic, Pascal, uvm.

gtkmm (C++)

Die Bibliothek gtkmm ist eine Anbindung von GTK+ an C++, die im Rahmen des GNOME-Projekts entwickelt wird. Es ist auch möglich, gtkmm-Code mittels Glade zu erstellen. Die Bezeichnung gtkmm steht für „gtk minus minus“ oder gtk--, dem ursprünglichen Namen des Projektes, welcher als Persiflage in Anlehnung an cpp für „c plus plus“ gedacht ist.

java-gnome (Java)

Mit der java-gnome-Bibliothek, die Bestandteil der offiziellen GNOME language bindings suite ist, wird GTK an Java angebunden.

PyGTK (Python)

Die Anbindung an Python erfolgt mittels PyGTK.

GTK# (C#)

Durch die GTK#-Bibliothek des Mono-Projekts wird eine Anbindung von GTK an C# ermöglicht.

PHP-GTK (PHP)

PHP-GTK ist eine Anbindung an PHP als PHP-Erweiterung. Es ist die erste Erweiterung für PHP, die eine clientseitige grafische Oberfläche bereitstellt und wurde z. T. nur geschrieben, um zu beweisen, dass PHP eine universelle Sprache ist, die nicht nur zwangsläufig in einer Webserverumgebung laufen muss.

Ruby Gnome2 (Ruby)

Durch Ruby-Gnome2 ist es auch möglich, GTK aus Ruby heraus anzusprechen.

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 95, Motif oder NextStep.

Umgebungen, die GTK benutzen

GNOME, XFCE 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 komplett anderen Desktop-Umgebungen, 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. GTK+ ist auch für Microsoft Windows und Mac OS X (mit 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. Eine native Portierung auf Mac OS X ist noch nicht abgeschlossen.

Alternativen

 Wikibooks: GTK – Lern- und Lehrmaterialien
 Commons: Bildschirmfotos von freien GTK-Programmen – Bilder, Videos und Audiodateien