Kapitel 15 GTK+
In diesem Kapitel erfahren Sie, wie Sie Anwendungen mit einer grafischen Oberfläche mithilfe der beliebten GTK+-Bibliothek erstellen können.
15.1 Was ist GTK+?
GTK+ ist eine Sammlung von grafischen Objekten (Toolkits) wie Buttons, Scrollbars, Menüs und alles, was der Look & Feel-Mensch eben kennt, um Programme mit einer grafischen Oberfläche zu erstellen. Die grafischen Objekte werden hierbei auch als Widgets bezeichnet – genauer, da hier ja von GTK+ die Rede ist, das GTK+ Widget Set. Außerdem ist GTK+ freie Software im Sinne der GNU LGPL-Lizenz.
GTK+ selbst wurde während der Entwicklung des GNU-Image-Manipulation-Programms »erschaffen«, das Sie wohl als GIMP kennen (sollten). GIMP ist ein professionelles Open-Source-Bildbearbeitungsprogramm (das mit dem Programm Adobe Photoshop vergleichbar ist (abgesehen von der Bedienung)), das in Kalifornien von den Studenten Spencer Kimball und Peter Mattis 1995 aus dem Feuer gehoben wurde. Zu dieser Zeit wurde allerdings nicht GTK+ als Toolkit verwendet, sondern Motif. Mit der Zeit waren die Entwickler aber recht unzufrieden mit der Unflexibilität von Motif, und just wurde 1996 GTK+ (kurz für GIMP ToolKit) entwickelt. Ein weiterer Nachteil von Motif wahr wohl auch, dass es sich hierbei um ein kommerzielles Toolkit handelte. Das Plus (+) von GTK wurde ein Jahr später hinzugefügt, womit die Entwickler anzeigen wollten, dass GTK+ objektorientiert wurde (wohlgemerkt, aber in C geschrieben!).
Natürlich basiert GTK+ auf dem X Window-System. Wenn Sie einen Blick in die Quellcodes der GTK+-Bibliotheken werfen (genauer GDK), werden Sie viele Funktionsaufrufe der X-Bibliotheken wieder erkennen (wieder ein Vorteil, das Thema im Buch behandelt zu haben). Aber dennoch sollten Sie jetzt nicht den Fehler machen und denken, die GTK+-Bibliothek sei nichts anderes als »nur« eine Wrapper-Bibliothek zum X Window-System. Abgesehen davon, dass die Datenstrukturen und Datentypen anders als bei den anderen Toolkits aussehen, besitzt GTK+ weitaus mehr Widgets als die meisten der anderen X-Toolkits. Wie auch immer, da Sie die Grundlagen des X Window-Systems kennen, wissen Sie auch, warum GTK+ arbeitet, wie es eben soll.
Hinweis Bitte verzeihen Sie mir im Verlaufe des Textes die Mischung aus englischen und deutschen Wörtern. Häufig ist der englische Begriff geläufiger, weshalb auf eine Eindeutschung weitgehend verzichtet wird.
|
15.1.1 Was sind GDK und Glib?
Im Zusammenhang mit der Verwendung von GTK+ werden häufig auch die Bibliotheken GDK und Glib erwähnt bzw. verwendet. In der Kurzfassung fügt sich das Puzzle wie folgt zusammen: Glib ist das Fundament mit den grundlegenden Datenstrukturen und Hilfsfunktionen, GDK ist die Schnittstelle zu X11, und GTK+ liegt oben drauf. Die folgende Grafik soll Ihnen den Aufbau von GTK+ zeigen:
GDK ist also das GTK+-Zeichnen-Toolkit und nichts anderes als eine Wrapper-Bibliothek für die Xlib. Die Wrapper-Bibliothek GDK, zwischen X und der GTK+-Bibliothek, ist daher nötig, weil GTK+ seine eigenen Datenstrukturen und Datentypen besitzt. Gewöhnlich verwenden Sie GDK-Funktionen, wenn Sie Grafiken zu Ihrer Anwendung hinzufügen wollen. Mit Grafiken sind hierbei Dinge gemeint wie das Zeichnen von Linien, Kreisen, Ellipsen, Rechtecken oder das Erzeugen von Icons und die Verwendung von Farben oder Fonts. Da GDK eigentlich auf der Xlib aufbaut, ist es eine Bibliothek einer etwas niedrigeren Ebene, was auch bedeutet, dass hierbei mit Fenstern anstatt mit Widgets gearbeitet wird! Natürlich können Sie auch hier den (nicht ganz so) harten Weg gehen und, wie schon bei der Xlib, Anwendungen rein nur mit GDK-Funktionen schreiben – wovon ich Ihnen aber wie schon beim Schreiben von grafischen Anwendungen mit der Xlib abraten kann. Sofern Sie also Funktionen der Xlib verwenden wollen, sollten Sie auf die entsprechende Wrapper-Funktion von GDK zurückgreifen, und das nur dann, wenn Sie Grafiken zu Ihrem Programm hinzufügen wollen.
Glib (nicht zu verwechseln mit Glibc) ist eine Art Hilfsbibliothek, was heißt, ohne diese Bibliothek würde das GTK+-Leben auch existieren. Mit der Glib lassen sich viele Aufgaben wie Stringmanipulationen, Datenstrukturen, binäre Bäume oder Hashtabellen enorm einfacher erstellen. Des Weiteren liefert Ihnen die Glib eine Menge hilfreicher Routinen für den täglichen Gebrauch von C mit. Sprich, die Glib beinhaltet adressierte Standard-C-Funktionen wie z. B. malloc() (g_malloc()) oder printf() (g_printf()), die aber im Gegensatz zu den Standardfunktionen von C eine eingebaute Fehlerbehandlung besitzen und bei einem Problem, das während eines Vorgangs auftritt, automatisch mit g_error() (Glib-Version für perror()) eine Fehlermeldung ausgeben. Aus Portabilitätsgründen rate ich Ihnen, die Funktionen der Glib zu verwenden, weil diese zumindest zuverlässiger sind als die Portabilität von Standardfunktionen (traurig, aber wahr).
15.1.2 Schnittstellen von GTK+ zu anderen Programmiersprachen
Um Anwendungen mit der GTK+-Bibliothek zu schreiben, müssen Sie nicht unbedingt C verwenden. Zwar wurde GTK+ komplett mitsamt dem objektorientierten Konzept in C geschrieben, aber es sind trotzdem eine Menge Sprachanbindungen vorhanden, C++, Ada, Perl/Gtk, Python, PHP, Pascal und noch eine Menge mehr. Für weitere diesbezügliche Informationen sei die Webseite von GTK als erste Anlaufstelle empfohlen (www.gtk.org).
15.1.3 GTK+ und GNOME
Der GNOME-Desktop erfreut sich neben dem KDE-Desktop in der Linux-Welt größter Beliebtheit – so beliebt, dass RedHat diesen Desktop als Standard-Desktop verwendet. Auf den meisten Rechnern dürfte wohl neben dem KDE- auch der GNOME-Desktop installiert sein (wer die Wahl hat, hat die Qual). Der Desktop sei deswegen hier erwähnt, weil das komplette GNOME-Projekt mit dem GTK+-Toolkit entwickelt wurde. Somit ist im Prinzip jede GNOME-Anwendung eine GTK+-Anwendung.
GNOME-Anwendungen werden aber mittlerweile nicht mehr mit reinem GTK+-Code erstellt, sondern schon mit einer GNOME-eigenen Bibliothek – die mittlerweile mehr als nur noch eine Erweiterung von GTK+ darstellt. Wobei sich hier die Entwickler in zwei Lager spalten, den GTK+-Puristen, die sich weigern, die GNOME-Bibliothek zu verwenden, da angeblich die schlanken GTK+-Programme unnötig fett würden. (Das tun sie in der Tat – aber keine Angst, Gleiches gilt auch für QT3 und KDE. Sie werden vielleicht von der Bytegröße her nicht fett, aber man muss wegen einer Lieblingsanwendung 1000 Pakete darauf installieren). Und da sind dann die GNOME-Anhänger, die eben auch wieder viele gute Argumente für ihre GNOME-Bibliothek parat haben. Allerdings kann man sagen (um möglichst neutral zu bleiben), dass beide Bibliotheken durchaus ihre Vor- und Nachteile haben.
Aber die GNOME-Bibliothek ist hier nicht das Thema, weshalb ich Ihnen dazu bei Interesse das Buch GNOME 2.0 von M. Warkus ans Herz legen möchte.
Dennoch sollte hier nicht der Eindruck entstehen, GTK+ sei abhängig vom GNOME-Desktop. Diese Bibliothek können Sie überall dort einsetzen, wo eben diese Bibliothek existiert – also auch jenseits der Linux-Welt (aber diese Welt steht hier nicht zur Debatte).
15.1.4 GTK+ Version 1.2 und 2.x
In diesem Buch wird GTK+ in der Version 2.x beschrieben, was zwangsläufig bedeutet, dass die meisten Beispiele nicht mehr mit der Version 1.2 kompatibel sind. In der zweiten Versionsnummer von GTK+ ist eine Menge Neuheiten hinzugekommen, welche die Erstellung von GTK+-Anwendungen erheblich erleichtern. Vor allem ist die zweite Version von GTK+ noch »objektorientierter« geworden. Viele Funktionen wurden hierbei gegen andere ausgetauscht. Sofern Sie sich hier mit den Versionen herumschlagen müssen, sollten Sie sich Incompatible Changes from 1.2 to 2.0 auf der Webseite von http://www.gtk.org/ (oder auf der Buch-CD) ansehen.
Sofern Sie auf eine 1.2-Version von GTK+ zurückgreifen müssen (wollen), finden Sie auch auf der Buch-CD ein Extra mit über 100 Seiten, das ursprünglich für dieses Buch geschrieben wurde, aber aus aktuellen Gründen hier dann doch nicht abgedruckt wurde, wobei die Beispiele auf der Buch-CD zum größten Teil mit eventuell kleinen Modifikationen auch mit der 2.x-Version ausführbar sind. Sprich: Auch wenn Sie mit der Versionsnummer 2.x loslegen wollen, kann sich ein Blick in dieses Extrakapitel auf der Buch-CD lohnen.
Außerdem schläft die Weiterentwicklung von GTK+ nicht, weshalb es sich empfiehlt, regelmäßig auf der Homepage von GTK+ im GTK+ 2.x.x Release Announcement zu lesen, was denn neu hinzugekommen ist. Aktuell bei Druck des Buchs ist die Version 2.4.1.
15.1.5 GTK+-Aufbau des Kapitels
Der Umfang von GTK+ ist enorm, und es würde Sinn ergeben, hierzu ein ganzes Buch zu schreiben. Da Sie hier nur ein Kapitel zur Verfügung haben, sollen Sie auch maximalen Nutzen daraus ziehen können.
Dank der sauberen Strukturierung ist die Verwendung von GTK+ recht einfach, wenn man sich ein wenig intensiver damit befasst. Nur sollten Sie immer die GTK+-Funktionsreferenz, die als HTML-Version von der GTK+-Homepage zu beziehen ist (auch auf der Buch-CD), parat halten, um über die umfangreichen, aber gut strukturierten API-Funktionen den Überblick zu behalten. Es empfiehlt sich also, parallel zu diesem Buch, zum entsprechenden Thema auch die Referenz zu studieren.
Dieses Kapitel kann Ihnen nur zu jedem Beispiel eine Einführung geben. Wird z. B. das Kapitel der Fenster behandelt, so finden Sie eine Einführung, wie man ein Fenster erstellt, anzeigt und wie Sie die Ereignisse des Fensters auswerten können. Dennoch gibt es zu jedem Widget noch eine fast unüberschaubare Menge an weiteren Funktionen und Eigenschaften, die Sie verwenden könnten. Meistens jedoch handelt es sich um selbst sprechende Funktionsnamen wie gtk_window_set_resizable() oder gtk_window_set_policy().
Des Weiteren muss erwähnt werden, dass die Erstellung einer GTK+-Anwendung mittlerweile recht flexibel geworden ist – sprich, es gibt mehrere Wege, um ans Ziel zu kommen. Als Beispiel wäre hier die Erzeugung eines Widgets selbst zu erwähnen. Z. B. kann ein Widget mit dem Funktionsaufruf gtk_widgetname_new() erzeugt werden. Eine weitere Möglichkeit hat man hingegen mit der Funktion g_object_new(GTK_TYPE_WIDGETNAME ...). Dies sollte nur erwähnt werden, um Missverständnisse zu beseitigen, wenn Sie z. B. das GTK+-Tutorial von der GTK-Homepage gelesen haben oder noch lesen wollen (sehr zu empfehlen).
Im Buch werden auf jeden Fall, sofern dies möglich ist, die Widgets mit g_object_new() erzeugt, und meistens werden hiermit gleichzeitig auch die Eigenschaften des Widgets gesetzt. Zum Abfragen der Attribute kann natürlich weiterhin die klassische Methode mit gtk_einwidget_get_einwert() verwendet werden oder die Möglichkeit mit g_object_get() zum Abfragen der Eigenschaften oder des Zustands eines Widgets.
Somit ist der Aufbau der einzelnen Abschnitte immer recht ähnlich. Zuerst folgt eine kurze Beschreibung dessen, was kommt, dann ein Listing, das die einzelnen Widgets demonstriert. Anschließend folgt eine Beschreibung der einzelnen Widgets mitsamt ihren wichtigsten Eigenschaften, die hierfür verwendet (gesetzt bzw. abgefragt) werden können.
Hinweis Auch wenn GTK+ das objektorientierte Konzept verwendet, ist es nicht Voraussetzung, dass man schon selbst objektorientiert programmiert hat.
|
|