GTK/ Ereignisse
Aus Wikibooks
Für das Thema Signale schauen wir uns erstmal noch einmal das Hallo-Welt Programm an:
#include <gtk/gtk.h> int main(int argc, char* argv[]) { GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL); gtk_container_add(GTK_CONTAINER(window), gtk_label_new("Hallo Welt!")); gtk_widget_show_all(window); gtk_main(); return 0; }
Die Zeile
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
blieb bisher immer unbeachtet. Wer das Hallo-Welt Programm kompiliert und ausführt wird feststellen, dass das Programm beendet wird wenn man den Schließenbutton drückt.
Das passiert nicht von allein. Dafür ist die Zeile da. Die Funktion g_signal_connect verbindet ein Objekt, ein Event und eine Funktion.
Halt, halt, Event? Was ist das? Ein Event wird an das Programm gesendet, wenn etwas geschieht. Um auf solch ein Event reagieren zu können, muss man GTK erstmal sagen, dass man das möchte.
Im Beispiel ist G_OBJECT(window) das Hauptfenster, das Event ist "delete_event" was versendet wird, wenn das Objekt "zerstört" werden soll und die Funktion die Aufgerufen werden soll ist gtk_main_quit, die die gtk_main Funktion beendet.
Auf diese Art können Signale und Funktionen verknüpft werden. Wofür der letzte Parameter ist, wird im nächsten Abschnitt beschrieben.
[Bearbeiten] Benutzerdaten für Signale
Wofür ist denn nun der letzte Parameter da? In den meisten Fällen scheint er NULL zu sein. Und wofür ist der Zeigerparameter da, der in unserer Signalfunktion definiert wurde? Wofür der Parameter widget steht, wissen wir ja schon, er enthält einen Zeiger auf das angeklickte Widget. Und der andere Parameter? Er kann Nutzdaten enthalten. Besser gesagt, Zeiger auf Nutzdaten. Damit könnte man beispielsweise eine einzige Routine für mehrere Widgets nutzen, die ähnliche Aufgaben haben oder die Funktion könnte Paramter bekommen, die nicht von alleine für diese Funktion verfügbar sind.