diff --git a/input/input_state.cpp b/input/input_state.cpp index dd4332ceeb..2da6321b61 100644 --- a/input/input_state.cpp +++ b/input/input_state.cpp @@ -44,12 +44,19 @@ int MapPadButtonFixed(int keycode) { std::vector confirmKeys; std::vector cancelKeys; +std::vector tabLeftKeys; +std::vector tabRightKeys; -void SetConfirmCancelKeys(std::vector confirm, std::vector cancel) { +void SetConfirmCancelKeys(const std::vector &confirm, const std::vector &cancel) { confirmKeys = confirm; cancelKeys = cancel; } +void SetTabLeftRightKeys(const std::vector &tabLeft, const std::vector &tabRight) { + tabLeftKeys = tabLeft; + tabRightKeys = tabRight; +} + uint32_t ButtonTracker::Update() { pad_buttons_ |= pad_buttons_async_set; pad_buttons_ &= ~pad_buttons_async_clear; diff --git a/input/input_state.h b/input/input_state.h index 561ea60096..378a4ba98b 100644 --- a/input/input_state.h +++ b/input/input_state.h @@ -180,4 +180,7 @@ extern ButtonTracker g_buttonTracker; // Is there a nicer place for this stuff? It's here to avoid dozens of linking errors in UnitTest.. extern std::vector confirmKeys; extern std::vector cancelKeys; -void SetConfirmCancelKeys(std::vector confirm, std::vector cancel); +extern std::vector tabLeftKeys; +extern std::vector tabRightKeys; +void SetConfirmCancelKeys(const std::vector &confirm, const std::vector &cancel); +void SetTabLeftRightKeys(const std::vector &tabLeft, const std::vector &tabRight); diff --git a/ui/view.cpp b/ui/view.cpp index 06e7b36e1a..8e7f60b289 100644 --- a/ui/view.cpp +++ b/ui/view.cpp @@ -202,11 +202,35 @@ void Clickable::Touch(const TouchInput &input) { // TODO: O/X confirm preference for xperia play? bool IsAcceptKeyCode(int keyCode) { - return std::find(confirmKeys.begin(), confirmKeys.end(), (keycode_t)keyCode) != confirmKeys.end(); + if (confirmKeys.empty()) { + return keyCode == NKCODE_SPACE || keyCode == NKCODE_ENTER || keyCode == NKCODE_Z || keyCode == NKCODE_BUTTON_A || keyCode == NKCODE_BUTTON_CROSS || keyCode == NKCODE_BUTTON_1; + } else { + return std::find(confirmKeys.begin(), confirmKeys.end(), (keycode_t)keyCode) != confirmKeys.end(); + } } bool IsEscapeKeyCode(int keyCode) { - return std::find(cancelKeys.begin(), cancelKeys.end(), (keycode_t)keyCode) != cancelKeys.end(); + if (cancelKeys.empty()) { + return keyCode == NKCODE_ESCAPE || keyCode == NKCODE_BACK || keyCode == NKCODE_BUTTON_CIRCLE || keyCode == NKCODE_BUTTON_B || keyCode == NKCODE_BUTTON_2; + } else { + return std::find(cancelKeys.begin(), cancelKeys.end(), (keycode_t)keyCode) != cancelKeys.end(); + } +} + +bool IsTabLeftKeyCode(int keyCode) { + if (tabLeftKeys.empty()) { + return keyCode == NKCODE_BUTTON_L1; + } else { + return std::find(tabLeftKeys.begin(), tabLeftKeys.end(), (keycode_t)keyCode) != tabLeftKeys.end(); + } +} + +bool IsTabRightKeyCode(int keyCode) { + if (tabRightKeys.empty()) { + return keyCode == NKCODE_BUTTON_R1; + } else { + return std::find(tabRightKeys.begin(), tabRightKeys.end(), (keycode_t)keyCode) != tabRightKeys.end(); + } } void Clickable::Key(const KeyInput &key) { diff --git a/ui/view.h b/ui/view.h index 890b63a92e..5d57d046ec 100644 --- a/ui/view.h +++ b/ui/view.h @@ -768,5 +768,7 @@ void EventTriggered(Event *e, EventParams params); void DispatchEvents(); bool IsAcceptKeyCode(int keyCode); bool IsEscapeKeyCode(int keyCode); +bool IsTabLeftKeyCode(int keyCode); +bool IsTabRightKeyCode(int keyCode); } // namespace diff --git a/ui/viewgroup.cpp b/ui/viewgroup.cpp index d867d26fd7..d35394ac31 100644 --- a/ui/viewgroup.cpp +++ b/ui/viewgroup.cpp @@ -975,9 +975,9 @@ void ChoiceStrip::HighlightChoice(unsigned int choice){ void ChoiceStrip::Key(const KeyInput &input) { if (input.flags & KEY_DOWN) { - if (input.keyCode == NKCODE_BUTTON_L1 && selected_ > 0) { + if (IsTabLeftKeyCode(input.keyCode) && selected_ > 0) { SetSelection(selected_ - 1); - } else if (input.keyCode == NKCODE_BUTTON_R1 && selected_ < (int)views_.size() - 1) { + } else if (IsTabRightKeyCode(input.keyCode) && selected_ < (int)views_.size() - 1) { SetSelection(selected_ + 1); } }