X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Fbinding_proxy.cc;h=f12c64cf68973a0bf39a626ee5167abdb2c60a8a;hb=a1f858d3b207739e0719c1fc28003f1d9dd3965d;hp=3a2f5bbbc837e423e78379a2ae05e25792a77947;hpb=50a3102b9b533d7f8786d220f8df67421b9227c8;p=ardour.git diff --git a/libs/gtkmm2ext/binding_proxy.cc b/libs/gtkmm2ext/binding_proxy.cc index 3a2f5bbbc8..f12c64cf68 100644 --- a/libs/gtkmm2ext/binding_proxy.cc +++ b/libs/gtkmm2ext/binding_proxy.cc @@ -31,14 +31,35 @@ using namespace Gtkmm2ext; using namespace std; using namespace PBD; -BindingProxy::BindingProxy (Controllable& c) - : prompter (Gtk::WIN_POS_MOUSE, 30000, false), +BindingProxy::BindingProxy (boost::shared_ptr c) + : prompter (0), controllable (c), bind_button (2), bind_statemask (Gdk::CONTROL_MASK) { - prompter.signal_unmap_event().connect (mem_fun (*this, &BindingProxy::prompter_hiding)); +} + +BindingProxy::BindingProxy () + : prompter (0), + bind_button (2), + bind_statemask (Gdk::CONTROL_MASK) + +{ +} + +BindingProxy::~BindingProxy () +{ + if (prompter) { + delete prompter; + } +} + +void +BindingProxy::set_controllable (boost::shared_ptr c) +{ + learning_finished (); + controllable = c; } void @@ -58,12 +79,16 @@ BindingProxy::get_bind_button_state (guint &button, guint &statemask) bool BindingProxy::button_press_handler (GdkEventButton *ev) { - if ((ev->state & bind_statemask) && ev->button == bind_button) { - if (Controllable::StartLearning (&controllable)) { + if (controllable && (ev->state & bind_statemask) && ev->button == bind_button) { + 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 +100,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; }