diff --git a/gesture/gesture.go b/gesture/gesture.go index 28aad990..3fc56c60 100644 --- a/gesture/gesture.go +++ b/gesture/gesture.go @@ -174,7 +174,7 @@ func (s *Scroll) Add(ops *op.Ops) { oph := pointer.InputOp{ Tag: s, Grab: s.grab, - Types: pointer.Press | pointer.Move | pointer.Release | pointer.Scroll, + Types: pointer.Press | pointer.Drag | pointer.Release | pointer.Scroll, } oph.Add(ops) if s.flinger.Active() { @@ -234,7 +234,7 @@ func (s *Scroll) Scroll(cfg unit.Converter, q event.Queue, t time.Time, axis Axi iscroll := int(s.scroll) s.scroll -= float32(iscroll) total += iscroll - case pointer.Move: + case pointer.Drag: if !s.dragging || s.pid != e.PointerID { continue } diff --git a/io/pointer/doc.go b/io/pointer/doc.go index efb0a4b4..95bf4adf 100644 --- a/io/pointer/doc.go +++ b/io/pointer/doc.go @@ -12,7 +12,7 @@ Types Only events that match a specified list of types are delivered to a handler. -For example, to receive Press, Move, and Release events (but not Enter, +For example, to receive Press, Drag, and Release events (but not Move, Enter, Leave, or Scroll): var ops op.Ops @@ -20,7 +20,7 @@ Leave, or Scroll): pointer.InputOp{ Tag: h, - Types: pointer.Press | pointer.Move | pointer.Release, + Types: pointer.Press | pointer.Drag | pointer.Release, }.Add(ops) Scroll events are only delivered to the foremost scroll handler. diff --git a/io/pointer/pointer.go b/io/pointer/pointer.go index 9dc1f35a..7d4c74b1 100644 --- a/io/pointer/pointer.go +++ b/io/pointer/pointer.go @@ -92,6 +92,8 @@ const ( Release // Move of a pointer. Move + // Drag of a pointer. + Drag // Pointer enters an area watching for pointer input Enter // Pointer leaves an area watching for pointer input @@ -180,6 +182,8 @@ func (t Type) String() string { return "Cancel" case Move: return "Move" + case Drag: + return "Drag" case Enter: return "Enter" case Leave: diff --git a/io/router/pointer.go b/io/router/pointer.go index 8e27015c..de64d512 100644 --- a/io/router/pointer.go +++ b/io/router/pointer.go @@ -235,6 +235,10 @@ func (q *pointerQueue) Push(e pointer.Event, events *handlerEvents) { } p := &q.pointers[pidx] + if e.Type == pointer.Move && p.pressed { + e.Type = pointer.Drag + } + q.deliverEnterLeaveEvents(p, events, e) if e.Type == pointer.Release { q.deliverEvent(p, events, e) diff --git a/io/router/pointer_test.go b/io/router/pointer_test.go index 9fce1686..12e3c4c9 100644 --- a/io/router/pointer_test.go +++ b/io/router/pointer_test.go @@ -39,7 +39,7 @@ func TestPointerDrag(t *testing.T) { }, }, ) - assertEventSequence(t, r.Events(handler), pointer.Cancel, pointer.Enter, pointer.Press, pointer.Leave, pointer.Move) + assertEventSequence(t, r.Events(handler), pointer.Cancel, pointer.Enter, pointer.Press, pointer.Leave, pointer.Drag) } func TestPointerMove(t *testing.T) { @@ -446,7 +446,7 @@ func addPointerHandler(ops *op.Ops, tag event.Tag, area image.Rectangle) { pointer.Rect(area).Add(ops) pointer.InputOp{ Tag: tag, - Types: pointer.Press | pointer.Move | pointer.Release | pointer.Enter | pointer.Leave, + Types: pointer.Press | pointer.Release | pointer.Move | pointer.Drag | pointer.Enter | pointer.Leave, }.Add(ops) }