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.