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.
This commit is contained in:
Robin Gareus 2018-09-16 23:08:41 +02:00
parent 9321f46c45
commit 3298653955
2 changed files with 8 additions and 5 deletions

View File

@ -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 ();
}

View File

@ -38,7 +38,7 @@ public:
private:
void add_item (ARDOUR::RouteGroup *, std::set<ARDOUR::RouteGroup*> const &, Gtk::RadioMenuItem::Group*);
void new_group ();
void set_group (ARDOUR::RouteGroup *);
void set_group (Gtk::RadioMenuItem*, ARDOUR::RouteGroup *);
void new_group_dialog_finished (int, RouteGroupDialog*);
Gtk::Menu* _menu;