From ddc0cc840ab36a05426b5e982ab71752a04a6b78 Mon Sep 17 00:00:00 2001 From: Joel Linn Date: Sat, 7 Nov 2020 13:11:10 +0100 Subject: [PATCH] [SDL2] Allow AUX buttons. --- src/xenia/hid/sdl/sdl_input_driver.cc | 58 ++++++++++++++++++--------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/src/xenia/hid/sdl/sdl_input_driver.cc b/src/xenia/hid/sdl/sdl_input_driver.cc index 97a21cc8d..ad6d68a8d 100644 --- a/src/xenia/hid/sdl/sdl_input_driver.cc +++ b/src/xenia/hid/sdl/sdl_input_driver.cc @@ -268,7 +268,8 @@ X_RESULT SDLInputDriver::GetKeystroke(uint32_t users, uint32_t flags, // The order of this list is also the order in which events are send if // multiple buttons change at once. static_assert(sizeof(X_INPUT_GAMEPAD::buttons) == 2); - static const std::array::type, 34> + static constexpr std::array::type, + 34> vk_lookup = { // 00 - True buttons from xinput button field X_INPUT_GAMEPAD_VK_DPAD_UP, @@ -497,23 +498,39 @@ void SDLInputDriver::OnControllerDeviceButtonChanged(const SDL_Event& event) { // Define a lookup table to map between SDL and XInput button codes. // These need to be in the order of the SDL_GameControllerButton enum. - static const std::array::type, - SDL_CONTROLLER_BUTTON_MAX> - xbutton_lookup = {X_INPUT_GAMEPAD_A, - X_INPUT_GAMEPAD_B, - X_INPUT_GAMEPAD_X, - X_INPUT_GAMEPAD_Y, - X_INPUT_GAMEPAD_BACK, - X_INPUT_GAMEPAD_GUIDE, - X_INPUT_GAMEPAD_START, - X_INPUT_GAMEPAD_LEFT_THUMB, - X_INPUT_GAMEPAD_RIGHT_THUMB, - X_INPUT_GAMEPAD_LEFT_SHOULDER, - X_INPUT_GAMEPAD_RIGHT_SHOULDER, - X_INPUT_GAMEPAD_DPAD_UP, - X_INPUT_GAMEPAD_DPAD_DOWN, - X_INPUT_GAMEPAD_DPAD_LEFT, - X_INPUT_GAMEPAD_DPAD_RIGHT}; + static constexpr std::array< + std::underlying_type::type, 21> + xbutton_lookup = { + // Standard buttons: + X_INPUT_GAMEPAD_A, + X_INPUT_GAMEPAD_B, + X_INPUT_GAMEPAD_X, + X_INPUT_GAMEPAD_Y, + X_INPUT_GAMEPAD_BACK, + X_INPUT_GAMEPAD_GUIDE, + X_INPUT_GAMEPAD_START, + X_INPUT_GAMEPAD_LEFT_THUMB, + X_INPUT_GAMEPAD_RIGHT_THUMB, + X_INPUT_GAMEPAD_LEFT_SHOULDER, + X_INPUT_GAMEPAD_RIGHT_SHOULDER, + X_INPUT_GAMEPAD_DPAD_UP, + X_INPUT_GAMEPAD_DPAD_DOWN, + X_INPUT_GAMEPAD_DPAD_LEFT, + X_INPUT_GAMEPAD_DPAD_RIGHT, + // There are additional buttons only available on some controllers. + // For now just assign sensible defaults + // Misc: + X_INPUT_GAMEPAD_GUIDE, + // Xbox Elite paddles: + X_INPUT_GAMEPAD_Y, + X_INPUT_GAMEPAD_B, + X_INPUT_GAMEPAD_X, + X_INPUT_GAMEPAD_A, + // PS touchpad button + X_INPUT_GAMEPAD_GUIDE, + }; + static_assert(SDL_CONTROLLER_BUTTON_A == 0); + static_assert(SDL_CONTROLLER_BUTTON_DPAD_RIGHT == 14); auto idx = GetControllerIndexFromInstanceID(event.cbutton.which); assert(idx); @@ -521,6 +538,11 @@ void SDLInputDriver::OnControllerDeviceButtonChanged(const SDL_Event& event) { uint16_t xbuttons = controller.state.gamepad.buttons; // Lookup the XInput button code. + if (event.cbutton.button >= xbutton_lookup.size()) { + // A newer SDL Version may have added new buttons. + XELOGI("SDL HID: Unknown button was pressed: {}.", event.cbutton.button); + return; + } auto xbutton = xbutton_lookup.at(event.cbutton.button); // Pressed or released? if (event.cbutton.state == SDL_PRESSED) {