mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-07 02:15:34 +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
|
package input
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
"gioui.org/ui"
|
"gioui.org/ui"
|
||||||
"gioui.org/ui/input"
|
"gioui.org/ui/input"
|
||||||
|
"gioui.org/ui/internal/ops"
|
||||||
"gioui.org/ui/key"
|
"gioui.org/ui/key"
|
||||||
"gioui.org/ui/pointer"
|
"gioui.org/ui/pointer"
|
||||||
)
|
)
|
||||||
@@ -16,6 +19,11 @@ type Router struct {
|
|||||||
kqueue keyQueue
|
kqueue keyQueue
|
||||||
|
|
||||||
handlers handlerEvents
|
handlers handlerEvents
|
||||||
|
|
||||||
|
reader ui.OpsReader
|
||||||
|
// InvalidateOp summary.
|
||||||
|
redraw bool
|
||||||
|
redrawTime time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
type handlerEvents struct {
|
type handlerEvents struct {
|
||||||
@@ -29,6 +37,10 @@ func (q *Router) Events(k input.Key) []input.Event {
|
|||||||
|
|
||||||
func (q *Router) Frame(ops *ui.Ops) {
|
func (q *Router) Frame(ops *ui.Ops) {
|
||||||
q.handlers.Clear()
|
q.handlers.Clear()
|
||||||
|
q.redraw = false
|
||||||
|
q.reader.Reset(ops)
|
||||||
|
q.collect()
|
||||||
|
|
||||||
q.pqueue.Frame(ops, &q.handlers)
|
q.pqueue.Frame(ops, &q.handlers)
|
||||||
q.kqueue.Frame(ops, &q.handlers)
|
q.kqueue.Frame(ops, &q.handlers)
|
||||||
}
|
}
|
||||||
@@ -47,6 +59,24 @@ func (q *Router) InputState() key.TextInputState {
|
|||||||
return q.kqueue.InputState()
|
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() {
|
func (h *handlerEvents) init() {
|
||||||
if h.handlers == nil {
|
if h.handlers == nil {
|
||||||
h.handlers = make(map[input.Key][]input.Event)
|
h.handlers = make(map[input.Key][]input.Event)
|
||||||
|
|||||||
+2
-23
@@ -13,7 +13,6 @@ import (
|
|||||||
"gioui.org/ui/app/internal/gpu"
|
"gioui.org/ui/app/internal/gpu"
|
||||||
iinput "gioui.org/ui/app/internal/input"
|
iinput "gioui.org/ui/app/internal/input"
|
||||||
"gioui.org/ui/input"
|
"gioui.org/ui/input"
|
||||||
"gioui.org/ui/internal/ops"
|
|
||||||
"gioui.org/ui/key"
|
"gioui.org/ui/key"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -48,7 +47,6 @@ type Window struct {
|
|||||||
delayedDraw *time.Timer
|
delayedDraw *time.Timer
|
||||||
|
|
||||||
router iinput.Router
|
router iinput.Router
|
||||||
reader ui.OpsReader
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// driver is the interface for the platform implementation
|
// 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.gpu.Draw(w.Profiling, size, root)
|
||||||
w.router.Frame(root)
|
w.router.Frame(root)
|
||||||
w.reader.Reset(root)
|
|
||||||
redrawTime, redraw := collectRedraws(&w.reader)
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
w.mu.Lock()
|
w.mu.Lock()
|
||||||
w.setTextInput(w.router.InputState())
|
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.timings = fmt.Sprintf("tot:%7s cpu:%7s %s", frameDur.Round(q), drawDur.Round(q), w.gpu.Timings())
|
||||||
w.setNextFrame(time.Time{})
|
w.setNextFrame(time.Time{})
|
||||||
}
|
}
|
||||||
if redraw {
|
if t, ok := w.router.RedrawTime(); ok {
|
||||||
w.setNextFrame(redrawTime)
|
w.setNextFrame(t)
|
||||||
}
|
}
|
||||||
w.updateAnimation()
|
w.updateAnimation()
|
||||||
w.mu.Unlock()
|
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() {
|
func (w *Window) Redraw() {
|
||||||
w.mu.Lock()
|
w.mu.Lock()
|
||||||
defer w.mu.Unlock()
|
defer w.mu.Unlock()
|
||||||
|
|||||||
Reference in New Issue
Block a user