diff options
author | Caolán McNamara <caolanm@redhat.com> | 2019-01-24 14:31:08 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2019-01-24 20:02:15 +0100 |
commit | 8e8de0a1c8ca88fb8b91ca44e260a87b93057379 (patch) | |
tree | 7f83c62c7306eecd0e478922927367b00ecf7809 /vcl | |
parent | c66027d18eecaf29962e251def4203091d1669f3 (diff) |
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@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 20 |
1 files changed, 20 insertions, 0 deletions
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 |