[Libreoffice-commits] core.git: vcl/unx

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Jan 24 19:02:51 UTC 2019


 vcl/unx/gtk3/gtk3gtkinst.cxx |   20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

New commits:
commit 8e8de0a1c8ca88fb8b91ca44e260a87b93057379
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Thu Jan 24 14:31:08 2019 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Thu Jan 24 20:02:15 2019 +0100

    Resolves: tdf#122931 crash on closing b&n dialog after gallery menu activated
    
    Change-Id: I3284edc2ed64895642bd12ea479a1aba8023b2ba
    Reviewed-on: https://gerrit.libreoffice.org/66873
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index c6b4553d2bbd..b6cd35b7a01d 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -1826,6 +1826,15 @@ public:
         g_signal_connect(pMenuItem, "activate", G_CALLBACK(signalActivate), this);
     }
 
+    void remove_from_map(GtkMenuItem* pMenuItem)
+    {
+        const gchar* pStr = gtk_buildable_get_name(GTK_BUILDABLE(pMenuItem));
+        OString id(pStr, pStr ? strlen(pStr) : 0);
+        auto iter = m_aMap.find(id);
+        g_signal_handlers_disconnect_by_data(iter->second, this);
+        m_aMap.erase(iter);
+    }
+
     void disable_item_notify_events()
     {
         for (auto& a : m_aMap)
@@ -4200,6 +4209,7 @@ public:
 class GtkInstanceMenu : public MenuHelper, public virtual weld::Menu
 {
 protected:
+    std::vector<GtkMenuItem*> m_aExtraItems;
     OString m_sActivated;
     GtkInstanceMenuButton* m_pTopLevelMenuButton;
 
@@ -4358,12 +4368,22 @@ public:
         gtk_menu_shell_append(GTK_MENU_SHELL(m_pMenu), pItem);
         gtk_widget_show(pItem);
         GtkMenuItem* pMenuItem = GTK_MENU_ITEM(pItem);
+        m_aExtraItems.push_back(pMenuItem);
         add_to_map(pMenuItem);
         if (m_pTopLevelMenuButton)
             m_pTopLevelMenuButton->add_to_map(pMenuItem);
         if (pos != -1)
             gtk_menu_reorder_child(m_pMenu, pItem, pos);
     }
+
+    virtual ~GtkInstanceMenu() override
+    {
+        if (m_pTopLevelMenuButton)
+        {
+            for (auto a : m_aExtraItems)
+                m_pTopLevelMenuButton->remove_from_map(a);
+        }
+    }
 };
 
 class GtkInstanceRadioButton : public GtkInstanceToggleButton, public virtual weld::RadioButton


More information about the Libreoffice-commits mailing list