summaryrefslogtreecommitdiff
path: root/gtk2_ardour/virtual_keyboard_window.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2019-12-15 13:58:03 +0100
committerRobin Gareus <robin@gareus.org>2019-12-15 14:06:00 +0100
commita31fde491a47e8fba6dbef7f174277f0ecf3211c (patch)
tree0a806ef1658092df2ff92b1eaa4d1782b581d911 /gtk2_ardour/virtual_keyboard_window.cc
parentb2bc934e218a8ed05b6f37edc5585191e60ca288 (diff)
VKeybd: Pitchebend sprung mode and keyboard-shortcuts
This unconditionally returns the pitch-bend wheel when used by mouse-drag/drop. Mouse-wheel retains the "wheel" mode. <F1>-<F4> key-bindings have been added to jump to discrete values
Diffstat (limited to 'gtk2_ardour/virtual_keyboard_window.cc')
-rw-r--r--gtk2_ardour/virtual_keyboard_window.cc64
1 files changed, 58 insertions, 6 deletions
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,17 +383,62 @@ 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;
+ 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;
}
- if (ev->keyval == GDK_KEY_Right) {
- _piano_octave_key.set_value (_piano_octave_key.get_value_as_int () + 1);
+ }
+
+ 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;
}
}
- return ARDOUR_UI_UTILS::relay_key_press (ev, this);
+ _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
@@ -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);
+}