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]