summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2014-05-07 11:49:46 +0200
committerStephan Bergmann <sbergman@redhat.com>2014-05-07 11:49:46 +0200
commit93f5d5a9190e0e03bf4822663652a4b068c44f75 (patch)
tree9ac61601b056acad6a6c83d728c684661d3f3271 /vcl
parentc6fdd34c16f415629222348631141c3e13af6d4a (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.h2
-rw-r--r--vcl/inc/window.h4
-rw-r--r--vcl/source/app/svapp.cxx65
-rw-r--r--vcl/source/helper/threadex.cxx2
-rw-r--r--vcl/source/window/dockmgr.cxx2
-rw-r--r--vcl/source/window/dockwin.cxx2
-rw-r--r--vcl/source/window/floatwin.cxx2
-rw-r--r--vcl/source/window/menu.cxx2
-rw-r--r--vcl/source/window/syschild.cxx2
-rw-r--r--vcl/source/window/toolbox.cxx2
-rw-r--r--vcl/source/window/toolbox2.cxx2
-rw-r--r--vcl/source/window/window.cxx39
-rw-r--r--vcl/source/window/winproc.cxx4
-rw-r--r--vcl/unx/generic/app/i18n_status.cxx2
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;