[Libreoffice-commits] core.git: framework/source
Caolán McNamara
caolanm at redhat.com
Wed Mar 2 16:50:32 UTC 2016
framework/source/layoutmanager/layoutmanager.cxx | 57 ++++++++++++++++++-----
1 file changed, 46 insertions(+), 11 deletions(-)
New commits:
commit 0c622c988523da4edc68d68ca4f4358c1fef83e4
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Mar 2 15:07:04 2016 +0000
extra menubar displayed after exiting embedded object edit
when using native gtk3 menubars.
The issue is that MenuBarManager does not own its MenuBar.
And in this embedded menubar situation a new menubar is newed and passed to
m_pInplaceMenuBar but nothing destroys it.
Now with native gtk3 menubars this becomes obvious as the native menubar stays
behind, while in the non-native case the old menubar is replaced by
the new one so while it still leaks the menubar you don't see it.
Change-Id: Id732cb66664a71efc471d7bad35f4de890e1017e
diff --git a/framework/source/layoutmanager/layoutmanager.cxx b/framework/source/layoutmanager/layoutmanager.cxx
index c89a577..737f367 100644
--- a/framework/source/layoutmanager/layoutmanager.cxx
+++ b/framework/source/layoutmanager/layoutmanager.cxx
@@ -210,12 +210,18 @@ void LayoutManager::impl_clearUpMenuBar()
}
// reset inplace menubar manager
- m_pInplaceMenuBar = nullptr;
+ Menu *pMenuBar = nullptr;
+ if (m_pInplaceMenuBar)
+ {
+ pMenuBar = m_pInplaceMenuBar->GetMenuBar();
+ m_pInplaceMenuBar = nullptr;
+ }
if ( m_xInplaceMenuBar.is() )
{
m_xInplaceMenuBar->dispose();
m_xInplaceMenuBar.clear();
}
+ delete pMenuBar;
Reference< XComponent > xComp( m_xMenuBar, UNO_QUERY );
if ( xComp.is() )
@@ -1150,10 +1156,19 @@ throw (uno::RuntimeException, std::exception)
SolarMutexGuard aGuard;
// Reset old inplace menubar!
- m_pInplaceMenuBar = nullptr;
- if ( m_xInplaceMenuBar.is() )
+ Menu *pOldMenuBar = nullptr;
+ if (m_pInplaceMenuBar)
+ {
+ pOldMenuBar = m_pInplaceMenuBar->GetMenuBar();
+ m_pInplaceMenuBar = nullptr;
+ }
+ if (m_xInplaceMenuBar.is())
+ {
m_xInplaceMenuBar->dispose();
- m_xInplaceMenuBar.clear();
+ m_xInplaceMenuBar.clear();
+ }
+ delete pOldMenuBar;
+
m_bInplaceMenuSet = false;
if ( m_xFrame.is() && m_xContainerWindow.is() )
@@ -1201,10 +1216,18 @@ throw (uno::RuntimeException)
}
// Remove inplace menu bar
- m_pInplaceMenuBar = nullptr;
- if ( m_xInplaceMenuBar.is() )
+ Menu *pMenuBar = nullptr;
+ if (m_pInplaceMenuBar)
+ {
+ pMenuBar = m_pInplaceMenuBar->GetMenuBar();
+ m_pInplaceMenuBar = nullptr;
+ }
+ if (m_xInplaceMenuBar.is())
+ {
m_xInplaceMenuBar->dispose();
- m_xInplaceMenuBar.clear();
+ m_xInplaceMenuBar.clear();
+ }
+ delete pMenuBar;
}
void SAL_CALL LayoutManager::attachFrame( const Reference< XFrame >& xFrame )
@@ -2807,12 +2830,18 @@ throw( RuntimeException, std::exception )
implts_destroyElements();
impl_clearUpMenuBar();
m_xMenuBar.clear();
- if ( m_xInplaceMenuBar.is() )
+ Menu *pMenuBar = nullptr;
+ if (m_pInplaceMenuBar)
{
+ pMenuBar = m_pInplaceMenuBar->GetMenuBar();
m_pInplaceMenuBar = nullptr;
+ }
+ if (m_xInplaceMenuBar.is())
+ {
m_xInplaceMenuBar->dispose();
+ m_xInplaceMenuBar.clear();
}
- m_xInplaceMenuBar.clear();
+ delete pMenuBar;
m_xContainerWindow.clear();
m_xContainerTopWindow.clear();
@@ -2865,12 +2894,18 @@ throw( RuntimeException, std::exception )
}
impl_clearUpMenuBar();
m_xMenuBar.clear();
- if ( m_xInplaceMenuBar.is() )
+ Menu *pMenuBar = nullptr;
+ if (m_pInplaceMenuBar)
{
+ pMenuBar = m_pInplaceMenuBar->GetMenuBar();
m_pInplaceMenuBar = nullptr;
+ }
+ if (m_xInplaceMenuBar.is())
+ {
m_xInplaceMenuBar->dispose();
+ m_xInplaceMenuBar.clear();
}
- m_xInplaceMenuBar.clear();
+ delete pMenuBar;
m_xContainerWindow.clear();
m_xContainerTopWindow.clear();
}
More information about the Libreoffice-commits
mailing list