all: [API] replace tag parameter of Source.Event with per-filter tags

Until now, every event has had a particular target. We're about to simplify
key event delivery to match the first matching filter, so there is no
longer a global meaning to the tag argument to Source.Event.

Add fields to filters to specify their target tags.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2023-11-26 12:58:10 -06:00
parent 496fc3cc82
commit d9a007586c
16 changed files with 195 additions and 115 deletions
+32 -1
View File
@@ -19,6 +19,17 @@ import (
"gioui.org/op/clip"
)
func TestPointerNilTarget(t *testing.T) {
r := new(Router)
r.Event(pointer.Filter{Kinds: pointer.Press})
r.Frame(new(op.Ops))
r.Queue(pointer.Event{Kind: pointer.Press})
// Nil Targets should not receive events.
if _, ok := r.Event(pointer.Filter{Kinds: pointer.Press}); ok {
t.Errorf("nil target received event")
}
}
func TestPointerWakeup(t *testing.T) {
handler := new(int)
var ops op.Ops
@@ -55,9 +66,29 @@ func TestPointerDrag(t *testing.T) {
}
func events(r *Router, h event.Tag, filters ...event.Filter) []event.Event {
// Hack to facilitate transition to per-filter tags.
for i, f := range filters {
switch f := f.(type) {
case key.Filter:
f.Target = h
filters[i] = f
case key.FocusFilter:
f.Target = h
filters[i] = f
case transfer.SourceFilter:
f.Target = h
filters[i] = f
case transfer.TargetFilter:
f.Target = h
filters[i] = f
case pointer.Filter:
f.Target = h
filters[i] = f
}
}
var events []event.Event
for {
e, ok := r.Event(h, filters...)
e, ok := r.Event(filters...)
if !ok {
break
}