1

I have the following example from here, it shows this under the "Increase - Decrease" title.

#include <gtk/gtk.h> gint count = 0; char buf[5]; void increase(GtkWidget *widget, gpointer label) { count++; sprintf(buf, "%d", count); gtk_label_set_text(label, buf); } void decrease(GtkWidget *widget, gpointer label) { count--; sprintf(buf, "%d", count); gtk_label_set_text(label, buf); } int main(int argc, char** argv) { GtkWidget *label; GtkWidget *window; GtkWidget *frame; GtkWidget *plus; GtkWidget *minus; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 250, 180); gtk_window_set_title(GTK_WINDOW(window), "+-"); frame = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(window), frame); plus = gtk_button_new_with_label("+"); gtk_widget_set_size_request(plus, 80, 35); gtk_fixed_put(GTK_FIXED(frame), plus, 50, 20); minus = gtk_button_new_with_label("-"); gtk_widget_set_size_request(minus, 80, 35); gtk_fixed_put(GTK_FIXED(frame), minus, 50, 80); label = gtk_label_new("0"); gtk_fixed_put(GTK_FIXED(frame), label, 190, 58); gtk_widget_show_all(window); g_signal_connect(window, "destroy", G_CALLBACK (gtk_main_quit), NULL); g_signal_connect(plus, "clicked", G_CALLBACK(increase), label); g_signal_connect(minus, "clicked", G_CALLBACK(decrease), label); gtk_main(); return 0; } 

what I'm wondering is, the g_signal_connect(plus, "clicked",G_CALLBACK(increase), label); function sends the "label" to the function increase, where its arguments are void increase(GtkWidget *widget, gpointer label). Now in the increase function the gtk_label_set_text() function requires a data type of GtkLabel as its first argument but I only see a GtkWidget variable and a void pointer label as the arguments to the increase function. If that is so how does the gtk_label_set_text() work?.

1 Answer 1

3

In C (but not C++), you can implicitly cast a void* to a pointer to any other type. It's very commonly seen when allocating memory with malloc, which returns a void*:

int *myIntArray = malloc(10 * sizeof(int)); // allocate array of 10 ints 

Your code is doing the same thing, just with parameter passing:

void gtk_label_set_text(GtkLabel *label, const char *text); void *label = ...; gtk_label_set_text(label, "some string"); // label is implicitly cast from // void* to GtkLabel* 
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks, another thing, Why would we include the GtkWidget *widget in the increase function?.
@sil3nt: GtkWidget *widget is included in the function because the function has to have a very specific prototype. The GtkButton::clicked callback requires the callback function to have that signature and it will pass you a GtkWidget* as the first parameter. If your callback has the wrong signature, you'll receive the wrong parameters and you will most likely crash.
So the first parameter to the increase function is passed in automatically through g_signal_connect(plus,"clicked",G_CALLBACK(increase), label);?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.