summaryrefslogtreecommitdiff
path: root/vcl/source/app/svapp.cxx
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2015-05-07 22:08:21 +0100
committerMichael Meeks <michael.meeks@collabora.com>2015-05-08 17:37:41 +0100
commita738606d48d6678aaabf68a6ba748f79d5c6b9b8 (patch)
tree38f8184d4691c43e3a9e4beb7a1989ec1e7c1b4d /vcl/source/app/svapp.cxx
parent5c430093a301b31174a81ad4437f0361c86cfe3c (diff)
PostUserEvent - instrument to allow holding a VclPtr reference.
This helps avoid things dying during emission in a robust manner. Bit of an unpleasant 3rd optional parameter; better names appreciated. Change-Id: I27571823f9d96caef1d07602785a02390d3a3591
Diffstat (limited to 'vcl/source/app/svapp.cxx')
-rw-r--r--vcl/source/app/svapp.cxx12
1 files changed, 11 insertions, 1 deletions
diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx
index 5a397f430965..32949fb7734f 100644
--- a/vcl/source/app/svapp.cxx
+++ b/vcl/source/app/svapp.cxx
@@ -897,13 +897,23 @@ void Application::RemoveMouseAndKeyEvents( vcl::Window* pWin )
}
}
-ImplSVEvent * Application::PostUserEvent( const Link<>& rLink, void* pCaller )
+ImplSVEvent * Application::PostUserEvent( const Link<>& rLink, void* pCaller,
+ bool bReferenceLink )
{
ImplSVEvent* pSVEvent = new ImplSVEvent;
pSVEvent->mpData = pCaller;
pSVEvent->mpLink = new Link<>( rLink );
pSVEvent->mpWindow = NULL;
pSVEvent->mbCall = true;
+ if (bReferenceLink)
+ {
+ // Double check that this is indeed a vcl::Window instance.
+ assert(dynamic_cast<vcl::Window *>(
+ reinterpret_cast<vcl::Window *>(rLink.GetInstance())) ==
+ reinterpret_cast<vcl::Window *>(rLink.GetInstance()));
+ pSVEvent->mpInstanceRef = reinterpret_cast<vcl::Window *>(rLink.GetInstance());
+ }
+
vcl::Window* pDefWindow = ImplGetDefaultWindow();
if ( pDefWindow == 0 || !pDefWindow->ImplGetFrame()->PostEvent( pSVEvent ) )
{