diff options
author | Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de> | 2017-03-03 15:55:40 +0100 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2017-03-16 14:43:59 +0100 |
commit | 33a066b518eadc06e481c35677f0224b47caefa2 (patch) | |
tree | 974b8bb07f03e01679a37f0bb5e5b75385bf9a4c /vcl | |
parent | 94df63a10521ebc04c577de8f9b1ba6f73034550 (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>
(cherry picked from commit 449733a5c3b59c7b56db1db3dbc7fd0dcefd1a55)
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/window/menu.cxx | 11 | ||||
-rw-r--r-- | vcl/unx/gtk/gtksalmenu.cxx | 28 |
2 files changed, 32 insertions, 7 deletions
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx index ba1e6fd92e3e..854affea713f 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(); |