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 <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2019-10-12 13:58:16 +02:00
parent a184faa50e
commit ff4fa71738
+6 -4
View File
@@ -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 {