diff --git a/io/router/pointer.go b/io/router/pointer.go index 2f56d327..4c4a051e 100644 --- a/io/router/pointer.go +++ b/io/router/pointer.go @@ -725,12 +725,16 @@ func (q *pointerQueue) deliverEnterLeaveEvents(p *pointerInfo, events *handlerEv } // Deliver Enter events and update cursor. q.cursor = pointer.CursorDefault + cursorFound := false for _, k := range hits { h := q.handlers[k] - for i := len(q.cursors) - 1; i >= 0; i-- { - if c := q.cursors[i]; c.area == h.area { - q.cursor = c.cursor - break + if !cursorFound { + for i := len(q.cursors) - 1; i >= 0; i-- { + if c := q.cursors[i]; c.area == h.area { + q.cursor = c.cursor + cursorFound = true + break + } } } if _, found := searchTag(p.entered, k); found { diff --git a/io/router/pointer_test.go b/io/router/pointer_test.go index 05e2acd1..abef0bc5 100644 --- a/io/router/pointer_test.go +++ b/io/router/pointer_test.go @@ -1109,6 +1109,33 @@ func TestDeferredInputOp(t *testing.T) { r.Frame(&ops) } +func TestPassCursor(t *testing.T) { + var ops op.Ops + var r Router + + rect := clip.Rect(image.Rect(0, 0, 100, 100)) + background := rect.Push(&ops) + pointer.InputOp{Tag: 1}.Add(&ops) + pointer.CursorDefault.Add(&ops) + background.Pop() + + overlayPass := pointer.PassOp{}.Push(&ops) + overlay := rect.Push(&ops) + pointer.InputOp{Tag: 2}.Add(&ops) + want := pointer.CursorPointer + want.Add(&ops) + overlay.Pop() + overlayPass.Pop() + r.Frame(&ops) + r.Queue(pointer.Event{ + Position: f32.Pt(10, 10), + Type: pointer.Move, + }) + if got := r.Cursor(); want != got { + t.Errorf("got cursor %v, want %v", got, want) + } +} + // offer satisfies io.ReadCloser for use in data transfers. type offer struct { data string