provisional processor control-box tweaks - possible fix for #6519
authorRobin Gareus <robin@gareus.org>
Wed, 19 Aug 2015 11:49:30 +0000 (13:49 +0200)
committerRobin Gareus <robin@gareus.org>
Wed, 19 Aug 2015 12:27:14 +0000 (14:27 +0200)
ControlBoxes are created/destroyed regularly (plugin re-order,
track selection -> Editor Mixer,...).

Properly disconnect the timer signal in the dtor and skip updateing the
tooltip unnecessarily (duplicate calls, Changed & Timer).

This should really be undone, the timer needs to be removed and Changed() used throughout.

gtk2_ardour/processor_box.cc
gtk2_ardour/processor_box.h

index 536d5f26f91cf9fd5448541cd86c557407df3579..f6ce27a0c91115f16f7bbf2fd741854240cdb4ab 100644 (file)
@@ -529,7 +529,8 @@ ProcessorEntry::Control::Control (boost::shared_ptr<AutomationControl> c, string
 
                _button.signal_clicked.connect (sigc::mem_fun (*this, &Control::button_clicked));
                _button.signal_led_clicked.connect (sigc::mem_fun (*this, &Control::button_clicked));
-               c->Changed.connect (_connection, MISSING_INVALIDATOR, boost::bind (&Control::control_changed, this), gui_context ());
+               // dup. currently timers are used :(
+               //c->Changed.connect (_connection, MISSING_INVALIDATOR, boost::bind (&Control::control_changed, this), gui_context ());
 
        } else {
                
@@ -565,10 +566,13 @@ ProcessorEntry::Control::Control (boost::shared_ptr<AutomationControl> c, string
                _slider.set_default_value (normal);
                
                _adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &Control::slider_adjusted));
-               c->Changed.connect (_connection, MISSING_INVALIDATOR, boost::bind (&Control::control_changed, this), gui_context ());
+               // dup. currently timers are used :(
+               //c->Changed.connect (_connection, MISSING_INVALIDATOR, boost::bind (&Control::control_changed, this), gui_context ());
        }
 
-       Timers::rapid_connect (sigc::mem_fun (*this, &Control::control_changed));
+       // yuck, do we really need to do this?
+       // according to c404374 this is only needed for send automation
+       timer_connection = Timers::rapid_connect (sigc::mem_fun (*this, &Control::control_changed));
        
        control_changed ();
        set_tooltip ();
@@ -577,6 +581,11 @@ ProcessorEntry::Control::Control (boost::shared_ptr<AutomationControl> c, string
        set_no_tooltip_whatsoever (_slider);
 }
 
+ProcessorEntry::Control::~Control ()
+{
+       timer_connection.disconnect ();
+}
+
 void
 ProcessorEntry::Control::set_tooltip ()
 {
@@ -645,9 +654,13 @@ ProcessorEntry::Control::control_changed ()
                _button.set_active (c->get_value() > 0.5);
                
        } else {
-
-               _adjustment.set_value (c->internal_to_interface(c->get_value ()));
-               set_tooltip ();
+               // as long as rapid timers are used, only update the tooltip
+               // if the value has changed.
+               const double nval = c->internal_to_interface (c->get_value ());
+               if (_adjustment.get_value() != nval) {
+                       _adjustment.set_value (nval);
+                       set_tooltip ();
+               }
        }
        
        _ignore_ui_adjustment = false;
index a76970b72136721f3d23468f6e83064f4005252d..fcc70a60748b944c7f8a5ee8f7771ad6f2e55aa6 100644 (file)
@@ -169,6 +169,7 @@ private:
        class Control : public sigc::trackable {
        public:
                Control (boost::shared_ptr<ARDOUR::AutomationControl>, std::string const &);
+               ~Control ();
 
                void set_visible (bool);
                void add_state (XMLNode *) const;
@@ -203,6 +204,7 @@ private:
                PBD::ScopedConnection _connection;
                bool _visible;
                std::string _name;
+               sigc::connection timer_connection;
        };
 
        std::list<Control*> _controls;