GTK (Programmbibliothek)

GTK

GTK-Logo
Gtk3-demo
gtk3-demo zeigt Steuerelemente
Basisdaten

Entwickler Das GTK-Team
Erscheinungsjahr 1998[1]
Aktuelle Version 4.16.7[2]
(24. November 2024)
Betriebssystem Unix, Linux, macOS, Windows
Programmier­sprache C[3]
Kategorie GUI-Toolkit
Lizenz GNU Lesser General Public License, Version 2.1[4][5]
deutschsprachig ja
gtk.org
GTK3 Widget Factory

GTK (früher GTK+,[6] GIMP-Toolkit) ist ein freies GUI-Toolkit unter der LGPL. GTK enthält viele Steuerelemente, mit denen sich grafische Benutzeroberflächen (GUI) für Software erstellen lassen.

Die Bibliothek 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 von den Desktop-Umgebungen Gnome, Xfce, LXDE, Cinnamon, Pantheon und Budgie sowie von einer Vielzahl weiterer Anwendungen verwendet und ist somit, neben Qt, das erfolgreichste GUI-Toolkit für das X Window System.

Geschichte und Entwicklung

[Bearbeiten | Quelltext bearbeiten]
Altes Logo

GTK ist in der Programmiersprache C geschrieben. Die erste Version von GTK+ erschien im April 1998.[1] 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 macOS 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.

Ab Version 2.8 verwendet GTK+ die vektorbasierte Bibliothek Cairo, die zum Rendern nach Möglichkeit Hardwarebeschleunigung nutzt. GTK+ 2.99.3 vom 1. Februar 2011 ist die letzte Version der 2.x-Serie.[7]

Am 10. Februar 2011 wurde Version 3.0 veröffentlicht.[8] 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 enthält 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 derselben Bibliothek unterstützt.[9] Bisher waren dafür verschiedene Bibliotheken notwendig.

Mit GTK+ 3.2 wurden zwei neue Backends eingeführt: eines für den Display-Server Wayland und ein HTML5-Backend namens Broadway, mit dem GTK+-Anwendungen übers Netz ferngesteuert im Browser bedient werden können.[10]

GTK+ 3.4 unterstützt Multitouch und sanften Bildlauf und ist auch für Windows verfügbar.[11]

GTK+ 3.6 unterstützt CSS-Animationen und verwischt Schatten. Version 3.6.4 ist die letzte offizielle Version für Windows 32-bit und 64-bit.[12]

GTK+ 3.8 unterstützt Wayland in wichtigen Teilen nativ.[13]

GTK+ 3.10 entfernt die Möglichkeit Tastenkürzel individuell an den Benutzer anzupassen.[14] Zudem wird Wayland experimentell unterstützt und die Anzeige für hochauflösende Monitore verbessert.[15]

GTK+ 3.12 führt Popover ein. Diese Comic-Sprechblasen sind als Hilfe einsetzbar. Wayland-Support wurde verbessert.[16]

GTK+ 3.14 unterstützt Multitouch-Gesten.[17][18]

GTK+ 3.16 unterstützt das Rendern von Fenstern durch OpenGL. Auch wurde mit dem neuen Steuerelement GtkGLArea ermöglicht, 3D-Objekte direkt in Programmoberflächen einzubinden.[19][20]

GTK+ 3.18 unterstützt als Grundlage von Gnome 3.18 offiziell Wayland, den Nachfolger des X Window System.[21]

GTK+ 3.20 integriert mit gspell die Rechtschreibprüfung und verbessert das CSS-Theming.[22]

GTK+ 3.22 ist die letzte stabile Version von GTK+ 3 und wurde drei Jahre lang als LTS-Version gepflegt. Hauptmerkmal dieser Version sind die neuen Flatpak-Portale für einfache Installationen von Software.[23]

GTK+ 3.24 wurde im Juni 2018 als allerletzte Version zu GTK+ 3 für Herbst 2018 angekündigt, da sich GTK 4.0 verzögerte.[24] Stand Mai 2024 ist Version 3.24.41 die zuletzt aktualisierte LTS-Version, die im Januar 2023 veröffentlicht wurde.[25]

Im Februar 2019 wurde bekannt gegeben, dass GTK 4.0 das Plus-Zeichen („+“) aus dem Namensbestandteil entfernen wird.[6]

In GTK 4 werden Wayland und Vulkan mehr und besser unterstützt. Mehr Barrierefreiheit wurde auch realisiert. Gnome 40 ist dabei das abgestimmte Pendant auf Linux-Seite.[26] Fedora 34 war die erste große Linux-Variante, die GTK 4 mit Gnome 40 im April 2021 vorstellte.[27] Zudem wurde die in GTK+ 2 vorhandene Möglichkeit Tastenkürzel individuell an den Benutzer anzupassen endgültig entfernt.[28]

GTK 4.0 wurde am 16. Dezember 2020 offiziell vorgestellt. Highlights sind Verbesserungen im OpenGL-Renderer und ein neuer Vulkan-Renderer mit mehr schneller GPU-Unterstützung sowie besserer macOS- und Windows-Support neben vielen anderen Dingen.[29]

GTK 4.2 wurde im 30. März 2021 vorgestellt mit neuem OpenGL-Renderer NGL als Default.[30]

Über das Quartz-Backend,[31] eine Portierung des X Window System, kann GTK auf macOS genutzt werden.[32] Mit GTK 4.0 wurde die Unterstützung von macOS stark verbessert.

  • Nach GTK 2.24.10 und 3.6.4 wurde die Windows-Entwicklung mit Installer bei Gnome eingestellt. Es wird empfohlen, das Paket-System MSYS2 von Gnome auf Windows zu installieren.[33] MSYS2 unterstützt auch schon GTK 4.[34]
  • GTK 2.24.10 und 3.6.4 sind weiterhin im Netz verfügbar, jedoch gegenüber den aktuellen Versionen in Linux erheblich mehr durch Fehler belastet.[35][36]
  • Für Windows 64-bit (Stand Januar 2021) ist nun durch die Arbeit von Tom Schoonjans 2.24.33 (aktuell wie Linux) und 3.24.24 (aktuell wie Linux) verfügbar.[37]
  • Mit Windows 10 Fall Creators Update steht dort nun auch GTK 3 im WSL zur Verfügung. Eine Anleitung zum Installieren von Programmen mit Fenstern ist in der GTK-Community vorhanden.[38] GTK 4 ist für die Version 20H2 und 21H1 im WSL verfügbar abhängig von der gewählten Linux-Distribution.

Programmierbeispiel

[Bearbeiten | Quelltext bearbeiten]
The GTK toolkit

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.

Die Darstellung dieses Programms

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 gcc 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

[Bearbeiten | Quelltext bearbeiten]

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.

Hallo Welt in Perl
Programmiersprache Name der Anbindung Programm-Beispiele
C++ gtkmm Inkscape, Solang, GParted, GNote
Python PyGTK (bis GTK 2.24.0)[39] OpenShot, gPodder, Ubuntu Tweak
PyGObject (ab GTK 3.0.0)[39] Pitivi, Lollypop, GNOME Music, Meld
C# (Mono) GTK# Tomboy, F-Spot, Banshee, Pinta, MonoDevelop, gbrainy
Vala - Shotwell, Geary, Corebird, Elementary OS, libunity
JavaScript Gjs Gnome Shell, GNOME Maps, Polari
Vorhanden, jedoch bisher seltener verwendet:
Ada GtkAda
Common Lisp cl-gtk2[40]
D gtkD[41] Tilix
FreeBASIC GladeToBac[42] Data2App,[43] GTK+tobac[44]
Fortran gtk-fortran[45]
Go Go-GTK[46]
Haskell Gtk2Hs
Java java-gnome GNOME Split
Julia Gtk.jl
Objective-C CoreGTK[47]
OCaml LablGTK
Pascal LCL Lazarus
Perl gtk2-perl[48] slimrat, odot, Shutter
PHP PHP-GTK[49] Phoronix Test Suite
Racket gui-lib drracket
Ruby Ruby-GNOME2 Alexandria
Rust Gtk-rs[50] systemd-manager[51]
Tcl Gnocl

Grafischer Stil

[Bearbeiten | Quelltext bearbeiten]

Das Aussehen des Toolkits ist zum größten Teil durch den Benutzer konfigurierbar. Dazu stehen verschiedene Themes zur Auswahl.

Beispiel für Clearlooks 2.20

Von 2005 bis 2014 verwendete GTK Clearlooks als Theme.[52]

Beispiel für Adwaita

Seit Mitte 2014 ist Adwaita das neue Standardtheme von GTK.[53]

Desktop-Umgebungen, die GTK benutzen

[Bearbeiten | Quelltext bearbeiten]

Die Desktop-Umgebungen Gnome, Cinnamon, MATE, Xfce, LXDE, Pantheon von Elementary OS und der ROX Desktop bauen selbst auf GTK auf, was bedeutet, dass deren Fenstermanager beim Zeichnen der Fensterelemente auf GTK zurückgreifen und die zugehörigen Programme mit GTK entwickelt wurden.

GTK ist aber nicht nur auf diese Desktops beschränkt; jedes GTK-Programm kann in einer beliebigen anderen Desktop-Umgebung, wie zum Beispiel KDE oder CDE, ausgeführt werden, sofern auf dem System die GTK-Bibliotheken installiert sind. Um die optische Integration in Qt-basierte Desktops (z. B. KDE) zu verbessern, gibt es u. a. gtk-qt.[54] GTK ist auch für Windows und macOS (nativ/X11) verfügbar und ermöglicht es damit, Anwendungen zu schreiben, die verhältnismäßig leicht zwischen Unix, Windows und macOS portiert werden können.

Wikibooks: GTK mit Builder – Lern- und Lehrmaterialien

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. a b Matthias Clasen: GTK+ History. In: people.redhat.com. Abgerufen am 12. Mai 2024 (englisch).
  2. 4.16.7. 24. November 2024 (abgerufen am 24. November 2024).
  3. The gtk Open Source Project on Open Hub: Languages Page. In: Open Hub. (abgerufen am 18. Juli 2018).
  4. In: Free Software Directory.
  5. Overview of GTK+ and its Libraries. (englisch, abgerufen am 28. Juli 2017).
  6. a b Emmanuele Bassi: Project rename to "GTK". In: Gnome Mailingliste. 6. Februar 2019, abgerufen am 7. Februar 2019 (englisch).
  7. https://ftp.fau.de/gnome/sources/gtk+/2.99/gtk+-2.99.3.changes
  8. GTK+ 3.0.0 released. In: Gnome Mail Service. 10. Februar 2011, abgerufen am 16. Oktober 2011 (englisch).
  9. Kristian Høgsberg: Multiple backends for GTK+. In: Casually Defiant. 3. Januar 2011, abgerufen am 16. Oktober 2011 (englisch).
  10. Alexander Larsson: Demonstration des HTML5 Broadway Backends. In: blogs.gnome.org. 18. April 2011, abgerufen am 16. Oktober 2011 (englisch).
  11. Thorsten Leemhui: GTK+ 3.4 mit Multitouch- und Windows-Unterstützung. In: heise.de. 28. März 2012, abgerufen am 3. Februar 2024.
  12. Thorsten Leemhui: Neue Versionen von GTK+, GLib und Clutter. In: heise.de. 25. September 2012, abgerufen am 3. Februar 2024.
  13. Oliver Diedrich: Gtk+ 3.8 bringt Wayland-Support. In: heise online. 27. März 2013, abgerufen am 4. Dezember 2020.
  14. Make Keyboard shortcuts changeable again in ≥GTK+3.10 and GTK4 (#5242). In: gitlab.gnome.org. 10. Oktober 2022, abgerufen am 12. Mai 2024 (englisch).
  15. Oliver Diedrich: Gtk+ 3.10 mit verbesserter Wayland-Unterstützung. In: heise online. 24. September 2013, abgerufen am 4. Dezember 2020.
  16. Thorsten Leemhuis: Angesehen: Gnome 3.12. In: heise online. 27. März 2014, abgerufen am 4. Dezember 2020.
  17. Oliver Diedrich: Gnome 3.14 mit Multitouch. (PDF; 93 kB) In: Heise Online. 3. Oktober 2014, S. 38, abgerufen am 12. Mai 2024.
  18. Keywan Tonekaboni, Oliver Diedrich: GUADEC: Wayland-Support für Gnome. In: Heise Online. 4. August 2013, abgerufen am 12. Mai 2024.
  19. Willkommen bei GNOME 3.16. In: GNOME Help. Abgerufen am 4. Dezember 2020.
  20. Thorsten Leemhuis: Linux-Desktop: Neues Gnome zeigt Nachrichten oben. In: Heise online. 25. März 2015, abgerufen am 4. Dezember 2020.
  21. Thorsten Leemhuis: Linux-Desktop Gnome 3.18 mit Google-Drive-Support freigegeben. In: Heise Online. 23. September 2015, abgerufen am 4. Dezember 2020.
  22. Rainald Menge-Sonnentag: GUI-Toolkit GTK+ 3.20 verbessert das CSS-Theming. In: Heise online. 22. März 2016, abgerufen am 4. Dezember 2020.
  23. Rainald Menge-Sonnentag: GUI-Toolkit GTK+ 3.22 bringt Flatpak-Portale. In: Heise online. 20. September 2016, abgerufen am 4. Dezember 2020.
  24. Michael Larabel: GTK+ 3.24 To Deliver Some New Features While Waiting For GTK4. In: Phoronix. 23. Juni 2018, abgerufen am 12. Mai 2024 (englisch).
  25. Matthias Clasen: Post-release version bump. In: gitlab.gnome.org. 24. Januar 2024, abgerufen am 12. Mai 2024 (englisch).
  26. Silke Hahn: Gnome-Toolkit für GUI: GTK 4.0 erscheint nach 4 Jahren und ist grunderneuert. In: heise.de. 17. Dezember 2020, abgerufen am 3. Februar 2024.
  27. Sven Bauduin: Gnome 40: Neue Shell UX für Linux offiziell erschienen. In: Computerbase. 19. März 2021, abgerufen am 13. November 2024.
  28. Make Keyboard shortcuts changeable again in ≥GTK+3.10 and GTK4. In: gitlab.gnome.org. 17. September 2023, abgerufen am 13. November 2024.
  29. Michael Larabel: GTK 4.0 Toolkit Officially Released. In: Phoronix. 16. Dezember 2020, abgerufen am 13. November 2024 (englisch).
  30. Michael Larabel: GTK 4.2 Released With NGL Renderer By Default. In: Phoronix. 30. März 2021, abgerufen am 13. November 2024 (englisch).
  31. Projects/GTK/OSX - GNOME Wiki! Abgerufen am 4. Dezember 2020.
  32. Setting up GTK for Mac OS. In: The GTK Project. Abgerufen am 13. November 2024 (englisch).
  33. Setting up GTK for Windows. In: The GTK Project. Abgerufen am 13. November 2024 (englisch).
  34. Base Package: mingw-w64-gtk4. In: MSYS2 Packages. Abgerufen am 13. November 2024 (englisch).
  35. GTK+ for Windows Runtime Environment. Abgerufen am 4. Dezember 2020 (englisch).
  36. GTK+. Abgerufen am 4. Dezember 2020.
  37. Tom Schoonjans: tschoonj/GTK-for-Windows-Runtime-Environment-Installer. 2. Dezember 2020, abgerufen am 4. Dezember 2020.
  38. Windows Subsystem for Linux: Installation des WSL und Konfiguration von Gnome unter Windows 10. Abgerufen am 4. Dezember 2020.
  39. a b [ANNOUNCE] PyGTK 2.24.0. 8. April 2011, abgerufen am 15. Oktober 2011 (englisch).
  40. cl-gtk2 im CLiki. Abgerufen am 1. April 2015 (englisch).
  41. gtkD. Abgerufen am 15. Oktober 2011 (englisch).
  42. GladeToBac. Abgerufen am 15. Oktober 2011 (englisch).
  43. Data2App. Abgerufen am 15. Oktober 2011 (englisch).
  44. GTK+tobac. Abgerufen am 15. Oktober 2011 (englisch).
  45. gtk-fortran. Abgerufen am 15. Oktober 2011 (englisch).
  46. Go-GTK. Abgerufen am 6. April 2012 (englisch).
  47. CoreGTK. Abgerufen am 27. März 2020 (englisch).
  48. gtk-perl. Abgerufen am 1. Juli 2017 (englisch).
  49. PHP-GTK. Abgerufen am 2. August 2022 (englisch).
  50. Gtk-rs. Abgerufen am 20. Dezember 2016 (englisch).
  51. systemd-manager. Abgerufen am 11. Dezember 2020 (englisch).
  52. Default Theme Progress, 28. Februar 2005
  53. A new default theme for GTK+, 13. Juni 2014
  54. gtk-qt-engine. Abgerufen am 17. November 2012 (englisch).