mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-02 16:06:19 +00:00
ui/app,ui/internal/input: move InvalidateOp summary to Router
In preparation for extracting more op types in Router. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -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)
|
||||
|
||||
+2
-23
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user