diff --git a/ui/app/internal/input/router.go b/ui/app/internal/input/router.go index 6c8032fb..00f544d8 100644 --- a/ui/app/internal/input/router.go +++ b/ui/app/internal/input/router.go @@ -24,8 +24,8 @@ type Router struct { reader ui.OpsReader // InvalidateOp summary. - redraw bool - redrawTime time.Time + wakeup bool + wakeupTime time.Time // ProfileOp summary. profHandlers []input.Key @@ -42,7 +42,7 @@ func (q *Router) Events(k input.Key) []input.Event { func (q *Router) Frame(ops *ui.Ops) { q.handlers.Clear() - q.redraw = false + q.wakeup = false q.profHandlers = q.profHandlers[:0] q.reader.Reset(ops) q.collect() @@ -71,9 +71,9 @@ func (q *Router) collect() { case ops.TypeInvalidate: var op ui.InvalidateOp op.Decode(encOp.Data) - if !q.redraw || op.At.Before(q.redrawTime) { - q.redraw = true - q.redrawTime = op.At + if !q.wakeup || op.At.Before(q.wakeupTime) { + q.wakeup = true + q.wakeupTime = op.At } case ops.TypeProfile: var op system.ProfileOp @@ -93,8 +93,8 @@ func (q *Router) Profiling() bool { return len(q.profHandlers) > 0 } -func (q *Router) RedrawTime() (time.Time, bool) { - return q.redrawTime, q.redraw +func (q *Router) WakeupTime() (time.Time, bool) { + return q.wakeupTime, q.wakeup } func (h *handlerEvents) init() { diff --git a/ui/app/window.go b/ui/app/window.go index d7ac0c24..7ebafcd0 100644 --- a/ui/app/window.go +++ b/ui/app/window.go @@ -29,11 +29,11 @@ type Window struct { gpu *gpu.GPU inputState key.TextInputState - out chan Event - in chan Event - ack chan struct{} - redraws chan struct{} - frames chan *ui.Ops + out chan Event + in chan Event + ack chan struct{} + invalidates chan struct{} + frames chan *ui.Ops stage Stage animating bool @@ -81,11 +81,11 @@ func NewWindow(opts *WindowOptions) *Window { } w := &Window{ - in: make(chan Event), - out: make(chan Event), - ack: make(chan struct{}), - redraws: make(chan struct{}, 1), - frames: make(chan *ui.Ops), + in: make(chan Event), + out: make(chan Event), + ack: make(chan struct{}), + invalidates: make(chan struct{}, 1), + frames: make(chan *ui.Ops), } go w.run(opts) return w @@ -133,15 +133,18 @@ func (w *Window) draw(size image.Point, frame *ui.Ops) { w.router.AddProfile(system.ProfileEvent{Timings: timings}) w.setNextFrame(time.Time{}) } - if t, ok := w.router.RedrawTime(); ok { + if t, ok := w.router.WakeupTime(); ok { w.setNextFrame(t) } w.updateAnimation() } -func (w *Window) Redraw() { +// Invalidate the current window such that a DrawEvent will be generated +// immediately. If the window is not active, the redraw will trigger +// when the window becomes active. +func (w *Window) Invalidate() { select { - case w.redraws <- struct{}{}: + case w.invalidates <- struct{}{}: default: } } @@ -217,7 +220,7 @@ func (w *Window) run(opts *WindowOptions) { case <-timer: w.setNextFrame(time.Time{}) w.updateAnimation() - case <-w.redraws: + case <-w.invalidates: w.setNextFrame(time.Time{}) w.updateAnimation() case e := <-w.in: