crashreport: 644837b5-c445-4779-a75d-dd69fc2e3a6f
drop hint of previous window to get mouse wheel event when that window is disposed in order to drop any references to it immediately that happens to avoid anything else lingering too late move the VclPtr into ImplSVData alongside the rest of the things like this so we can remove the over-the-top DeleteOnDeinit which itself replaced a relatively harmless static Window* Change-Id: I1e172071b711b6e4ded9a813ee3de730d3dfdf38
This commit is contained in:
@@ -193,6 +193,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
|
||||
|
@@ -477,6 +477,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 )
|
||||
{
|
||||
|
@@ -1475,27 +1475,27 @@ public:
|
||||
bool HandleWheelEvent::HandleEvent(const SalWheelMouseEvent& rEvt)
|
||||
{
|
||||
static SalWheelMouseEvent aPreviousEvent;
|
||||
static vcl::DeleteOnDeinit< VclPtr<vcl::Window> > xPreviousWindow( new VclPtr<vcl::Window> );
|
||||
|
||||
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
|
||||
VclPtr<vcl::Window> tmp = *xPreviousWindow.get();
|
||||
if (shouldReusePreviousMouseWindow(aPreviousEvent, rEvt) && acceptableWheelScrollTarget(tmp))
|
||||
if (shouldReusePreviousMouseWindow(aPreviousEvent, rEvt) && acceptableWheelScrollTarget(pSVData->maWinData.mpLastWheelWindow))
|
||||
{
|
||||
xMouseWindow = tmp;
|
||||
xMouseWindow = pSVData->maWinData.mpLastWheelWindow;
|
||||
}
|
||||
|
||||
aPreviousEvent = rEvt;
|
||||
|
||||
(*xPreviousWindow.get()) = Dispatch(xMouseWindow);
|
||||
pSVData->maWinData.mpLastWheelWindow = Dispatch(xMouseWindow);
|
||||
|
||||
return *xPreviousWindow.get();
|
||||
return pSVData->maWinData.mpLastWheelWindow.get();
|
||||
}
|
||||
|
||||
class HandleGestureEvent : public HandleGestureEventBase
|
||||
|
Reference in New Issue
Block a user