Files
gio/ui/app/internal/input/router.go
T
Elias Naur cbdda4e9c5 ui/input: move Router and input queues to internal package
Now that only app.Window needs the Router, make it unavailable for
clients.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-12 13:51:00 +02:00

57 lines
1.1 KiB
Go

// SPDX-License-Identifier: Unlicense OR MIT
package input
import (
"gioui.org/ui"
"gioui.org/ui/input"
"gioui.org/ui/key"
"gioui.org/ui/pointer"
)
// Router is a Queue implementation that routes events from
// all available input sources to registered handlers.
type Router struct {
pqueue pointerQueue
kqueue keyQueue
handlers handlerEvents
}
type handlerEvents map[input.Key][]input.Event
func (q *Router) Events(k input.Key) []input.Event {
events := q.handlers[k]
delete(q.handlers, k)
return events
}
func (q *Router) Frame(ops *ui.Ops) {
q.init()
for k := range q.handlers {
delete(q.handlers, k)
}
q.pqueue.Frame(ops, q.handlers)
q.kqueue.Frame(ops, q.handlers)
}
func (q *Router) Add(e input.Event) {
q.init()
switch e := e.(type) {
case pointer.Event:
q.pqueue.Push(e, q.handlers)
case key.EditEvent, key.ChordEvent, key.FocusEvent:
q.kqueue.Push(e, q.handlers)
}
}
func (q *Router) InputState() key.TextInputState {
return q.kqueue.InputState()
}
func (q *Router) init() {
if q.handlers == nil {
q.handlers = make(handlerEvents)
}
}