forked from joejulian/gio
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:
+13
-4
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
@@ -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()
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user