mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-06 18:05:35 +00:00
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:
@@ -239,10 +239,11 @@ func (q *pointerQueue) Frame(root *op.Ops, events *handlerEvents) {
|
|||||||
for i, k2 := range p.handlers {
|
for i, k2 := range p.handlers {
|
||||||
if k2 == k {
|
if k2 == k {
|
||||||
// Drop other handlers that lost their grab.
|
// Drop other handlers that lost their grab.
|
||||||
cancelHandlers(events, p.handlers[i+1:]...)
|
dropped := make([]event.Tag, 0, len(p.handlers)-1)
|
||||||
cancelHandlers(events, p.handlers[:i]...)
|
dropped = append(dropped, p.handlers[:i]...)
|
||||||
q.dropHandlers(events, p.handlers[i+1:]...)
|
dropped = append(dropped, p.handlers[i+1:]...)
|
||||||
q.dropHandlers(events, p.handlers[:i]...)
|
cancelHandlers(events, dropped...)
|
||||||
|
q.dropHandlers(events, dropped...)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,41 @@ func TestPointerDragNegative(t *testing.T) {
|
|||||||
assertEventSequence(t, r.Events(handler), pointer.Cancel, pointer.Enter, pointer.Press, pointer.Leave, pointer.Drag)
|
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) {
|
func TestPointerMove(t *testing.T) {
|
||||||
handler1 := new(int)
|
handler1 := new(int)
|
||||||
handler2 := new(int)
|
handler2 := new(int)
|
||||||
|
|||||||
Reference in New Issue
Block a user