Re: GtkScrolledWindow containing GtkTextView containing a TextBuffer can't keep at bottom of Buffer



Hi,

Le 10/06/2013 12:26, Thomas A. Moulton a écrit :
On 06/09/2013 05:21 PM, Thomas A. Moulton wrote:
Ok here is a single file example of my code... it works the same way
it does in my larger project

Any suggestions would be GREATLY appreciated!

tom

What happens is when you enter enough lines of text to fill the window
the scrolled window does not scroll up
when the "eob" mark is not visible (eob=last line of text buffer)

The problem you have is that you insert the TextView in the
ScrolledWindow through a Viewport.  This results in a widget hierarchy
like this:

...
+ GtkScrolledWindow
  + GtkViewport
    + GtkTextView

This means that the TextView doesn't get to control the ScrolledWinodw,
its the Viewport that does.  So when you ask scroll_to_mark() the
ScrolledWindow won't get the request, and so won't scroll.

What you need it NOT to add a Viewport, so you get a hierarchy like this:

...
+ GtkScrolledWindow
  + GtkTextView

Like this, the thing that gets scrolled is the TextView, not a kind of
proxy.  GtkViewport is only useful if you want to add a non-scrollable
widget (e.g. boxes, grids, etc) to a scrolled window: it acts as a proxy
that implements the scrolling.  On the other hand, if the widget you
want to add IS scrollable (implement the GtkScrollable interface), it
must NOT be in a Viewport: if it does, it will expect scrolling requests
and alike, but never get them since its the Viewport that gets them.

In practice, just replace

        gtk_scrolled_window_add_with_viewport(scroll, GTK_WIDGET(text));

with

        gtk_container_add(GTK_CONTAINER(scroll), GTK_WIDGET(text));

and it will work as you expect.  Not that
gtk_scrolled_window_add_with_viewport() is even deprecated nowadays,
simply adding a child to a ScrolledWindow is enough (it will
automatically add a Viewport for you if required -- which is NOT the
case for GtkTextViews).

Regards,
Colomban


PS:

you do:

        char line[512];
        const gchar *cmd;

        cmd = gtk_entry_get_text(entry);
        strcpy(line, cmd);
        gtk_entry_set_text(entry, "");

        ...
        gtk_text_buffer_insert_with_tags(buf, ..., line, -1, ...);

Why do you copy the line in a static buffer (that might be too small,
and cause a crash since strcpy() doesn't have a max size parameter)?
You could just put the line into the buffer:

        
        const gchar *line;

        line = gtk_entry_get_text(entry);
        ...
        gtk_text_buffer_insert_with_tags(buf, ..., line, -1, ...);
        gtk_entry_set_text(entry, "");



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]