diff options
author | Robin Gareus <robin@gareus.org> | 2018-09-16 23:08:41 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2018-09-16 23:08:41 +0200 |
commit | 32986539552bde1b1b66ff30bb070e4bb0fb087f (patch) | |
tree | ddfeb8da4b2cb4e4a7b02e3607536af2989ac1fd /gtk2_ardour/route_group_menu.cc | |
parent | 9321f46c453b3df226f0abc8ced6415e1d3e842d (diff) |
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.
Diffstat (limited to 'gtk2_ardour/route_group_menu.cc')
-rw-r--r-- | gtk2_ardour/route_group_menu.cc | 11 |
1 files changed, 7 insertions, 4 deletions
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<RadioMenuItem *> (&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<RouteGroup*> const & groups, items.push_back (RadioMenuElem (*group, rg->name())); RadioMenuItem* i = static_cast<RadioMenuItem*> (&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<RouteGroup*> 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<Route> 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 (); } |