X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Fbinding_proxy.cc;h=bf21c19bce983532aa575dd18bd57a814b581bd5;hb=61e851da0841190b5f45944a0aa5395cae07a269;hp=3a2f5bbbc837e423e78379a2ae05e25792a77947;hpb=50a3102b9b533d7f8786d220f8df67421b9227c8;p=ardour.git diff --git a/libs/gtkmm2ext/binding_proxy.cc b/libs/gtkmm2ext/binding_proxy.cc index 3a2f5bbbc8..bf21c19bce 100644 --- a/libs/gtkmm2ext/binding_proxy.cc +++ b/libs/gtkmm2ext/binding_proxy.cc @@ -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) +guint BindingProxy::bind_button = 2; +guint BindingProxy::bind_statemask = Gdk::CONTROL_MASK; +BindingProxy::BindingProxy (boost::shared_ptr c) + : prompter (0), + controllable (c) { - prompter.signal_unmap_event().connect (mem_fun (*this, &BindingProxy::prompter_hiding)); +} + +BindingProxy::BindingProxy () + : prompter (0) +{ +} + +BindingProxy::~BindingProxy () +{ + if (prompter) { + delete prompter; + } +} + +void +BindingProxy::set_controllable (boost::shared_ptr 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; }