#include #include /* we need to remember our widget pointers so we can tinker with'em */ typedef struct { GtkWidget* gold; GtkWidget* silver; GtkWidget* bronze; GtkWidget* result; int score; } prog_data; void set_score( GtkWidget *widget, gpointer data) { int score = *((int*)data); char string[4]; g_snprintf(string, 4, "%d", score); gtk_label_set_text(GTK_LABEL(widget), string); } void quit( GtkWidget *widget, gpointer data ) { gtk_main_quit(); } void calculate( GtkWidget *widget, gpointer data ) { prog_data bits = *((prog_data*)data); int gold = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(bits.gold)); int silver = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(bits.silver)); int bronze = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(bits.bronze)); ((prog_data*)data)->score = gold * 3 + silver * 2 + bronze; set_score(bits.result, &(((prog_data*)data)->score)); } /* another callback */ gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ) { gtk_main_quit (); return FALSE; } int main( int argc, char *argv[] ) { GtkWidget* window; GtkWidget* new_widget; GtkWidget* table; GtkWidget* base; GtkWidget* result; prog_data mydata; mydata.score = 0; /* This is called in all GTK applications. Arguments are parsed * from the command line and are returned to the application. */ gtk_init (&argc, &argv); /* Create a new window */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* This is a new call, which just sets the title of our * new window to "Hello Buttons!" */ gtk_window_set_title (GTK_WINDOW (window), "Olympic Scorer"); /* Here we just set a handler for delete_event that immediately * exits GTK. */ g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL); /* Sets the border width of the window. */ gtk_container_set_border_width (GTK_CONTAINER (window), 10); table = gtk_table_new(4, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 10); /* Put the table into the main window. */ gtk_container_add (GTK_CONTAINER (window), table); /* put in gold medal stuff */ new_widget = gtk_label_new ("Gold medals: "); gtk_table_attach_defaults(GTK_TABLE(table), new_widget, 0, 1, 0, 1); gtk_widget_show (new_widget); new_widget = gtk_spin_button_new_with_range (0, 100, 1); g_signal_connect(G_OBJECT(new_widget), "value_changed", G_CALLBACK(calculate), &mydata); gtk_table_attach_defaults(GTK_TABLE(table), new_widget, 1, 2, 0, 1); gtk_widget_show (new_widget); mydata.gold = new_widget; /* put in silver medal stuff */ new_widget = gtk_label_new ("Silver medals: "); gtk_table_attach_defaults(GTK_TABLE(table), new_widget, 0, 1, 1, 2); gtk_widget_show (new_widget); new_widget = gtk_spin_button_new_with_range (0, 100, 1); g_signal_connect(G_OBJECT(new_widget), "value_changed", G_CALLBACK(calculate), &mydata); gtk_table_attach_defaults(GTK_TABLE(table), new_widget, 1, 2, 1, 2); gtk_widget_show (new_widget); mydata.silver = new_widget; /* put in bronze medal stuff */ new_widget = gtk_label_new ("Bronze medals: "); gtk_table_attach_defaults(GTK_TABLE(table), new_widget, 0, 1, 2, 3); gtk_widget_show (new_widget); new_widget = gtk_spin_button_new_with_range (0, 100, 1); g_signal_connect(G_OBJECT(new_widget), "value_changed", G_CALLBACK(calculate), &mydata); gtk_table_attach_defaults(GTK_TABLE(table), new_widget, 1, 2, 2, 3); gtk_widget_show (new_widget); mydata.bronze = new_widget; /* make a vbox for the result hbox and the quit button */ base = gtk_vbox_new(FALSE, 10); gtk_table_attach_defaults(GTK_TABLE(table), base, 0, 2, 3, 4); /* fill out the result hbox */ result = gtk_hbox_new(FALSE, 10); new_widget = gtk_label_new ("Score is: "); gtk_box_pack_start (GTK_BOX(result), new_widget, TRUE, TRUE, 0); gtk_widget_show (new_widget); /* results box */ new_widget = gtk_label_new(""); gtk_box_pack_start (GTK_BOX(result), new_widget, TRUE, TRUE, 0); gtk_widget_show (new_widget); mydata.result = new_widget; new_widget = gtk_button_new_with_label("Calculate score"); g_signal_connect(G_OBJECT(new_widget), "clicked", G_CALLBACK(calculate), &mydata); gtk_box_pack_start(GTK_BOX(result), new_widget, TRUE, TRUE, 0); gtk_widget_show (new_widget); gtk_box_pack_start(GTK_BOX(base), result, TRUE, TRUE, 0); gtk_widget_show(result); /* and add a quit button */ new_widget = gtk_button_new_with_label("Exit"); g_signal_connect(G_OBJECT(new_widget), "clicked", G_CALLBACK(quit), ""); gtk_box_pack_start(GTK_BOX(base), new_widget, TRUE, TRUE, 0); gtk_widget_show (new_widget); gtk_widget_show(base); gtk_widget_show (table); gtk_widget_show (window); /* Rest in gtk_main and wait for the fun to begin! */ gtk_main (); return 0; }