summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--framework/source/uielement/menubarmanager.cxx11
-rw-r--r--include/vcl/menu.hxx9
-rw-r--r--vcl/inc/salmenu.hxx1
-rw-r--r--vcl/inc/unx/gtk/gtksalmenu.hxx4
-rw-r--r--vcl/source/window/menu.cxx46
-rw-r--r--vcl/unx/gtk/gloactiongroup.cxx2
-rw-r--r--vcl/unx/gtk/gtkdata.cxx18
-rw-r--r--vcl/unx/gtk/gtksalmenu.cxx62
8 files changed, 31 insertions, 122 deletions
diff --git a/framework/source/uielement/menubarmanager.cxx b/framework/source/uielement/menubarmanager.cxx
index 871881728f53..d5ae1d6ea4bd 100644
--- a/framework/source/uielement/menubarmanager.cxx
+++ b/framework/source/uielement/menubarmanager.cxx
@@ -385,10 +385,6 @@ throw ( RuntimeException, std::exception )
OUString aFeatureURL = Event.FeatureURL.Complete;
SolarMutexGuard aSolarGuard;
- if ( m_bHasMenuBar )
- {
- vcl::MenuInvalidator::Invalidated();
- }
{
if ( m_bDisposed )
return;
@@ -487,6 +483,8 @@ throw ( RuntimeException, std::exception )
pMenuItemHandler->xMenuItemDispatch.clear();
}
}
+ if ( m_bHasMenuBar && !m_bActive )
+ m_pVCLMenu->UpdateNativeMenu();
}
}
@@ -893,9 +891,8 @@ IMPL_LINK_TYPED( MenuBarManager, Activate, Menu *, pMenu, bool )
if ( !bPopupMenu )
{
xMenuItemDispatch->addStatusListener( static_cast< XStatusListener* >( this ), aTargetURL );
- xMenuItemDispatch->removeStatusListener( static_cast< XStatusListener* >( this ), aTargetURL );
- if ( m_bHasMenuBar )
- xMenuItemDispatch->addStatusListener( static_cast< XStatusListener* >( this ), aTargetURL );
+ if ( !m_bHasMenuBar )
+ xMenuItemDispatch->removeStatusListener( static_cast< XStatusListener* >( this ), aTargetURL );
}
}
else if ( !bPopupMenu )
diff --git a/include/vcl/menu.hxx b/include/vcl/menu.hxx
index e28fbd9f9060..34847988207f 100644
--- a/include/vcl/menu.hxx
+++ b/include/vcl/menu.hxx
@@ -310,6 +310,8 @@ public:
void RemoveDisabledEntries( bool bCheckPopups = true, bool bRemoveEmptyPopups = false );
bool HasValidEntries( bool bCheckPopups = true );
+ void UpdateNativeMenu();
+
void SetItemText( sal_uInt16 nItemId, const OUString& rStr );
OUString GetItemText( sal_uInt16 nItemId ) const;
@@ -404,13 +406,6 @@ public:
};
-namespace vcl { namespace MenuInvalidator {
-
-VCL_DLLPUBLIC void AddMenuInvalidateListener(const Link<LinkParamNone*,void>&);
-VCL_DLLPUBLIC void Invalidated();
-
-}}
-
class VCL_DLLPUBLIC MenuBar : public Menu
{
Link<void*,void> maCloseHdl;
diff --git a/vcl/inc/salmenu.hxx b/vcl/inc/salmenu.hxx
index fba86a1fed59..d7930bbc39fe 100644
--- a/vcl/inc/salmenu.hxx
+++ b/vcl/inc/salmenu.hxx
@@ -77,6 +77,7 @@ public:
virtual bool ShowNativePopupMenu(FloatingWindow * pWin, const Rectangle& rRect, FloatWinPopupFlags nFlags);
virtual bool AddMenuBarButton( const SalMenuButtonItem& ); // return false if not implemented or failure
virtual void RemoveMenuBarButton( sal_uInt16 nId );
+ virtual void Update() {}
// TODO: implement show/hide for the Win/Mac VCL native backends
virtual void ShowItem( unsigned nPos, bool bShow ) { EnableItem( nPos, bShow ); }
diff --git a/vcl/inc/unx/gtk/gtksalmenu.hxx b/vcl/inc/unx/gtk/gtksalmenu.hxx
index 998a9257d699..18a2b4d27959 100644
--- a/vcl/inc/unx/gtk/gtksalmenu.hxx
+++ b/vcl/inc/unx/gtk/gtksalmenu.hxx
@@ -94,11 +94,11 @@ public:
void NativeSetAccelerator( unsigned nSection, unsigned nItemPos, const vcl::KeyCode& rKeyCode, const OUString& rKeyName );
void DispatchCommand( gint itemId, const gchar* aCommand );
- void Activate();
+ void Activate( const gchar* aMenuCommand = nullptr );
void Deactivate( const gchar* aMenuCommand );
void Display( bool bVisible );
bool PrepUpdate();
- void Update(); // Update this menu only.
+ virtual void Update() override; // Update this menu only.
void UpdateFull(); // Update full menu hierarchy from this menu.
};
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx
index 3be6868a9117..b6b1ce5db7f9 100644
--- a/vcl/source/window/menu.cxx
+++ b/vcl/source/window/menu.cxx
@@ -2309,6 +2309,12 @@ bool Menu::HasValidEntries( bool bCheckPopups )
return bValidEntries;
}
+void Menu::UpdateNativeMenu()
+{
+ if ( ImplGetSalMenu() )
+ ImplGetSalMenu()->Update();
+}
+
void Menu::MenuBarKeyInput(const KeyEvent&)
{
}
@@ -3221,44 +3227,4 @@ ImplMenuDelData::~ImplMenuDelData()
const_cast< Menu* >( mpMenu )->ImplRemoveDel( *this );
}
-namespace vcl { namespace MenuInvalidator {
-
-struct MenuInvalidateListeners : public vcl::DeletionNotifier
-{
- std::vector<Link<LinkParamNone*,void>> m_aListeners;
-};
-
-static MenuInvalidateListeners* pMenuInvalidateListeners = nullptr;
-
-void AddMenuInvalidateListener(const Link<LinkParamNone*,void>& rLink)
-{
- if(!pMenuInvalidateListeners)
- pMenuInvalidateListeners = new MenuInvalidateListeners();
- // ensure uniqueness
- auto& rListeners = pMenuInvalidateListeners->m_aListeners;
- if (std::find(rListeners.begin(), rListeners.end(), rLink) == rListeners.end())
- rListeners.push_back( rLink );
-}
-
-void Invalidated()
-{
- if(!pMenuInvalidateListeners)
- return;
-
- vcl::DeletionListener aDel( pMenuInvalidateListeners );
-
- auto& rYieldListeners = pMenuInvalidateListeners->m_aListeners;
- // Copy the list, because this can be destroyed when calling a Link...
- std::vector<Link<LinkParamNone*,void>> aCopy( rYieldListeners );
- for( Link<LinkParamNone*,void>& rLink : aCopy )
- {
- if (aDel.isDeleted()) break;
- // check this hasn't been removed in some re-enterancy scenario fdo#47368
- if( std::find(rYieldListeners.begin(), rYieldListeners.end(), rLink) != rYieldListeners.end() )
- rLink.Call( nullptr );
- }
-};
-
-} } // namespace vcl::MenuInvalidator
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/gtk/gloactiongroup.cxx b/vcl/unx/gtk/gloactiongroup.cxx
index 838538801ca7..e710809ca6cb 100644
--- a/vcl/unx/gtk/gloactiongroup.cxx
+++ b/vcl/unx/gtk/gloactiongroup.cxx
@@ -201,7 +201,7 @@ g_lo_action_group_perform_submenu_action (GLOActionGroup *group,
SAL_INFO("vcl.unity", "g_lo_action_group_perform_submenu_action on " << group << " to " << bState);
if (bState)
- pSalMenu->Activate();
+ pSalMenu->Activate (action_name);
else
pSalMenu->Deactivate (action_name);
}
diff --git a/vcl/unx/gtk/gtkdata.cxx b/vcl/unx/gtk/gtkdata.cxx
index e6121f7cba76..fa65259e8601 100644
--- a/vcl/unx/gtk/gtkdata.cxx
+++ b/vcl/unx/gtk/gtkdata.cxx
@@ -1027,22 +1027,4 @@ void GtkSalDisplay::deregisterFrame( SalFrame* pFrame )
SalGenericDisplay::deregisterFrame( pFrame );
}
-#if GTK_CHECK_VERSION(3,0,0)
-void GtkSalDisplay::RefreshMenusUnity()
-{
-#ifdef ENABLE_GMENU_INTEGRATION
- for(auto pSalFrame : m_aFrames) {
- auto pGtkSalFrame( static_cast<GtkSalFrame*>(pSalFrame));
- GtkSalMenu* pSalMenu = static_cast<GtkSalMenu*>(pGtkSalFrame->GetMenu());
- if(pSalMenu) {
- pSalMenu->Activate();
- pSalMenu->UpdateFull();
- }
- }
-#else
- (void) this;
-#endif
-}
-#endif
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/gtk/gtksalmenu.cxx b/vcl/unx/gtk/gtksalmenu.cxx
index d8211eb5b865..7b9f7eda6cdd 100644
--- a/vcl/unx/gtk/gtksalmenu.cxx
+++ b/vcl/unx/gtk/gtksalmenu.cxx
@@ -372,54 +372,9 @@ void GtkSalMenu::SetSubMenu( SalMenuItem* pSalMenuItem, SalMenu* pSubMenu, unsig
pItem->mpSubMenu = pGtkSubMenu;
}
-static bool bInvalidMenus = false;
-static gboolean RefreshMenusUnity(gpointer)
-{
- SolarMutexGuard g;
-#if GTK_CHECK_VERSION(3,0,0)
- GetGtkSalData()->GetGtkDisplay()->RefreshMenusUnity();
-#else
- SalDisplay* pSalDisplay = vcl_sal::getSalDisplay(GetGenericData());
- std::list< SalFrame* >::const_iterator pSalFrame = pSalDisplay->getFrames().begin();
- std::list< SalFrame* >::const_iterator pEndSalFrame = pSalDisplay->getFrames().end();
- for(; pSalFrame != pEndSalFrame; ++pSalFrame) {
- const GtkSalFrame* pGtkSalFrame = static_cast< const GtkSalFrame* >( *pSalFrame );
- GtkSalFrame* pFrameNonConst = const_cast<GtkSalFrame*>(pGtkSalFrame);
- GtkSalMenu* pSalMenu = static_cast<GtkSalMenu*>(pFrameNonConst->GetMenu());
- if(pSalMenu) {
- pSalMenu->Activate();
- pSalMenu->UpdateFull();
- }
- }
-#endif
- bInvalidMenus = false;
- return FALSE;
-}
-
-static void RefreshMenusUnity(void*, LinkParamNone*)
-{
- if(!bInvalidMenus) {
- g_timeout_add(10, &RefreshMenusUnity, nullptr);
- bInvalidMenus = true;
- }
-}
-
-static Link<LinkParamNone*,void>* getRefreshLinkInstance()
-{
- static Link<LinkParamNone*,void>* pLink = nullptr;
- if(!pLink) {
- pLink = new Link<LinkParamNone*,void>(nullptr, &RefreshMenusUnity);
- }
- return pLink;
-}
-
void GtkSalMenu::SetFrame( const SalFrame* pFrame )
{
SolarMutexGuard aGuard;
- {
- vcl::MenuInvalidator::AddMenuInvalidateListener(*getRefreshLinkInstance());
- }
-
assert(mbMenuBar);
SAL_INFO("vcl.unity", "GtkSalMenu set to frame");
mpFrame = static_cast< const GtkSalFrame* >( pFrame );
@@ -674,6 +629,7 @@ void GtkSalMenu::DispatchCommand( gint itemId, const gchar *aCommand )
void GtkSalMenu::ActivateAllSubmenus(MenuBar* pMenuBar)
{
pMenuBar->HandleMenuActivateEvent(mpVCLMenu);
+ pMenuBar->HandleMenuDeActivateEvent(mpVCLMenu);
for ( size_t nPos = 0; nPos < maItems.size(); nPos++ )
{
GtkSalMenuItem *pSalItem = maItems[ nPos ];
@@ -685,11 +641,23 @@ void GtkSalMenu::ActivateAllSubmenus(MenuBar* pMenuBar)
}
}
-void GtkSalMenu::Activate()
+void GtkSalMenu::Activate( const gchar* aMenuCommand )
{
if ( !mbMenuBar )
return;
- ActivateAllSubmenus(static_cast<MenuBar*>(mpVCLMenu));
+
+ if ( !aMenuCommand ) {
+ ActivateAllSubmenus( static_cast< MenuBar* >( mpVCLMenu ) );
+ return;
+ }
+
+ GtkSalMenu* pSalSubMenu = GetMenuForItemCommand( const_cast<gchar*>(aMenuCommand), TRUE );
+
+ if ( pSalSubMenu != nullptr ) {
+ MenuBar* pMenuBar = static_cast< MenuBar* >( mpVCLMenu );
+ pMenuBar->HandleMenuActivateEvent( pSalSubMenu->mpVCLMenu );
+ pSalSubMenu->Update();
+ }
}
void GtkSalMenu::Deactivate( const gchar* aMenuCommand )