GTK+2: Struktur an Funktion uebergeben
-
Hallo, ich habe ein Problem (GTK+2/Linux), mit dem ich einfach nicht weiter komme:
Ich moechte einer Callback-Funktion zwei Widgets uebergeben. Das will ich mit
Hilfe einer Struktur machen.typedef struct { GtkWidget *a; GtkWidget *b; } w2;
im Hauptfenster die aufrufende Funktion:
w2 str; GtkWidget *ok_button = gtk_button_new_from_stock(GTK_STOCK_OK); str.a = gtk_spin_button_new_with_range(1.0, 100.0, 1.0); g_signal_connect(G_OBJECT(ok_button), "clicked", G_CALLBACK(grab_int_value), gpointer &str);
hier die Callback-Funktion:
static void grab_int_value(GtkWidget *button, gpointer data) { w2 *tmp = data; gint res = gtk_spin_button_get_value_as_int((GtkSpinButton *) tmp->a); ... }
Es kompiliert ohne Fehler und Warnungen. Wenn ich das Programm von der Kommandozeile ausfuehre
bekomme ich folgende Fehlermeldung:Gtk-CRITICAL **: IA__gtk_spin_button_get_value_as_int: assertion `GTK_IS_SPIN_BUTTON (spin_button)' failed
Kann mir jemand erklaeren, wo mein Fehler liegt?
Danke
-
Kann es sein, dass w2 aus dem Scope gelaufen ist?
-
also str
-
Der Strukturtyp w2 (fuer 2 Widgets) ist global deklariert.
Die Strukturvariable str wird in der gleichen Funktion definiert, in der auch der Eventhandler aufgerufen wird.
Also glaube ich nicht, dass der scope ein Problem ist.
Ich bin aber noch Anfaenger in der GUI-Programmierung. Bin fuer jeden Hinweis dankbar.
-
Ich habe das Gefuehl, dass der Cast im Eventhandler irgendwie verkehrt ist.
Innerhalb der Struktur benoetige ich ein GtkWidget, um den Spinbutton anzulegen,
beim Abfragen des Wertes im Eventhandler muss das GtkWidget aber in ein GtkSpinButton
gecastet werden. Ich habe schon so viele Kombinationen durchprobiert.
-
Also ich mache das eigentlich immer so:
typedef struct _W2 { GtkWidget *window1; // Der angezeigte Bildschirm // GtkWidget *statusbar1; // Für Meldungen in der Statusbar guint id_statusbar1; // Die ID dazu [...] // } W2;
In der main() sieht es bei mir so aus:
[...] W2 *work; // Variable, die das gesamte Programm benötigt // work = g_slice_new(W2); // Speicher für diese Variable [...]
Man könnte natürlich auch mit malloc arbeiten.... und nicht vergessen - den Speicher wieder freigeben
-
Danke, das hilft mir ein Stueck weiter.