globally remove all trailing whitespace from ardour code base.
[ardour.git] / libs / gtkmm2ext / binding_proxy.cc
index 3a2f5bbbc837e423e78379a2ae05e25792a77947..87473adcd2b571ac69cae03e5674fd8ec09a9466 100644 (file)
@@ -31,14 +31,32 @@ using namespace Gtkmm2ext;
 using namespace std;
 using namespace PBD;
 
-BindingProxy::BindingProxy (Controllable& c)
-       : prompter (Gtk::WIN_POS_MOUSE, 30000, false),
-         controllable (c),
-         bind_button (2),
-         bind_statemask (Gdk::CONTROL_MASK)
-
-{                        
-       prompter.signal_unmap_event().connect (mem_fun (*this, &BindingProxy::prompter_hiding));
+guint BindingProxy::bind_button = 2;
+guint BindingProxy::bind_statemask = Gdk::CONTROL_MASK;
+
+BindingProxy::BindingProxy (boost::shared_ptr<Controllable> c)
+       : prompter (0),
+         controllable (c)
+{                      
+}
+
+BindingProxy::BindingProxy ()
+       : prompter (0)
+{                      
+}
+
+BindingProxy::~BindingProxy ()
+{
+       if (prompter) {
+               delete prompter;
+       }
+}
+
+void
+BindingProxy::set_controllable (boost::shared_ptr<Controllable> c)
+{
+       learning_finished ();
+       controllable = c;
 }
 
 void
@@ -48,22 +66,26 @@ BindingProxy::set_bind_button_state (guint button, guint statemask)
        bind_statemask = statemask;
 }
 
-void
-BindingProxy::get_bind_button_state (guint &button, guint &statemask)
+bool
+BindingProxy::is_bind_action (GdkEventButton *ev)
 {
-       button = bind_button;
-       statemask = bind_statemask;
+       return ( (ev->state & bind_statemask) && ev->button == bind_button );
 }
 
+
 bool
 BindingProxy::button_press_handler (GdkEventButton *ev)
 {
-       if ((ev->state & bind_statemask) && ev->button == bind_button) { 
-               if (Controllable::StartLearning (&controllable)) {
+       if ( controllable && is_bind_action(ev) ) {
+               if (Controllable::StartLearning (controllable.get())) {
                        string prompt = _("operate controller now");
-                       prompter.set_text (prompt);
-                       prompter.touch (); // shows popup
-                       learning_connection = controllable.LearningFinished.connect (mem_fun (*this, &BindingProxy::learning_finished));
+                       if (prompter == 0) {
+                               prompter = new PopUp (Gtk::WIN_POS_MOUSE, 30000, false);
+                               prompter->signal_unmap_event().connect (mem_fun (*this, &BindingProxy::prompter_hiding));
+                       }
+                       prompter->set_text (prompt);
+                       prompter->touch (); // shows popup
+                       controllable->LearningFinished.connect_same_thread (learning_connection, boost::bind (&BindingProxy::learning_finished, this));
                }
                return true;
        }
@@ -75,15 +97,19 @@ void
 BindingProxy::learning_finished ()
 {
        learning_connection.disconnect ();
-       prompter.touch (); // hides popup
+       if (prompter) {
+               prompter->touch (); // hides popup
+       }
 }
 
 
 bool
-BindingProxy::prompter_hiding (GdkEventAny *ev)
+BindingProxy::prompter_hiding (GdkEventAny* /*ev*/)
 {
        learning_connection.disconnect ();
-       Controllable::StopLearning (&controllable);
+       if (controllable) {
+               Controllable::StopLearning (controllable.get());
+       }
        return false;
 }