io/router: drop the correct handlers when a pointer grab is requested

Fixes gio#208

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2021-03-27 13:11:36 +01:00
parent 07802569f7
commit 17ba8e28af
2 changed files with 40 additions and 4 deletions
+5 -4
View File
@@ -239,10 +239,11 @@ func (q *pointerQueue) Frame(root *op.Ops, events *handlerEvents) {
for i, k2 := range p.handlers {
if k2 == k {
// Drop other handlers that lost their grab.
cancelHandlers(events, p.handlers[i+1:]...)
cancelHandlers(events, p.handlers[:i]...)
q.dropHandlers(events, p.handlers[i+1:]...)
q.dropHandlers(events, p.handlers[:i]...)
dropped := make([]event.Tag, 0, len(p.handlers)-1)
dropped = append(dropped, p.handlers[:i]...)
dropped = append(dropped, p.handlers[i+1:]...)
cancelHandlers(events, dropped...)
q.dropHandlers(events, dropped...)
break
}
}
+35
View File
@@ -79,6 +79,41 @@ func TestPointerDragNegative(t *testing.T) {
assertEventSequence(t, r.Events(handler), pointer.Cancel, pointer.Enter, pointer.Press, pointer.Leave, pointer.Drag)
}
func TestPointerGrab(t *testing.T) {
handler1 := new(int)
handler2 := new(int)
handler3 := new(int)
var ops op.Ops
types := pointer.Press | pointer.Release
pointer.InputOp{Tag: handler1, Types: types, Grab: true}.Add(&ops)
pointer.InputOp{Tag: handler2, Types: types}.Add(&ops)
pointer.InputOp{Tag: handler3, Types: types}.Add(&ops)
var r Router
r.Frame(&ops)
r.Queue(
pointer.Event{
Type: pointer.Press,
Position: f32.Pt(50, 50),
},
)
assertEventSequence(t, r.Events(handler1), pointer.Cancel, pointer.Press)
assertEventSequence(t, r.Events(handler2), pointer.Cancel, pointer.Press)
assertEventSequence(t, r.Events(handler3), pointer.Cancel, pointer.Press)
r.Frame(&ops)
r.Queue(
pointer.Event{
Type: pointer.Release,
Position: f32.Pt(50, 50),
},
)
assertEventSequence(t, r.Events(handler1), pointer.Release)
assertEventSequence(t, r.Events(handler2), pointer.Cancel)
assertEventSequence(t, r.Events(handler3), pointer.Cancel)
}
func TestPointerMove(t *testing.T) {
handler1 := new(int)
handler2 := new(int)