summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>2017-03-03 15:55:40 +0100
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2017-03-14 16:59:30 +0000
commit449733a5c3b59c7b56db1db3dbc7fd0dcefd1a55 (patch)
tree6f6a5e039afb6ad90197bd94c4892a07f46c39c2
parentc8f0a37ff804e6329b21a4b7bfabb0667263c6e5 (diff)
tdf#106271 Cannot disable Menubar under Unity
Empty the global menu when the user wants to hide the menubar. When showing it again, the global menu is refilled. (cherry picked from commit f2fa5951bf3d02439a3e96d1f9d89962f0901edc) The following commits have been squashed into this commit: 1. Destroy menu widget when enabling Unity integration Like GtkSalMenu::ShowMenuBar did before f2fa5951bf3d02439a3e96d1f9d89962f0901edc ("tdf#106271 Cannot disable Menubar under Unity") Should fix https://lists.freedesktop.org/archives/libreoffice/2017- March/077225.html (cherry-picked from commit 27f89f08cf4086802ce67f12389414bef6ab64ca) 2. Don't use SetDisplayable when enabling Unity mode because now it tracks the global menu too, but all we need here is to hide the in-window menubar widget. (cherry-picked from commit 3daa6c66eb9a4c334d6f72a8fd4bb09d7360a913) Change-Id: I3c5e17100622cd8d22c4348cf90a76233dd0fd4c Reviewed-on: https://gerrit.libreoffice.org/34919 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
-rw-r--r--include/vcl/menu.hxx1
-rw-r--r--vcl/source/window/menu.cxx11
-rw-r--r--vcl/unx/gtk/gtksalmenu.cxx28
3 files changed, 33 insertions, 7 deletions
diff --git a/include/vcl/menu.hxx b/include/vcl/menu.hxx
index 959d54d9f118..3c132cc32e07 100644
--- a/include/vcl/menu.hxx
+++ b/include/vcl/menu.hxx
@@ -478,6 +478,7 @@ public:
// if the menubar is unattached an empty rectangle is returned
Rectangle GetMenuBarButtonRectPixel( sal_uInt16 nId );
void RemoveMenuBarButton( sal_uInt16 nId );
+ void LayoutChanged();
};
inline MenuBar& MenuBar::operator=( const MenuBar& rMenu )
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx
index e88914c2d361..b327f3d10e7e 100644
--- a/vcl/source/window/menu.cxx
+++ b/vcl/source/window/menu.cxx
@@ -2464,6 +2464,13 @@ void MenuBar::ShowButtons( bool bClose, bool bFloat, bool bHide )
}
}
+void MenuBar::LayoutChanged()
+{
+ MenuBarWindow* pMenuWin = getMenuBarWindow();
+ if (pMenuWin)
+ pMenuWin->LayoutChanged();
+}
+
void MenuBar::SetDisplayable( bool bDisplayable )
{
if( bDisplayable != mbDisplayable )
@@ -2472,9 +2479,7 @@ void MenuBar::SetDisplayable( bool bDisplayable )
ImplGetSalMenu()->ShowMenuBar( bDisplayable );
mbDisplayable = bDisplayable;
- MenuBarWindow* pMenuWin = getMenuBarWindow();
- if (pMenuWin)
- pMenuWin->LayoutChanged();
+ LayoutChanged();
}
}
diff --git a/vcl/unx/gtk/gtksalmenu.cxx b/vcl/unx/gtk/gtksalmenu.cxx
index 2cf072a01d5d..807470ab1066 100644
--- a/vcl/unx/gtk/gtksalmenu.cxx
+++ b/vcl/unx/gtk/gtksalmenu.cxx
@@ -766,6 +766,9 @@ static gboolean MenuBarSignalKey(GtkWidget*, GdkEventKey* pEvent, gpointer menu)
void GtkSalMenu::CreateMenuBarWidget()
{
#if GTK_CHECK_VERSION(3,0,0)
+ if (mpMenuBarContainerWidget)
+ return;
+
GtkGrid* pGrid = mpFrame->getTopLevelGridWidget();
mpMenuBarContainerWidget = gtk_grid_new();
@@ -1153,16 +1156,33 @@ void GtkSalMenu::Deactivate(const gchar* pCommand)
void GtkSalMenu::EnableUnity(bool bEnable)
{
- if (bUnityMode != bEnable)
+ bUnityMode = bEnable;
+
+ MenuBar* pMenuBar(static_cast<MenuBar*>(mpVCLMenu.get()));
+
+ if (bEnable)
+ DestroyMenuBarWidget();
+ else
{
- bUnityMode = bEnable;
- static_cast<MenuBar*>(mpVCLMenu.get())->SetDisplayable(!bEnable);
+ Update();
+ if (pMenuBar->IsDisplayable())
+ CreateMenuBarWidget();
}
+
+ pMenuBar->LayoutChanged();
}
void GtkSalMenu::ShowMenuBar( bool bVisible )
{
- if (bVisible && !bUnityMode && !mpMenuBarContainerWidget)
+ // Unity tdf#106271: Can't hide global menu, so empty it instead when user wants to hide menubar,
+ if (bUnityMode)
+ {
+ if (bVisible)
+ Update();
+ else if (mpMenuModel && g_menu_model_get_n_items(G_MENU_MODEL(mpMenuModel)) > 0)
+ g_lo_menu_remove(G_LO_MENU(mpMenuModel), 0);
+ }
+ else if (bVisible)
CreateMenuBarWidget();
else
DestroyMenuBarWidget();