On Wed, Mar 20, 2013 at 10:17:36PM +0000, Benoît Knecht wrote:
> Instead of guesstimating the values of the scrollbars adjustments after
> a change in zoom level, connect callbacks to the "changed" GtkAdjustment
> event (which is emitted when the bounds or page_size of the adjustment
> change, e.g. when the zoom level changes), and compute the new values
> from there.
> cb_view_hadjustment_changed() centers the page horizontally if a
> "best-fit" or "width" zoom is being performed, or if "zoom-center" is
> true; otherwise, it keeps the view horizontally centered around the same
> area of the page.
> cb_view_vadjustment_changed() always keeps the view vertically centered
> around the same area of the page.
> ---
> This is in preparation for addressing <http://bugs.pwmt.org/issue99>. A patch
> will follow shortly.

Just a couple of notes based on my experimentation with the patch:

        - Jumping to a page using a numeric command doesn't work anymore. The 
          page number is updated on the status bar, but the view is not 
          adjusted to the target page. This will not happen unless you zoom at 
          least one time.

        - Activating the input bar using ':' will cause the view to be adjusted 
          to the same position it was in during the most recent zoom. Again, 
          this happens only after at least one zoom.

I think this happens because in both cases the act of showing the input bar 
causes the upper bound of the vertical adjustment to be changed which triggers 
cb_view_vadjustment_changed which in turn will call set_adjustment_from_ratio.  
Since you don't update the adjustment ratios during the above operations, 
set_adjustment_from_ratio will get us back to where we were during the last 

Also, your patch makes it necessary to update the adjustment ratios in the 
adjustment_ratio struct during scrolling in the document to reflect the changed 

One could argue that we should then call zathura_readjust_view_after_zooming[1]
from cb_view_vadjstment_value_changed in order to update the ratio whenever the 
vertical adjustment changes, and indeed when I did that, the above problems 
disappeared, but now zooming doesn't work as it should, because when we zoom,
"both" the adjustment upper bound and value change, and apparently, the 
'value-changed' callback is called "before" the 'changed' callback. So, the 
'value-changed' callback will update the ratio based on the new upper bound 
before the 'changed' callback has a chance to update the adjustment value from 
the ratio. This sort of chicken-and-egg problem will cause zooming to 
effectively scroll the document backward, because the 'changed' callback will 
then set the adjustment value using the wrong ratio computed from the 
'value-changed' callback.

I hope I haven't lost you somewhere!

Similar arguments could be made for the horizontal adjustment.

[1] I think this function should now be called something more generic because 
all that it does now is updating the adjustment ratios, which isn't specific to 
zooming and should be done whenever the adjustments change (e.g. scrolling).

zathura mailing list

Reply via email to