From d34544cc220ab88c337ba1c5e1ff04f8c57487bc Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 30 Mar 2022 18:22:43 +0200 Subject: [PATCH] io/router: merge pointerQueue.deliverScrollEvents and deliverEvent They're similar except for a bit of special handling for scroll events. Signed-off-by: Elias Naur --- io/router/pointer.go | 36 ++++++++++-------------------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/io/router/pointer.go b/io/router/pointer.go index ab28df66..384c577f 100644 --- a/io/router/pointer.go +++ b/io/router/pointer.go @@ -664,7 +664,7 @@ func (q *pointerQueue) Push(e pointer.Event, events *handlerEvents) { q.deliverDropEvent(p, events) case pointer.Scroll: q.deliverEnterLeaveEvents(p, events, e) - q.deliverScrollEvent(p, events, e) + q.deliverEvent(p, events, e) default: panic("unsupported pointer event type") } @@ -681,8 +681,17 @@ func (q *pointerQueue) deliverEvent(p *pointerInfo, events *handlerEvents, e poi e.Priority = pointer.Grabbed foremost = false } + var sx, sy = e.Scroll.X, e.Scroll.Y for _, k := range p.handlers { h := q.handlers[k] + if e.Type == pointer.Scroll { + if sx == 0 && sy == 0 { + return + } + // Distribute the scroll to the handler based on its ScrollRange. + sx, e.Scroll.X = setScrollEvent(sx, h.scrollRange.Min.X, h.scrollRange.Max.X) + sy, e.Scroll.Y = setScrollEvent(sy, h.scrollRange.Min.Y, h.scrollRange.Max.Y) + } if e.Type&h.types == 0 { continue } @@ -696,31 +705,6 @@ func (q *pointerQueue) deliverEvent(p *pointerInfo, events *handlerEvents, e poi } } -func (q *pointerQueue) deliverScrollEvent(p *pointerInfo, events *handlerEvents, e pointer.Event) { - foremost := true - if p.pressed && len(p.handlers) == 1 { - e.Priority = pointer.Grabbed - foremost = false - } - var sx, sy = e.Scroll.X, e.Scroll.Y - for _, k := range p.handlers { - if sx == 0 && sy == 0 { - return - } - h := q.handlers[k] - // Distribute the scroll to the handler based on its ScrollRange. - sx, e.Scroll.X = setScrollEvent(sx, h.scrollRange.Min.X, h.scrollRange.Max.X) - sy, e.Scroll.Y = setScrollEvent(sy, h.scrollRange.Min.Y, h.scrollRange.Max.Y) - e := e - if foremost { - foremost = false - e.Priority = pointer.Foremost - } - e.Position = q.invTransform(h.area, e.Position) - events.Add(k, e) - } -} - func (q *pointerQueue) deliverEnterLeaveEvents(p *pointerInfo, events *handlerEvents, e pointer.Event) { var hits []event.Tag if e.Source != pointer.Mouse && !p.pressed && e.Type != pointer.Press {