From ff4fa717381e5f57798266e48b2c1045cf18aede Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sat, 12 Oct 2019 13:58:16 +0200 Subject: [PATCH] app/internal/input: really reset dropped handlers First, let the handlers know they're dropping with a cancel event. Second, reset the grab flag of dropped handlers. Fixes issues when drag-scrolling and then clicking and another with two nested drag gestures where the grab flag is kept for the second handler even after it is pushed out by the first handler grabbing. Signed-off-by: Elias Naur --- app/internal/input/pointer.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/internal/input/pointer.go b/app/internal/input/pointer.go index cdaf2fa8..ddc2f7ae 100644 --- a/app/internal/input/pointer.go +++ b/app/internal/input/pointer.go @@ -170,13 +170,15 @@ func (q *pointerQueue) Frame(root *op.Ops, events *handlerEvents) { q.collectHandlers(&q.reader, events, op.TransformOp{}, -1, -1, false) for k, h := range q.handlers { if !h.active { - q.dropHandler(k) + q.dropHandler(k, events) delete(q.handlers, k) } } } -func (q *pointerQueue) dropHandler(k event.Key) { +func (q *pointerQueue) dropHandler(k event.Key, events *handlerEvents) { + events.Add(k, pointer.Event{Type: pointer.Cancel}) + q.handlers[k].wantsGrab = false for i := range q.pointers { p := &q.pointers[i] for i := len(p.handlers) - 1; i >= 0; i-- { @@ -192,7 +194,7 @@ func (q *pointerQueue) Push(e pointer.Event, events *handlerEvents) { if e.Type == pointer.Cancel { q.pointers = q.pointers[:0] for k := range q.handlers { - q.dropHandler(k) + q.dropHandler(k, events) } return } @@ -228,7 +230,7 @@ func (q *pointerQueue) Push(e pointer.Event, events *handlerEvents) { } // Drop handlers that lost their grab. for _, k := range q.scratch { - q.dropHandler(k) + q.dropHandler(k, events) } } if e.Type == pointer.Release {