From b041a151e61727124b8d1c50f72fcd6d73319f13 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 21 Mar 2013 14:58:10 -0600 Subject: [PATCH] racket/gui: fix auto-scrollbars for editor GUI It's possible to go from a state where one scroll bar is needed (vertical or horizontal) to a state where each scrollbar is needed iff the other scrollbar is needed. In that case, the auto-scrollbar algorithm couldn't find either fixpoint and would loop forever. --- collects/mred/private/wxme/editor-canvas.rkt | 22 +++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/collects/mred/private/wxme/editor-canvas.rkt b/collects/mred/private/wxme/editor-canvas.rkt index 2aec2ad284..fdd03f9cd0 100644 --- a/collects/mred/private/wxme/editor-canvas.rkt +++ b/collects/mred/private/wxme/editor-canvas.rkt @@ -752,7 +752,7 @@ (begin (set! given-h-scrolls-per-page -2) #f) - (let loop ([retval #f]) + (let loop ([retval #f] [iters 0]) (let-boxes ([sx 0] [sy 0]) (get-scroll sx sy) @@ -806,7 +806,7 @@ (set! scroll-offset -scroll-offset) - (let-values ([(num-scrolls vspp) + (let-values ([(vnum-scrolls vspp) (if (positive? vnum-scrolls) (let ([num-lines (- (send med num-scroll-lines) 1)]) (values vnum-scrolls @@ -908,8 +908,24 @@ (set! scroll-width hnum-scrolls) (set! scroll-height vnum-scrolls) + (when (and go-again? (iters . > . 2)) + ;; we're not reaching a fixpoint, so + ;; it seems that a horizontal scroll + ;; is needed iff there's a vertical + ;; scrollbar; force a fixpoint + (cond + [(and auto-x? auto-y?) + (set! xscroll-on? #f) + (set! yscroll-on? #f)] + ;; I don't think these cases are possible, + ;; but in case I have it wrong, conservatively + ;; force scrollbars on. + [auto-x? (set! xscroll-on? #t)] + [auto-y? (set! yscroll-on? #t)]) + (show-scrollbars xscroll-on? yscroll-on?)) + (if go-again? - (loop #t) + (loop #t (add1 iters)) #t)))))) retval)))))))