Fix CheckOption crash on session-reload
authorRobin Gareus <robin@gareus.org>
Sat, 8 Dec 2018 20:18:54 +0000 (21:18 +0100)
committerRobin Gareus <robin@gareus.org>
Sat, 8 Dec 2018 20:18:54 +0000 (21:18 +0100)
The ToggleAction has a lifetime of the UI, independent of the
CheckOption widget. The CheckOption needs to unsubscribe from the
signal_toggled() signal when it is deleted.

Also a CheckOption without a Action makes no sense. require _action
to be give at instantiation time.

gtk2_ardour/option_editor.cc
gtk2_ardour/option_editor.h

index 875e6114524902a4dda9846a91da605dfd62b7fe..3482f66980612398941b3d6dc47a770c1ce736ee 100644 (file)
@@ -213,18 +213,22 @@ CheckOption::CheckOption (string const & i, string const & n, Glib::RefPtr<Gtk::
        _button->signal_toggled().connect (sigc::mem_fun (*this, &CheckOption::toggled));
 
        Gtkmm2ext::Activatable::set_related_action (act);
-       if (_action) {
+       assert (_action);
 
-               action_sensitivity_changed ();
+       action_sensitivity_changed ();
 
-               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (_action);
-               if (tact) {
-                       action_toggled ();
-                       tact->signal_toggled().connect (sigc::mem_fun (*this, &CheckOption::action_toggled));
-               }
-
-               _action->connect_property_changed ("sensitive", sigc::mem_fun (*this, &CheckOption::action_sensitivity_changed));
+       Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (_action);
+       if (tact) {
+               action_toggled ();
+               _callback_connection = tact->signal_toggled().connect (sigc::mem_fun (*this, &CheckOption::action_toggled));
        }
+
+       _action->connect_property_changed ("sensitive", sigc::mem_fun (*this, &CheckOption::action_sensitivity_changed));
+}
+
+CheckOption::~CheckOption ()
+{
+       _callback_connection.disconnect ();
 }
 
 void
index d6738889f3dd45a5d8d7618aef5528135c6a1b9e..749df8f90c70e5631770da0e315b19fa44c71ca2 100644 (file)
@@ -193,6 +193,7 @@ class CheckOption : public OptionEditorComponent , public Gtkmm2ext::Activatable
 {
 public:
        CheckOption (std::string const &, std::string const &, Glib::RefPtr<Gtk::Action> act );
+       virtual ~CheckOption ();
        void set_state_from_config () {}
        void parameter_changed (std::string const &) {}
        void add_to_page (OptionEditorPage*);
@@ -203,17 +204,18 @@ public:
 
        Gtk::Widget& tip_widget() { return *_button; }
 
+protected:
        void action_toggled ();
        void action_sensitivity_changed () {}
        void action_visibility_changed () {}
 
-protected:
        virtual void toggled ();
 
-       sigc::slot<bool>       _get; ///< slot to get the configuration variable's value
-       sigc::slot<bool, bool> _set;  ///< slot to set the configuration variable's value
        Gtk::CheckButton*      _button; ///< UI button
        Gtk::Label*            _label; ///< label for button, so we can use markup
+
+private:
+       sigc::connection       _callback_connection;
 };
 
 /** Component which provides the UI to handle a boolean option using a GTK CheckButton */