mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-07 18:35:34 +00:00
ui/app/internal/input: add tracking up updates to handlerEvents
In preparation for only redrawing when new events are available. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -35,7 +35,7 @@ func (q *keyQueue) InputState() key.TextInputState {
|
|||||||
return q.state
|
return q.state
|
||||||
}
|
}
|
||||||
|
|
||||||
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[input.Key]*keyHandler)
|
q.handlers = make(map[input.Key]*keyHandler)
|
||||||
}
|
}
|
||||||
@@ -56,11 +56,11 @@ func (q *keyQueue) Frame(root *ui.Ops, events handlerEvents) {
|
|||||||
changed := focus != nil && focus != q.focus
|
changed := focus != nil && focus != q.focus
|
||||||
if focus != q.focus {
|
if focus != q.focus {
|
||||||
if q.focus != nil {
|
if q.focus != nil {
|
||||||
events[q.focus] = append(events[q.focus], key.FocusEvent{Focus: false})
|
events.Add(q.focus, key.FocusEvent{Focus: false})
|
||||||
}
|
}
|
||||||
q.focus = focus
|
q.focus = focus
|
||||||
if q.focus != nil {
|
if q.focus != nil {
|
||||||
events[q.focus] = append(events[q.focus], key.FocusEvent{Focus: true})
|
events.Add(q.focus, key.FocusEvent{Focus: true})
|
||||||
} else {
|
} else {
|
||||||
hide = true
|
hide = true
|
||||||
}
|
}
|
||||||
@@ -77,14 +77,13 @@ func (q *keyQueue) Frame(root *ui.Ops, events handlerEvents) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *keyQueue) Push(e input.Event, events handlerEvents) {
|
func (q *keyQueue) Push(e input.Event, events *handlerEvents) {
|
||||||
if q.focus == nil {
|
if q.focus != nil {
|
||||||
return
|
events.Add(q.focus, e)
|
||||||
}
|
}
|
||||||
events[q.focus] = append(events[q.focus], e)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *keyQueue) resolveFocus(events handlerEvents) (input.Key, listenerPriority, bool) {
|
func (q *keyQueue) resolveFocus(events *handlerEvents) (input.Key, listenerPriority, bool) {
|
||||||
var k input.Key
|
var k input.Key
|
||||||
var pri listenerPriority
|
var pri listenerPriority
|
||||||
var hide bool
|
var hide bool
|
||||||
@@ -112,7 +111,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] = []input.Event{key.FocusEvent{Focus: false}}
|
events.Set(op.Key, []input.Event{key.FocusEvent{Focus: false}})
|
||||||
}
|
}
|
||||||
h.active = true
|
h.active = true
|
||||||
case ops.TypeHideInput:
|
case ops.TypeHideInput:
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ const (
|
|||||||
areaEllipse
|
areaEllipse
|
||||||
)
|
)
|
||||||
|
|
||||||
func (q *pointerQueue) collectHandlers(r *ui.OpsReader, events handlerEvents, t ui.Transform, area, node int, pass bool) {
|
func (q *pointerQueue) collectHandlers(r *ui.OpsReader, events *handlerEvents, t ui.Transform, area, node int, pass bool) {
|
||||||
for encOp, ok := r.Decode(); ok; encOp, ok = r.Decode() {
|
for encOp, ok := r.Decode(); ok; encOp, ok = r.Decode() {
|
||||||
switch ops.OpType(encOp.Data[0]) {
|
switch ops.OpType(encOp.Data[0]) {
|
||||||
case ops.TypePush:
|
case ops.TypePush:
|
||||||
@@ -103,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] = []input.Event{pointer.Event{Type: pointer.Cancel}}
|
events.Set(op.Key, []input.Event{pointer.Event{Type: pointer.Cancel}})
|
||||||
}
|
}
|
||||||
h.active = true
|
h.active = true
|
||||||
h.area = area
|
h.area = area
|
||||||
@@ -160,7 +160,7 @@ func (q *pointerQueue) init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *pointerQueue) Frame(root *ui.Ops, events handlerEvents) {
|
func (q *pointerQueue) Frame(root *ui.Ops, events *handlerEvents) {
|
||||||
q.init()
|
q.init()
|
||||||
for _, h := range q.handlers {
|
for _, h := range q.handlers {
|
||||||
// Reset handler.
|
// Reset handler.
|
||||||
@@ -189,7 +189,7 @@ func (q *pointerQueue) dropHandler(k input.Key) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *pointerQueue) Push(e pointer.Event, events handlerEvents) {
|
func (q *pointerQueue) Push(e pointer.Event, events *handlerEvents) {
|
||||||
q.init()
|
q.init()
|
||||||
if e.Type == pointer.Cancel {
|
if e.Type == pointer.Cancel {
|
||||||
q.pointers = q.pointers[:0]
|
q.pointers = q.pointers[:0]
|
||||||
@@ -257,7 +257,7 @@ func (q *pointerQueue) Push(e pointer.Event, events handlerEvents) {
|
|||||||
}
|
}
|
||||||
e.Hit = q.hit(h.area, e.Position)
|
e.Hit = q.hit(h.area, e.Position)
|
||||||
e.Position = h.transform.InvTransform(e.Position)
|
e.Position = h.transform.InvTransform(e.Position)
|
||||||
events[k] = append(events[k], e)
|
events.Add(k, e)
|
||||||
if e.Type == pointer.Release {
|
if e.Type == pointer.Release {
|
||||||
// Release grab when the number of grabs reaches zero.
|
// Release grab when the number of grabs reaches zero.
|
||||||
grabs := 0
|
grabs := 0
|
||||||
|
|||||||
@@ -18,39 +18,67 @@ type Router struct {
|
|||||||
handlers handlerEvents
|
handlers handlerEvents
|
||||||
}
|
}
|
||||||
|
|
||||||
type handlerEvents map[input.Key][]input.Event
|
type handlerEvents struct {
|
||||||
|
handlers map[input.Key][]input.Event
|
||||||
|
updated bool
|
||||||
|
}
|
||||||
|
|
||||||
func (q *Router) Events(k input.Key) []input.Event {
|
func (q *Router) Events(k input.Key) []input.Event {
|
||||||
events := q.handlers[k]
|
return q.handlers.For(k)
|
||||||
delete(q.handlers, k)
|
|
||||||
return events
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *Router) Frame(ops *ui.Ops) {
|
func (q *Router) Frame(ops *ui.Ops) {
|
||||||
q.init()
|
q.handlers.Clear()
|
||||||
for k := range q.handlers {
|
q.pqueue.Frame(ops, &q.handlers)
|
||||||
delete(q.handlers, k)
|
q.kqueue.Frame(ops, &q.handlers)
|
||||||
}
|
|
||||||
q.pqueue.Frame(ops, q.handlers)
|
|
||||||
q.kqueue.Frame(ops, q.handlers)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *Router) Add(e input.Event) {
|
func (q *Router) Add(e input.Event) bool {
|
||||||
q.init()
|
|
||||||
switch e := e.(type) {
|
switch e := e.(type) {
|
||||||
case pointer.Event:
|
case pointer.Event:
|
||||||
q.pqueue.Push(e, q.handlers)
|
q.pqueue.Push(e, &q.handlers)
|
||||||
case key.EditEvent, key.ChordEvent, key.FocusEvent:
|
case key.EditEvent, key.ChordEvent, key.FocusEvent:
|
||||||
q.kqueue.Push(e, q.handlers)
|
q.kqueue.Push(e, &q.handlers)
|
||||||
}
|
}
|
||||||
|
return q.handlers.Updated()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *Router) InputState() key.TextInputState {
|
func (q *Router) InputState() key.TextInputState {
|
||||||
return q.kqueue.InputState()
|
return q.kqueue.InputState()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *Router) init() {
|
func (h *handlerEvents) init() {
|
||||||
if q.handlers == nil {
|
if h.handlers == nil {
|
||||||
q.handlers = make(handlerEvents)
|
h.handlers = make(map[input.Key][]input.Event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *handlerEvents) Set(k input.Key, evts []input.Event) {
|
||||||
|
h.init()
|
||||||
|
h.handlers[k] = evts
|
||||||
|
h.updated = true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *handlerEvents) Add(k input.Key, e input.Event) {
|
||||||
|
h.init()
|
||||||
|
h.handlers[k] = append(h.handlers[k], e)
|
||||||
|
h.updated = true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *handlerEvents) Updated() bool {
|
||||||
|
u := h.updated
|
||||||
|
h.updated = false
|
||||||
|
return u
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *handlerEvents) For(k input.Key) []input.Event {
|
||||||
|
events := h.handlers[k]
|
||||||
|
delete(h.handlers, k)
|
||||||
|
return events
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *handlerEvents) Clear() {
|
||||||
|
for k := range h.handlers {
|
||||||
|
delete(h.handlers, k)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user