|
|
@ -150,6 +150,8 @@ public: |
|
|
if (sdl_controller) { |
|
|
if (sdl_controller) { |
|
|
const auto type = SDL_GameControllerGetType(sdl_controller.get()); |
|
|
const auto type = SDL_GameControllerGetType(sdl_controller.get()); |
|
|
return (type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO) || |
|
|
return (type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO) || |
|
|
|
|
|
(type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT) || |
|
|
|
|
|
(type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT) || |
|
|
(type == SDL_CONTROLLER_TYPE_PS5); |
|
|
(type == SDL_CONTROLLER_TYPE_PS5); |
|
|
} |
|
|
} |
|
|
return false; |
|
|
return false; |
|
|
@ -228,9 +230,8 @@ public: |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Common::Input::BatteryLevel GetBatteryLevel() { |
|
|
|
|
|
const auto level = SDL_JoystickCurrentPowerLevel(sdl_joystick.get()); |
|
|
|
|
|
switch (level) { |
|
|
|
|
|
|
|
|
Common::Input::BatteryLevel GetBatteryLevel(SDL_JoystickPowerLevel battery_level) { |
|
|
|
|
|
switch (battery_level) { |
|
|
case SDL_JOYSTICK_POWER_EMPTY: |
|
|
case SDL_JOYSTICK_POWER_EMPTY: |
|
|
return Common::Input::BatteryLevel::Empty; |
|
|
return Common::Input::BatteryLevel::Empty; |
|
|
case SDL_JOYSTICK_POWER_LOW: |
|
|
case SDL_JOYSTICK_POWER_LOW: |
|
|
@ -378,7 +379,6 @@ void SDLDriver::InitJoystick(int joystick_index) { |
|
|
if (joystick_map.find(guid) == joystick_map.end()) { |
|
|
if (joystick_map.find(guid) == joystick_map.end()) { |
|
|
auto joystick = std::make_shared<SDLJoystick>(guid, 0, sdl_joystick, sdl_gamecontroller); |
|
|
auto joystick = std::make_shared<SDLJoystick>(guid, 0, sdl_joystick, sdl_gamecontroller); |
|
|
PreSetController(joystick->GetPadIdentifier()); |
|
|
PreSetController(joystick->GetPadIdentifier()); |
|
|
SetBattery(joystick->GetPadIdentifier(), joystick->GetBatteryLevel()); |
|
|
|
|
|
joystick->EnableMotion(); |
|
|
joystick->EnableMotion(); |
|
|
joystick_map[guid].emplace_back(std::move(joystick)); |
|
|
joystick_map[guid].emplace_back(std::move(joystick)); |
|
|
return; |
|
|
return; |
|
|
@ -398,7 +398,6 @@ void SDLDriver::InitJoystick(int joystick_index) { |
|
|
const int port = static_cast<int>(joystick_guid_list.size()); |
|
|
const int port = static_cast<int>(joystick_guid_list.size()); |
|
|
auto joystick = std::make_shared<SDLJoystick>(guid, port, sdl_joystick, sdl_gamecontroller); |
|
|
auto joystick = std::make_shared<SDLJoystick>(guid, port, sdl_joystick, sdl_gamecontroller); |
|
|
PreSetController(joystick->GetPadIdentifier()); |
|
|
PreSetController(joystick->GetPadIdentifier()); |
|
|
SetBattery(joystick->GetPadIdentifier(), joystick->GetBatteryLevel()); |
|
|
|
|
|
joystick->EnableMotion(); |
|
|
joystick->EnableMotion(); |
|
|
joystick_guid_list.emplace_back(std::move(joystick)); |
|
|
joystick_guid_list.emplace_back(std::move(joystick)); |
|
|
} |
|
|
} |
|
|
@ -438,8 +437,6 @@ void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) { |
|
|
if (const auto joystick = GetSDLJoystickBySDLID(event.jbutton.which)) { |
|
|
if (const auto joystick = GetSDLJoystickBySDLID(event.jbutton.which)) { |
|
|
const PadIdentifier identifier = joystick->GetPadIdentifier(); |
|
|
const PadIdentifier identifier = joystick->GetPadIdentifier(); |
|
|
SetButton(identifier, event.jbutton.button, true); |
|
|
SetButton(identifier, event.jbutton.button, true); |
|
|
// Battery doesn't trigger an event so just update every button press
|
|
|
|
|
|
SetBattery(identifier, joystick->GetBatteryLevel()); |
|
|
|
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
@ -466,6 +463,13 @@ void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) { |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
case SDL_JOYBATTERYUPDATED: { |
|
|
|
|
|
if (auto joystick = GetSDLJoystickBySDLID(event.jbattery.which)) { |
|
|
|
|
|
const PadIdentifier identifier = joystick->GetPadIdentifier(); |
|
|
|
|
|
SetBattery(identifier, joystick->GetBatteryLevel(event.jbattery.level)); |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
case SDL_JOYDEVICEREMOVED: |
|
|
case SDL_JOYDEVICEREMOVED: |
|
|
LOG_DEBUG(Input, "Controller removed with Instance_ID {}", event.jdevice.which); |
|
|
LOG_DEBUG(Input, "Controller removed with Instance_ID {}", event.jdevice.which); |
|
|
CloseJoystick(SDL_JoystickFromInstanceID(event.jdevice.which)); |
|
|
CloseJoystick(SDL_JoystickFromInstanceID(event.jdevice.which)); |
|
|
@ -501,6 +505,9 @@ SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_en |
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "0"); |
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "0"); |
|
|
} else { |
|
|
} else { |
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "1"); |
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "1"); |
|
|
|
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED, "0"); |
|
|
|
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS, "0"); |
|
|
|
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS, "1"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Disable hidapi drivers for pro controllers when the custom joycon driver is enabled
|
|
|
// Disable hidapi drivers for pro controllers when the custom joycon driver is enabled
|
|
|
@ -508,8 +515,11 @@ SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_en |
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH, "0"); |
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH, "0"); |
|
|
} else { |
|
|
} else { |
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH, "1"); |
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH, "1"); |
|
|
|
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED, "0"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED, "1"); |
|
|
|
|
|
|
|
|
// Disable hidapi driver for xbox. Already default on Windows, this causes conflict with native
|
|
|
// Disable hidapi driver for xbox. Already default on Windows, this causes conflict with native
|
|
|
// driver on Linux.
|
|
|
// driver on Linux.
|
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_XBOX, "0"); |
|
|
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_XBOX, "0"); |
|
|
@ -789,7 +799,9 @@ ButtonMapping SDLDriver::GetButtonMappingForDevice(const Common::ParamPackage& p |
|
|
// This list also excludes Screenshot since there's not really a mapping for that
|
|
|
// This list also excludes Screenshot since there's not really a mapping for that
|
|
|
ButtonBindings switch_to_sdl_button; |
|
|
ButtonBindings switch_to_sdl_button; |
|
|
|
|
|
|
|
|
if (SDL_GameControllerGetType(controller) == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO) { |
|
|
|
|
|
|
|
|
if (SDL_GameControllerGetType(controller) == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO || |
|
|
|
|
|
SDL_GameControllerGetType(controller) == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT || |
|
|
|
|
|
SDL_GameControllerGetType(controller) == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT) { |
|
|
switch_to_sdl_button = GetNintendoButtonBinding(joystick); |
|
|
switch_to_sdl_button = GetNintendoButtonBinding(joystick); |
|
|
} else { |
|
|
} else { |
|
|
switch_to_sdl_button = GetDefaultButtonBinding(); |
|
|
switch_to_sdl_button = GetDefaultButtonBinding(); |
|
|
|