You missed the list in your last reply. It is quoted below, and I've attached the file you sent me as well (table.txt).
On Thu, Jan 31, 2013 at 4:54 PM, Ferdinand Ramirez < ramirez.ferdin...@yahoo.com> wrote: > Attached is a working program with GtkEntry in the table. If you comment > out line 21 and uncomment line 20 to use GtkTextView instead of GtkEntry, > you will encounter the error I mentioned. > > Similarly, if you replace the gtk_widget_show_all on line 65 by > gtk_widget_show, the error goes away but does not draw the table, only the > outermost frame. In fact, doing gtk_widget_show for successive levels of > children works until you reach the GtkTextView level. > > Am I invoking (in lines 73 to 75) the function to create the table in the > correct manner from the thread? What you see in lines 71 and 72 are > alternatives to invoking the function but those have identical results as > well. > > -Ferdinand > I've found that this isn't related to threading, and seems to be a bug in TextView; my guess is embedding TextViews inside TextViews is somehow a bad idea. This error only effects Gtk+-2.0 (at least 2.24.13), and does not effect Gtk+3.0 (3.6.4) I have attached a more concise version of the program that produces the bug. I found that if you delay the show_all on the embedded TextViews to another g_idle_add, you don't get the error. I believe the code is valid, so if nobody else has a comment you might want to file a bug. I don't know if Gtk+2 gets bugfixes anymore though.. The error is: Gtk-WARNING **: gtktextview.c:4610: somehow some text lines were modified or scrolling occurred since the last validation of lines on the screen - may be a text widget bug. Gtk:ERROR:gtktextview.c:4611:gtk_text_view_paint: code should not be reached And the backtrace is: #0 0x00000030f9a35ba5 in raise () from /lib64/libc.so.6 #1 0x00000030f9a37358 in abort () from /lib64/libc.so.6 #2 0x00007ffff7775b37 in g_assertion_message () from /lib64/libglib-2.0.so.0 #3 0x000000345001efd5 in gtk_text_view_expose_event () from /lib64/libgtk-x11-2.0.so.0 #4 0x000000344ff4da3c in _gtk_marshal_BOOLEAN__BOXED () from /lib64/libgtk-x11-2.0.so.0 #5 0x00007ffff7a3d910 in g_closure_invoke () from /lib64/libgobject-2.0.so.0 #6 0x00007ffff7a4ea80 in signal_emit_unlocked_R () from /lib64/libgobject-2.0.so.0 #7 0x00007ffff7a568c7 in g_signal_emit_valist () from /lib64/libgobject-2.0.so.0 #8 0x00007ffff7a56de2 in g_signal_emit () from /lib64/libgobject-2.0.so.0 #9 0x00000034500814be in gtk_widget_event_internal () from /lib64/libgtk-x11-2.0.so.0 #10 0x000000344ff4be80 in gtk_main_do_event () from /lib64/libgtk-x11-2.0.so.0 #11 0x000000344fa4556c in _gdk_window_process_updates_recurse () from /lib64/libgdk-x11-2.0.so.0 #12 0x000000344fa45513 in _gdk_window_process_updates_recurse () from /lib64/libgdk-x11-2.0.so.0 #13 0x000000344fa45513 in _gdk_window_process_updates_recurse () from /lib64/libgdk-x11-2.0.so.0 #14 0x000000344fa45513 in _gdk_window_process_updates_recurse () from /lib64/libgdk-x11-2.0.so.0 #15 0x000000344fa400e7 in gdk_window_process_updates_internal () from /lib64/libgdk-x11-2.0.so.0 #16 0x000000344fa4263e in gdk_window_process_updates () from /lib64/libgdk-x11-2.0.so.0 #17 0x0000003450017eb2 in gtk_text_view_value_changed () from /lib64/libgtk-x11-2.0.so.0 #18 0x0000003450018346 in get_hadjustment () from /lib64/libgtk-x11-2.0.so.0 #19 0x000000345001b140 in gtk_text_view_size_allocate () from /lib64/libgtk-x11-2.0.so.0 #20 0x00007ffff7a40a9e in g_cclosure_marshal_VOID__BOXEDv () from /lib64/libgobject-2.0.so.0 #21 0x00007ffff7a3db0b in _g_closure_invoke_va () from /lib64/libgobject-2.0.so.0 #22 0x00007ffff7a563a8 in g_signal_emit_valist () from /lib64/libgobject-2.0.so.0 #23 0x00007ffff7a56de2 in g_signal_emit () from /lib64/libgobject-2.0.so.0 #24 0x0000003450086268 in gtk_widget_size_allocate () from /lib64/libgtk-x11-2.0.so.0 #25 0x000000344ff090ae in gtk_frame_size_allocate () from /lib64/libgtk-x11-2.0.so.0 #26 0x00007ffff7a40a9e in g_cclosure_marshal_VOID__BOXEDv () from /lib64/libgobject-2.0.so.0 #27 0x00007ffff7a3db0b in _g_closure_invoke_va () from /lib64/libgobject-2.0.so.0 #28 0x00007ffff7a563a8 in g_signal_emit_valist () from /lib64/libgobject-2.0.so.0 #29 0x00007ffff7a56de2 in g_signal_emit () from /lib64/libgobject-2.0.so.0 #30 0x0000003450086268 in gtk_widget_size_allocate () from /lib64/libgtk-x11-2.0.so.0 #31 0x000000344ffe595b in gtk_table_size_allocate () from /lib64/libgtk-x11-2.0.so.0 #32 0x00007ffff7a40a9e in g_cclosure_marshal_VOID__BOXEDv () from /lib64/libgobject-2.0.so.0 #33 0x00007ffff7a3db0b in _g_closure_invoke_va () from /lib64/libgobject-2.0.so.0 #34 0x00007ffff7a563a8 in g_signal_emit_valist () from /lib64/libgobject-2.0.so.0 #35 0x00007ffff7a56de2 in g_signal_emit () from /lib64/libgobject-2.0.so.0 #36 0x0000003450086268 in gtk_widget_size_allocate () from /lib64/libgtk-x11-2.0.so.0 #37 0x000000344ff090ae in gtk_frame_size_allocate () from /lib64/libgtk-x11-2.0.so.0 #38 0x00007ffff7a40a9e in g_cclosure_marshal_VOID__BOXEDv () from /lib64/libgobject-2.0.so.0 #39 0x00007ffff7a3dbd7 in _g_closure_invoke_va () from /lib64/libgobject-2.0.so.0 #40 0x00007ffff7a563a8 in g_signal_emit_valist () from /lib64/libgobject-2.0.so.0 #41 0x00007ffff7a56de2 in g_signal_emit () from /lib64/libgobject-2.0.so.0 #42 0x0000003450086268 in gtk_widget_size_allocate () from /lib64/libgtk-x11-2.0.so.0 #43 0x00000034500188c6 in gtk_text_view_child_allocated () from /lib64/libgtk-x11-2.0.so.0 #44 0x00007ffff7a3d910 in g_closure_invoke () from /lib64/libgobject-2.0.so.0 #45 0x00007ffff7a4ed08 in signal_emit_unlocked_R () from /lib64/libgobject-2.0.so.0 #46 0x00007ffff7a56c8d in g_signal_emit_valist () from /lib64/libgobject-2.0.so.0 #47 0x00007ffff7a56de2 in g_signal_emit () from /lib64/libgobject-2.0.so.0 #48 0x000000345000a6a5 in gtk_text_layout_get_line_display () from /lib64/libgtk-x11-2.0.so.0 #49 0x000000345000b21a in gtk_text_layout_real_wrap () from /lib64/libgtk-x11-2.0.so.0 #50 0x000000344ffef203 in _gtk_text_btree_validate_line () from /lib64/libgtk-x11-2.0.so.0 #51 0x00000034500096e1 in gtk_text_layout_validate_yrange () from /lib64/libgtk-x11-2.0.so.0 #52 0x00000034500186a7 in gtk_text_view_validate_onscreen () from /lib64/libgtk-x11-2.0.so.0 #53 0x000000345001acae in gtk_text_view_flush_first_validate () from /lib64/libgtk-x11-2.0.so.0 #54 0x000000345001ace9 in first_validate_callback () from /lib64/libgtk-x11-2.0.so.0 #55 0x000000344fa1ebb7 in gdk_threads_dispatch () from /lib64/libgdk-x11-2.0.so.0 #56 0x00007ffff7753a55 in g_main_context_dispatch () from /lib64/libglib-2.0.so.0 #57 0x00007ffff7753d88 in g_main_context_iterate.isra.24 () from /lib64/libglib-2.0.so.0 #58 0x00007ffff7754182 in g_main_loop_run () from /lib64/libglib-2.0.so.0 #59 0x000000344ff4ab47 in gtk_main () from /lib64/libgtk-x11-2.0.so.0 #60 0x0000000000401142 in main ()
#include <gtk/gtk.h> /* gcc table3.c -Wall -o table3 `pkg-config --cflags --libs gtk+-2.0` */ GThread *t1; gpointer thrfn(gpointer data); GtkWidget *view; GdkColor green = {0, 0, 0xffff, 0}; GtkWidget *createtable(int rows, int columns) { int i, j; GtkWidget *frame, *tview; GtkWidget *table1 = gtk_table_new(rows, columns, FALSE); for(i=0; i<rows; i++) for(j=0; j<columns; j++) { frame = gtk_frame_new(NULL); gtk_container_set_border_width(GTK_CONTAINER(frame), 0.5); gtk_widget_modify_bg(frame, GTK_STATE_NORMAL, &green); // tview = gtk_text_view_new(); tview = gtk_entry_new(); gtk_container_add(GTK_CONTAINER(frame), tview); gtk_table_attach_defaults(GTK_TABLE(table1), frame, j, j+1, i, i+1); } frame = gtk_frame_new(NULL); gtk_container_set_border_width(GTK_CONTAINER(frame), 0.5); gtk_widget_modify_bg(frame, GTK_STATE_NORMAL, &green); gtk_widget_set_size_request(frame, 200, 200); gtk_container_add(GTK_CONTAINER(frame), table1); return frame; } int main( int argc, char *argv[]) { GtkWidget *window; if(!g_thread_supported()) g_thread_init(NULL); gdk_threads_init(); gdk_threads_enter(); gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 630, 650); gtk_window_set_title(GTK_WINDOW(window), ""); gtk_container_set_border_width(GTK_CONTAINER(window), 5); view = gtk_text_view_new(); gtk_container_add(GTK_CONTAINER(window), view); gtk_widget_show_all(window); t1 = g_thread_create(thrfn, NULL, FALSE, NULL); gtk_main(); gdk_threads_leave(); return 0; } gboolean tblinsert(gpointer data) { GtkTextIter iter; GtkWidget *table1 = createtable(4, 2); GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); gtk_text_buffer_get_end_iter(buffer, &iter); GtkTextChildAnchor *anchor = gtk_text_buffer_create_child_anchor(buffer, &iter); gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(view), table1, anchor); gtk_widget_show_all(table1); return FALSE; } gpointer thrfn(gpointer data) { // g_idle_add((GSourceFunc)tblinsert, NULL); // g_main_context_invoke(NULL, (GSourceFunc)tblinsert, NULL); gdk_threads_enter(); tblinsert(NULL); gdk_threads_leave(); return NULL; }
#include <gtk/gtk.h> 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; }
_______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list