mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-07 18:35:34 +00:00
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:
@@ -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
|
||||||
|
|||||||
+35
-31
@@ -141,37 +141,7 @@ 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 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
kq := &q.key.queue
|
|
||||||
if kq.Accepts(f, e) {
|
|
||||||
q.handlers.Add(f, e)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
a := kq.AreaFor(f)
|
|
||||||
pq := &q.pointer.queue
|
|
||||||
idx := len(pq.hitTree) - 1
|
|
||||||
// Locate first potential receiver.
|
|
||||||
for idx != -1 {
|
|
||||||
n := &pq.hitTree[idx]
|
|
||||||
if n.area == a {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
idx--
|
|
||||||
}
|
|
||||||
for idx != -1 {
|
|
||||||
n := &pq.hitTree[idx]
|
|
||||||
idx = n.next
|
|
||||||
if n.ktag == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if n.ktag != nil && kq.Accepts(n.ktag, e) {
|
|
||||||
q.handlers.Add(n.ktag, e)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case key.EditEvent, key.FocusEvent, key.SnippetEvent, key.SelectionEvent:
|
case key.EditEvent, key.FocusEvent, key.SnippetEvent, key.SelectionEvent:
|
||||||
if f := q.key.queue.focus; f != nil {
|
if f := q.key.queue.focus; f != nil {
|
||||||
q.handlers.Add(f, e)
|
q.handlers.Add(f, e)
|
||||||
@@ -183,6 +153,40 @@ func (q *Router) Queue(events ...event.Event) bool {
|
|||||||
return q.handlers.HadEvents()
|
return q.handlers.HadEvents()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (q *Router) queueKeyEvent(e key.Event) {
|
||||||
|
kq := &q.key.queue
|
||||||
|
f := q.key.queue.focus
|
||||||
|
a := 0 // Root area
|
||||||
|
if f != nil {
|
||||||
|
if kq.Accepts(f, e) {
|
||||||
|
q.handlers.Add(f, e)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
a = kq.AreaFor(f)
|
||||||
|
}
|
||||||
|
pq := &q.pointer.queue
|
||||||
|
idx := len(pq.hitTree) - 1
|
||||||
|
// Locate first potential receiver.
|
||||||
|
for idx != -1 {
|
||||||
|
n := &pq.hitTree[idx]
|
||||||
|
if n.area == a {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
idx--
|
||||||
|
}
|
||||||
|
for idx != -1 {
|
||||||
|
n := &pq.hitTree[idx]
|
||||||
|
idx = n.next
|
||||||
|
if n.ktag == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if n.ktag != nil && kq.Accepts(n.ktag, e) {
|
||||||
|
q.handlers.Add(n.ktag, e)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (q *Router) MoveFocus(dir FocusDirection) bool {
|
func (q *Router) MoveFocus(dir FocusDirection) bool {
|
||||||
return q.key.queue.MoveFocus(dir, &q.handlers)
|
return q.key.queue.MoveFocus(dir, &q.handlers)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user