wlad-p
(Wlad)
January 17, 2024, 12:42pm
1
I have a GTK3 application in C. I have a regular button
GtkWidget *btn = gtk_button_new_with_label("Button");
g_signal_connect(btn, "clicked", G_CALLBACK(my_function), /* values here */);
and a corresponding callback function:
static void my_function(GtkWidget* widget, gpointer *data){...}
Instead of passing a single argument I would like to pass multiple values. I saw you can somehow do it with a struct but so far I couldn’t do it. Does anyone have some working examples? Thank you!
ebassi
(Emmanuele Bassi)
January 17, 2024, 12:49pm
2
The only way to do that in C is to pack all the data inside a structure and pass the structure to the callback.
First, you define the structure:
typedef struct {
char *arg1;
int arg2;
GtkWidget *arg3;
} CallbackData;
then you allocate it before connecting to the signal:
CallbackData *data = g_new0 (CallbackData, 1);
data->arg1 = g_strdup ("some string");
data->arg2 = 42;
data->arg3 = some_other_widget;
g_signal_connect (btn, "clicked", G_CALLBACK (my_function), data);
Inside the my_function
handler, you take the user data generic pointer and assign it to a structure pointer:
static void
my_function (GtkButton *button,
gpointer user_data)
{
CallbackData *data = user_data;
// use data->arg1, data->arg2, data->arg3 as needed
}
The user_data
argument is not a gpointer*
: it’s a gpointer
. Those are two very different types.
1 Like
system
(system)
Closed
March 2, 2024, 12:50pm
3
This topic was automatically closed 45 days after the last reply. New replies are no longer allowed.