mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-04 08:55:35 +00:00
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>
This commit is contained in:
@@ -4,13 +4,14 @@ package input
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"gioui.org/ui"
|
"gioui.org/ui"
|
||||||
|
"gioui.org/ui/input"
|
||||||
"gioui.org/ui/internal/ops"
|
"gioui.org/ui/internal/ops"
|
||||||
"gioui.org/ui/key"
|
"gioui.org/ui/key"
|
||||||
)
|
)
|
||||||
|
|
||||||
type keyQueue struct {
|
type keyQueue struct {
|
||||||
focus Key
|
focus input.Key
|
||||||
handlers map[Key]*keyHandler
|
handlers map[input.Key]*keyHandler
|
||||||
reader ui.OpsReader
|
reader ui.OpsReader
|
||||||
state key.TextInputState
|
state key.TextInputState
|
||||||
}
|
}
|
||||||
@@ -36,7 +37,7 @@ func (q *keyQueue) InputState() key.TextInputState {
|
|||||||
|
|
||||||
func (q *keyQueue) Frame(root *ui.Ops, events handlerEvents) {
|
func (q *keyQueue) Frame(root *ui.Ops, events handlerEvents) {
|
||||||
if q.handlers == nil {
|
if q.handlers == nil {
|
||||||
q.handlers = make(map[Key]*keyHandler)
|
q.handlers = make(map[input.Key]*keyHandler)
|
||||||
}
|
}
|
||||||
for _, h := range q.handlers {
|
for _, h := range q.handlers {
|
||||||
h.active = false
|
h.active = false
|
||||||
@@ -76,15 +77,15 @@ func (q *keyQueue) Frame(root *ui.Ops, events handlerEvents) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *keyQueue) Push(e Event, events handlerEvents) {
|
func (q *keyQueue) Push(e input.Event, events handlerEvents) {
|
||||||
if q.focus == nil {
|
if q.focus == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
events[q.focus] = append(events[q.focus], e)
|
events[q.focus] = append(events[q.focus], e)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *keyQueue) resolveFocus(events handlerEvents) (Key, listenerPriority, bool) {
|
func (q *keyQueue) resolveFocus(events handlerEvents) (input.Key, listenerPriority, bool) {
|
||||||
var k Key
|
var k input.Key
|
||||||
var pri listenerPriority
|
var pri listenerPriority
|
||||||
var hide bool
|
var hide bool
|
||||||
loop:
|
loop:
|
||||||
@@ -111,7 +112,7 @@ loop:
|
|||||||
h = new(keyHandler)
|
h = new(keyHandler)
|
||||||
q.handlers[op.Key] = h
|
q.handlers[op.Key] = h
|
||||||
// Reset the handler on (each) first appearance.
|
// Reset the handler on (each) first appearance.
|
||||||
events[op.Key] = []Event{key.FocusEvent{Focus: false}}
|
events[op.Key] = []input.Event{key.FocusEvent{Focus: false}}
|
||||||
}
|
}
|
||||||
h.active = true
|
h.active = true
|
||||||
case ops.TypeHideInput:
|
case ops.TypeHideInput:
|
||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
|
|
||||||
"gioui.org/ui"
|
"gioui.org/ui"
|
||||||
"gioui.org/ui/f32"
|
"gioui.org/ui/f32"
|
||||||
|
"gioui.org/ui/input"
|
||||||
"gioui.org/ui/internal/ops"
|
"gioui.org/ui/internal/ops"
|
||||||
"gioui.org/ui/pointer"
|
"gioui.org/ui/pointer"
|
||||||
)
|
)
|
||||||
@@ -15,10 +16,10 @@ import (
|
|||||||
type pointerQueue struct {
|
type pointerQueue struct {
|
||||||
hitTree []hitNode
|
hitTree []hitNode
|
||||||
areas []areaNode
|
areas []areaNode
|
||||||
handlers map[Key]*pointerHandler
|
handlers map[input.Key]*pointerHandler
|
||||||
pointers []pointerInfo
|
pointers []pointerInfo
|
||||||
reader ui.OpsReader
|
reader ui.OpsReader
|
||||||
scratch []Key
|
scratch []input.Key
|
||||||
}
|
}
|
||||||
|
|
||||||
type hitNode struct {
|
type hitNode struct {
|
||||||
@@ -28,13 +29,13 @@ type hitNode struct {
|
|||||||
pass bool
|
pass bool
|
||||||
|
|
||||||
// For handler nodes.
|
// For handler nodes.
|
||||||
key Key
|
key input.Key
|
||||||
}
|
}
|
||||||
|
|
||||||
type pointerInfo struct {
|
type pointerInfo struct {
|
||||||
id pointer.ID
|
id pointer.ID
|
||||||
pressed bool
|
pressed bool
|
||||||
handlers []Key
|
handlers []input.Key
|
||||||
}
|
}
|
||||||
|
|
||||||
type pointerHandler struct {
|
type pointerHandler struct {
|
||||||
@@ -102,7 +103,7 @@ func (q *pointerQueue) collectHandlers(r *ui.OpsReader, events handlerEvents, t
|
|||||||
if !ok {
|
if !ok {
|
||||||
h = new(pointerHandler)
|
h = new(pointerHandler)
|
||||||
q.handlers[op.Key] = h
|
q.handlers[op.Key] = h
|
||||||
events[op.Key] = []Event{pointer.Event{Type: pointer.Cancel}}
|
events[op.Key] = []input.Event{pointer.Event{Type: pointer.Cancel}}
|
||||||
}
|
}
|
||||||
h.active = true
|
h.active = true
|
||||||
h.area = area
|
h.area = area
|
||||||
@@ -112,7 +113,7 @@ func (q *pointerQueue) collectHandlers(r *ui.OpsReader, events handlerEvents, t
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *pointerQueue) opHit(handlers *[]Key, pos f32.Point) {
|
func (q *pointerQueue) opHit(handlers *[]input.Key, pos f32.Point) {
|
||||||
// Track whether we're passing through hits.
|
// Track whether we're passing through hits.
|
||||||
pass := true
|
pass := true
|
||||||
idx := len(q.hitTree) - 1
|
idx := len(q.hitTree) - 1
|
||||||
@@ -155,7 +156,7 @@ func (a *areaNode) hit(p f32.Point) bool {
|
|||||||
|
|
||||||
func (q *pointerQueue) init() {
|
func (q *pointerQueue) init() {
|
||||||
if q.handlers == nil {
|
if q.handlers == nil {
|
||||||
q.handlers = make(map[Key]*pointerHandler)
|
q.handlers = make(map[input.Key]*pointerHandler)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,7 +177,7 @@ func (q *pointerQueue) Frame(root *ui.Ops, events handlerEvents) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *pointerQueue) dropHandler(k Key) {
|
func (q *pointerQueue) dropHandler(k input.Key) {
|
||||||
delete(q.handlers, k)
|
delete(q.handlers, k)
|
||||||
for i := range q.pointers {
|
for i := range q.pointers {
|
||||||
p := &q.pointers[i]
|
p := &q.pointers[i]
|
||||||
@@ -4,6 +4,7 @@ package input
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"gioui.org/ui"
|
"gioui.org/ui"
|
||||||
|
"gioui.org/ui/input"
|
||||||
"gioui.org/ui/key"
|
"gioui.org/ui/key"
|
||||||
"gioui.org/ui/pointer"
|
"gioui.org/ui/pointer"
|
||||||
)
|
)
|
||||||
@@ -17,9 +18,9 @@ type Router struct {
|
|||||||
handlers handlerEvents
|
handlers handlerEvents
|
||||||
}
|
}
|
||||||
|
|
||||||
type handlerEvents map[Key][]Event
|
type handlerEvents map[input.Key][]input.Event
|
||||||
|
|
||||||
func (q *Router) Events(k Key) []Event {
|
func (q *Router) Events(k input.Key) []input.Event {
|
||||||
events := q.handlers[k]
|
events := q.handlers[k]
|
||||||
delete(q.handlers, k)
|
delete(q.handlers, k)
|
||||||
return events
|
return events
|
||||||
@@ -34,7 +35,7 @@ func (q *Router) Frame(ops *ui.Ops) {
|
|||||||
q.kqueue.Frame(ops, q.handlers)
|
q.kqueue.Frame(ops, q.handlers)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *Router) Add(e Event) {
|
func (q *Router) Add(e input.Event) {
|
||||||
q.init()
|
q.init()
|
||||||
switch e := e.(type) {
|
switch e := e.(type) {
|
||||||
case pointer.Event:
|
case pointer.Event:
|
||||||
+2
-1
@@ -12,6 +12,7 @@ import (
|
|||||||
"gioui.org/ui"
|
"gioui.org/ui"
|
||||||
"gioui.org/ui/app/internal/gpu"
|
"gioui.org/ui/app/internal/gpu"
|
||||||
"gioui.org/ui/input"
|
"gioui.org/ui/input"
|
||||||
|
iinput "gioui.org/ui/app/internal/input"
|
||||||
"gioui.org/ui/internal/ops"
|
"gioui.org/ui/internal/ops"
|
||||||
"gioui.org/ui/key"
|
"gioui.org/ui/key"
|
||||||
)
|
)
|
||||||
@@ -46,7 +47,7 @@ type Window struct {
|
|||||||
nextFrame time.Time
|
nextFrame time.Time
|
||||||
delayedDraw *time.Timer
|
delayedDraw *time.Timer
|
||||||
|
|
||||||
router input.Router
|
router iinput.Router
|
||||||
reader ui.OpsReader
|
reader ui.OpsReader
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user