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:
committed by
Michael Meeks
parent
9f3515f90c
commit
c2d65e08c9
@@ -51,7 +51,10 @@ MediaWindow::MediaWindow( vcl::Window* parent, bool bInternalMediaControl ) :
|
||||
|
||||
|
||||
|
||||
MediaWindow::~MediaWindow() {}
|
||||
MediaWindow::~MediaWindow()
|
||||
{
|
||||
mpImpl.disposeAndClear();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user