#include void changed_handler (GtkWidget *dummy, GtkWidget *win); void add_handler (GtkWidget *container, GtkWidget *child, GtkWidget *win); void changed_handler (GtkWidget *dummy, GtkWidget *win) { g_print("changed!\n"); } void add_handler (GtkWidget *container, GtkWidget *child, GtkWidget *win) { g_print ("add_handler\n"); if (GTK_IS_EDITABLE (child)) { g_print ("connecting \"changed\" event\n"); gtk_signal_connect (GTK_OBJECT (child), "changed", GTK_SIGNAL_FUNC (changed_handler), win); } else if (GTK_IS_CONTAINER (child)) { g_print ("recursive connect\n"); gtk_signal_connect (GTK_OBJECT (child), "add", GTK_SIGNAL_FUNC (add_handler), win); } } int main (int argc, char *argv[]) { GtkWidget *win; GtkWidget *vbox; GtkWidget *entry; gtk_init (&argc, &argv); win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (win), "add", GTK_SIGNAL_FUNC (add_handler), win); vbox = gtk_vbox_new (TRUE, 0); gtk_container_add (GTK_CONTAINER (win), vbox); // this works entry = gtk_entry_new (); gtk_container_add (GTK_CONTAINER (vbox), entry); entry = gtk_entry_new (); gtk_container_add (GTK_CONTAINER (vbox), entry); // this doesn't :( entry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0); entry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0); entry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0); gtk_widget_show_all (win); gtk_main (); return 0; }