diff --git a/gtk2_ardour/virtual_keyboard_window.cc b/gtk2_ardour/virtual_keyboard_window.cc index 9d276329e1..56cd96145e 100644 --- a/gtk2_ardour/virtual_keyboard_window.cc +++ b/gtk2_ardour/virtual_keyboard_window.cc @@ -100,6 +100,7 @@ VirtualKeyboardWindow::VirtualKeyboardWindow () _pitch_adjustment.signal_value_changed ().connect (sigc::mem_fun (*this, &VirtualKeyboardWindow::pitch_slider_adjusted)); _pitchbend->ValueChanged.connect_same_thread (_cc_connections, boost::bind (&VirtualKeyboardWindow::pitch_bend_event_handler, this, _1)); + _pitch_slider->StopGesture.connect (sigc::mem_fun (*this, &VirtualKeyboardWindow::pitch_bend_release)); set_tooltip (_yaxis_velocity, _("When enabled, mouse-click y-axis position defines the velocity.")); @@ -382,19 +383,64 @@ VirtualKeyboardWindow::on_key_press_event (GdkEventKey* ev) // and use signals. -- also subscribe SustainChanged, indicate sustain. // TODO: pitch-bend shortcuts if (ev->type == GDK_KEY_PRESS) { - if (ev->keyval == GDK_KEY_Left) { - _piano_octave_key.set_value (_piano_octave_key.get_value_as_int () - 1); - return true; - } - if (ev->keyval == GDK_KEY_Right) { - _piano_octave_key.set_value (_piano_octave_key.get_value_as_int () + 1); - return true; + switch (ev->keyval) { + case GDK_KEY_Left: + _piano_octave_key.set_value (_piano_octave_key.get_value_as_int () - 1); + return true; + case GDK_KEY_Right: + _piano_octave_key.set_value (_piano_octave_key.get_value_as_int () + 1); + return true; + case GDK_KEY_F1: + _pitch_adjustment.set_value (0); + return true; + case GDK_KEY_F2: + _pitch_adjustment.set_value (4096); + return true; + case GDK_KEY_F3: + _pitch_adjustment.set_value (12288); + return true; + case GDK_KEY_F4: + _pitch_adjustment.set_value (16383); + return true; + default: + break; } } return ARDOUR_UI_UTILS::relay_key_press (ev, this); } +bool +VirtualKeyboardWindow::on_key_release_event (GdkEventKey* ev) +{ + /* try propagate unmodified events first */ + if ((ev->state & 0xf) == 0) { + if (gtk_window_propagate_key_event (gobj(), ev)) { + return true; + } + } + + _piano.grab_focus (); + + if (ev->type == GDK_KEY_RELEASE) { + switch (ev->keyval) { + case GDK_KEY_F1: + /* fallthrough */ + case GDK_KEY_F2: + /* fallthrough */ + case GDK_KEY_F3: + /* fallthrough */ + case GDK_KEY_F4: + _pitch_adjustment.set_value (8192); + return true; + default: + break; + } + } + + return ArdourWindow::on_key_release_event (ev); +} + void VirtualKeyboardWindow::select_keyboard_layout (std::string const& l) { @@ -623,3 +669,9 @@ VirtualKeyboardWindow::pitch_bend_event_handler (int val) ev[2] = (val >> 7) & 0x7f; _session->vkbd_output_port ()->write (ev, 3, 0); } + +void +VirtualKeyboardWindow::pitch_bend_release () +{ + _pitch_adjustment.set_value (8192); +} diff --git a/gtk2_ardour/virtual_keyboard_window.h b/gtk2_ardour/virtual_keyboard_window.h index 7248d14023..dc5b63df5e 100644 --- a/gtk2_ardour/virtual_keyboard_window.h +++ b/gtk2_ardour/virtual_keyboard_window.h @@ -98,11 +98,13 @@ protected: private: void on_unmap (); bool on_key_press_event (GdkEventKey*); + bool on_key_release_event (GdkEventKey*); void note_on_event_handler (int, int); void note_off_event_handler (int); void control_change_event_handler (int, int); void pitch_bend_event_handler (int); + void pitch_bend_release (); void select_keyboard_layout (std::string const&); void update_velocity_settings (int);