From 032e9a380edb5589afa1bc6746990b9fc714766c Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 12 Jul 2019 15:11:20 +0200 Subject: [PATCH] ui/app,ui/internal/input: move InvalidateOp summary to Router In preparation for extracting more op types in Router. Signed-off-by: Elias Naur --- ui/app/internal/input/router.go | 30 ++++++++++++++++++++++++++++++ ui/app/window.go | 25 ++----------------------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/ui/app/internal/input/router.go b/ui/app/internal/input/router.go index ca339fc9..4520fc9d 100644 --- a/ui/app/internal/input/router.go +++ b/ui/app/internal/input/router.go @@ -3,8 +3,11 @@ package input import ( + "time" + "gioui.org/ui" "gioui.org/ui/input" + "gioui.org/ui/internal/ops" "gioui.org/ui/key" "gioui.org/ui/pointer" ) @@ -16,6 +19,11 @@ type Router struct { kqueue keyQueue handlers handlerEvents + + reader ui.OpsReader + // InvalidateOp summary. + redraw bool + redrawTime time.Time } type handlerEvents struct { @@ -29,6 +37,10 @@ func (q *Router) Events(k input.Key) []input.Event { func (q *Router) Frame(ops *ui.Ops) { q.handlers.Clear() + q.redraw = false + q.reader.Reset(ops) + q.collect() + q.pqueue.Frame(ops, &q.handlers) q.kqueue.Frame(ops, &q.handlers) } @@ -47,6 +59,24 @@ func (q *Router) InputState() key.TextInputState { return q.kqueue.InputState() } +func (q *Router) collect() { + for encOp, ok := q.reader.Decode(); ok; encOp, ok = q.reader.Decode() { + switch ops.OpType(encOp.Data[0]) { + 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 + } + } + } +} + +func (q *Router) RedrawTime() (time.Time, bool) { + return q.redrawTime, q.redraw +} + func (h *handlerEvents) init() { if h.handlers == nil { h.handlers = make(map[input.Key][]input.Event) diff --git a/ui/app/window.go b/ui/app/window.go index 947e4d8f..40fa883f 100644 --- a/ui/app/window.go +++ b/ui/app/window.go @@ -13,7 +13,6 @@ import ( "gioui.org/ui/app/internal/gpu" iinput "gioui.org/ui/app/internal/input" "gioui.org/ui/input" - "gioui.org/ui/internal/ops" "gioui.org/ui/key" ) @@ -48,7 +47,6 @@ type Window struct { delayedDraw *time.Timer router iinput.Router - reader ui.OpsReader } // driver is the interface for the platform implementation @@ -138,8 +136,6 @@ func (w *Window) Draw(root *ui.Ops) { } w.gpu.Draw(w.Profiling, size, root) w.router.Frame(root) - w.reader.Reset(root) - redrawTime, redraw := collectRedraws(&w.reader) now := time.Now() w.mu.Lock() w.setTextInput(w.router.InputState()) @@ -151,30 +147,13 @@ func (w *Window) Draw(root *ui.Ops) { w.timings = fmt.Sprintf("tot:%7s cpu:%7s %s", frameDur.Round(q), drawDur.Round(q), w.gpu.Timings()) w.setNextFrame(time.Time{}) } - if redraw { - w.setNextFrame(redrawTime) + if t, ok := w.router.RedrawTime(); ok { + w.setNextFrame(t) } w.updateAnimation() w.mu.Unlock() } -func collectRedraws(r *ui.OpsReader) (time.Time, bool) { - var t time.Time - redraw := false - for encOp, ok := r.Decode(); ok; encOp, ok = r.Decode() { - switch ops.OpType(encOp.Data[0]) { - case ops.TypeInvalidate: - var op ui.InvalidateOp - op.Decode(encOp.Data) - if !redraw || op.At.Before(t) { - redraw = true - t = op.At - } - } - } - return t, redraw -} - func (w *Window) Redraw() { w.mu.Lock() defer w.mu.Unlock()