#include static GtkWidget* createtable(int rows, int columns) { int i, j; GtkWidget *table = gtk_table_new(rows, columns, FALSE); GtkWidget *frame = NULL; for (i=0; i < rows; ++i) { for (j=0; j < columns; ++j) { GtkWidget *tview = gtk_text_view_new(); frame = gtk_frame_new(NULL); gtk_container_add (GTK_CONTAINER(frame), tview); gtk_table_attach_defaults (GTK_TABLE(table), frame, j, j+1, i, i+1); } } frame = gtk_frame_new (NULL); gtk_container_add (GTK_CONTAINER(frame), table); return frame; } static gboolean do_show(gpointer view) { gtk_widget_show_all(GTK_WIDGET(view)); return G_SOURCE_REMOVE; } static gboolean tblinsert(gpointer data) { GtkTextIter iter; GtkTextChildAnchor *anchor; GtkWidget *view = GTK_WIDGET(data); GtkWidget *table = createtable(4, 2); GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); gtk_text_buffer_get_end_iter (buffer, &iter); anchor = gtk_text_buffer_create_child_anchor (buffer, &iter); gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW(view), table, anchor); #define DO_BUG TRUE if (DO_BUG) gtk_widget_show_all(view); else g_idle_add(do_show, view); return G_SOURCE_REMOVE; } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *view; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); view = gtk_text_view_new (); g_signal_connect (G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_container_add (GTK_CONTAINER(window), view); gtk_widget_show_all (window); g_timeout_add(1000, tblinsert, view); // if g_idle_add is used, 1/10 attempts will succeed gtk_main(); return 0; }