Ich arbeiten üblicherweise mit einem Applikations-Objekt (GObject) bzw. struct in einfacheren Fällen. Dazu verwende ich während der Entwicklungszeit eine Magic-Number, die mir bei der Fehlersuche schon sehr oft geholfen hat. Hier ein Beispiel:
Code:
#define MAGIC 0x39a7b26f /* zufällig! */
typedef struct {
/* was auch immer gebraucht wird */
gint magic;
} Appdata;
void on_button_clicked(GtkWidget *button, gpointer user_data) {
Appdata *data = (Appdata*)user_data;
g_assert(data->magic == MAGIC);
/* hier weiter auf Felder in data zugreifen */
}
int main() {
Appdata data;
data.magic = MAGIC;
/* weiter initialisierungen von data */
gtk_init(argc, argv);
/* widgets erstellen, signale verbinden etc. */
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(on_button_clicked), &data);
gtk_main()
/* cleanup */
return 0;
}
Wenn Appdata ein GObject ist, kannst du dir die Magic-number sparen, da wird sowieso bei jedem cast der Type überprüft.
Eine weitere Möglichkeit für die Übergabe von Daten ist g_object_set_data(). z.B. könnte man im Beispiel oben direkt Daten an button hängen:
Code:
g_object_set_data(G_OBJECT(button), "mydata", mydata);
Diese können dann in der Callback-Funktion wieder ausgelesen werden:
Code:
void on_button_clicked(GtkWidget *button, gpointer user_data) {
MyData *mydata = g_object_get_data(G_OBJECT(button), "mydata");
}
Gruss, Andy
Lesezeichen