diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index cdc68ea..e93f0b0 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -288,7 +288,7 @@ AppFrame::AppFrame() : this->SetSizer(vbox); // waterfallCanvas->SetFocusFromKbd(); - waterfallCanvas->SetFocus(); +// waterfallCanvas->SetFocus(); // SetIcon(wxICON(sample)); @@ -1196,15 +1196,15 @@ void AppFrame::OnIdle(wxIdleEvent& event) { } } - if (demodTuner->getMouseTracker()->mouseInView()) { - if (!demodTuner->HasFocus()) { - demodTuner->SetFocus(); - } - } else if (!wxGetApp().isDeviceSelectorOpen() && (!modemProps || !modemProps->isMouseInView())) { - if (!waterfallCanvas->HasFocus()) { - waterfallCanvas->SetFocus(); - } - } +// if (demodTuner->getMouseTracker()->mouseInView()) { +// if (!demodTuner->HasFocus()) { +// demodTuner->SetFocus(); +// } +// } else if (!wxGetApp().isDeviceSelectorOpen() && (!modemProps || !modemProps->isMouseInView())) { +// if (!waterfallCanvas->HasFocus()) { +// waterfallCanvas->SetFocus(); +// } +// } scopeCanvas->setPPMMode(demodTuner->isAltDown()); @@ -1276,6 +1276,8 @@ void AppFrame::OnIdle(wxIdleEvent& event) { if (!this->IsActive()) { std::this_thread::sleep_for(std::chrono::milliseconds(25)); + } else { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); } event.RequestMore(); @@ -1540,3 +1542,96 @@ void AppFrame::setMainWaterfallFFTSize(int fftSize) { waterfallDataThread->getProcessor()->setFFTSize(fftSize); waterfallCanvas->setFFTSize(fftSize); } + +int AppFrame::OnGlobalKeyDown(wxKeyEvent &event) { + if (!this->IsActive()) { + return -1; + } + + switch (event.GetKeyCode()) { + case WXK_UP: + case WXK_NUMPAD_UP: + case WXK_DOWN: + case WXK_NUMPAD_DOWN: + case WXK_LEFT: + case WXK_NUMPAD_LEFT: + case WXK_RIGHT: + case WXK_NUMPAD_RIGHT: + waterfallCanvas->OnKeyDown(event); + return 0; + case 'A': + case 'F': + case 'L': + case 'U': + return 0; + default: + break; + } + + if (demodTuner->getMouseTracker()->mouseInView()) { + demodTuner->OnKeyDown(event); + return 0; + } else if (waterfallCanvas->getMouseTracker()->mouseInView()) { + waterfallCanvas->OnKeyDown(event); + return 0; + } + + return 0; +} + +int AppFrame::OnGlobalKeyUp(wxKeyEvent &event) { + if (!this->IsActive()) { + return -1; + } + + switch (event.GetKeyCode()) { + case WXK_SPACE: + if (!demodTuner->getMouseTracker()->mouseInView()) { + wxGetApp().showFrequencyInput(); + return 0; + } + break; + case WXK_UP: + case WXK_NUMPAD_UP: + case WXK_DOWN: + case WXK_NUMPAD_DOWN: + case WXK_LEFT: + case WXK_NUMPAD_LEFT: + case WXK_RIGHT: + case WXK_NUMPAD_RIGHT: + waterfallCanvas->OnKeyUp(event); + return 0; + case 'A': + demodModeSelector->setSelection("AM"); + break; + case 'F': + if (demodModeSelector->getSelectionLabel() == "FM") { + demodModeSelector->setSelection("FMS"); + } else { + demodModeSelector->setSelection("FM"); + } + break; + case 'L': + demodModeSelector->setSelection("LSB"); + break; + case 'U': + demodModeSelector->setSelection("USB"); + break; + default: + break; + } + + if (demodTuner->getMouseTracker()->mouseInView()) { + demodTuner->OnKeyUp(event); + return 0; + } else if (waterfallCanvas->getMouseTracker()->mouseInView()) { + waterfallCanvas->OnKeyUp(event); + return 0; + } + + + // TODO: Catch key-ups outside of original target + + return 0; +} + diff --git a/src/AppFrame.h b/src/AppFrame.h index cfa549c..84d32ba 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -75,6 +75,9 @@ public: void updateModemProperties(ModemArgInfoList args); void setMainWaterfallFFTSize(int fftSize); + int OnGlobalKeyDown(wxKeyEvent &event); + int OnGlobalKeyUp(wxKeyEvent &event); + private: void OnMenu(wxCommandEvent& event); void OnClose(wxCloseEvent& event); diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index d023ad1..4d1517b 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -749,6 +749,22 @@ std::string CubicSDR::getModulePath() { return modulePath; } +int CubicSDR::FilterEvent(wxEvent& event) { + if (!appframe) { + return -1; + } + + if (event.GetEventType() == wxEVT_KEY_DOWN) { + return appframe->OnGlobalKeyDown((wxKeyEvent&)event); + } + + if (event.GetEventType() == wxEVT_KEY_UP) { + return appframe->OnGlobalKeyUp((wxKeyEvent&)event); + } + + return -1; // process normally +} + #ifdef USE_HAMLIB RigThread *CubicSDR::getRigThread() { return rigThread; diff --git a/src/CubicSDR.h b/src/CubicSDR.h index caa997f..83ad557 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -161,6 +161,8 @@ public: #endif private: + int FilterEvent(wxEvent& event); + AppFrame *appframe; AppConfig config; PrimaryGLContext *m_glContext; diff --git a/src/visual/InteractiveCanvas.cpp b/src/visual/InteractiveCanvas.cpp index 228277f..edd85dc 100644 --- a/src/visual/InteractiveCanvas.cpp +++ b/src/visual/InteractiveCanvas.cpp @@ -19,7 +19,7 @@ InteractiveCanvas::InteractiveCanvas(wxWindow *parent, int *attribList) : wxGLCanvas(parent, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize, - wxFULL_REPAINT_ON_RESIZE| wxWANTS_CHARS), parent(parent), shiftDown(false), altDown(false), ctrlDown(false), centerFreq(0), bandwidth(0), lastBandwidth(0), isView( + wxFULL_REPAINT_ON_RESIZE), parent(parent), shiftDown(false), altDown(false), ctrlDown(false), centerFreq(0), bandwidth(0), lastBandwidth(0), isView( false) { mouseTracker.setTarget(this); } diff --git a/src/visual/TuningCanvas.cpp b/src/visual/TuningCanvas.cpp index 3616463..bd21503 100644 --- a/src/visual/TuningCanvas.cpp +++ b/src/visual/TuningCanvas.cpp @@ -26,8 +26,8 @@ EVT_RIGHT_UP(TuningCanvas::OnMouseRightReleased) EVT_LEAVE_WINDOW(TuningCanvas::OnMouseLeftWindow) EVT_ENTER_WINDOW(TuningCanvas::OnMouseEnterWindow) EVT_MOUSEWHEEL(TuningCanvas::OnMouseWheelMoved) -EVT_KEY_DOWN(TuningCanvas::OnKeyDown) -EVT_KEY_UP(TuningCanvas::OnKeyUp) +//EVT_KEY_DOWN(TuningCanvas::OnKeyDown) +//EVT_KEY_UP(TuningCanvas::OnKeyUp) wxEND_EVENT_TABLE() TuningCanvas::TuningCanvas(wxWindow *parent, int *attribList) : diff --git a/src/visual/TuningCanvas.h b/src/visual/TuningCanvas.h index daf41ff..3482163 100644 --- a/src/visual/TuningCanvas.h +++ b/src/visual/TuningCanvas.h @@ -25,6 +25,8 @@ public: bool changed(); void setHalfBand(bool hb); + void OnKeyDown(wxKeyEvent& event); + void OnKeyUp(wxKeyEvent& event); private: void OnPaint(wxPaintEvent& event); @@ -36,8 +38,6 @@ private: void OnMouseReleased(wxMouseEvent& event); void OnMouseEnterWindow(wxMouseEvent& event); void OnMouseLeftWindow(wxMouseEvent& event); - void OnKeyDown(wxKeyEvent& event); - void OnKeyUp(wxKeyEvent& event); void OnMouseRightDown(wxMouseEvent& event); void OnMouseRightReleased(wxMouseEvent& event); diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index 6d5b5c9..522c82d 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -19,8 +19,8 @@ wxBEGIN_EVENT_TABLE(WaterfallCanvas, wxGLCanvas) EVT_PAINT(WaterfallCanvas::OnPaint) -EVT_KEY_DOWN(WaterfallCanvas::OnKeyDown) -EVT_KEY_UP(WaterfallCanvas::OnKeyUp) +//EVT_KEY_DOWN(WaterfallCanvas::OnKeyDown) +//EVT_KEY_UP(WaterfallCanvas::OnKeyUp) EVT_IDLE(WaterfallCanvas::OnIdle) EVT_MOTION(WaterfallCanvas::OnMouseMoved) EVT_LEFT_DOWN(WaterfallCanvas::OnMouseDown) @@ -345,7 +345,6 @@ void WaterfallCanvas::OnKeyUp(wxKeyEvent& event) { altDown = event.AltDown(); ctrlDown = event.ControlDown(); switch (event.GetKeyCode()) { - case 'A': case WXK_UP: case WXK_NUMPAD_UP: scaleMove = 0.0; @@ -354,7 +353,6 @@ void WaterfallCanvas::OnKeyUp(wxKeyEvent& event) { mouseZoom = 0.95; } break; - case 'Z': case WXK_DOWN: case WXK_NUMPAD_DOWN: scaleMove = 0.0; @@ -381,7 +379,6 @@ void WaterfallCanvas::OnKeyDown(wxKeyEvent& event) { long long freq = originalFreq; switch (event.GetKeyCode()) { - case 'A': case WXK_UP: case WXK_NUMPAD_UP: if (!shiftDown) { @@ -391,7 +388,6 @@ void WaterfallCanvas::OnKeyDown(wxKeyEvent& event) { scaleMove = 1.0; } break; - case 'Z': case WXK_DOWN: case WXK_NUMPAD_DOWN: if (!shiftDown) { diff --git a/src/visual/WaterfallCanvas.h b/src/visual/WaterfallCanvas.h index 013e3fc..9aff56b 100644 --- a/src/visual/WaterfallCanvas.h +++ b/src/visual/WaterfallCanvas.h @@ -33,11 +33,11 @@ public: void setLinesPerSecond(int lps); void setMinBandwidth(int min); -private: - void OnPaint(wxPaintEvent& event); void OnKeyDown(wxKeyEvent& event); void OnKeyUp(wxKeyEvent& event); +private: + void OnPaint(wxPaintEvent& event); void OnIdle(wxIdleEvent &event); void OnMouseMoved(wxMouseEvent& event);