From 33f9a850c8066301b1ed30d4203aa07aa959c486 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 27 Nov 2023 18:06:07 -0600 Subject: [PATCH] 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 --- gesture/gesture.go | 17 +++++++++++++---- io/input/key_test.go | 2 +- io/input/pointer_test.go | 30 ++++++++++++++---------------- io/pointer/pointer.go | 2 +- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/gesture/gesture.go b/gesture/gesture.go index c9a289eb..b32c2a47 100644 --- a/gesture/gesture.go +++ b/gesture/gesture.go @@ -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 } diff --git a/io/input/key_test.go b/io/input/key_test.go index bb18ab5e..b5c77a4f 100644 --- a/io/input/key_test.go +++ b/io/input/key_test.go @@ -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) diff --git a/io/input/pointer_test.go b/io/input/pointer_test.go index 484bb240..8209de61 100644 --- a/io/input/pointer_test.go +++ b/io/input/pointer_test.go @@ -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() diff --git a/io/pointer/pointer.go b/io/pointer/pointer.go index 08a4e6a5..8b9b42fb 100644 --- a/io/pointer/pointer.go +++ b/io/pointer/pointer.go @@ -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.