diff options
author | Noel Grandin <noel@peralex.com> | 2015-06-11 16:00:03 +0200 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2015-06-13 18:01:10 +0100 |
commit | 5a617461a77abaca69a335901c3e5d7b084cc73f (patch) | |
tree | 4e3b5f9a12e30050143366f1b25162e1f6d4db62 | |
parent | 1666b1b7ce68d821768c383c59b6998b06d189f5 (diff) |
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>
-rw-r--r-- | avmedia/source/viewer/mediawindow.cxx | 5 | ||||
-rw-r--r-- | slideshow/source/engine/shapes/viewmediashape.cxx | 18 | ||||
-rw-r--r-- | slideshow/source/engine/shapes/viewmediashape.hxx | 4 |
3 files changed, 16 insertions, 11 deletions
diff --git a/avmedia/source/viewer/mediawindow.cxx b/avmedia/source/viewer/mediawindow.cxx index 3108df45d8c9..6e7934890e8c 100644 --- a/avmedia/source/viewer/mediawindow.cxx +++ b/avmedia/source/viewer/mediawindow.cxx @@ -51,7 +51,10 @@ MediaWindow::MediaWindow( vcl::Window* parent, bool bInternalMediaControl ) : -MediaWindow::~MediaWindow() {} +MediaWindow::~MediaWindow() +{ + mpImpl.disposeAndClear(); +} diff --git a/slideshow/source/engine/shapes/viewmediashape.cxx b/slideshow/source/engine/shapes/viewmediashape.cxx index f026b21a8eb2..60d86d0207ca 100644 --- a/slideshow/source/engine/shapes/viewmediashape.cxx +++ b/slideshow/source/engine/shapes/viewmediashape.cxx @@ -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(); } } } diff --git a/slideshow/source/engine/shapes/viewmediashape.hxx b/slideshow/source/engine/shapes/viewmediashape.hxx index 13eba7fce7bb..fe0462cd7e42 100644 --- a/slideshow/source/engine/shapes/viewmediashape.hxx +++ b/slideshow/source/engine/shapes/viewmediashape.hxx @@ -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; |