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

Reply via email to