mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-07 02:15:34 +00:00
io/router: refactor pointer.Push for clearer flow
Signed-off-by: Pierre Curto <pierre.curto@gmail.com>
This commit is contained in:
+30
-28
@@ -290,6 +290,17 @@ func (q *pointerQueue) dropHandlers(events *handlerEvents, tags ...event.Tag) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pointerOf returns the pointerInfo index corresponding to the pointer in e.
|
||||||
|
func (q *pointerQueue) pointerOf(e pointer.Event) int {
|
||||||
|
for i, p := range q.pointers {
|
||||||
|
if p.id == e.PointerID {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
q.pointers = append(q.pointers, pointerInfo{id: e.PointerID})
|
||||||
|
return len(q.pointers) - 1
|
||||||
|
}
|
||||||
|
|
||||||
func (q *pointerQueue) Push(e pointer.Event, events *handlerEvents) {
|
func (q *pointerQueue) Push(e pointer.Event, events *handlerEvents) {
|
||||||
q.reset()
|
q.reset()
|
||||||
if e.Type == pointer.Cancel {
|
if e.Type == pointer.Cancel {
|
||||||
@@ -299,43 +310,32 @@ func (q *pointerQueue) Push(e pointer.Event, events *handlerEvents) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pidx := -1
|
pidx := q.pointerOf(e)
|
||||||
for i, p := range q.pointers {
|
|
||||||
if p.id == e.PointerID {
|
|
||||||
pidx = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pidx == -1 {
|
|
||||||
q.pointers = append(q.pointers, pointerInfo{id: e.PointerID})
|
|
||||||
pidx = len(q.pointers) - 1
|
|
||||||
}
|
|
||||||
p := &q.pointers[pidx]
|
p := &q.pointers[pidx]
|
||||||
p.last = e
|
p.last = e
|
||||||
|
|
||||||
if e.Type == pointer.Move && p.pressed {
|
switch e.Type {
|
||||||
e.Type = pointer.Drag
|
case pointer.Press:
|
||||||
}
|
q.deliverEnterLeaveEvents(p, events, e)
|
||||||
|
p.pressed = true
|
||||||
if e.Type == pointer.Release {
|
q.deliverEvent(p, events, e)
|
||||||
|
case pointer.Move:
|
||||||
|
if p.pressed {
|
||||||
|
e.Type = pointer.Drag
|
||||||
|
}
|
||||||
|
q.deliverEnterLeaveEvents(p, events, e)
|
||||||
|
q.deliverEvent(p, events, e)
|
||||||
|
case pointer.Release:
|
||||||
q.deliverEvent(p, events, e)
|
q.deliverEvent(p, events, e)
|
||||||
p.pressed = false
|
p.pressed = false
|
||||||
}
|
q.deliverEnterLeaveEvents(p, events, e)
|
||||||
q.deliverEnterLeaveEvents(p, events, e)
|
|
||||||
|
|
||||||
if !p.pressed {
|
|
||||||
p.handlers = append(p.handlers[:0], q.scratch...)
|
|
||||||
}
|
|
||||||
if e.Type == pointer.Press {
|
|
||||||
p.pressed = true
|
|
||||||
}
|
|
||||||
switch e.Type {
|
|
||||||
case pointer.Release:
|
|
||||||
case pointer.Scroll:
|
case pointer.Scroll:
|
||||||
|
q.deliverEnterLeaveEvents(p, events, e)
|
||||||
q.deliverScrollEvent(p, events, e)
|
q.deliverScrollEvent(p, events, e)
|
||||||
default:
|
default:
|
||||||
q.deliverEvent(p, events, e)
|
panic("unsupported pointer event type")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !p.pressed && len(p.entered) == 0 {
|
if !p.pressed && len(p.entered) == 0 {
|
||||||
// No longer need to track pointer.
|
// No longer need to track pointer.
|
||||||
q.pointers = append(q.pointers[:pidx], q.pointers[pidx+1:]...)
|
q.pointers = append(q.pointers[:pidx], q.pointers[pidx+1:]...)
|
||||||
@@ -398,6 +398,8 @@ func (q *pointerQueue) deliverEnterLeaveEvents(p *pointerInfo, events *handlerEv
|
|||||||
q.scratch = append(q.scratch[:i], q.scratch[i+1:]...)
|
q.scratch = append(q.scratch[:i], q.scratch[i+1:]...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
p.handlers = append(p.handlers[:0], q.scratch...)
|
||||||
}
|
}
|
||||||
hits := q.scratch
|
hits := q.scratch
|
||||||
if e.Source != pointer.Mouse && !p.pressed && e.Type != pointer.Press {
|
if e.Source != pointer.Mouse && !p.pressed && e.Type != pointer.Press {
|
||||||
|
|||||||
Reference in New Issue
Block a user