diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-04-28 09:54:42 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-04-29 08:30:26 +0200 |
commit | 9eae555542ce01cb289b9e736454abcf835b8394 (patch) | |
tree | 7e6f1d44f609ebcf05e3675ea8f10e41652cc078 /vcl | |
parent | 8647288180806f8515bf2548db7280cbc657eaf3 (diff) |
speed up gtk menu construction at startup
Change-Id: Ia28b1f0281485691e3b4188d23947014c1eff385
Reviewed-on: https://gerrit.libreoffice.org/71465
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/unx/gtk/gtksalmenu.hxx | 2 | ||||
-rw-r--r-- | vcl/unx/gtk/gtksalmenu.cxx | 25 |
2 files changed, 21 insertions, 6 deletions
diff --git a/vcl/inc/unx/gtk/gtksalmenu.hxx b/vcl/inc/unx/gtk/gtksalmenu.hxx index bdacee7ca178..b973684b21f1 100644 --- a/vcl/inc/unx/gtk/gtksalmenu.hxx +++ b/vcl/inc/unx/gtk/gtksalmenu.hxx @@ -59,6 +59,8 @@ private: bool mbNeedsUpdate; bool mbReturnFocusToDocument; bool mbAddedGrab; + /// Even setting null icon on a menuitem can be expensive, so cache state to avoid that call + bool mbHasNullItemIcon = true; GtkWidget* mpMenuBarContainerWidget; std::unique_ptr<utl::TempFile> mxPersonaImage; BitmapEx maPersonaBitmap; diff --git a/vcl/unx/gtk/gtksalmenu.cxx b/vcl/unx/gtk/gtksalmenu.cxx index 2f85e0710043..e3d9dc85c087 100644 --- a/vcl/unx/gtk/gtksalmenu.cxx +++ b/vcl/unx/gtk/gtksalmenu.cxx @@ -1063,6 +1063,9 @@ namespace void GtkSalMenu::NativeSetItemIcon( unsigned nSection, unsigned nItemPos, const Image& rImage ) { #if GLIB_CHECK_VERSION(2,38,0) + if (!!rImage && mbHasNullItemIcon) + return; + SolarMutexGuard aGuard; if (!!rImage) @@ -1081,9 +1084,13 @@ void GtkSalMenu::NativeSetItemIcon( unsigned nSection, unsigned nItemPos, const g_lo_menu_set_icon_to_item_in_section( G_LO_MENU( mpMenuModel ), nSection, nItemPos, pIcon ); g_object_unref(pIcon); g_bytes_unref(pBytes); + mbHasNullItemIcon = false; } else + { g_lo_menu_set_icon_to_item_in_section( G_LO_MENU( mpMenuModel ), nSection, nItemPos, nullptr ); + mbHasNullItemIcon = true; + } #else (void)nSection; (void)nItemPos; @@ -1222,12 +1229,18 @@ void GtkSalMenu::ActivateAllSubmenus(Menu* pMenuBar) { if ( pSalItem->mpSubMenu != nullptr ) { - pSalItem->mpSubMenu->mbInActivateCallback = true; - pMenuBar->HandleMenuActivateEvent(pSalItem->mpSubMenu->GetMenu()); - pSalItem->mpSubMenu->mbInActivateCallback = false; - pSalItem->mpSubMenu->ActivateAllSubmenus(pMenuBar); - pSalItem->mpSubMenu->Update(); - pMenuBar->HandleMenuDeActivateEvent(pSalItem->mpSubMenu->GetMenu()); + // We can re-enter this method via the new event loop that gets created + // in GtkClipboardTransferable::getTransferDataFlavorsAsVector, so use the InActivateCallback + // flag to detect that and skip some startup work. + if (!pSalItem->mpSubMenu->mbInActivateCallback) + { + pSalItem->mpSubMenu->mbInActivateCallback = true; + pMenuBar->HandleMenuActivateEvent(pSalItem->mpSubMenu->GetMenu()); + pSalItem->mpSubMenu->mbInActivateCallback = false; + pSalItem->mpSubMenu->ActivateAllSubmenus(pMenuBar); + pSalItem->mpSubMenu->Update(); + pMenuBar->HandleMenuDeActivateEvent(pSalItem->mpSubMenu->GetMenu()); + } } } } |