Tutorial
Gtk - Signale
von Stueber | Seite 1 von 1 |
Was ist ein Signal?
In den letzten zwei Tutorials (Teil 1, Teil 2) hast du eine Oberfläche erstellt mit Buttons. Soweit so gut, aber Buttons nützen noch nicht viel. Auf die Buttons muss ja auch reagiert werden. Dafür ist ein Signal da. Gtk definiert für jedes Steuerelement Signale und deine Aufgabe ist es, die Callback-Funktionen zu schreiben. Eine Callback Funktion ist eine Funktion, die mit einem Signal verbunden wurde, und tut das, was eben als Reaktion auf das Signal gewünscht ist. Signale sind damit ein Ersatz für Schleifen, die auf INKEY oder GETMOUSE warten (Stichwort: Ereignisschleife).
Wie schreibe ich eine solche Callback-Funktion?
Zuerst musst du ein normales Unterprogramm (Sub) schreiben. Dieses Sub muss genau zwei Parameter haben, außer wenn vom Signal anders gewünscht. Der erste ist immer vom Typ GtkWidget ptr und zeigt auf das betreffende Steuerelement. Der letzte ist vom Typ gpointer und ist jetzt noch uninteressant für dich.
Gtk ist, wie du vielleicht schon gehört hast, in C geschrieben. Daher musst du das Sub mit cdecl deklarieren (siehe Eintrag in der Befehlsreferenz).
Verbinden von Signal und Callback
Jedes Steuerelement hat von Gtk vordefinierte Signale. Diese werden mit der Funktion g_signal_connect() mit Callback-Funktionen verbunden. Der erste Parameter ist das GtkWidget, der zweite der Name des Signals, der dritte ein Zeiger auf die Callback-Funktion und der vierte ist der Parameter, der als letztes an deine Callback-Funktion übergeben wird. Das wichtigste Signal für Buttons heißt "clicked". Es wird immer ausgelöst, wenn dein Button angeklickt wurde.
Beispiel
#include once "gtk/gtk.bi"
sub callback cdecl (byval widget as GtkWidget ptr, byval user_data as gpointer)
print "Button geklickt!"
end sub
gtk_init (0, 0)
dim as GtkWidget ptr win = gtk_window_new (GTK_WINDOW_TOPLEVEL)
gtk_window_set_title (GTK_WINDOW (win), "Test")
dim as GtkWidget ptr button = gtk_button_new_with_label("Button 1")
g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(@callback),0)
gtk_container_add (GTK_CONTAINER(win), button)
gtk_widget_show_all (win)
gtk_main()
Jetzt kannst du dir auch denken, was gtk_main() tut. Die Funktion wartet auf Benutzereingabe und löst dann deine Callback-Funktion aus.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|