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>
diff --git a/vcl/inc/unx/gtk/gtksalmenu.hxx b/vcl/inc/unx/gtk/gtksalmenu.hxx
index bdacee7..b973684 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 2f85e07..e3d9dc85 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());
            }
        }
    }
}