/* * gcc dumpage.c -o dumpage `pkg-config --cflags --libs gtk+-2.0` -W -Wall -g * * type foo. hit tab twice. type bar. hit tab twice. you'll see a bunch * of assertions. type foo. hit tab twice. crash. */ #include gboolean on_entry_focus_out (GtkWidget * entry, GdkEvent * event) { GtkWidget * parent; const gchar * text; GList * kids, * k; GtkWidget * checkbox; g_object_get (G_OBJECT (entry), "parent", &parent, NULL); text = gtk_entry_get_text (GTK_ENTRY (entry)); kids = gtk_container_get_children (GTK_CONTAINER (parent)); for (k = kids ; k != NULL ; k = k->next) { g_printerr ("child %p\n", k->data); if (GTK_IS_CHECK_BUTTON (k->data)) { g_printerr ("destroying %p\n", k->data); gtk_widget_hide (GTK_WIDGET (k->data)); gtk_container_remove (GTK_CONTAINER (parent), k->data); } } checkbox = gtk_check_button_new_with_label (text); g_printerr ("adding %p\n", checkbox); gtk_container_add (GTK_CONTAINER (parent), checkbox); gtk_widget_show_all (parent); return FALSE; } int main (int argc, char * argv[]) { GtkWidget * window; GtkWidget * frame; GtkWidget * vbox; GtkWidget * entry; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); frame = gtk_frame_new (NULL); gtk_container_add (GTK_CONTAINER (window), frame); vbox = gtk_vbox_new (FALSE, 5); gtk_container_add (GTK_CONTAINER (frame), vbox); entry = gtk_entry_new (); g_printerr ("entry is %p\n", entry); gtk_container_add (GTK_CONTAINER (vbox), entry); g_signal_connect (entry, "focus-out-event", G_CALLBACK (on_entry_focus_out), NULL); gtk_widget_show_all (window); gtk_main (); return 0; }