I have a small program where a gtk signal callback function needs 2 or 3 variables.
I don\'t want to make these global variables (The entire goal of the project is to be
Expanding on H2CO3's answer, you can also set the data (and I strongly recommend using a struct, by the way) to be freed automatically when the signal handler is disconnected:
g_signal_connect_data(save, "clicked", callback, data, (GClosureNotify)free, 0);
You can use g_object_set_data() and g_object_get_data(). First, set the data:
g_object_set_data(G_OBJECT(my_edit), "my_label", my_label);
g_object_set_data(G_OBJECT(my_edit), "age", GINT_TO_POINTER(age));
and in the callback you can get the data like so:
gint age = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "age"));
GtkWidget *my_label = g_object_get_data(G_OBJECT(widget), "my_label");
Of course you can use arrays of void pointers, but if you want to pass around values with different types (especially values whose type is longer than sizeof(void *)
), you can't use arrays. For these, you'll almost certainly want to wrap them in a struct and pass the struct's address as the data parameter.
Example:
struct my_struct *data = malloc(sizeof(*data));
data->field_one = value_one;
data->field_two = value_two; /* etc. */
g_signal_connect(save, "clicked", callback, data);
Of course, don't forget to free(data)
in the callback function (assuming it's for single use).
Edit: as you wanted an example with void **, here you are (this is ugly, and I don't recommend you to use this -- either because allocating a one-element array for primitive types is wasting your shoot or because casting a non-pointer to void * is bad practice...):
void **data = malloc(sizeof(data[0]) * n_elements);
type1 *element1_ptr = malloc(sizeof(first_item));
*element1_ptr = first_item;
data[0] = element1_ptr;
/* etc. */
To free them:
int i;
for (i = 0; i < n_elements; i++)
free(data[i]);
free(data);