#include static void switch_images(GtkWidget *button) { GtkWidget *image1, *image2; image1 = gtk_button_get_image(GTK_BUTTON(button)); image2 = g_object_get_data(G_OBJECT(button), "other-image"); g_print("Current image: %s, switching to %s\n", (const gchar*)g_object_get_data(G_OBJECT(image1), "id"), (const gchar*)g_object_get_data(G_OBJECT(image2), "id")); gtk_button_set_image(GTK_BUTTON(button), image2); g_object_set_data(G_OBJECT(button), "other-image", image1); g_print("New image realized: %d, mapped: %d, visible: %d\n", GTK_WIDGET_REALIZED(image2), GTK_WIDGET_MAPPED(image2), GTK_WIDGET_VISIBLE(image2)); } int main(int argc, char *argv[]) { GtkWidget *window, *target, *switcher, *vbox, *image1, *image2; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); image1 = gtk_image_new_from_stock(GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); g_object_set_data(G_OBJECT(image1), "id", "Yes"); g_object_ref(image1); image2 = gtk_image_new_from_stock(GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON); g_object_set_data(G_OBJECT(image2), "id", "No"); g_object_ref(image2); target = gtk_button_new_with_label("Target"); gtk_button_set_image(GTK_BUTTON(target), image1); g_object_set_data(G_OBJECT(target), "other-image", image2); gtk_box_pack_start(GTK_BOX(vbox), target, FALSE, FALSE, 0); switcher = gtk_button_new_with_label("Switch"); gtk_box_pack_start(GTK_BOX(vbox), switcher, FALSE, FALSE, 0); g_signal_connect_swapped(switcher, "clicked", G_CALLBACK(switch_images), target); gtk_widget_show_all(window); gtk_main(); return 0; }