diff options
| author | Narr the Reg <juangerman-13@hotmail.com> | 2022-12-20 12:45:54 -0600 | 
|---|---|---|
| committer | Narr the Reg <juangerman-13@hotmail.com> | 2023-01-19 18:05:20 -0600 | 
| commit | 2d802893e706c4ce7fd6f320db0eed2bf90b2d45 (patch) | |
| tree | 32368e503159fc82cd7362ef37eec94b9a5b3bbe | |
| parent | d80e6c399bf8196646cca5ac1265d122638bb96b (diff) | |
input_common: Disable SDL driver with switch controllers
| -rw-r--r-- | src/common/settings.h | 1 | ||||
| -rw-r--r-- | src/input_common/drivers/joycon.cpp | 4 | ||||
| -rw-r--r-- | src/input_common/drivers/sdl_driver.cpp | 19 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_advanced.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_advanced.ui | 22 | 
6 files changed, 44 insertions, 6 deletions
| diff --git a/src/common/settings.h b/src/common/settings.h index 80b2eeabc..4b4da4da2 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -483,6 +483,7 @@ struct Values {      Setting<bool> enable_raw_input{false, "enable_raw_input"};      Setting<bool> controller_navigation{true, "controller_navigation"}; +    Setting<bool> enable_joycon_driver{true, "enable_joycon_driver"};      SwitchableSetting<bool> vibration_enabled{true, "vibration_enabled"};      SwitchableSetting<bool> enable_accurate_vibrations{false, "enable_accurate_vibrations"}; diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index eab10d11c..1fca11d34 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp @@ -13,6 +13,10 @@  namespace InputCommon {  Joycons::Joycons(const std::string& input_engine_) : InputEngine(input_engine_) { +    // Avoid conflicting with SDL driver +    if (!Settings::values.enable_joycon_driver) { +        return; +    }      LOG_INFO(Input, "Joycon driver Initialization started");      const int init_res = SDL_hid_init();      if (init_res == 0) { diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index 4818bb744..c9496a0d8 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -318,6 +318,14 @@ void SDLDriver::InitJoystick(int joystick_index) {      const auto guid = GetGUID(sdl_joystick); +    if (Settings::values.enable_joycon_driver) { +        if (guid.uuid[5] == 0x05 && guid.uuid[4] == 0x7e) { +            LOG_ERROR(Input, "Device black listed {}", joystick_index); +            SDL_JoystickClose(sdl_joystick); +            return; +        } +    } +      std::scoped_lock lock{joystick_map_mutex};      if (joystick_map.find(guid) == joystick_map.end()) {          auto joystick = std::make_shared<SDLJoystick>(guid, 0, sdl_joystick, sdl_gamecontroller); @@ -440,9 +448,14 @@ SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_en      SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE, "1");      SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1"); -    // Use hidapi driver for joycons. This will allow joycons to be detected as a GameController and -    // not a generic one -    SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "1"); +    // Disable hidapi drivers for switch controllers when the custom joycon driver is enabled +    if (Settings::values.enable_joycon_driver) { +        SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "0"); +        SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH, "0"); +    } else { +        SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "1"); +        SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH, "1"); +    }      // Disable hidapi driver for xbox. Already default on Windows, this causes conflict with native      // driver on Linux. diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 0db62baa3..d8b26ebd8 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -440,6 +440,7 @@ void Config::ReadControlValues() {      ReadBasicSetting(Settings::values.emulate_analog_keyboard);      Settings::values.mouse_panning = false;      ReadBasicSetting(Settings::values.mouse_panning_sensitivity); +    ReadBasicSetting(Settings::values.enable_joycon_driver);      ReadBasicSetting(Settings::values.tas_enable);      ReadBasicSetting(Settings::values.tas_loop); @@ -1139,6 +1140,7 @@ void Config::SaveControlValues() {      WriteGlobalSetting(Settings::values.enable_accurate_vibrations);      WriteGlobalSetting(Settings::values.motion_enabled);      WriteBasicSetting(Settings::values.enable_raw_input); +    WriteBasicSetting(Settings::values.enable_joycon_driver);      WriteBasicSetting(Settings::values.keyboard_enabled);      WriteBasicSetting(Settings::values.emulate_analog_keyboard);      WriteBasicSetting(Settings::values.mouse_panning_sensitivity); diff --git a/src/yuzu/configuration/configure_input_advanced.cpp b/src/yuzu/configuration/configure_input_advanced.cpp index 235b813d9..77b976e74 100644 --- a/src/yuzu/configuration/configure_input_advanced.cpp +++ b/src/yuzu/configuration/configure_input_advanced.cpp @@ -138,6 +138,7 @@ void ConfigureInputAdvanced::ApplyConfiguration() {      Settings::values.controller_navigation = ui->controller_navigation->isChecked();      Settings::values.enable_ring_controller = ui->enable_ring_controller->isChecked();      Settings::values.enable_ir_sensor = ui->enable_ir_sensor->isChecked(); +    Settings::values.enable_joycon_driver = ui->enable_joycon_driver->isChecked();  }  void ConfigureInputAdvanced::LoadConfiguration() { @@ -172,6 +173,7 @@ void ConfigureInputAdvanced::LoadConfiguration() {      ui->controller_navigation->setChecked(Settings::values.controller_navigation.GetValue());      ui->enable_ring_controller->setChecked(Settings::values.enable_ring_controller.GetValue());      ui->enable_ir_sensor->setChecked(Settings::values.enable_ir_sensor.GetValue()); +    ui->enable_joycon_driver->setChecked(Settings::values.enable_joycon_driver.GetValue());      UpdateUIEnabled();  } diff --git a/src/yuzu/configuration/configure_input_advanced.ui b/src/yuzu/configuration/configure_input_advanced.ui index fac8cf827..75d96d3ab 100644 --- a/src/yuzu/configuration/configure_input_advanced.ui +++ b/src/yuzu/configuration/configure_input_advanced.ui @@ -2696,6 +2696,22 @@                       </widget>                     </item>                     <item row="5" column="0"> +                      <widget class="QCheckBox" name="enable_joycon_driver"> +                       <property name="toolTip"> +                         <string>Requires restarting yuzu</string> +                       </property> +                       <property name="minimumSize"> +                         <size> +                           <width>0</width> +                           <height>23</height> +                         </size> +                       </property> +                       <property name="text"> +                         <string>Enable direct JoyCon driver</string> +                       </property> +                     </widget> +                   </item> +                   <item row="6" column="0">                       <widget class="QCheckBox" name="mouse_panning">                         <property name="minimumSize">                           <size> @@ -2708,7 +2724,7 @@                         </property>                       </widget>                     </item> -                   <item row="5" column="2"> +                   <item row="6" column="2">                       <widget class="QSpinBox" name="mouse_panning_sensitivity">                         <property name="toolTip">                           <string>Mouse sensitivity</string> @@ -2730,14 +2746,14 @@                         </property>                       </widget>                     </item> -                   <item row="6" column="0"> +                   <item row="7" column="0">                       <widget class="QLabel" name="motion_touch">                         <property name="text">                           <string>Motion / Touch</string>                         </property>                       </widget>                     </item> -                   <item row="6" column="2"> +                   <item row="7" column="2">                       <widget class="QPushButton" name="buttonMotionTouch">                         <property name="text">                           <string>Configure</string> | 
