tdf#91960 presentation causes Impress crash

The SystenChildWindow in question is owned by ViewMediaShape
Fixed ViewMediaShape to dispose the vcl objects it creates correctly.
Also fix another crash in MediaWindowImpl child window correctly disposing its children.

Change-Id: If4aebcb6e5824266c154416f7246d73c6cb3509c
Reviewed-on: https://gerrit.libreoffice.org/16230
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Tested-by: Michael Meeks <michael.meeks@collabora.com>
This commit is contained in:
Noel Grandin
2015-06-11 16:00:03 +02:00
committed by Michael Meeks
parent 9f3515f90c
commit c2d65e08c9
3 changed files with 16 additions and 11 deletions

View File

@@ -51,7 +51,10 @@ MediaWindow::MediaWindow( vcl::Window* parent, bool bInternalMediaControl ) :
MediaWindow::~MediaWindow() {}
MediaWindow::~MediaWindow()
{
mpImpl.disposeAndClear();
}

View File

@@ -148,8 +148,8 @@ namespace slideshow
mxPlayerWindow.clear();
}
mpMediaWindow.reset();
mpEventHandlerParent.reset();
mpMediaWindow.disposeAndClear();
mpEventHandlerParent.disposeAndClear();
// shutdown player
if( mxPlayer.is() )
@@ -471,20 +471,23 @@ namespace slideshow
#else
if( avmedia::IsModel(rMimeType) )
{
mpEventHandlerParent.reset(VclPtr<vcl::Window>::Create(pWindow, WB_NOBORDER|WB_NODIALOGCONTROL));
mpMediaWindow.disposeAndClear();
mpEventHandlerParent.disposeAndClear();
mpEventHandlerParent = VclPtr<vcl::Window>::Create(pWindow, WB_NOBORDER|WB_NODIALOGCONTROL);
mpEventHandlerParent->SetPosSizePixel( Point( aAWTRect.X, aAWTRect.Y ),
Size( aAWTRect.Width, aAWTRect.Height ) );
mpEventHandlerParent->EnablePaint(false);
mpEventHandlerParent->Show();
SystemWindowData aWinData = OpenGLContext::generateWinData(mpEventHandlerParent.get(), false);
mpMediaWindow.reset(VclPtr<SystemChildWindow>::Create(mpEventHandlerParent.get(), 0, &aWinData));
mpMediaWindow = VclPtr<SystemChildWindow>::Create(mpEventHandlerParent.get(), 0, &aWinData);
mpMediaWindow->SetPosSizePixel( Point( 0, 0 ),
Size( aAWTRect.Width, aAWTRect.Height ) );
}
else
#endif
{
mpMediaWindow.reset( VclPtr<SystemChildWindow>::Create( pWindow, WB_CLIPCHILDREN ) );
mpMediaWindow.disposeAndClear();
mpMediaWindow = VclPtr<SystemChildWindow>::Create( pWindow, WB_CLIPCHILDREN );
mpMediaWindow->SetPosSizePixel( Point( aAWTRect.X, aAWTRect.Y ),
Size( aAWTRect.Width, aAWTRect.Height ) );
}
@@ -503,7 +506,6 @@ namespace slideshow
aAWTRect.X = aAWTRect.Y = 0;
aArgs[ 1 ] = uno::makeAny( aAWTRect );
aArgs[ 2 ] = uno::makeAny( reinterpret_cast< sal_IntPtr >( mpMediaWindow.get() ) );
mxPlayerWindow.set( mxPlayer->createPlayerWindow( aArgs ) );
@@ -519,8 +521,8 @@ namespace slideshow
{
//if there was no playerwindow, then clear the mpMediaWindow too
//so that we can draw a placeholder instead in that space
mpMediaWindow.reset();
mpEventHandlerParent.reset();
mpMediaWindow.disposeAndClear();
mpEventHandlerParent.disposeAndClear();
}
}
}

View File

@@ -148,8 +148,8 @@ namespace slideshow
const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rVCLDeviceParams,
const OUString& rMimeType );
ViewLayerSharedPtr mpViewLayer;
VclPtr< SystemChildWindow > mpMediaWindow;
VclPtr< vcl::Window > mpEventHandlerParent;
VclPtr< SystemChildWindow > mpMediaWindow;
VclPtr< vcl::Window > mpEventHandlerParent;
mutable ::com::sun::star::awt::Point maWindowOffset;
mutable ::basegfx::B2DRectangle maBounds;