diff --git a/src/citra_qt/applets/swkbd.cpp b/src/citra_qt/applets/swkbd.cpp index c67fedf3c..c7883ba8c 100644 --- a/src/citra_qt/applets/swkbd.cpp +++ b/src/citra_qt/applets/swkbd.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -371,17 +372,40 @@ void QtSoftwareKeyboardDialog::MoveSelection(int row_delta, int column_delta) { next_row = 0; } - int next_column = selected_column + column_delta; const int row_size = static_cast(button_rows[next_row].size()); - if (next_column < 0) { - next_column = row_size - 1; - } else if (next_column >= row_size) { - next_column = 0; + int next_column = selected_column; + if (row_delta != 0) { + const auto* const selected_button = button_rows[selected_row][selected_column]; + next_column = FindClosestColumnInRow( + next_row, selected_button->geometry().center().x()); + } else { + next_column += column_delta; + if (next_column < 0) { + next_column = row_size - 1; + } else if (next_column >= row_size) { + next_column = 0; + } } SetSelectedButton(next_row, next_column); } +int QtSoftwareKeyboardDialog::FindClosestColumnInRow(int row, int source_x) const { + int closest_column = 0; + int closest_distance = std::numeric_limits::max(); + + for (int column = 0; column < static_cast(button_rows[row].size()); ++column) { + const int distance = + std::abs(button_rows[row][column]->geometry().center().x() - source_x); + if (distance < closest_distance) { + closest_column = column; + closest_distance = distance; + } + } + + return closest_column; +} + void QtSoftwareKeyboardDialog::SetSelectedButton(int row, int column) { if (!button_rows.empty()) { auto* const previous_button = button_rows[selected_row][selected_column]; diff --git a/src/citra_qt/applets/swkbd.h b/src/citra_qt/applets/swkbd.h index 738bfd09e..8661f37a5 100644 --- a/src/citra_qt/applets/swkbd.h +++ b/src/citra_qt/applets/swkbd.h @@ -103,6 +103,7 @@ private: void ShowInlineValidationError(Frontend::ValidationError error); void ClearValidationError(); void MoveSelection(int row_delta, int column_delta); + int FindClosestColumnInRow(int row, int source_x) const; void SetSelectedButton(int row, int column); void ActivateSelectedButton(); void HandleInputAction(SoftwareKeyboardInputInterpreter::Action action);