Merge pull request #10901 from german77/sdl_fix
input_common: Make use of new SDL features
This commit is contained in:
commit
ce990adae5
2
externals/SDL
vendored
2
externals/SDL
vendored
@ -1 +1 @@
|
|||||||
Subproject commit c27f3ead7c37bcbef608f385baa9fce7232efc6d
|
Subproject commit 491fba1d06a4810645092b2559b9cc94abeb23bb
|
@ -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() {
|
Common::Input::BatteryLevel GetBatteryLevel(SDL_JoystickPowerLevel battery_level) {
|
||||||
const auto level = SDL_JoystickCurrentPowerLevel(sdl_joystick.get());
|
switch (battery_level) {
|
||||||
switch (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();
|
||||||
|
Loading…
Reference in New Issue
Block a user