Kaydet (Commit) 9eae5555 authored tarafından Noel Grandin's avatar Noel Grandin

speed up gtk menu construction at startup

Change-Id: Ia28b1f0281485691e3b4188d23947014c1eff385
Reviewed-on: https://gerrit.libreoffice.org/71465
Tested-by: Jenkins
Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst 86472881
......@@ -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;
......
......@@ -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());
}
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment