[Libreoffice-commits] core.git: Branch 'feature/vclref' - toolkit/source

Michael Meeks michael.meeks at collabora.com
Wed Mar 18 05:50:55 PDT 2015


 toolkit/source/helper/unowrapper.cxx |   28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

New commits:
commit d53b4af5d870bc358c1943d2bea91bbd749fd695
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Wed Mar 18 12:55:27 2015 +0000

    toolkit: much safer WindowDestroyed handler.
    
    Change-Id: I0c72231a932186130246bab343653ecb563a41f2

diff --git a/toolkit/source/helper/unowrapper.cxx b/toolkit/source/helper/unowrapper.cxx
index 6087476..fd2d33c 100644
--- a/toolkit/source/helper/unowrapper.cxx
+++ b/toolkit/source/helper/unowrapper.cxx
@@ -219,13 +219,13 @@ void UnoWrapper::WindowDestroyed( vcl::Window* pWindow )
 {
     // their still might be some children created with ::com::sun::star::loader::Java
     // that would otherwise not be destroyed until the garbage collector cleans up
-    vcl::Window* pChild = pWindow->GetWindow( WINDOW_FIRSTCHILD );
+    VclPtr< vcl::Window > pChild = pWindow->GetWindow( WINDOW_FIRSTCHILD );
     while ( pChild )
     {
-        vcl::Window* pNextChild = pChild->GetWindow( WINDOW_NEXT );
+        VclPtr< vcl::Window > pNextChild = pChild->GetWindow( WINDOW_NEXT );
 
-        vcl::Window* pClient = pChild->GetWindow( WINDOW_CLIENT );
-        if ( pClient->GetWindowPeer() )
+        VclPtr< vcl::Window > pClient = pChild->GetWindow( WINDOW_CLIENT );
+        if ( pClient && pClient->GetWindowPeer() )
         {
             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > xComp( pClient->GetComponentInterface( false ), ::com::sun::star::uno::UNO_QUERY );
             xComp->dispose();
@@ -235,16 +235,16 @@ void UnoWrapper::WindowDestroyed( vcl::Window* pWindow )
     }
 
     // System-Windows suchen...
-    vcl::Window* pOverlap = pWindow->GetWindow( WINDOW_OVERLAP );
+    VclPtr< vcl::Window > pOverlap = pWindow->GetWindow( WINDOW_OVERLAP );
     if ( pOverlap )
     {
         pOverlap = pOverlap->GetWindow( WINDOW_FIRSTOVERLAP );
         while ( pOverlap )
         {
-            vcl::Window* pNextOverlap = pOverlap->GetWindow( WINDOW_NEXT );
-            vcl::Window* pClient = pOverlap->GetWindow( WINDOW_CLIENT );
+            VclPtr< vcl::Window > pNextOverlap = pOverlap->GetWindow( WINDOW_NEXT );
+            VclPtr< vcl::Window > pClient = pOverlap->GetWindow( WINDOW_CLIENT );
 
-            if ( pClient->GetWindowPeer() && lcl_ImplIsParent( pWindow, pClient ) )
+            if ( pClient && pClient->GetWindowPeer() && lcl_ImplIsParent( pWindow, pClient ) )
             {
                 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > xComp( pClient->GetComponentInterface( false ), ::com::sun::star::uno::UNO_QUERY );
                 xComp->dispose();
@@ -254,9 +254,11 @@ void UnoWrapper::WindowDestroyed( vcl::Window* pWindow )
         }
     }
 
-    vcl::Window* pParent = pWindow->GetParent();
-    if ( pParent && pParent->GetWindowPeer() )
-        pParent->GetWindowPeer()->notifyWindowRemoved( *pWindow );
+    {
+        VclPtr< vcl::Window > pParent = pWindow->GetParent();
+        if ( pParent && pParent->GetWindowPeer() )
+            pParent->GetWindowPeer()->notifyWindowRemoved( *pWindow );
+    }
 
     VCLXWindow* pWindowPeer = pWindow->GetWindowPeer();
     uno::Reference< lang::XComponent > xWindowPeerComp( pWindow->GetComponentInterface( false ), uno::UNO_QUERY );
@@ -276,13 +278,13 @@ void UnoWrapper::WindowDestroyed( vcl::Window* pWindow )
     // #i42462#/#116855# no, don't loop: Instead, just ensure that all our top-window-children
     // are disposed, too (which should also be a valid fix for #102132#, but doesn't have the extreme
     // performance penalties)
-    vcl::Window* pTopWindowChild = pWindow->GetWindow( WINDOW_FIRSTTOPWINDOWCHILD );
+    VclPtr< vcl::Window > pTopWindowChild = pWindow->GetWindow( WINDOW_FIRSTTOPWINDOWCHILD );
     while ( pTopWindowChild )
     {
         OSL_ENSURE( pTopWindowChild->GetParent() == pWindow,
                     "UnoWrapper::WindowDestroyed: inconsistency in the SystemWindow relationship!" );
 
-        vcl::Window* pNextTopChild = pTopWindowChild->GetWindow( WINDOW_NEXTTOPWINDOWSIBLING );
+        VclPtr< vcl::Window > pNextTopChild = pTopWindowChild->GetWindow( WINDOW_NEXTTOPWINDOWSIBLING );
 
         //the window still could be on the stack, so we have to
         // use lazy delete ( it will automatically


More information about the Libreoffice-commits mailing list