vcl/unx/gtk/gtksalmenu.cxx |   14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

New commits:
commit ade817012f88f098ae633538697b9d14962d697c
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Wed Dec 19 16:23:06 2018 +0000
Commit:     Christian Lohmaier <lohmaier+libreoff...@googlemail.com>
CommitDate: Thu Dec 20 00:12:56 2018 +0100

    Resolves: tdf#121555 sometime crash on menu hierarchy change
    
    seems menubar gets set to dirty due to some menu activity that needs
    a refresh, but then the hierarchy changes and as its already dirty
    the maUpdateMenuBarIdle doesn't get launched
    
    the placement of the mbMenuBar test inside the loop through parents
    shows some confusion as to what which mbMenuBar might be met, the
    one belonging to this, or that of the parent being traversed, but
    it does seem to be the one belonging to this.
    
    Change-Id: I0b9dceadf64f7adf18eb1aa2dbda9bbfbcb66e0a
    Reviewed-on: https://gerrit.libreoffice.org/65462
    Tested-by: Jenkins
    Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com>

diff --git a/vcl/unx/gtk/gtksalmenu.cxx b/vcl/unx/gtk/gtksalmenu.cxx
index f6f45cf4acad..8329c376eda7 100644
--- a/vcl/unx/gtk/gtksalmenu.cxx
+++ b/vcl/unx/gtk/gtksalmenu.cxx
@@ -226,8 +226,12 @@ void GtkSalMenu::ImplUpdate(bool bRecurse, bool 
bRemoveDisabledEntries)
     if (mbNeedsUpdate)
     {
         mbNeedsUpdate = false;
-        if (mbMenuBar)
+        if (mbMenuBar && maUpdateMenuBarIdle.IsActive())
+        {
             maUpdateMenuBarIdle.Stop();
+            maUpdateMenuBarIdle.Invoke();
+            return;
+        }
     }
 
     Menu* pVCLMenu = mpVCLMenu;
@@ -556,13 +560,17 @@ IMPL_LINK_NOARG(GtkSalMenu, 
MenuBarHierarchyChangeHandler, Timer *, void)
 void GtkSalMenu::SetNeedsUpdate()
 {
     GtkSalMenu* pMenu = this;
+    // start that the menu and its parents are in need of an update
+    // on the next activation
     while (pMenu && !pMenu->mbNeedsUpdate)
     {
         pMenu->mbNeedsUpdate = true;
-        if (mbMenuBar)
-            maUpdateMenuBarIdle.Start();
         pMenu = pMenu->mpParentSalMenu;
     }
+    // only if a menubar is directly updated do we force in a full
+    // structure update
+    if (mbMenuBar && !maUpdateMenuBarIdle.IsActive())
+        maUpdateMenuBarIdle.Start();
 }
 
 void GtkSalMenu::SetMenuModel(GMenuModel* pMenuModel)
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to