Open Source im professionellen Einsatz
Linux-Magazin 12/2001
1288

Heiratsantrag

Der Name und die Attribute der Widgets lassen sich im Eigenschaftsfenster während der gesamten Designarbeit im Detail bearbeiten und modifizieren. Insbesondere dem Inhalt der Rubrik »Signale« schenke man an dieser Stelle Beachtung: Das Anlegen eines passenden Signals und dessen Handlers erfolgt hier. Für jedes verbundene Signal wird automatisch beim Drücken des Knopfes zum Code-Generieren der entsprechende Aufruf einer Handler-Funktion erstellt und in die Datei »callbacks.c« geschrieben.

Der Bearbeitung einer Menüleiste ist ein spezieller Menü-Editor gewidmet. Er besitzt mehr oder weniger die Funktionen des Eigenschaftsfensters, ist aber gesondert für Menüs ausgelegt, wie in Abbildung 6 zu sehen ist.

Wie bei jedem GUI-Builder stellt sich irgendwann die Frage nach der Verknüpfung von automatisch generiertem und vom Programmierer geschriebenem Code. Bei Glade lässt sich diese Problematik folgendermaßen lösen:

  • Verbindung der Signale mit den Callback-Funktionen in der Datei »callbacks.c«. Ein Blick auf den Code verrät, wie's gemacht wird: Außer dem reinen Interface-Code enthalten die in der Datei »interface.c« angelegten Funktionen auch die Verknüpfungen zwischen den Handler-Funktionen aus der Datei »callbacks.c« und den Signalen, die von einem Ereignis im entsprechenden Fenster ausgelöst werden. Das alles erfolgt automatisch, man muss nur darauf achten, dass die Signale bei der Erstellung des Interface richtig (im Eigenschaftsfenster unter der Rubrik »Signale« (Abbildung 3) eingetragen werden.
  • Aufrufe von Funktionen der Interface-Datei (normalerweise Funktionen zum Öffnen eines Fensters beziehungsweise Dialogs): Die Prozedur in diesem Fall ist immer jene, die Listing 1 zeigt. Es demonstriert, wie die von Glade automatisch in »interface.c« angelegte Funktion »create_about_dialog()« innerhalb von »on_about_activate()« in der Datei »callbacks.c« aufgerufen wird.
  • Zugriff auf Widgets in der Datei »interface.c«. Hier gibt es mehrere Möglichkeiten: Eine Handler-Funktion bekommt als erstes Argument immer einen Zeiger auf jenes Widget geliefert, das das Signal für deren Aufruf auslöst. Im Falle eines Handlers zum Selektieren der Zeile einer Spaltenliste (Listing 2) sieht man, dass der Zeiger »*clist« die Adresse der im Programm angeklickten Spaltenliste erhält, um den Text der ausgewählten Zelle in der Variablen »text« zu speichern.

Listing 3 zeigt eine andere Variante: Falls das Widget der oberste Container des Interface ist, wird es mit der Funktion »gtk_widget_get_toplevel()« gewonnen. So übergibt die Funktion »on_delete_data_button_clicked()« einen Zeiger zum Hauptfenster, in dem sich das Widget »button« befindet, an die Funktion »delete_data()«.

Will man aus einer Callback-Funktion hingegen auf ein beliebiges Widget aus dem entsprechenden Interface-Code zugreifen, gibt es zwei Varianten: Listing 4 zeigt den Weg über die in »support.c« definierte Funktion »lookup_widget()«, die jedoch in Zukunft nicht mehr zur Verfügung stehen wird. Ihr übergibt man als erstes Argument den Zeiger auf ein bereits vorhandenes Widget. Als zweites Argument dient der Name des zu gewinnenden Widgets.

Bei der zweiten - und künftig bevorzugten - Möglichkeit gibt man das gewünschte Widget als »user_data« weiter. Dabei wird der Name des Ziel-Widgets explizit im Feld »Daten« des Eigenschaftsfensters (Abbildung 3) eingegeben. Die eine Zeile innerhalb der Funktion »on_add_new_data_clicked()« in Listing 5 erfüllt die Aufgabe der Funktion »lookup_widget()« aus Listing 4 und übergibt zugleich die in Abbildung 3 festgelegte Variable »telefonbuch« (Hauptfenster,Klasse »GtkWidget«) an die Funktion »add_data()«. Kurz: Ein Zeiger zum Hauptfenster in »user_data« wird an die Funktion »add_data()« gegeben.

Es verbleibt noch die Möglichkeit, von einer Callback-Funktion aus auf lokale Widgets einer Interface-Funktion zuzugreifen, aber das erfordert GTK-Kenntnisse, die den Rahmen dieses Artikels sprengen würden. Allerdings enthält die Beispiel-Applikation entsprechenden, mit Kommentaren versehenen Code.

Sobald das Interface erzeugt und der Körper der Callback-Funktionen gefüllt wurde, steht die Kompilierung des Codes an. Dafür ruft man

./autogen.sh  [--prefix=Appverzeichnis]

auf, ein Shell-Skript, das die für Glade benötigten Systemressourcen überprüft und das passende »Makefile« erstellt. Wie üblich stößt »make« nun den Übersetzungsvorgang an. Das Binary wird auf der Karteikarte »Allgemein« im Menü »Datei | Projekt Optionen« festgelegten Verzeichnis (im Beispiel »~/Telefonbuch/src/«) hinterlegt.

»make install« kopiert es ins Verzeichnis, das mit der Option »--prefix« angegeben wurde. Dieser Schritt ist während der Entwicklungsphase des Programms jedoch nicht zu empfehlen.

Wer Blut geleckt hat, kann nun anhand der Beispielapplikation erste Erfahrungen mit Glade sammeln: Neben dem Hauptfenster besteht sie aus fünf weiteren Dialogen, die den Eintrag von Daten und das Laden oder Speichern eines Telefonbuchs ermöglichen, aber auch mit Fehlerbehandlungsmechanismen ausgestattet sind. Das Speicherformat des Telefonbuchs ist übrigens identisch mit dem des »pine«-Adressbuchs.

Abbildung 5: Alles im Überblick und greifbar - der Widget-Baum.

Abbildung 6: Mit dem Menü-Editor erstellt man schnell eine Menüleiste mit unterschiedlichen Eintragsvarianten und Tastaturkürzeln.

 

Listing 1: Aufrufe von Funktionen der Interface-Datei

Ein Auszug aus »callbacks.c«:

...
void on_about_activate (GtkMenuItem *menuitem,
                        gpointer user_data)
{
  GtkWidget *about_dialog;
  ...
  about_dialog = create_about_dialog ();
  gtk_widget_show (about_dialog);
}
...

Ein Auszug aus »interface.c«:

...
GtkWidget* create_about_dialog (void)
{
  /* Code von Glade automatisch generiert.*/
}
...

 

Listing 2: Zugriff auf Widgets aus dem GUI, 1. Variante

void on_clist_select_row (GtkCList *clist,
                          gint row,
                          gint column,
                          GdkEvent *event,
                          gpointer user_data)
{
  gchar *text;
  ...
  gtk_clist_get_text(GTK_CLIST(clist),
                     row,column,&text);
  ...
}

 

Listing 3: Zugriff auf Widgets aus dem GUI, 2. Variante

void on_delete_data_button_clicked (GtkButton *button,
                                    gpointer user_data)
{
  delete_data(gtk_widget_get_toplevel(GTK_WIDGET(button)));
}

 

Listing 4: Zugriff auf Widgets aus dem GUI, 3. Variante

void on_new_file_button_clicked (GtkButton *button,
                                 gpointer  user_data)
{
  GtkWidget *main_window;
  main_window = lookup_widget (GTK_WIDGET (button),
                               "telefonbuch");
  new_file(main_window);
}

 

Listing 5: Zugriff auf Widgets aus dem GUI, 4. Variante

void on_add_new_data_clicked (GtkButton *button,
                              gpointer user_data)
{
  add_data((GtkWidget *) user_data);
}

Fazit

Die Open-Source-Bewegung hat mit Glade (und anderen GUI-Buildern) ein wichtiges Ziel erreicht: den Entwurf von User-Interfaces durch visuelle Programmierung einfacher zu machen. Das spart dem Programmierer einige Mühsal beim Aufbau einer adäquaten User-Oberfläche, so dass er sich vornehmlich auf die Entwicklung des Codes seiner Applikation konzentrieren kann.

Er muss dabei auch nicht auf die Flexibilität der eigenen Interface-Programmierung verzichten: Wer mit dem Ergebnis von Glade unzufrieden ist, richtet visuell eine Box für das entsprechende Widget ein und verknüpft den selbst geschriebenen Interface-Code damit. Das ist besonders willkommen im Falle von nicht im Palettenfenster aufgeführten Widgets: Da GTK+ erweiterbar ist, kann jeder mit etwas Erfahrung eigene Widgets bauen. Beispiele sind Bibliotheken wie GtkEditor[13], GtkExtra[14] und ZVT Terminal Widget[15].

Wo viel Licht ist, ist aber auch wenigstens etwas Schatten: So bringt Glade zur Zeit keinen eigenen Quelltext-Editor mit. Das wird sich aber wahrscheinlich ändern: Die Integration in gIDE - das Integrated Development Environment von GTK+/Gnome[16] - ist bereits geplant.

Ein anderes Manko ist, dass beim Löschen von oder bei Änderungen an einem Signal-Handler die entsprechende Callback-Funktion in der Datei »callbacks.c« nicht gelöscht beziehungsweise neu geschrieben wird, was zu Compiler-Fehlern führen kann. Bis zur Version 1.0 darf man also noch auf einiges gespannt sein. (pju)

 

Infos

[1] [http://glade.gnome.org/]

[2] [http://www.epita.fr/~theber_s/epingle/epingle.html]

[3] [http://www.gtk.org/~timj/]

[4] [http://www.penguin.cz/~grad/]

[5] [http://www.guest.net/homepages/mmotta/VDKHome/vdkbuilder.html]

[6] [ftp://ftp.gtk.org/pub/gtk/v1.2/] und [http://www.gtk.org/]

[7] [http://members.aol.com/suboner/code/Gtk/glade.html]

[8] [http://members.aol.com/suboner/code/Gtk/index.html]

[9] [http://www.troll.no/]

[10] [https://www.linux-magazin.de/pub/listings/magazin/2001/12/glade/]

[11] [http://www-4.ibm.com/software/developer/library/gnome-glade/]

[12] Thorsten Fischer: "Schnell und oberflächlich", Linux-Magazin 9/00, [http://www.linux-magazin.de/ausgabe/2000/09/Gnome/gnome.html]

[13] [http://gtkeditor.sourceforge.net/]

[14] [http://gtkextra.sourceforge.net/ ]

[15] [http://developer.gnome.org/doc/API/zvtterm/book1.html]

[16] [http://gide.pn.org/]

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Aufgetischt

    Moderne Benutzeroberflächen gestalten ist dank der GTK-Bibliothek keine Kunst für besondere Experten. Eine optisch ansprechende Gestaltung erfordert allerdings einiges an Arbeitszeit. Glade und Gazpacho gehen dem Programmierer in der GUI-Küche zur Hand.

  • Verkehrskontrolle

    Grafische Oberflächen mit GTK müssen Entwickler nicht in aufwändigem Spaghetti-Code definieren. Eine ausgefeilte Oberfläche entsteht mit dem GUI-Builder Glade per Drag&Drop. Die Beschreibung im XML-Format lesen Programme zur Laufzeit ein. So entsteht ein Netzwerk-Sniffer mit schöner Oberfläche.

  • Spurensuche

    Der Desktop mit der Pfote findet auch hierzulande immer mehr Anhänger. Damit wächst die Bedeutung von Gnome als Entwicklungsplattform, deren GUI-Toolkit GTK sogar auf Windows und Mac läuft. Dieser Artikel verhilft zur Orientierung auf den verschlungenen Entwicklungswegen.

  • GTK+

    Mit Python und GTK+ ist eine GUI-Anwendung für Linux rasch geschrieben. Mit ein wenig Installationsarbeit läuft der gleiche Code auch unter Windows und Mac OS X.

  • Perlen vor die Zwerge

    Dass Skriptsprachen inzwischen vollwertige Programmiersprachen sind, hat sich inzwischen herumgesprochen. Aber nur wenige Programmierer bauen komplette Applikationen mit grafischen Oberflächen daraus. Entsprechend wenige wissen deshalb auch, dass das wesentlich schneller geht, als es mit den etablierten Sprachen möglich wäre.

comments powered by Disqus

Ausgabe 11/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.