summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/editor.cc8
-rw-r--r--gtk2_ardour/editor.h19
-rw-r--r--gtk2_ardour/time_axis_view.cc15
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/keyboard.h2
-rw-r--r--libs/gtkmm2ext/keyboard.cc8
5 files changed, 50 insertions, 2 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 939c05b1e8..e3e00cf340 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -282,6 +282,7 @@ Editor::Editor ()
, _region_selection_change_updates_region_list (true)
, _following_mixer_selection (false)
, _control_point_toggled_on_press (false)
+ , _stepping_axis_view (0)
{
constructed = false;
@@ -696,6 +697,8 @@ Editor::Editor ()
signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
signal_delete_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close));
+ Gtkmm2ext::Keyboard::the_keyboard().ShiftReleased.connect (sigc::mem_fun (*this, &Editor::shift_key_released));
+
/* allow external control surfaces/protocols to do various things */
ControlProtocol::ZoomToSession.connect (*this, invalidator (*this), boost::bind (&Editor::temporal_zoom_session, this), gui_context());
@@ -5473,3 +5476,8 @@ Editor::popup_control_point_context_menu (ArdourCanvas::Item* item, GdkEvent* ev
_control_point_context_menu.popup (event->button.button, event->button.time);
}
+void
+Editor::shift_key_released ()
+{
+ _stepping_axis_view = 0;
+}
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 5134b6a7a1..a2d7c93fd3 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -470,6 +470,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void get_pointer_position (double &, double &) const;
+ TimeAxisView* stepping_axis_view () {
+ return _stepping_axis_view;
+ }
+
+ void set_stepping_axis_view (TimeAxisView* v) {
+ _stepping_axis_view = v;
+ }
+
protected:
void map_transport_state ();
void map_position_change (framepos_t);
@@ -2102,6 +2110,17 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
/** Flag for a bit of a hack wrt control point selection; see set_selected_control_point_from_click */
bool _control_point_toggled_on_press;
+ /** This is used by TimeAxisView to keep a track of the TimeAxisView that is currently being
+ stepped in height using Shift-Scrollwheel. When a scroll event occurs, we do the step on
+ this _stepping_axis_view if it is non-0 (and we set up this _stepping_axis_view with the
+ TimeAxisView underneath the mouse if it is 0). Then Editor resets _stepping_axis_view when
+ the shift key is released. In this (hacky) way, pushing shift and moving the scroll wheel
+ will operate on the same track until shift is released (rather than skipping about to whatever
+ happens to be underneath the mouse at the time).
+ */
+ TimeAxisView* _stepping_axis_view;
+ void shift_key_released ();
+
friend class Drag;
friend class RegionDrag;
friend class RegionMoveDrag;
diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc
index ddf03e968e..ee5c7c1c2a 100644
--- a/gtk2_ardour/time_axis_view.cc
+++ b/gtk2_ardour/time_axis_view.cc
@@ -48,6 +48,7 @@
#include "utils.h"
#include "streamview.h"
#include "editor_drag.h"
+#include "editor.h"
#include "i18n.h"
@@ -317,7 +318,12 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
switch (ev->direction) {
case GDK_SCROLL_UP:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
- step_height (false);
+ /* See Editor::_stepping_axis_view for notes on this hack */
+ Editor& e = dynamic_cast<Editor&> (_editor);
+ if (!e.stepping_axis_view ()) {
+ e.set_stepping_axis_view (this);
+ }
+ e.stepping_axis_view()->step_height (false);
return true;
} else if (Keyboard::no_modifiers_active (ev->state)) {
_editor.scroll_tracks_up_line();
@@ -327,7 +333,12 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
case GDK_SCROLL_DOWN:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
- step_height (true);
+ /* See Editor::_stepping_axis_view for notes on this hack */
+ Editor& e = dynamic_cast<Editor&> (_editor);
+ if (!e.stepping_axis_view ()) {
+ e.set_stepping_axis_view (this);
+ }
+ e.stepping_axis_view()->step_height (true);
return true;
} else if (Keyboard::no_modifiers_active (ev->state)) {
_editor.scroll_tracks_down_line();
diff --git a/libs/gtkmm2ext/gtkmm2ext/keyboard.h b/libs/gtkmm2ext/gtkmm2ext/keyboard.h
index 3287cdb37e..909f791403 100644
--- a/libs/gtkmm2ext/gtkmm2ext/keyboard.h
+++ b/libs/gtkmm2ext/gtkmm2ext/keyboard.h
@@ -159,6 +159,8 @@ class Keyboard : public sigc::trackable, PBD::Stateful
}
};
+ sigc::signal0<void> ShiftReleased;
+
protected:
static Keyboard* _the_keyboard;
diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc
index 6328eb977c..81b9ae642a 100644
--- a/libs/gtkmm2ext/keyboard.cc
+++ b/libs/gtkmm2ext/keyboard.cc
@@ -243,6 +243,14 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
keyval = event->keyval;
}
+ if (keyval == GDK_Shift_L) {
+ /* There is a special and rather hacky situation in Editor which makes
+ it useful to know when a shift key has been released, so emit a signal
+ here (see Editor::_stepping_axis_view)
+ */
+ ShiftReleased (); /* EMIT SIGNAL */
+ }
+
if (event->type == GDK_KEY_PRESS) {
if (find (state.begin(), state.end(), keyval) == state.end()) {