diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2014-05-07 11:49:46 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2014-05-07 11:49:46 +0200 |
commit | 93f5d5a9190e0e03bf4822663652a4b068c44f75 (patch) | |
tree | 9ac61601b056acad6a6c83d728c684661d3f3271 /vcl | |
parent | c6fdd34c16f415629222348631141c3e13af6d4a (diff) |
The opaque PostUserEvent IDs are actually pointers
...so declare them as such. This avoids the recurring mistake of storing such
IDs as sal_uInt32, truncating in 64 bit environments, causing RemoveUserEvent to
potentially not remove the event, it thus firing "too late" and probably causing
a crash.
While at it, consolidate the trivially unnecessary overloads of both
Application::PostUserEvent and Window::PostUserEvent. And in each of them, it
looks like deleting the mpLink member was missing from the failure branch.
Change-Id: Iab13afbb06e12ac15dec6a6b5b85a7e402a3c654
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/toolbox.h | 2 | ||||
-rw-r--r-- | vcl/inc/window.h | 4 | ||||
-rw-r--r-- | vcl/source/app/svapp.cxx | 65 | ||||
-rw-r--r-- | vcl/source/helper/threadex.cxx | 2 | ||||
-rw-r--r-- | vcl/source/window/dockmgr.cxx | 2 | ||||
-rw-r--r-- | vcl/source/window/dockwin.cxx | 2 | ||||
-rw-r--r-- | vcl/source/window/floatwin.cxx | 2 | ||||
-rw-r--r-- | vcl/source/window/menu.cxx | 2 | ||||
-rw-r--r-- | vcl/source/window/syschild.cxx | 2 | ||||
-rw-r--r-- | vcl/source/window/toolbox.cxx | 2 | ||||
-rw-r--r-- | vcl/source/window/toolbox2.cxx | 2 | ||||
-rw-r--r-- | vcl/source/window/window.cxx | 39 | ||||
-rw-r--r-- | vcl/source/window/winproc.cxx | 4 | ||||
-rw-r--r-- | vcl/unx/generic/app/i18n_status.cxx | 2 |
14 files changed, 54 insertions, 78 deletions
diff --git a/vcl/inc/toolbox.h b/vcl/inc/toolbox.h index 43c0c914e3b8..9056ec55e043 100644 --- a/vcl/inc/toolbox.h +++ b/vcl/inc/toolbox.h @@ -139,7 +139,7 @@ struct ImplToolBoxPrivateData // the optional custom menu PopupMenu* mpMenu; sal_uInt16 maMenuType; - sal_uIntPtr mnEventId; + ImplSVEvent * mnEventId; // called when menu button is clicked and before the popup menu is executed Link maMenuButtonHdl; diff --git a/vcl/inc/window.h b/vcl/inc/window.h index 089583692f87..d42eeb20ca67 100644 --- a/vcl/inc/window.h +++ b/vcl/inc/window.h @@ -140,8 +140,8 @@ struct ImplFrameData sal_Int32 mnDPIY; // Original Screen Resolution ImplMapRes maMapUnitRes; // for LogicUnitToPixel sal_uIntPtr mnAllSaveBackSize; // size of all bitmaps of saved backgrounds - sal_uIntPtr mnFocusId; // FocusId for PostUserLink - sal_uIntPtr mnMouseMoveId; // MoveId for PostUserLink + ImplSVEvent * mnFocusId; // FocusId for PostUserLink + ImplSVEvent * mnMouseMoveId; // MoveId for PostUserLink long mnLastMouseX; // last x mouse position long mnLastMouseY; // last y mouse position long mnBeforeLastMouseX; // last but one x mouse position diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx index 8a7a8b4fe01a..5177aa177ce8 100644 --- a/vcl/source/app/svapp.cxx +++ b/vcl/source/app/svapp.cxx @@ -156,7 +156,7 @@ struct ImplPostEventData { sal_uLong mnEvent; const Window* mpWin; - sal_uLong mnEventId; + ImplSVEvent * mnEventId; KeyEvent maKeyEvent; MouseEvent maMouseEvent; ZoomEvent maZoomEvent; @@ -712,16 +712,16 @@ bool Application::HandleKey( sal_uLong nEvent, Window *pWin, KeyEvent* pKeyEvent return bProcessed; } -sal_uLong Application::PostKeyEvent( sal_uLong nEvent, Window *pWin, KeyEvent* pKeyEvent ) +ImplSVEvent * Application::PostKeyEvent( sal_uLong nEvent, Window *pWin, KeyEvent* pKeyEvent ) { const SolarMutexGuard aGuard; - sal_uLong nEventId = 0; + ImplSVEvent * nEventId = 0; if( pWin && pKeyEvent ) { ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, *pKeyEvent ); - PostUserEvent( nEventId, + nEventId = PostUserEvent( STATIC_LINK( NULL, Application, PostEventHandler ), pPostEventData ); @@ -737,10 +737,10 @@ sal_uLong Application::PostKeyEvent( sal_uLong nEvent, Window *pWin, KeyEvent* p return nEventId; } -sal_uLong Application::PostMouseEvent( sal_uLong nEvent, Window *pWin, MouseEvent* pMouseEvent ) +ImplSVEvent * Application::PostMouseEvent( sal_uLong nEvent, Window *pWin, MouseEvent* pMouseEvent ) { const SolarMutexGuard aGuard; - sal_uLong nEventId = 0; + ImplSVEvent * nEventId = 0; if( pWin && pMouseEvent ) { @@ -754,7 +754,7 @@ sal_uLong Application::PostMouseEvent( sal_uLong nEvent, Window *pWin, MouseEven ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, aTransformedEvent ); - PostUserEvent( nEventId, + nEventId = PostUserEvent( STATIC_LINK( NULL, Application, PostEventHandler ), pPostEventData ); @@ -772,10 +772,10 @@ sal_uLong Application::PostMouseEvent( sal_uLong nEvent, Window *pWin, MouseEven #if !HAVE_FEATURE_DESKTOP -sal_uLong Application::PostZoomEvent( sal_uLong nEvent, Window *pWin, ZoomEvent* pZoomEvent ) +ImplSVEvent * Application::PostZoomEvent( sal_uLong nEvent, Window *pWin, ZoomEvent* pZoomEvent ) { const SolarMutexGuard aGuard; - sal_uLong nEventId = 0; + ImplSVEvent * nEventId = 0; if( pWin && pZoomEvent ) { @@ -788,7 +788,7 @@ sal_uLong Application::PostZoomEvent( sal_uLong nEvent, Window *pWin, ZoomEvent* ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, aTransformedEvent ); - PostUserEvent( nEventId, + nEventId = PostUserEvent( STATIC_LINK( NULL, Application, PostEventHandler ), pPostEventData ); @@ -804,16 +804,16 @@ sal_uLong Application::PostZoomEvent( sal_uLong nEvent, Window *pWin, ZoomEvent* return nEventId; } -sal_uLong Application::PostScrollEvent( sal_uLong nEvent, Window *pWin, ScrollEvent* pScrollEvent ) +ImplSVEvent * Application::PostScrollEvent( sal_uLong nEvent, Window *pWin, ScrollEvent* pScrollEvent ) { const SolarMutexGuard aGuard; - sal_uLong nEventId = 0; + ImplSVEvent * nEventId = 0; if( pWin && pScrollEvent ) { ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, *pScrollEvent ); - PostUserEvent( nEventId, + nEventId = PostUserEvent( STATIC_LINK( NULL, Application, PostEventHandler ), pPostEventData ); @@ -837,7 +837,7 @@ IMPL_STATIC_LINK_NOINSTANCE( Application, PostEventHandler, void*, pCallData ) ImplPostEventData* pData = static_cast< ImplPostEventData * >( pCallData ); const void* pEventData; sal_uLong nEvent; - const sal_uLong nEventId = pData->mnEventId; + ImplSVEvent * const nEventId = pData->mnEventId; switch( pData->mnEvent ) { @@ -924,51 +924,40 @@ void Application::RemoveMouseAndKeyEvents( Window* pWin ) } } -sal_uLong Application::PostUserEvent( const Link& rLink, void* pCaller ) -{ - sal_uLong nEventId; - PostUserEvent( nEventId, rLink, pCaller ); - return nEventId; -} - -bool Application::PostUserEvent( sal_uLong& rEventId, const Link& rLink, void* pCaller ) +ImplSVEvent * Application::PostUserEvent( const Link& rLink, void* pCaller ) { ImplSVEvent* pSVEvent = new ImplSVEvent; pSVEvent->mpData = pCaller; pSVEvent->mpLink = new Link( rLink ); pSVEvent->mpWindow = NULL; pSVEvent->mbCall = true; - rEventId = (sal_uLong)pSVEvent; Window* pDefWindow = ImplGetDefaultWindow(); - if ( pDefWindow && pDefWindow->ImplGetFrame()->PostEvent( pSVEvent ) ) - return true; - else + if ( pDefWindow == 0 || !pDefWindow->ImplGetFrame()->PostEvent( pSVEvent ) ) { - rEventId = 0; + delete pSVEvent->mpLink; delete pSVEvent; - return false; + pSVEvent = 0; } + return pSVEvent; } -void Application::RemoveUserEvent( sal_uLong nUserEvent ) +void Application::RemoveUserEvent( ImplSVEvent * nUserEvent ) { if(nUserEvent) { - ImplSVEvent* pSVEvent = (ImplSVEvent*)nUserEvent; - - DBG_ASSERT( !pSVEvent->mpWindow, + DBG_ASSERT( !nUserEvent->mpWindow, "Application::RemoveUserEvent(): Event is send to a window" ); - DBG_ASSERT( pSVEvent->mbCall, + DBG_ASSERT( nUserEvent->mbCall, "Application::RemoveUserEvent(): Event is already removed" ); - if ( pSVEvent->mpWindow ) + if ( nUserEvent->mpWindow ) { - if( ! pSVEvent->maDelData.IsDead() ) - pSVEvent->mpWindow->ImplRemoveDel( &(pSVEvent->maDelData) ); - pSVEvent->mpWindow = NULL; + if( ! nUserEvent->maDelData.IsDead() ) + nUserEvent->mpWindow->ImplRemoveDel( &(nUserEvent->maDelData) ); + nUserEvent->mpWindow = NULL; } - pSVEvent->mbCall = false; + nUserEvent->mbCall = false; } } diff --git a/vcl/source/helper/threadex.cxx b/vcl/source/helper/threadex.cxx index 85fe63c1736f..37d8ef892a9b 100644 --- a/vcl/source/helper/threadex.cxx +++ b/vcl/source/helper/threadex.cxx @@ -60,7 +60,7 @@ long SolarThreadExecutor::impl_execute( const TimeValue* _pTimeout ) osl_resetCondition( m_aStart ); osl_resetCondition( m_aFinish ); sal_uLong nSolarMutexCount = Application::ReleaseSolarMutex(); - sal_uLong nEvent = Application::PostUserEvent( LINK( this, SolarThreadExecutor, worker ) ); + ImplSVEvent * nEvent = Application::PostUserEvent( LINK( this, SolarThreadExecutor, worker ) ); if ( osl_cond_result_timeout == osl_waitCondition( m_aStart, _pTimeout ) ) { m_bTimeout = true; diff --git a/vcl/source/window/dockmgr.cxx b/vcl/source/window/dockmgr.cxx index bcffef5d2510..93014d3886ca 100644 --- a/vcl/source/window/dockmgr.cxx +++ b/vcl/source/window/dockmgr.cxx @@ -47,7 +47,7 @@ private: Point maDockPos; Rectangle maDockRect; bool mbInMove; - sal_uLong mnLastUserEvent; + ImplSVEvent * mnLastUserEvent; DECL_LINK(DockingHdl, void *); DECL_LINK(DockTimerHdl, void *); diff --git a/vcl/source/window/dockwin.cxx b/vcl/source/window/dockwin.cxx index 72ecded1caff..e1276fcb9af3 100644 --- a/vcl/source/window/dockwin.cxx +++ b/vcl/source/window/dockwin.cxx @@ -63,7 +63,7 @@ private: Point maDockPos; Rectangle maDockRect; bool mbInMove; - sal_uLong mnLastUserEvent; + ImplSVEvent * mnLastUserEvent; DECL_LINK(DockingHdl, void *); DECL_LINK(DockTimerHdl, void *); diff --git a/vcl/source/window/floatwin.cxx b/vcl/source/window/floatwin.cxx index 56bd19a08963..5163b5137a10 100644 --- a/vcl/source/window/floatwin.cxx +++ b/vcl/source/window/floatwin.cxx @@ -577,7 +577,7 @@ void FloatingWindow::ImplCallPopupModeEnd() // call Handler asyncron. if ( !mnPostId ) - Application::PostUserEvent( mnPostId, LINK( this, FloatingWindow, ImplEndPopupModeHdl ) ); + mnPostId = Application::PostUserEvent( LINK( this, FloatingWindow, ImplEndPopupModeHdl ) ); } void FloatingWindow::PopupModeEnd() diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx index b06a9a5493d6..57b912161bfb 100644 --- a/vcl/source/window/menu.cxx +++ b/vcl/source/window/menu.cxx @@ -1132,7 +1132,7 @@ void Menu::ImplSelect() // call select ImplSVData* pSVData = ImplGetSVData(); pSVData->maAppData.mpActivePopupMenu = NULL; // if new execute in select() - Application::PostUserEvent( nEventId, LINK( this, Menu, ImplCallSelect ) ); + nEventId = Application::PostUserEvent( LINK( this, Menu, ImplCallSelect ) ); } void Menu::Select() diff --git a/vcl/source/window/syschild.cxx b/vcl/source/window/syschild.cxx index f70d25c67886..eb141a120616 100644 --- a/vcl/source/window/syschild.cxx +++ b/vcl/source/window/syschild.cxx @@ -85,7 +85,7 @@ long ImplSysChildProc( void* pInst, SalObject* /* pObject */, if ( !pWindow->ImplGetFrameData()->mnFocusId ) { pWindow->ImplGetFrameData()->mbStartFocusState = true; - Application::PostUserEvent( pWindow->ImplGetFrameData()->mnFocusId, LINK( pWindow->ImplGetFrameWindow(), Window, ImplAsyncFocusHdl ) ); + pWindow->ImplGetFrameData()->mnFocusId = Application::PostUserEvent( LINK( pWindow->ImplGetFrameWindow(), Window, ImplAsyncFocusHdl ) ); } break; diff --git a/vcl/source/window/toolbox.cxx b/vcl/source/window/toolbox.cxx index 6ca7338e7553..a12de7b6eeb4 100644 --- a/vcl/source/window/toolbox.cxx +++ b/vcl/source/window/toolbox.cxx @@ -4979,7 +4979,7 @@ bool ToolBox::ImplOpenItem( KeyCode aKeyCode ) return bRet; UpdateCustomMenu(); - Application::PostUserEvent( mpData->mnEventId, LINK( this, ToolBox, ImplCallExecuteCustomMenu ) ); + mpData->mnEventId = Application::PostUserEvent( LINK( this, ToolBox, ImplCallExecuteCustomMenu ) ); } else if( mnHighItemId && ImplGetItem( mnHighItemId ) && (ImplGetItem( mnHighItemId )->mnBits & TIB_DROPDOWN) ) diff --git a/vcl/source/window/toolbox2.cxx b/vcl/source/window/toolbox2.cxx index ea9a1fa14988..ba4e866e2140 100644 --- a/vcl/source/window/toolbox2.cxx +++ b/vcl/source/window/toolbox2.cxx @@ -2050,7 +2050,7 @@ void ToolBox::ExecuteCustomMenu() // handle custom menu asynchronously // to avoid problems if the toolbox is closed during menu execute UpdateCustomMenu(); - Application::PostUserEvent( mpData->mnEventId, LINK( this, ToolBox, ImplCallExecuteCustomMenu ) ); + mpData->mnEventId = Application::PostUserEvent( LINK( this, ToolBox, ImplCallExecuteCustomMenu ) ); } } diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index ed5e01814182..53ab0279c325 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -3869,7 +3869,7 @@ void Window::ImplCallMouseMove( sal_uInt16 nMouseCode, bool bModChanged ) void Window::ImplGenerateMouseMove() { if ( !mpWindowImpl->mpFrameData->mnMouseMoveId ) - Application::PostUserEvent( mpWindowImpl->mpFrameData->mnMouseMoveId, LINK( mpWindowImpl->mpFrameWindow, Window, ImplGenerateMouseMoveHdl ) ); + mpWindowImpl->mpFrameData->mnMouseMoveId = Application::PostUserEvent( LINK( mpWindowImpl->mpFrameWindow, Window, ImplGenerateMouseMoveHdl ) ); } IMPL_LINK_NOARG(Window, ImplGenerateMouseMoveHdl) @@ -5242,51 +5242,38 @@ void Window::RemoveChildEventListener( const Link& rEventListener ) mpWindowImpl->maChildEventListeners.removeListener( rEventListener ); } -sal_uLong Window::PostUserEvent( const Link& rLink, void* pCaller ) +ImplSVEvent * Window::PostUserEvent( const Link& rLink, void* pCaller ) { - sal_uLong nEventId; - PostUserEvent( nEventId, rLink, pCaller ); - return nEventId; -} - -bool Window::PostUserEvent( sal_uLong& rEventId, const Link& rLink, void* pCaller ) -{ - ImplSVEvent* pSVEvent = new ImplSVEvent; pSVEvent->mpData = pCaller; pSVEvent->mpLink = new Link( rLink ); pSVEvent->mpWindow = this; pSVEvent->mbCall = true; ImplAddDel( &(pSVEvent->maDelData) ); - rEventId = (sal_uLong)pSVEvent; - if ( mpWindowImpl->mpFrame->PostEvent( pSVEvent ) ) - return true; - else + if ( !mpWindowImpl->mpFrame->PostEvent( pSVEvent ) ) { - rEventId = 0; ImplRemoveDel( &(pSVEvent->maDelData) ); + delete pSVEvent->mpLink; delete pSVEvent; - return false; + pSVEvent = 0; } + return pSVEvent; } -void Window::RemoveUserEvent( sal_uLong nUserEvent ) +void Window::RemoveUserEvent( ImplSVEvent * nUserEvent ) { - - ImplSVEvent* pSVEvent = (ImplSVEvent*)nUserEvent; - - DBG_ASSERT( pSVEvent->mpWindow == this, + DBG_ASSERT( nUserEvent->mpWindow == this, "Window::RemoveUserEvent(): Event doesn't send to this window or is already removed" ); - DBG_ASSERT( pSVEvent->mbCall, + DBG_ASSERT( nUserEvent->mbCall, "Window::RemoveUserEvent(): Event is already removed" ); - if ( pSVEvent->mpWindow ) + if ( nUserEvent->mpWindow ) { - pSVEvent->mpWindow->ImplRemoveDel( &(pSVEvent->maDelData) ); - pSVEvent->mpWindow = NULL; + nUserEvent->mpWindow->ImplRemoveDel( &(nUserEvent->maDelData) ); + nUserEvent->mpWindow = NULL; } - pSVEvent->mbCall = false; + nUserEvent->mbCall = false; } bool Window::IsLocked( bool bChildren ) const diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx index 769e1d508ed3..93ff18b82687 100644 --- a/vcl/source/window/winproc.cxx +++ b/vcl/source/window/winproc.cxx @@ -1743,7 +1743,7 @@ static void ImplHandleGetFocus( Window* pWindow ) if ( !pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId ) { pWindow->ImplGetWindowImpl()->mpFrameData->mbStartFocusState = !pWindow->ImplGetWindowImpl()->mpFrameData->mbHasFocus; - Application::PostUserEvent( pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId, LINK( pWindow, Window, ImplAsyncFocusHdl ) ); + pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId = Application::PostUserEvent( LINK( pWindow, Window, ImplAsyncFocusHdl ) ); Window* pFocusWin = pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusWin; if ( pFocusWin && pFocusWin->ImplGetWindowImpl()->mpCursor ) pFocusWin->ImplGetWindowImpl()->mpCursor->ImplShow(); @@ -1780,7 +1780,7 @@ static void ImplHandleLoseFocus( Window* pWindow ) if ( !pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId ) { pWindow->ImplGetWindowImpl()->mpFrameData->mbStartFocusState = !pWindow->ImplGetWindowImpl()->mpFrameData->mbHasFocus; - Application::PostUserEvent( pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId, LINK( pWindow, Window, ImplAsyncFocusHdl ) ); + pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId = Application::PostUserEvent( LINK( pWindow, Window, ImplAsyncFocusHdl ) ); } Window* pFocusWin = pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusWin; diff --git a/vcl/unx/generic/app/i18n_status.cxx b/vcl/unx/generic/app/i18n_status.cxx index 945d858bce09..b0d5e8eb9a8a 100644 --- a/vcl/unx/generic/app/i18n_status.cxx +++ b/vcl/unx/generic/app/i18n_status.cxx @@ -87,7 +87,7 @@ class XIMStatusWindow : public StatusWindow // for delayed showing bool m_bDelayedShow; I18NStatus::ShowReason m_eDelayedReason; - sal_uLong m_nDelayedEvent; + ImplSVEvent * m_nDelayedEvent; // for toggling bool m_bOn; |