Re: Setting the scroll position of a GtkTextView in GtkScrolledWindow after render
- From: Andri Möll <andri dot ee>
- To: Reuben Rissler <silrep emypeople net>, gtk-app-devel-list gnome org, mail ssalewski de
- Subject: Re: Setting the scroll position of a GtkTextView in GtkScrolledWindow after render
- Date: Mon, 8 Apr 2019 21:42:02 +0000
Thanks, both!
While I'm not using GtkSourceView but GtkTextView, given the former
depends on the latter, they're related. Anyway, turns out that
GtkTextView indeed lays its text out asynchronously without any event to
notify when it's done.
I did end up creating a GNOME Discourse topic, too, where I dug into
gtktextview.c and described it at
https://discourse.gnome.org/t/setting-the-scroll-position-of-a-gtktextview-in-gtkscrolledwindow-after-render/745.
Here's what I wrote for the sake of completeness:
Looking into
https://gitlab.gnome.org/GNOME/gtk/blob/3.24.7/gtk/gtktextview.c#L4508,
I can see that it does indeed lay 2000px out at once and does so with
the priority `GTK_TEXT_VIEW_PRIORITY_VALIDATE`
(https://gitlab.gnome.org/GNOME/gtk/blob/3.24.7/gtk/gtktextview.c#L4550).
I can also see `incremental_validate_callback` updates the adjustments
every idle tick until text is laid out. I wonder if through listening
to those updates I can retry setting the scroll position until it
finally sticks. From my initial test check it at least seems the upper
bound of the vertical adjustment is refined downwards. That permits
differentiating incomplete layouts (where my set position doesn't
stick) from an invalid scroll point (where my set position is really
beyond the upper bound). I'll have to play around with this. Feels
like the web where setting the scroll position is quite a challenge. :P
While setting the scroll in an idle callback is possible, it may be more
robust to do so immediately after the adjustments are updated. Then
again, both heavily depend on the implementation details of GtkTextView
and may break anytime GtkTextView's text layout routines are changed.
Andri
On 4/8/19 3:57 PM, Stefan Salewski wrote:
May that be still this old bug:
https://picheta.me/articles/2013/08/gtk-plus--a-method-to-guarantee-scrolling.html
I think in 2015 I was concerned with that bug, and I asked here, no
response. So I had to apply the old fix mentioned in above link for my
Nim editor. Development of GtkSourceView is not very active, so that
bug may still exist. And in case you have not noticed yet, the gtk-list
has basically moved to discourse forum.
On 4/8/19 4:56 PM, Reuben Rissler wrote:
On 04/08/2019 09:07 AM, Andri Möll via gtk-app-devel-list wrote:
Hey,
I can't figure out if it's me or something's amiss. I'm trying to set
the scroll position after rendering a GtkTextView in a
GtkScrolledWindow, but it's reset to a different value, if it works
at all. I've so far tried to set the vertical adjustment value both
after GtkScrolledWindow is mapped or its child (GtkTextView)
size-allocated. When using a GtkListBox instead of a GtkTextView and
setting the adjustment's value on "size-allocate", it works. No such
luck with a GtkTextView, however.
The peculiar thing with the GtkTextView is, while the adjustment
reports its upper bound to be, for example, 588 and its value 0,
immediately after setting it to 493, it reports its value as 11. I
figure "size-allocate" is still the wrong event to use here given the
adjustment is in flux. What would the right path be to consistently
set the scroll position after the first render, and later, after
resetting the GtkTextView's buffer?
You probably are affected by the same problem as
https://stackoverflow.com/questions/48934458/gtk-sourceview-scroll-to-mark-not-working.
Basically, you need to add a timeout (glib_idle_add or so) to allow
all render calculations to be done.
Reuben
[
Date Prev][
Date Next] [
Thread Prev][Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]