From c616d433c291fcb4809affc681c9f2e902859fc4 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Fri, 6 May 2016 18:13:24 -0400 Subject: [PATCH] Make key navigation to ruler work on Windows --- src/TrackPanel.cpp | 2 +- src/widgets/Ruler.cpp | 34 +++++++++++++++++++++++++++++++++- src/widgets/Ruler.h | 1 + 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 772fa9e97..604445b5f 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -8710,7 +8710,7 @@ void TrackPanel::SetFocusedTrack( Track *t ) if (t && !t->GetLinked() && t->GetLink()) t = (WaveTrack*)t->GetLink(); - if (AudacityProject::GetKeyboardCaptureHandler()) { + if (t && AudacityProject::GetKeyboardCaptureHandler()) { AudacityProject::ReleaseKeyboard(this); } diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index 26108055a..81f3038b9 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -1781,6 +1781,7 @@ BEGIN_EVENT_TABLE(AdornedRulerPanel, wxPanel) EVT_MENU(OnShowHideScrubbingID, AdornedRulerPanel::OnToggleScrubbing) // Key events, to navigate buttons + EVT_COMMAND(wxID_ANY, EVT_CAPTURE_KEY, AdornedRulerPanel::OnCaptureKey) EVT_KEY_DOWN(AdornedRulerPanel::OnKeyDown) EVT_SET_FOCUS(AdornedRulerPanel::OnSetFocus) @@ -2251,6 +2252,10 @@ bool AdornedRulerPanel::IsWithinMarker(int mousePosX, double markerTime) void AdornedRulerPanel::OnMouseEvents(wxMouseEvent &evt) { + // PRL: why do I need these two lines on Windows but not on Mac? + if (evt.ButtonDown(wxMOUSE_BTN_ANY)) + SetFocus(); + // Disable mouse actions on Timeline while recording. if (mIsRecording) { if (HasCapture()) @@ -2754,6 +2759,31 @@ void AdornedRulerPanel::OnToggleScrubbing(wxCommandEvent&) PostSizeEventToParent(); } +void AdornedRulerPanel::OnCaptureKey(wxCommandEvent &event) +{ + wxKeyEvent *kevent = (wxKeyEvent *)event.GetEventObject(); + int keyCode = kevent->GetKeyCode(); + + switch (keyCode) + { + case WXK_DOWN: + case WXK_NUMPAD_DOWN: + case WXK_UP: + case WXK_NUMPAD_UP: + case WXK_TAB: + case WXK_NUMPAD_TAB: + case WXK_RIGHT: + case WXK_NUMPAD_RIGHT: + case WXK_LEFT: + case WXK_NUMPAD_LEFT: + case WXK_RETURN: + case WXK_NUMPAD_ENTER: + return; + } + + event.Skip(); +} + void AdornedRulerPanel::OnKeyDown(wxKeyEvent &event) { switch (event.GetKeyCode()) @@ -2807,6 +2837,7 @@ void AdornedRulerPanel::OnKeyDown(wxKeyEvent &event) void AdornedRulerPanel::OnSetFocus(wxFocusEvent & WXUNUSED(event)) { + AudacityProject::CaptureKeyboard(this); mProject->GetTrackPanel()->SetFocusedTrack(nullptr); mTabState = TabState{}; Refresh( false ); @@ -2814,7 +2845,8 @@ void AdornedRulerPanel::OnSetFocus(wxFocusEvent & WXUNUSED(event)) void AdornedRulerPanel::OnKillFocus(wxFocusEvent & WXUNUSED(event)) { - Refresh( false ); + AudacityProject::ReleaseKeyboard(this); + Refresh(false); } void AdornedRulerPanel::OnCaptureLost(wxMouseCaptureLostEvent & WXUNUSED(evt)) diff --git a/src/widgets/Ruler.h b/src/widgets/Ruler.h index 33e0c97ad..5a0421882 100644 --- a/src/widgets/Ruler.h +++ b/src/widgets/Ruler.h @@ -474,6 +474,7 @@ private: void OnToggleScrubbing(wxCommandEvent&); + void OnCaptureKey(wxCommandEvent &event); void OnKeyDown(wxKeyEvent &event); void OnSetFocus(wxFocusEvent &); void OnKillFocus(wxFocusEvent &);