adjust canvas refresh strategy yet again
- there seems to be no need to auto-resume flushes on a canvas, which can create flicker if the auto-resume timeout turns out to be too short
This commit is contained in:
parent
75bc9bd718
commit
1c6f745ac1
|
@ -272,9 +272,11 @@
|
||||||
;; are defined by `canvas-mixin' from ../common/canvas-mixin
|
;; are defined by `canvas-mixin' from ../common/canvas-mixin
|
||||||
(define/public (queue-paint) (void))
|
(define/public (queue-paint) (void))
|
||||||
(define/public (request-canvas-flush-delay)
|
(define/public (request-canvas-flush-delay)
|
||||||
(request-flush-delay (get-cocoa-window)))
|
(unless is-gl?
|
||||||
|
(request-flush-delay (get-cocoa-window))))
|
||||||
(define/public (cancel-canvas-flush-delay req)
|
(define/public (cancel-canvas-flush-delay req)
|
||||||
(cancel-flush-delay req))
|
(unless is-gl?
|
||||||
|
(cancel-flush-delay req)))
|
||||||
(define/public (queue-canvas-refresh-event thunk)
|
(define/public (queue-canvas-refresh-event thunk)
|
||||||
(queue-window-refresh-event this thunk))
|
(queue-window-refresh-event this thunk))
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
(init [(cnvs canvas)])
|
(init [(cnvs canvas)])
|
||||||
(define canvas cnvs)
|
(define canvas cnvs)
|
||||||
|
|
||||||
|
(inherit end-delay)
|
||||||
(super-new)
|
(super-new)
|
||||||
|
|
||||||
(define gl #f)
|
(define gl #f)
|
||||||
|
@ -59,21 +60,18 @@
|
||||||
(values (unbox xb) (unbox yb))))
|
(values (unbox xb) (unbox yb))))
|
||||||
|
|
||||||
(define/override (queue-backing-flush)
|
(define/override (queue-backing-flush)
|
||||||
;; With Cocoa window-level delay doesn't stop
|
;; Re-enable expose events so that the queued
|
||||||
;; displays; it blocks flushes to the screen.
|
;; backing flush will be handled:
|
||||||
;; So leave the delay in place, and `end-delay'
|
(end-delay)
|
||||||
;; after displaying to the window (after which
|
|
||||||
;; we'll be ready to flush the window), which
|
|
||||||
;; is at then end of `do-backing-flush'.
|
|
||||||
(send canvas queue-backing-flush))
|
(send canvas queue-backing-flush))
|
||||||
|
|
||||||
(define/override (flush)
|
(define/override (flush)
|
||||||
(send canvas flush))
|
(send canvas flush))
|
||||||
|
|
||||||
(define/override (request-delay)
|
(define/override (request-delay)
|
||||||
(request-flush-delay (send canvas get-flush-window)))
|
(send canvas request-canvas-flush-delay))
|
||||||
(define/override (cancel-delay req)
|
(define/override (cancel-delay req)
|
||||||
(cancel-flush-delay req))))
|
(send canvas cancel-canvas-flush-delay req))))
|
||||||
|
|
||||||
(define (do-backing-flush canvas dc ctx dx dy)
|
(define (do-backing-flush canvas dc ctx dx dy)
|
||||||
(tellv ctx saveGraphicsState)
|
(tellv ctx saveGraphicsState)
|
||||||
|
@ -99,6 +97,5 @@
|
||||||
(cairo_fill cr)
|
(cairo_fill cr)
|
||||||
(cairo_set_source cr s)
|
(cairo_set_source cr s)
|
||||||
(cairo_pattern_destroy s))
|
(cairo_pattern_destroy s))
|
||||||
(cairo_destroy cr))))
|
(cairo_destroy cr))))))
|
||||||
(send dc end-delay)))
|
|
||||||
(tellv ctx restoreGraphicsState)))
|
(tellv ctx restoreGraphicsState)))
|
||||||
|
|
|
@ -6,19 +6,28 @@
|
||||||
(protect-out do-request-flush-delay
|
(protect-out do-request-flush-delay
|
||||||
do-cancel-flush-delay))
|
do-cancel-flush-delay))
|
||||||
|
|
||||||
|
;; Auto-cancel schedules a cancel of a request flush
|
||||||
|
;; on event boundaries. It makes sense if you don't
|
||||||
|
;; trust a program to un-delay important refreshes,
|
||||||
|
;; but auto-cancel is currently disabled because
|
||||||
|
;; bad refresh-delay effects are confined to the enclosing
|
||||||
|
;; window on all platforms.
|
||||||
|
(define AUTO-CANCEL-DELAY? #f)
|
||||||
|
|
||||||
(define (do-request-flush-delay win disable enable)
|
(define (do-request-flush-delay win disable enable)
|
||||||
(atomically
|
(atomically
|
||||||
(let ([req (box win)])
|
(let ([req (box win)])
|
||||||
(and
|
(and
|
||||||
(disable win)
|
(disable win)
|
||||||
(begin
|
(begin
|
||||||
(add-event-boundary-sometimes-callback!
|
(when AUTO-CANCEL-DELAY?
|
||||||
req
|
(add-event-boundary-sometimes-callback!
|
||||||
(lambda (v)
|
req
|
||||||
;; in atomic mode
|
(lambda (v)
|
||||||
(when (unbox req)
|
;; in atomic mode
|
||||||
(set-box! req #f)
|
(when (unbox req)
|
||||||
(enable win))))
|
(set-box! req #f)
|
||||||
|
(enable win)))))
|
||||||
req)))))
|
req)))))
|
||||||
|
|
||||||
(define (do-cancel-flush-delay req enable)
|
(define (do-cancel-flush-delay req enable)
|
||||||
|
@ -27,4 +36,5 @@
|
||||||
(when win
|
(when win
|
||||||
(set-box! req #f)
|
(set-box! req #f)
|
||||||
(enable win)
|
(enable win)
|
||||||
(remove-event-boundary-callback! req)))))
|
(when AUTO-CANCEL-DELAY?
|
||||||
|
(remove-event-boundary-callback! req))))))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user