io/router: send key events to root handlers if nothing else wants them

Fixes: https://todo.sr.ht/~eliasnaur/gio/403
Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2022-04-23 09:40:23 +02:00
parent 6ddc13ce66
commit 30fa85f518
2 changed files with 49 additions and 31 deletions
+14
View File
@@ -345,6 +345,20 @@ func TestKeyRouting(t *testing.T) {
assertKeyEvent(t, r.Events(&handlers[0]), false) assertKeyEvent(t, r.Events(&handlers[0]), false)
} }
func TestTopLevelInputOp(t *testing.T) {
h := new(int)
ops := new(op.Ops)
r := new(Router)
key.InputOp{Tag: h, Keys: "A"}.Add(ops)
r.Frame(ops)
A := key.Event{Name: "A"}
r.Queue(A)
assertKeyEvent(t, r.Events(h), false, A)
}
func assertKeyEvent(t *testing.T, events []event.Event, expected bool, expectedInputs ...event.Event) { func assertKeyEvent(t *testing.T, events []event.Event, expected bool, expectedInputs ...event.Event) {
t.Helper() t.Helper()
var evtFocus int var evtFocus int
+18 -14
View File
@@ -141,16 +141,29 @@ func (q *Router) Queue(events ...event.Event) bool {
case pointer.Event: case pointer.Event:
q.pointer.queue.Push(e, &q.handlers) q.pointer.queue.Push(e, &q.handlers)
case key.Event: case key.Event:
f := q.key.queue.focus q.queueKeyEvent(e)
if f == nil { case key.EditEvent, key.FocusEvent, key.SnippetEvent, key.SelectionEvent:
break if f := q.key.queue.focus; f != nil {
q.handlers.Add(f, e)
} }
case clipboard.Event:
q.cqueue.Push(e, &q.handlers)
}
}
return q.handlers.HadEvents()
}
func (q *Router) queueKeyEvent(e key.Event) {
kq := &q.key.queue kq := &q.key.queue
f := q.key.queue.focus
a := 0 // Root area
if f != nil {
if kq.Accepts(f, e) { if kq.Accepts(f, e) {
q.handlers.Add(f, e) q.handlers.Add(f, e)
break return
}
a = kq.AreaFor(f)
} }
a := kq.AreaFor(f)
pq := &q.pointer.queue pq := &q.pointer.queue
idx := len(pq.hitTree) - 1 idx := len(pq.hitTree) - 1
// Locate first potential receiver. // Locate first potential receiver.
@@ -172,15 +185,6 @@ func (q *Router) Queue(events ...event.Event) bool {
break break
} }
} }
case key.EditEvent, key.FocusEvent, key.SnippetEvent, key.SelectionEvent:
if f := q.key.queue.focus; f != nil {
q.handlers.Add(f, e)
}
case clipboard.Event:
q.cqueue.Push(e, &q.handlers)
}
}
return q.handlers.HadEvents()
} }
func (q *Router) MoveFocus(dir FocusDirection) bool { func (q *Router) MoveFocus(dir FocusDirection) bool {