mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	Merge pull request #10901 from german77/sdl_fix
input_common: Make use of new SDL features
This commit is contained in:
		@@ -150,6 +150,8 @@ public:
 | 
			
		||||
        if (sdl_controller) {
 | 
			
		||||
            const auto type = SDL_GameControllerGetType(sdl_controller.get());
 | 
			
		||||
            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);
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
@@ -228,9 +230,8 @@ public:
 | 
			
		||||
        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:
 | 
			
		||||
            return Common::Input::BatteryLevel::Empty;
 | 
			
		||||
        case SDL_JOYSTICK_POWER_LOW:
 | 
			
		||||
@@ -378,7 +379,6 @@ void SDLDriver::InitJoystick(int joystick_index) {
 | 
			
		||||
    if (joystick_map.find(guid) == joystick_map.end()) {
 | 
			
		||||
        auto joystick = std::make_shared<SDLJoystick>(guid, 0, sdl_joystick, sdl_gamecontroller);
 | 
			
		||||
        PreSetController(joystick->GetPadIdentifier());
 | 
			
		||||
        SetBattery(joystick->GetPadIdentifier(), joystick->GetBatteryLevel());
 | 
			
		||||
        joystick->EnableMotion();
 | 
			
		||||
        joystick_map[guid].emplace_back(std::move(joystick));
 | 
			
		||||
        return;
 | 
			
		||||
@@ -398,7 +398,6 @@ void SDLDriver::InitJoystick(int joystick_index) {
 | 
			
		||||
    const int port = static_cast<int>(joystick_guid_list.size());
 | 
			
		||||
    auto joystick = std::make_shared<SDLJoystick>(guid, port, sdl_joystick, sdl_gamecontroller);
 | 
			
		||||
    PreSetController(joystick->GetPadIdentifier());
 | 
			
		||||
    SetBattery(joystick->GetPadIdentifier(), joystick->GetBatteryLevel());
 | 
			
		||||
    joystick->EnableMotion();
 | 
			
		||||
    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)) {
 | 
			
		||||
            const PadIdentifier identifier = joystick->GetPadIdentifier();
 | 
			
		||||
            SetButton(identifier, event.jbutton.button, true);
 | 
			
		||||
            // Battery doesn't trigger an event so just update every button press
 | 
			
		||||
            SetBattery(identifier, joystick->GetBatteryLevel());
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
@@ -466,6 +463,13 @@ void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) {
 | 
			
		||||
        }
 | 
			
		||||
        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:
 | 
			
		||||
        LOG_DEBUG(Input, "Controller removed with Instance_ID {}", 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");
 | 
			
		||||
    } else {
 | 
			
		||||
        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
 | 
			
		||||
@@ -508,8 +515,11 @@ SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_en
 | 
			
		||||
        SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH, "0");
 | 
			
		||||
    } else {
 | 
			
		||||
        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
 | 
			
		||||
    // driver on Linux.
 | 
			
		||||
    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
 | 
			
		||||
    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);
 | 
			
		||||
    } else {
 | 
			
		||||
        switch_to_sdl_button = GetDefaultButtonBinding();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user