diff options
-rw-r--r-- | vcl/inc/svdata.hxx | 1 | ||||
-rw-r--r-- | vcl/source/window/window.cxx | 4 | ||||
-rw-r--r-- | vcl/source/window/winproc.cxx | 11 |
3 files changed, 11 insertions, 5 deletions
diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx index eef919d32a3b..6522da1aafa3 100644 --- a/vcl/inc/svdata.hxx +++ b/vcl/inc/svdata.hxx @@ -208,6 +208,7 @@ struct ImplSVWinData AutoTimer* mpTrackTimer; // tracking timer ImageList* mpMsgBoxImgList; // ImageList for MessageBox VclPtr<vcl::Window> mpAutoScrollWin; // window, that is in AutoScrollMode mode + VclPtr<vcl::Window> mpLastWheelWindow; // window, that last received a mouse wheel event StartTrackingFlags mnTrackFlags; // tracking flags StartAutoScrollFlags mnAutoScrollFlags; // auto scroll flags bool mbNoDeactivate; // true: do not execute Deactivate diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index bd2a66249877..2c4164eae76a 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -481,6 +481,10 @@ void Window::dispose() if( pSVData->maWinData.mpActiveApplicationFrame == this ) pSVData->maWinData.mpActiveApplicationFrame = nullptr; + // reset hint of what was the last wheeled window + if( pSVData->maWinData.mpLastWheelWindow == this ) + pSVData->maWinData.mpLastWheelWindow = nullptr; + // reset marked windows if ( mpWindowImpl->mpFrameData != nullptr ) { diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx index 66e89448b798..fce0d799cf79 100644 --- a/vcl/source/window/winproc.cxx +++ b/vcl/source/window/winproc.cxx @@ -1509,26 +1509,27 @@ public: bool HandleWheelEvent::HandleEvent(const SalWheelMouseEvent& rEvt) { static SalWheelMouseEvent aPreviousEvent; - static VclPtr<vcl::Window> xPreviousWindow; if (!Setup()) return false; VclPtr<vcl::Window> xMouseWindow = FindTarget(); + ImplSVData* pSVData = ImplGetSVData(); + // avoid the problem that scrolling via wheel to this point brings a widget // under the mouse that also accepts wheel commands, so stick with the old // widget if the time gap is very small - if (shouldReusePreviousMouseWindow(aPreviousEvent, rEvt) && acceptableWheelScrollTarget(xPreviousWindow)) + if (shouldReusePreviousMouseWindow(aPreviousEvent, rEvt) && acceptableWheelScrollTarget(pSVData->maWinData.mpLastWheelWindow)) { - xMouseWindow = xPreviousWindow.get(); + xMouseWindow = pSVData->maWinData.mpLastWheelWindow; } aPreviousEvent = rEvt; - xPreviousWindow = Dispatch(xMouseWindow); + pSVData->maWinData.mpLastWheelWindow = Dispatch(xMouseWindow); - return xPreviousWindow; + return pSVData->maWinData.mpLastWheelWindow.get(); } class HandleGestureEvent : public HandleGestureEventBase |