io/pointer: make Cancel non-zero

It's semantically problematic that a zero Kind matches Cancel, and
outweighs the downside of having to explicitly mention Cancel in filters.
For example, GrabCmd was always deferred because the resulting Cancel
events always match the processed filters.

Remove Frame from a few tests now that GrabCmd can be executed
immediately.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2023-11-27 18:06:07 -06:00
parent 5fcfc40ab8
commit 33f9a850c8
4 changed files with 29 additions and 22 deletions
+13 -4
View File
@@ -44,7 +44,10 @@ func (h *Hover) Add(ops *op.Ops) {
// Update state and report whether a pointer is inside the area.
func (h *Hover) Update(q input.Source) bool {
for {
ev, ok := q.Event(pointer.Filter{Target: h, Kinds: pointer.Enter | pointer.Leave})
ev, ok := q.Event(pointer.Filter{
Target: h,
Kinds: pointer.Enter | pointer.Leave | pointer.Cancel,
})
if !ok {
break
}
@@ -176,7 +179,10 @@ func (c *Click) Pressed() bool {
// Update state and return the next click events, if any.
func (c *Click) Update(q input.Source) (ClickEvent, bool) {
for {
evt, ok := q.Event(pointer.Filter{Target: c, Kinds: pointer.Press | pointer.Release | pointer.Enter | pointer.Leave})
evt, ok := q.Event(pointer.Filter{
Target: c,
Kinds: pointer.Press | pointer.Release | pointer.Enter | pointer.Leave | pointer.Cancel,
})
if !ok {
break
}
@@ -269,7 +275,7 @@ func (s *Scroll) Update(cfg unit.Metric, q input.Source, t time.Time, axis Axis,
total := 0
f := pointer.Filter{
Target: s,
Kinds: pointer.Press | pointer.Drag | pointer.Release | pointer.Scroll,
Kinds: pointer.Press | pointer.Drag | pointer.Release | pointer.Scroll | pointer.Cancel,
ScrollBounds: bounds,
}
for {
@@ -373,7 +379,10 @@ func (d *Drag) Add(ops *op.Ops) {
// Update state and return the next drag event, if any.
func (d *Drag) Update(cfg unit.Metric, q input.Source, axis Axis) (pointer.Event, bool) {
for {
ev, ok := q.Event(pointer.Filter{Target: d, Kinds: pointer.Press | pointer.Drag | pointer.Release})
ev, ok := q.Event(pointer.Filter{
Target: d,
Kinds: pointer.Press | pointer.Drag | pointer.Release | pointer.Cancel,
})
if !ok {
break
}
+1 -1
View File
@@ -224,7 +224,7 @@ func TestFocusClick(t *testing.T) {
key.FocusFilter{Target: h},
pointer.Filter{
Target: h,
Kinds: pointer.Press | pointer.Release,
Kinds: pointer.Press | pointer.Release | pointer.Cancel,
},
}
assertEventPointerTypeSequence(t, events(r, -1, filters...), pointer.Cancel)
+14 -16
View File
@@ -94,7 +94,7 @@ func TestPointerGrab(t *testing.T) {
var ops op.Ops
filter := func(t event.Tag) event.Filter {
return pointer.Filter{Target: t, Kinds: pointer.Press | pointer.Release}
return pointer.Filter{Target: t, Kinds: pointer.Press | pointer.Release | pointer.Cancel}
}
event.InputOp(&ops, handler1)
@@ -112,11 +112,10 @@ func TestPointerGrab(t *testing.T) {
Position: f32.Pt(50, 50),
},
)
assertEventPointerTypeSequence(t, events(&r, -1, filter(handler1)), pointer.Press)
assertEventPointerTypeSequence(t, events(&r, -1, filter(handler2)), pointer.Press)
assertEventPointerTypeSequence(t, events(&r, -1, filter(handler3)), pointer.Press)
assertEventPointerTypeSequence(t, events(&r, 1, filter(handler1)), pointer.Press)
assertEventPointerTypeSequence(t, events(&r, 1, filter(handler2)), pointer.Press)
assertEventPointerTypeSequence(t, events(&r, 1, filter(handler3)), pointer.Press)
r.Source().Execute(pointer.GrabCmd{Tag: handler1})
r.Frame(&ops)
r.Queue(
pointer.Event{
Kind: pointer.Release,
@@ -134,7 +133,7 @@ func TestPointerGrabSameHandlerTwice(t *testing.T) {
var ops op.Ops
filter := func(t event.Tag) event.Filter {
return pointer.Filter{Target: t, Kinds: pointer.Press | pointer.Release}
return pointer.Filter{Target: t, Kinds: pointer.Press | pointer.Release | pointer.Cancel}
}
event.InputOp(&ops, handler1)
@@ -151,10 +150,9 @@ func TestPointerGrabSameHandlerTwice(t *testing.T) {
Position: f32.Pt(50, 50),
},
)
assertEventPointerTypeSequence(t, events(&r, -1, filter(handler1)), pointer.Press)
assertEventPointerTypeSequence(t, events(&r, -1, filter(handler2)), pointer.Press)
assertEventPointerTypeSequence(t, events(&r, 1, filter(handler1)), pointer.Press)
assertEventPointerTypeSequence(t, events(&r, 1, filter(handler2)), pointer.Press)
r.Source().Execute(pointer.GrabCmd{Tag: handler1})
r.Frame(&ops)
r.Queue(
pointer.Event{
Kind: pointer.Release,
@@ -173,7 +171,7 @@ func TestPointerMove(t *testing.T) {
filter := func(t event.Tag) event.Filter {
return pointer.Filter{
Target: t,
Kinds: pointer.Move | pointer.Enter | pointer.Leave,
Kinds: pointer.Move | pointer.Enter | pointer.Leave | pointer.Cancel,
}
}
@@ -220,7 +218,7 @@ func TestPointerTypes(t *testing.T) {
r1 := clip.Rect(image.Rect(0, 0, 100, 100)).Push(&ops)
f := pointer.Filter{
Target: handler,
Kinds: pointer.Press | pointer.Release,
Kinds: pointer.Press | pointer.Release | pointer.Cancel,
}
event.InputOp(&ops, handler)
r1.Pop()
@@ -503,7 +501,7 @@ func TestPointerEnterLeaveNested(t *testing.T) {
filter := func(t event.Tag) event.Filter {
return pointer.Filter{
Target: t,
Kinds: pointer.Press | pointer.Move | pointer.Release | pointer.Enter | pointer.Leave,
Kinds: pointer.Press | pointer.Move | pointer.Release | pointer.Enter | pointer.Leave | pointer.Cancel,
}
}
@@ -765,7 +763,7 @@ func TestPassOp(t *testing.T) {
var r Router
filter := func(t event.Tag) event.Filter {
return pointer.Filter{Target: t, Kinds: pointer.Press}
return pointer.Filter{Target: t, Kinds: pointer.Press | pointer.Cancel}
}
assertEventPointerTypeSequence(t, events(&r, -1, filter(h1)), pointer.Cancel)
assertEventPointerTypeSequence(t, events(&r, -1, filter(h2)), pointer.Cancel)
@@ -792,7 +790,7 @@ func TestAreaPassthrough(t *testing.T) {
var r Router
f := pointer.Filter{
Target: h,
Kinds: pointer.Press,
Kinds: pointer.Press | pointer.Cancel,
}
assertEventPointerTypeSequence(t, events(&r, -1, f), pointer.Cancel)
r.Frame(&ops)
@@ -814,7 +812,7 @@ func TestEllipse(t *testing.T) {
var r Router
f := pointer.Filter{
Target: h,
Kinds: pointer.Press,
Kinds: pointer.Press | pointer.Cancel,
}
assertEventPointerTypeSequence(t, events(&r, -1, f), pointer.Cancel)
r.Frame(&ops)
@@ -1094,7 +1092,7 @@ func (o *offer) Close() error {
func addPointerHandler(r *Router, ops *op.Ops, tag event.Tag, area image.Rectangle) pointer.Filter {
f := pointer.Filter{
Target: tag,
Kinds: pointer.Press | pointer.Release | pointer.Move | pointer.Drag | pointer.Enter | pointer.Leave,
Kinds: pointer.Press | pointer.Release | pointer.Move | pointer.Drag | pointer.Enter | pointer.Leave | pointer.Cancel,
}
events(r, -1, f)
defer clip.Rect(area).Push(ops).Pop()
+1 -1
View File
@@ -173,7 +173,7 @@ const (
const (
// A Cancel event is generated when the current gesture is
// interrupted by other handlers or the system.
Cancel Kind = (1 << iota) >> 1
Cancel Kind = 1 << iota
// Press of a pointer.
Press
// Release of a pointer.