From 32986539552bde1b1b66ff30bb070e4bb0fb087f Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 16 Sep 2018 23:08:41 +0200 Subject: Fix crash when re-assigning groups This works around an issue where gtk sends two callbacks when a radio selection changes. First: unselect, then select new item. Previously: Two tracks, two groups. Select all tracks, assign to 2nd group. Crash. The first callback, "unselect" iterates over all tracks, removes them from any groups. Eventually all groups are unused and hence destroyed. The 2nd callback - "select" - now uses a just destroyed group. --- gtk2_ardour/route_group_menu.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'gtk2_ardour/route_group_menu.cc') diff --git a/gtk2_ardour/route_group_menu.cc b/gtk2_ardour/route_group_menu.cc index 5ccafaec39..63577392a7 100644 --- a/gtk2_ardour/route_group_menu.cc +++ b/gtk2_ardour/route_group_menu.cc @@ -88,7 +88,7 @@ RouteGroupMenu::build (WeakRouteList const & s) RadioMenuItem::Group group; items.push_back (RadioMenuElem (group, _("No Group"))); RadioMenuItem* i = static_cast (&items.back ()); - i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::set_group), (RouteGroup *) 0)); + i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::set_group), i, (RouteGroup *) 0)); if (groups.size() == 1 && *groups.begin() == 0) { i->set_active (); @@ -116,7 +116,7 @@ RouteGroupMenu::add_item (RouteGroup* rg, std::set const & groups, items.push_back (RadioMenuElem (*group, rg->name())); RadioMenuItem* i = static_cast (&items.back ()); - i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::set_group), rg)); + i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::set_group), i, rg)); if (groups.size() == 1 && *groups.begin() == rg) { /* there's only one active group, and it's this one */ @@ -131,11 +131,14 @@ RouteGroupMenu::add_item (RouteGroup* rg, std::set const & groups, * @param Group, or 0 for none. */ void -RouteGroupMenu::set_group (RouteGroup* g) +RouteGroupMenu::set_group (Gtk::RadioMenuItem* e, RouteGroup* g) { if (_inhibit_group_selected) { return; } + if (e && !e->get_active()) { + return; + } for (WeakRouteList::const_iterator i = _subject.begin(); i != _subject.end(); ++i) { boost::shared_ptr r = i->lock (); @@ -173,7 +176,7 @@ RouteGroupMenu::new_group_dialog_finished (int r, RouteGroupDialog* d) { if (r == RESPONSE_OK) { _session->add_route_group (d->group()); - set_group (d->group()); + set_group (0, d->group()); } else { delete d->group (); } -- cgit v1.2.3