using namespace std;
using namespace PBD;
-BindingProxy::BindingProxy (Controllable& c)
- : prompter (Gtk::WIN_POS_MOUSE, 30000, false),
+BindingProxy::BindingProxy (boost::shared_ptr<Controllable> 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<Controllable> c)
+{
+ learning_finished ();
+ controllable = c;
}
void
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;
}
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;
}