From f6451eb533181679f243561e1b2d082e257aae73 Mon Sep 17 00:00:00 2001 From: Shreeraj Jadhav Date: Fri, 19 Jan 2024 17:39:48 -0500 Subject: [PATCH] fix(ParentedView): mouse scrolling behavior for out-of-focus windows Out of focus windows/viewports do not detect `pointerenter` events reliably. Add listener to `wheel` events for rebinding interactor with events. --- src/core/internal/ParentedView.tsx | 31 ++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/core/internal/ParentedView.tsx b/src/core/internal/ParentedView.tsx index b016419..b427cd5 100644 --- a/src/core/internal/ParentedView.tsx +++ b/src/core/internal/ParentedView.tsx @@ -87,9 +87,9 @@ const ParentedView = forwardRef(function ParentedView( * 1. Switch to targeted renderer. * 2. Switch to this View's interactor style. */ - useEventListener(containerRef, 'pointerenter', (ev: PointerEvent) => { + const switchTarget = (): boolean => { const rendererAPI = rendererRef.current; - if (!rendererAPI) return; + if (!rendererAPI) return false; const interactor = getInteractor(); @@ -101,14 +101,25 @@ const ParentedView = forwardRef(function ParentedView( const oldContainer = interactor.getContainer(); const newContainer = containerRef.current; if (oldContainer !== newContainer) { - if (oldContainer) { - interactor.unbindEvents(); - } - if (newContainer) { - interactor.bindEvents(newContainer); - } - - // forward event to interactor + return interactor.setContainer(newContainer); + } + return false; + }; + + // Use wheel events to cover the posibility of interacting + // with an out-of-focus browser window. + useEventListener(containerRef, 'wheel', (ev: WheelEvent) => { + if (switchTarget()) { + // forward wheel-event to interactor + const interactor = getInteractor(); + interactor.handleWheel(ev); + } + }); + + useEventListener(containerRef, 'pointerenter', (ev: PointerEvent) => { + if (switchTarget()) { + // forward pointer-event to interactor + const interactor = getInteractor(); interactor.handlePointerEnter(ev); } });