| 1 |
root |
1.5 |
=encoding utf8 |
| 2 |
|
|
|
| 3 |
root |
1.1 |
=head1 Gtk+2 - ein erweiterbares GUI-Toolkit |
| 4 |
|
|
|
| 5 |
|
|
=head2 Abstract |
| 6 |
|
|
|
| 7 |
root |
1.3 |
Gtk+2 (das {{G}}IMP {{T}}ool{{K}}it, Version 2) unterlief bei der |
| 8 |
|
|
Entwicklung zu Version 2 tiefgreifende Änderungen. Das Typsystem wurde |
| 9 |
|
|
stark abstrahiert, so daß Schnittstellen zu anderen Sprachen sich im |
| 10 |
|
|
wesentlichen auf das Bereitstellen des Objektsystems beschränken. |
| 11 |
|
|
|
| 12 |
|
|
In diesem Dokument wird das Toolkit Gtk2 kurz vorgestellt, wobei Erfahrung |
| 13 |
|
|
mit GUI-Programmierung vorausgesetzt wird. Im wesentlichen wird es jedoch |
| 14 |
|
|
darum gehen, einige besondere Techniken vorzustellen sowie das Toolkit von |
| 15 |
|
|
Perl aus selbst zu erweitern. |
| 16 |
root |
1.1 |
|
| 17 |
root |
1.6 |
=head1 Gtk2 und Glib, eine Übersicht |
| 18 |
root |
1.1 |
|
| 19 |
root |
1.3 |
=head2 Übersicht über die G-Module |
| 20 |
root |
1.1 |
|
| 21 |
root |
1.3 |
Es gibt eine Menge Bibliotheken, deren Namen mit G anfängt und im |
| 22 |
|
|
Dunstkreis von Gtk+ stehen. Vielleicht wäre es sinnvoll gewesen, eine neue |
| 23 |
|
|
G-Hierarchie in Perl zu begründen, so muß man sich mit einer teilweise |
| 24 |
|
|
nicht sehr logischen Namensgebung zurechtzufinden. |
| 25 |
|
|
|
| 26 |
|
|
=over 4 |
| 27 |
|
|
|
| 28 |
|
|
=item Glib |
| 29 |
|
|
|
| 30 |
|
|
Glib ist die Schnittstelle zur C<libglib> (sowie zu C<libgobject>, |
| 31 |
|
|
C<libgmodule> und C<libgthread>). Es bildet die Grundlage für das Objekt- |
| 32 |
|
|
und Typ- und Signalsystem, bietet Hilfsfunktionen zum Umwandeln von |
| 33 |
|
|
Dateinamen, Logging usf. |
| 34 |
|
|
|
| 35 |
|
|
Eine I<sehr> sauber geschriebene Bilbiothek, die auf GObject aufsetzt, |
| 36 |
|
|
läßt sich praktisch ohne zusätzlichen Schnittstellencode nutzen: sobald |
| 37 |
|
|
die entsprechenden Typen registriert wurden (geschieht meist in einer |
| 38 |
|
|
Init-Funktion) kann man Objekte instantiieren und benutzen. |
| 39 |
|
|
|
| 40 |
|
|
=item Gtk2 |
| 41 |
|
|
|
| 42 |
|
|
Dieses Modul ist eine Sammelstelle für diverse Bilbiotheken: neben |
| 43 |
|
|
C<libgtk+> auch C<libgdk>, C<libgdk_pixbuf> und C<libpango>. |
| 44 |
|
|
|
| 45 |
|
|
Sie reicht für fast alle Anwendungen aus. |
| 46 |
|
|
|
| 47 |
|
|
=item Gtk2::GLExt, Gtk2::GladeXML, Gtk2::TrayIcon und Gtk2::Spell |
| 48 |
|
|
|
| 49 |
|
|
Bieten Integration von OpenGL, GladeXML, EggTryIcon und Spell-checking für |
| 50 |
|
|
Text-Widgets. |
| 51 |
|
|
|
| 52 |
|
|
=item Gnome2 |
| 53 |
|
|
|
| 54 |
|
|
Schnittstelle zur C<libgnome> und vielem mehr. Muss man nicht |
| 55 |
|
|
benutzen, kann mir aber vorstellen, das sie für die Erstellung von |
| 56 |
|
|
Gnome-Applikationen ganz nützlich sind :) |
| 57 |
|
|
|
| 58 |
|
|
=item Gnome2::Canvas, Gnome2::GConf, Gnome2::PanelApplet, Gnome2::Print, |
| 59 |
|
|
Gnome2::Rsvg, Gnome2::VFS, Gnome2::Vte, Gnome2::Wnck. |
| 60 |
|
|
|
| 61 |
root |
1.6 |
Jede Menge Gnome-Zeugs. |
| 62 |
root |
1.3 |
|
| 63 |
|
|
=back |
| 64 |
root |
1.1 |
|
| 65 |
root |
1.6 |
=head2 Die Widgets von Gtk2 sind GObjects |
| 66 |
root |
1.1 |
|
| 67 |
root |
1.3 |
Wie jedes andere Toolkit auch, bietet Gtk2 eine Menge vorgefertigter |
| 68 |
|
|
I<Widgets>: I<Buttons>, I<Labels>, I<Frames> und andere "einfache" |
| 69 |
|
|
Widgets, aber auch komplexe, wie das I<Text>- (komplett in Unicode, |
| 70 |
|
|
einbettbare Objekte) oder das I<TreeView>- (Listen und Bäume im |
| 71 |
|
|
MVC-Modell) Widget. |
| 72 |
|
|
|
| 73 |
|
|
=begin latex |
| 74 |
|
|
|
| 75 |
|
|
\begin{figure}[h]\includegraphics{gtk2-textwidget.png}\label{Das Text-Widget}\end{figure} |
| 76 |
|
|
|
| 77 |
|
|
=end latex |
| 78 |
|
|
|
| 79 |
root |
1.6 |
Alle diese Widgets sind sogenannte I<GObjects> (davon abgeleitet sind |
| 80 |
|
|
in Gtk2 dann sogenannte I<Widgets>, GUI-Objekte), und haben folgende |
| 81 |
|
|
Features: |
| 82 |
root |
1.4 |
|
| 83 |
|
|
=over 4 |
| 84 |
|
|
|
| 85 |
|
|
=item Eine Klasse |
| 86 |
|
|
|
| 87 |
root |
1.6 |
Jedes GObject ist eine Instanz einer Klasse (C<GObjectClass>), eine |
| 88 |
|
|
Datenstruktur, die Informationen über Methoden u.ä. speichert. |
| 89 |
|
|
|
| 90 |
|
|
Eine C<GObjectClass> ist allerdings nur ein Spezialfall eines |
| 91 |
|
|
C<GType>s: Die Glib bildet ein komplettes Typsystem mit Klassen, |
| 92 |
|
|
Aufzählungen, Flags, einfachen Datentypen wie Integer oder |
| 93 |
|
|
Fließkommazahlen oder auch C-structs an. All dies ist zur Laufzeit in |
| 94 |
|
|
einer Form verfügbar, in der sich auch neue - zur Compielzeit nicht |
| 95 |
|
|
bekannte - Datentypen verwenden lassen. |
| 96 |
|
|
|
| 97 |
|
|
Schnittstellen für andere Sprachen werden dadurch einfach, da man |
| 98 |
|
|
"lediglich" die Konzepte "Datentyp", "Konverter", "Klasse", "Methode", |
| 99 |
|
|
"Bitset" usw. umsetzen muß. Konkrete Instanzen dieser Typen funktionieren |
| 100 |
|
|
zur Laufzeit automatisch. |
| 101 |
|
|
|
| 102 |
|
|
Bei einer gut geschriebenen C-Bibliothek, die auf Glib bzw. GObject |
| 103 |
|
|
aufsetzt, muß man eigetnlich nur die Initialisierungsfunktion aufrufen, |
| 104 |
|
|
die die Datentypen registriert, und kann dann sofort von Perl darauf |
| 105 |
|
|
zugreifen - ohne eine einzige XS-Funktion geschrieben zu haben. |
| 106 |
root |
1.4 |
|
| 107 |
|
|
=item Methoden |
| 108 |
|
|
|
| 109 |
|
|
Jedes GObjekt hat mindestens Methoden zum Erzeugen (C<constructor>) |
| 110 |
root |
1.6 |
und Zerstören (C<finalize>), Setzen und Lesen von Properties und eine |
| 111 |
root |
1.4 |
Spezialität von GObject - C<dispose>. Letzteres ist eine Art Anfrage an |
| 112 |
|
|
ein Objekt, sich freiwillig aufzulösen. |
| 113 |
|
|
|
| 114 |
root |
1.6 |
Gtk2 fügt noch einige weitere hinzu, wie die C<destroy>-Methode, die aktiv |
| 115 |
|
|
versucht, ein Objekt zu zerstören: In GUI-Programmen ist es manchmal |
| 116 |
|
|
schwer, alle Referenzen im richtigen Moment aufzulösen, da sie häufig |
| 117 |
|
|
zirkulär sind. Manche Objekte "leben" auch ganz eigenständig, z.B. wird |
| 118 |
|
|
ein Toplevel-Fenster im allgemeinen vom Benutzer "referenziert", was sich |
| 119 |
|
|
aber nicht notwendigerweise im Referenz-Zähler niederschlägt. |
| 120 |
|
|
|
| 121 |
|
|
Um solche Objekte loszuwerden, kann man sie bitten, sich zu |
| 122 |
|
|
I<destroyen>. Dabei gibt es alle Referenzen auf andere Objekte frei und |
| 123 |
|
|
bittet diese, sich ebenfalls zu destroyen. Dadurch werden zirkuläre |
| 124 |
|
|
Referenzen effektiv aufgebrochen. |
| 125 |
|
|
|
| 126 |
root |
1.7 |
Methoden kann man in Perl nicht direkt implementieren, dafür aber eigene |
| 127 |
|
|
Signale, die beliebige Parameter oder Rückgabewerte besitzen können und |
| 128 |
|
|
mehr oder weniger direkt von C oder anderen Sprachen aus aufgerufen werden |
| 129 |
|
|
können. |
| 130 |
root |
1.6 |
|
| 131 |
root |
1.4 |
=item Signale |
| 132 |
|
|
|
| 133 |
root |
1.6 |
Signale ähneln Methoden, Callbacks oder sogenannten "Delegates". Wie |
| 134 |
|
|
Methoden sind sie fest an eine Klasse gebunden und rufen (in C) eine |
| 135 |
|
|
Methode der Klasse auf, sobald sie ausgelöst werden. |
| 136 |
|
|
|
| 137 |
|
|
Ein Signal kann von jedem ausgelöst werden, insbesondere lösen aber |
| 138 |
|
|
Ereignisse (Events) in Gtk2 Signale aus. Der Signal-Handler eines Objektes |
| 139 |
|
|
verarbeitet das Ereignis (und beendet die Signalauslieferung) oder tut |
| 140 |
|
|
nichts, woraufhin Gtk2 ein anderes Objekt als Empfänger sucht. |
| 141 |
|
|
|
| 142 |
|
|
Zusätzlich kann man vor oder nach dem eigentlichen Signal-Handler |
| 143 |
|
|
des Objektes weitere Callbacks einklinken. Z.B. löst das Text-Widget |
| 144 |
|
|
beim Mausklick rechts ein C<populate-menu>-Signal aus, das |
| 145 |
|
|
normalerweise ein Popup-Menü generiert. Das kann man verändern oder |
| 146 |
|
|
ganz überschreiben. Und wenn man Mausklicks abfangen möchte, kann man |
| 147 |
|
|
das C<button-press-event>-Signal überschreiben und so Mausklicks vom |
| 148 |
|
|
Text-Widget fernhalten. |
| 149 |
|
|
|
| 150 |
root |
1.4 |
=item Properties (Eigenschaften) |
| 151 |
|
|
|
| 152 |
root |
1.6 |
Properties sind von der jeweiligen Klasse definierte Eigenschaften, die |
| 153 |
|
|
das Objektverhalten beeinflussen. |
| 154 |
|
|
|
| 155 |
root |
1.7 |
#TODO# |
| 156 |
|
|
|
| 157 |
root |
1.6 |
=item Schlüssel-Wert-Paare |
| 158 |
|
|
|
| 159 |
root |
1.7 |
#TODO# |
| 160 |
|
|
|
| 161 |
root |
1.4 |
=back |
| 162 |
root |
1.3 |
|
| 163 |
root |
1.6 |
=head2 Informationen über Klassen zur Laufzeit abfragen |
| 164 |
root |
1.1 |
|
| 165 |
root |
1.4 |
=head2 Leben und sterben lassen: Wie man seine Objekte wieder loskriegt |
| 166 |
|
|
|
| 167 |
|
|
=head2 Beispiel: Session-Management |
| 168 |
root |
1.1 |
|
| 169 |
root |
1.4 |
=head2 Beispiel: Glade |
| 170 |
root |
1.1 |
|
| 171 |
|
|
=head1 Teil 2 - Gtk+ als solide Grundlage für Eigenentwicklungen |
| 172 |
|
|
|
| 173 |
|
|
=head2 Perl-Objekte vs. Glib-Objekte |
| 174 |
root |
1.3 |
|
| 175 |
root |
1.7 |
=head3 Die Perl-Methode |
| 176 |
root |
1.1 |
|
| 177 |
root |
1.7 |
=head3 Die unsaubere Glib-Methode |
| 178 |
root |
1.1 |
|
| 179 |
root |
1.7 |
=head3 Die saubere Glib-Methode |
| 180 |
root |
1.1 |
|
| 181 |
root |
1.7 |
=head2 Rapid Application Development mit Glade - mein Weg |
| 182 |
root |
1.1 |
|
| 183 |
root |
1.7 |
=head2 Objekte aus anderen Sprachen nutzen |
| 184 |
root |
1.1 |
|
| 185 |
root |
1.7 |
=head1 Verweise |
| 186 |
root |
1.1 |
|
| 187 |
root |
1.7 |
=over 4 |
| 188 |
root |
1.1 |
|
| 189 |
root |
1.7 |
=item http://www.gtk.org/ |
| 190 |
root |
1.1 |
|
| 191 |
root |
1.7 |
Die Dokuemntation zu Gtk+, Glib usw. |
| 192 |
root |
1.1 |
|
| 193 |
root |
1.7 |
=item apt-get install devhelp-book-gtk2 # oder devhelp-books |
| 194 |
root |
1.1 |
|
| 195 |
root |
1.7 |
Installiert unter debian I<devhelp>, einen inetraktiven Help-Browser und |
| 196 |
|
|
das Gtk2-Buch (dazu gehört auch GObject, Glib-Doku uvm.). Sehr hilfreich |
| 197 |
|
|
beim Programmieren. |
| 198 |
root |
1.1 |
|
| 199 |
root |
1.7 |
=back |
| 200 |
root |
1.1 |
|
| 201 |
|
|
|