Fix special handling of 'zoom vertical' scroll wheel modifier key.

gtkmm2ext/keyboard.cc has a special case to emit a signal on the key-up of
the modifier key used to adjust track heights in conjunction with the
scroll wheel, so that the same track continues to be resized even when
it's shrunk to no longer be under the mouse cursor. However, this code
assumed that the modifier key for this was <Shift>.

Fix it to use the event->state bit corresponding to
ScrollZoomVerticalModifier instead, and rename the relevant functions to
clarify that it's the 'zoom vertical' modifier key they're dealing with.

Partially fixes #5610.
This commit is contained in:
Colin Fletcher 2013-07-23 16:15:23 +01:00 committed by Paul Davis
parent c222acecaa
commit 1da655c2eb
4 changed files with 18 additions and 14 deletions

View file

@ -698,7 +698,7 @@ Editor::Editor ()
signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); 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)); 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)); Gtkmm2ext::Keyboard::the_keyboard().ZoomVerticalModifierReleased.connect (sigc::mem_fun (*this, &Editor::zoom_vertical_modifier_released));
/* allow external control surfaces/protocols to do various things */ /* allow external control surfaces/protocols to do various things */
@ -5510,7 +5510,7 @@ Editor::popup_control_point_context_menu (ArdourCanvas::Item* item, GdkEvent* ev
} }
void void
Editor::shift_key_released () Editor::zoom_vertical_modifier_released()
{ {
_stepping_axis_view = 0; _stepping_axis_view = 0;
} }

View file

@ -2053,15 +2053,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
bool _control_point_toggled_on_press; bool _control_point_toggled_on_press;
/** This is used by TimeAxisView to keep a track of the TimeAxisView that is currently being /** 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 stepped in height using ScrollZoomVerticalModifier+Scrollwheel. When a scroll event
this _stepping_axis_view if it is non-0 (and we set up this _stepping_axis_view with the occurs, we do the step on this _stepping_axis_view if it is non-0 (and we set up this
TimeAxisView underneath the mouse if it is 0). Then Editor resets _stepping_axis_view when _stepping_axis_view with the TimeAxisView underneath the mouse if it is 0). Then Editor
the shift key is released. In this (hacky) way, pushing shift and moving the scroll wheel resets _stepping_axis_view when the modifier key is released. In this (hacky) way,
will operate on the same track until shift is released (rather than skipping about to whatever pushing the modifier key and moving the scroll wheel will operate on the same track
happens to be underneath the mouse at the time). until the key is released (rather than skipping about to whatever happens to be
underneath the mouse at the time).
*/ */
TimeAxisView* _stepping_axis_view; TimeAxisView* _stepping_axis_view;
void shift_key_released (); void zoom_vertical_modifier_released();
friend class Drag; friend class Drag;
friend class RegionDrag; friend class RegionDrag;

View file

@ -164,7 +164,7 @@ class Keyboard : public sigc::trackable, PBD::Stateful
} }
}; };
sigc::signal0<void> ShiftReleased; sigc::signal0<void> ZoomVerticalModifierReleased;
protected: protected:
static Keyboard* _the_keyboard; static Keyboard* _the_keyboard;

View file

@ -248,12 +248,15 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
keyval = event->keyval; keyval = event->keyval;
} }
if (keyval == GDK_Shift_L) { if (event->state & ScrollZoomVerticalModifier) {
/* There is a special and rather hacky situation in Editor which makes /* 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 it useful to know when the modifier key for vertical zoom has been
here (see Editor::_stepping_axis_view) released, so emit a signal here (see Editor::_stepping_axis_view).
Note that the state bit for the modifier key is set for the key-up
event when the modifier is released, but not the key-down when it
is pressed, so we get here on key-up, which is what we want.
*/ */
ShiftReleased (); /* EMIT SIGNAL */ ZoomVerticalModifierReleased (); /* EMIT SIGNAL */
} }
if (event->type == GDK_KEY_PRESS) { if (event->type == GDK_KEY_PRESS) {