aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xREADME.md2
-rwxr-xr-xsrc/common/settings.h2
-rwxr-xr-xsrc/core/hid/emulated_controller.cpp78
-rwxr-xr-xsrc/core/hid/emulated_controller.h7
-rwxr-xr-xsrc/core/hid/hid_types.h26
-rwxr-xr-xsrc/core/hle/service/acc/acc.cpp8
-rwxr-xr-xsrc/core/hle/service/acc/acc_su.cpp4
-rwxr-xr-xsrc/core/hle/service/am/am.cpp6
-rwxr-xr-xsrc/core/hle/service/aoc/aoc_u.cpp3
-rwxr-xr-xsrc/core/hle/service/audio/hwopus.cpp2
-rwxr-xr-xsrc/core/hle/service/hid/hid.cpp6
-rwxr-xr-xsrc/core/hle/service/hid/hid.h1
-rwxr-xr-xsrc/core/hle/service/hid/hidbus.cpp26
-rwxr-xr-xsrc/core/hle/service/hid/hidbus.h4
-rwxr-xr-xsrc/core/hle/service/ncm/ncm.cpp1
-rwxr-xr-xsrc/core/hle/service/ns/ns.cpp12
-rwxr-xr-xsrc/core/hle/service/sockets/bsd.cpp3
-rwxr-xr-xsrc/core/hle/service/ssl/ssl.cpp10
-rwxr-xr-xsrc/core/hle/service/vi/vi.cpp5
-rwxr-xr-xsrc/core/hle/service/vi/vi_m.cpp4
-rwxr-xr-xsrc/yuzu/configuration/config.cpp11
-rwxr-xr-xsrc/yuzu/configuration/configure_graphics_advanced.cpp2
-rwxr-xr-xsrc/yuzu/configuration/configure_input_per_game.cpp5
-rwxr-xr-xsrc/yuzu/configuration/configure_input_player.cpp8
24 files changed, 182 insertions, 54 deletions
diff --git a/README.md b/README.md
index abe155b4d..e846c7186 100755
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
1yuzu emulator early access 1yuzu emulator early access
2============= 2=============
3 3
4This is the source code for early-access 3414. 4This is the source code for early-access 3416.
5 5
6## Legal Notice 6## Legal Notice
7 7
diff --git a/src/common/settings.h b/src/common/settings.h
index eecd0c5ab..2ccfd936f 100755
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -482,7 +482,7 @@ struct Values {
482 SwitchableSetting<s32, true> sound_index{1, 0, 2, "sound_index"}; 482 SwitchableSetting<s32, true> sound_index{1, 0, 2, "sound_index"};
483 483
484 // Controls 484 // Controls
485 InputSetting<std::array<PlayerInput, 10>> players; 485 InputSetting<std::array<PlayerInput, 8>> players;
486 486
487 SwitchableSetting<bool> use_docked_mode{true, "use_docked_mode"}; 487 SwitchableSetting<bool> use_docked_mode{true, "use_docked_mode"};
488 488
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp
index 1e3d93b47..ee6b8d287 100755
--- a/src/core/hid/emulated_controller.cpp
+++ b/src/core/hid/emulated_controller.cpp
@@ -82,7 +82,12 @@ Settings::ControllerType EmulatedController::MapNPadToSettingsType(NpadStyleInde
82} 82}
83 83
84void EmulatedController::ReloadFromSettings() { 84void EmulatedController::ReloadFromSettings() {
85 const auto player_index = NpadIdTypeToIndex(npad_id_type); 85 if (npad_id_type == NpadIdType::Other) {
86 ReloadDebugPadFromSettings();
87 return;
88 }
89
90 const auto player_index = NpadIdTypeToConfigIndex(npad_id_type);
86 const auto& player = Settings::values.players.GetValue()[player_index]; 91 const auto& player = Settings::values.players.GetValue()[player_index];
87 92
88 for (std::size_t index = 0; index < player.buttons.size(); ++index) { 93 for (std::size_t index = 0; index < player.buttons.size(); ++index) {
@@ -111,13 +116,21 @@ void EmulatedController::ReloadFromSettings() {
111 116
112 ring_params[0] = Common::ParamPackage(Settings::values.ringcon_analogs); 117 ring_params[0] = Common::ParamPackage(Settings::values.ringcon_analogs);
113 118
114 // Other or debug controller should always be a pro controller 119 SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type));
115 if (npad_id_type != NpadIdType::Other) { 120 original_npad_type = npad_type;
116 SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type)); 121
117 original_npad_type = npad_type; 122 // Player 1 shares config with handheld. Disable controller when handheld is selected
118 } else { 123 if (npad_id_type == NpadIdType::Player1 && npad_type == NpadStyleIndex::Handheld) {
119 SetNpadStyleIndex(NpadStyleIndex::ProController); 124 Disconnect();
120 original_npad_type = npad_type; 125 ReloadInput();
126 return;
127 }
128
129 // Handheld shares config with player 1. Disable controller when handheld isn't selected
130 if (npad_id_type == NpadIdType::Handheld && npad_type != NpadStyleIndex::Handheld) {
131 Disconnect();
132 ReloadInput();
133 return;
121 } 134 }
122 135
123 Disconnect(); 136 Disconnect();
@@ -128,6 +141,33 @@ void EmulatedController::ReloadFromSettings() {
128 ReloadInput(); 141 ReloadInput();
129} 142}
130 143
144void EmulatedController::ReloadDebugPadFromSettings() {
145 for (std::size_t index = 0; index < Settings::values.debug_pad_buttons.size(); ++index) {
146 button_params[index] = Common::ParamPackage(Settings::values.debug_pad_buttons[index]);
147 }
148 for (std::size_t index = 0; index < Settings::values.debug_pad_analogs.size(); ++index) {
149 stick_params[index] = Common::ParamPackage(Settings::values.debug_pad_analogs[index]);
150 }
151 for (std::size_t index = 0; index < motion_params.size(); ++index) {
152 motion_params[index] = {};
153 }
154
155 controller.color_values = {};
156 controller.colors_state.fullkey = {};
157 controller.colors_state.left = {};
158 controller.colors_state.right = {};
159 ring_params[0] = {};
160 SetNpadStyleIndex(NpadStyleIndex::ProController);
161 original_npad_type = npad_type;
162
163 Disconnect();
164 if (Settings::values.debug_pad_enabled) {
165 Connect();
166 }
167
168 ReloadInput();
169}
170
131void EmulatedController::LoadDevices() { 171void EmulatedController::LoadDevices() {
132 // TODO(german77): Use more buttons to detect the correct device 172 // TODO(german77): Use more buttons to detect the correct device
133 const auto left_joycon = button_params[Settings::NativeButton::DRight]; 173 const auto left_joycon = button_params[Settings::NativeButton::DRight];
@@ -560,9 +600,23 @@ bool EmulatedController::IsConfiguring() const {
560} 600}
561 601
562void EmulatedController::SaveCurrentConfig() { 602void EmulatedController::SaveCurrentConfig() {
563 const auto player_index = NpadIdTypeToIndex(npad_id_type); 603 // Other can't alter the config from here
604 if (npad_id_type == NpadIdType::Other) {
605 return;
606 }
607
608 const auto player_index = NpadIdTypeToConfigIndex(npad_id_type);
564 auto& player = Settings::values.players.GetValue()[player_index]; 609 auto& player = Settings::values.players.GetValue()[player_index];
565 player.connected = is_connected; 610
611 // Only save the connected status when handheld is connected
612 if (npad_id_type == NpadIdType::Handheld && npad_type == NpadStyleIndex::Handheld) {
613 player.connected = is_connected;
614 }
615
616 if (npad_id_type != NpadIdType::Handheld && npad_type != NpadStyleIndex::Handheld) {
617 player.connected = is_connected;
618 }
619
566 player.controller_type = MapNPadToSettingsType(npad_type); 620 player.controller_type = MapNPadToSettingsType(npad_type);
567 for (std::size_t index = 0; index < player.buttons.size(); ++index) { 621 for (std::size_t index = 0; index < player.buttons.size(); ++index) {
568 player.buttons[index] = button_params[index].Serialize(); 622 player.buttons[index] = button_params[index].Serialize();
@@ -1152,7 +1206,7 @@ bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue v
1152 if (!output_devices[device_index]) { 1206 if (!output_devices[device_index]) {
1153 return false; 1207 return false;
1154 } 1208 }
1155 const auto player_index = NpadIdTypeToIndex(npad_id_type); 1209 const auto player_index = NpadIdTypeToConfigIndex(npad_id_type);
1156 const auto& player = Settings::values.players.GetValue()[player_index]; 1210 const auto& player = Settings::values.players.GetValue()[player_index];
1157 const f32 strength = static_cast<f32>(player.vibration_strength) / 100.0f; 1211 const f32 strength = static_cast<f32>(player.vibration_strength) / 100.0f;
1158 1212
@@ -1178,7 +1232,7 @@ bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue v
1178} 1232}
1179 1233
1180bool EmulatedController::IsVibrationEnabled(std::size_t device_index) { 1234bool EmulatedController::IsVibrationEnabled(std::size_t device_index) {
1181 const auto player_index = NpadIdTypeToIndex(npad_id_type); 1235 const auto player_index = NpadIdTypeToConfigIndex(npad_id_type);
1182 const auto& player = Settings::values.players.GetValue()[player_index]; 1236 const auto& player = Settings::values.players.GetValue()[player_index];
1183 1237
1184 if (!player.vibration_enabled) { 1238 if (!player.vibration_enabled) {
diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h
index 4da1e9d60..2000e33c7 100755
--- a/src/core/hid/emulated_controller.h
+++ b/src/core/hid/emulated_controller.h
@@ -250,9 +250,14 @@ public:
250 /// Reload all input devices 250 /// Reload all input devices
251 void ReloadInput(); 251 void ReloadInput();
252 252
253 /// Overrides current mapped devices with the stored configuration and reloads all input devices 253 /// Overrides current mapped devices with the stored configuration and reloads all input
254 /// callbacks
254 void ReloadFromSettings(); 255 void ReloadFromSettings();
255 256
257 /// Overrides current mapped debug pad with the stored configuration and reloads all input
258 /// callbacks
259 void ReloadDebugPadFromSettings();
260
256 /// Saves the current mapped configuration 261 /// Saves the current mapped configuration
257 void SaveCurrentConfig(); 262 void SaveCurrentConfig();
258 263
diff --git a/src/core/hid/hid_types.h b/src/core/hid/hid_types.h
index 156480228..5e97e3459 100755
--- a/src/core/hid/hid_types.h
+++ b/src/core/hid/hid_types.h
@@ -690,6 +690,32 @@ constexpr size_t NpadIdTypeToIndex(NpadIdType npad_id_type) {
690 } 690 }
691} 691}
692 692
693/// Converts a NpadIdType to a config array index.
694constexpr size_t NpadIdTypeToConfigIndex(NpadIdType npad_id_type) {
695 switch (npad_id_type) {
696 case NpadIdType::Player1:
697 return 0;
698 case NpadIdType::Player2:
699 return 1;
700 case NpadIdType::Player3:
701 return 2;
702 case NpadIdType::Player4:
703 return 3;
704 case NpadIdType::Player5:
705 return 4;
706 case NpadIdType::Player6:
707 return 5;
708 case NpadIdType::Player7:
709 return 6;
710 case NpadIdType::Player8:
711 return 7;
712 case NpadIdType::Other:
713 case NpadIdType::Handheld:
714 default:
715 return 0;
716 }
717}
718
693/// Converts an array index to a NpadIdType 719/// Converts an array index to a NpadIdType
694constexpr NpadIdType IndexToNpadIdType(size_t index) { 720constexpr NpadIdType IndexToNpadIdType(size_t index) {
695 switch (index) { 721 switch (index) {
diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp
index b37a79627..3811b57c0 100755
--- a/src/core/hle/service/acc/acc.cpp
+++ b/src/core/hle/service/acc/acc.cpp
@@ -77,6 +77,8 @@ public:
77 {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ 77 {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+
78 {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ 78 {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+
79 {150, nullptr, "CreateAuthorizationRequest"}, 79 {150, nullptr, "CreateAuthorizationRequest"},
80 {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
81 {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
80 }; 82 };
81 // clang-format on 83 // clang-format on
82 84
@@ -137,7 +139,10 @@ public:
137 {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+ 139 {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+
138 {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ 140 {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+
139 {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ 141 {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+
142 {143, nullptr, "GetNetworkServiceLicenseCacheEx"},
140 {150, nullptr, "CreateAuthorizationRequest"}, 143 {150, nullptr, "CreateAuthorizationRequest"},
144 {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
145 {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
141 {200, nullptr, "IsRegistered"}, 146 {200, nullptr, "IsRegistered"},
142 {201, nullptr, "RegisterAsync"}, 147 {201, nullptr, "RegisterAsync"},
143 {202, nullptr, "UnregisterAsync"}, 148 {202, nullptr, "UnregisterAsync"},
@@ -243,6 +248,7 @@ public:
243 {100, nullptr, "GetRequestWithTheme"}, 248 {100, nullptr, "GetRequestWithTheme"},
244 {101, nullptr, "IsNetworkServiceAccountReplaced"}, 249 {101, nullptr, "IsNetworkServiceAccountReplaced"},
245 {199, nullptr, "GetUrlForIntroductionOfExtraMembership"}, // 2.0.0 - 5.1.0 250 {199, nullptr, "GetUrlForIntroductionOfExtraMembership"}, // 2.0.0 - 5.1.0
251 {200, nullptr, "ApplyAsyncWithAuthorizedToken"},
246 }; 252 };
247 // clang-format on 253 // clang-format on
248 254
@@ -648,9 +654,11 @@ public:
648 {0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, 654 {0, nullptr, "EnsureAuthenticationTokenCacheAsync"},
649 {1, nullptr, "LoadAuthenticationTokenCache"}, 655 {1, nullptr, "LoadAuthenticationTokenCache"},
650 {2, nullptr, "InvalidateAuthenticationTokenCache"}, 656 {2, nullptr, "InvalidateAuthenticationTokenCache"},
657 {3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"},
651 {10, nullptr, "EnsureEdgeTokenCacheAsync"}, 658 {10, nullptr, "EnsureEdgeTokenCacheAsync"},
652 {11, nullptr, "LoadEdgeTokenCache"}, 659 {11, nullptr, "LoadEdgeTokenCache"},
653 {12, nullptr, "InvalidateEdgeTokenCache"}, 660 {12, nullptr, "InvalidateEdgeTokenCache"},
661 {13, nullptr, "IsEdgeTokenCacheAvailable"},
654 {20, nullptr, "EnsureApplicationAuthenticationCacheAsync"}, 662 {20, nullptr, "EnsureApplicationAuthenticationCacheAsync"},
655 {21, nullptr, "LoadApplicationAuthenticationTokenCache"}, 663 {21, nullptr, "LoadApplicationAuthenticationTokenCache"},
656 {22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"}, 664 {22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"},
diff --git a/src/core/hle/service/acc/acc_su.cpp b/src/core/hle/service/acc/acc_su.cpp
index 78459e219..67612b5e8 100755
--- a/src/core/hle/service/acc/acc_su.cpp
+++ b/src/core/hle/service/acc/acc_su.cpp
@@ -55,6 +55,10 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager>
55 {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, 55 {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
56 {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, 56 {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
57 {299, nullptr, "SuspendBackgroundDaemon"}, 57 {299, nullptr, "SuspendBackgroundDaemon"},
58 {900, nullptr, "SetUserUnqualifiedForDebug"},
59 {901, nullptr, "UnsetUserUnqualifiedForDebug"},
60 {902, nullptr, "ListUsersUnqualifiedForDebug"},
61 {910, nullptr, "RefreshFirmwareSettingsForDebug"},
58 {997, nullptr, "DebugInvalidateTokenCacheForUser"}, 62 {997, nullptr, "DebugInvalidateTokenCacheForUser"},
59 {998, nullptr, "DebugSetUserStateClose"}, 63 {998, nullptr, "DebugSetUserStateClose"},
60 {999, nullptr, "DebugSetUserStateOpen"}, 64 {999, nullptr, "DebugSetUserStateOpen"},
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp
index de6730c33..2d1bd422f 100755
--- a/src/core/hle/service/am/am.cpp
+++ b/src/core/hle/service/am/am.cpp
@@ -227,6 +227,8 @@ IDebugFunctions::IDebugFunctions(Core::System& system_)
227 {30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"}, 227 {30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"},
228 {31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"}, 228 {31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"},
229 {40, nullptr, "GetAppletResourceUsageInfo"}, 229 {40, nullptr, "GetAppletResourceUsageInfo"},
230 {50, nullptr, "AddSystemProgramIdAndAppletIdForDebug"},
231 {51, nullptr, "AddOperationConfirmedLibraryAppletIdForDebug"},
230 {100, nullptr, "SetCpuBoostModeForApplet"}, 232 {100, nullptr, "SetCpuBoostModeForApplet"},
231 {101, nullptr, "CancelCpuBoostModeForApplet"}, 233 {101, nullptr, "CancelCpuBoostModeForApplet"},
232 {110, nullptr, "PushToAppletBoundChannelForDebug"}, 234 {110, nullptr, "PushToAppletBoundChannelForDebug"},
@@ -238,6 +240,8 @@ IDebugFunctions::IDebugFunctions(Core::System& system_)
238 {131, nullptr, "FriendInvitationClearApplicationParameter"}, 240 {131, nullptr, "FriendInvitationClearApplicationParameter"},
239 {132, nullptr, "FriendInvitationPushApplicationParameter"}, 241 {132, nullptr, "FriendInvitationPushApplicationParameter"},
240 {140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"}, 242 {140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"},
243 {200, nullptr, "CreateFloatingLibraryAppletAccepterForDebug"},
244 {300, nullptr, "TerminateAllRunningApplicationsForDebug"},
241 {900, nullptr, "GetGrcProcessLaunchedSystemEvent"}, 245 {900, nullptr, "GetGrcProcessLaunchedSystemEvent"},
242 }; 246 };
243 // clang-format on 247 // clang-format on
@@ -1860,6 +1864,8 @@ IHomeMenuFunctions::IHomeMenuFunctions(Core::System& system_)
1860 {31, nullptr, "GetWriterLockAccessorEx"}, 1864 {31, nullptr, "GetWriterLockAccessorEx"},
1861 {40, nullptr, "IsSleepEnabled"}, 1865 {40, nullptr, "IsSleepEnabled"},
1862 {41, nullptr, "IsRebootEnabled"}, 1866 {41, nullptr, "IsRebootEnabled"},
1867 {50, nullptr, "LaunchSystemApplet"},
1868 {51, nullptr, "LaunchStarter"},
1863 {100, nullptr, "PopRequestLaunchApplicationForDebug"}, 1869 {100, nullptr, "PopRequestLaunchApplicationForDebug"},
1864 {110, nullptr, "IsForceTerminateApplicationDisabledForDebug"}, 1870 {110, nullptr, "IsForceTerminateApplicationDisabledForDebug"},
1865 {200, nullptr, "LaunchDevMenu"}, 1871 {200, nullptr, "LaunchDevMenu"},
diff --git a/src/core/hle/service/aoc/aoc_u.cpp b/src/core/hle/service/aoc/aoc_u.cpp
index 12643fded..bc2ac1741 100755
--- a/src/core/hle/service/aoc/aoc_u.cpp
+++ b/src/core/hle/service/aoc/aoc_u.cpp
@@ -130,6 +130,9 @@ AOC_U::AOC_U(Core::System& system_)
130 {101, &AOC_U::CreatePermanentEcPurchasedEventManager, "CreatePermanentEcPurchasedEventManager"}, 130 {101, &AOC_U::CreatePermanentEcPurchasedEventManager, "CreatePermanentEcPurchasedEventManager"},
131 {110, nullptr, "CreateContentsServiceManager"}, 131 {110, nullptr, "CreateContentsServiceManager"},
132 {200, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"}, 132 {200, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"},
133 {300, nullptr, "SetupHostAddOnContent"},
134 {301, nullptr, "GetRegisteredAddOnContentPath"},
135 {302, nullptr, "UpdateCachedList"},
133 }; 136 };
134 // clang-format on 137 // clang-format on
135 138
diff --git a/src/core/hle/service/audio/hwopus.cpp b/src/core/hle/service/audio/hwopus.cpp
index 5953f1c4a..deac92449 100755
--- a/src/core/hle/service/audio/hwopus.cpp
+++ b/src/core/hle/service/audio/hwopus.cpp
@@ -362,6 +362,8 @@ HwOpus::HwOpus(Core::System& system_) : ServiceFramework{system_, "hwopus"} {
362 {5, &HwOpus::GetWorkBufferSizeEx, "GetWorkBufferSizeEx"}, 362 {5, &HwOpus::GetWorkBufferSizeEx, "GetWorkBufferSizeEx"},
363 {6, nullptr, "OpenHardwareOpusDecoderForMultiStreamEx"}, 363 {6, nullptr, "OpenHardwareOpusDecoderForMultiStreamEx"},
364 {7, &HwOpus::GetWorkBufferSizeForMultiStreamEx, "GetWorkBufferSizeForMultiStreamEx"}, 364 {7, &HwOpus::GetWorkBufferSizeForMultiStreamEx, "GetWorkBufferSizeForMultiStreamEx"},
365 {8, nullptr, "GetWorkBufferSizeExEx"},
366 {9, nullptr, "GetWorkBufferSizeForMultiStreamExEx"},
365 }; 367 };
366 RegisterHandlers(functions); 368 RegisterHandlers(functions);
367} 369}
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index f78070f1b..2173893dc 100755
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -64,6 +64,7 @@ IAppletResource::IAppletResource(Core::System& system_,
64 MakeControllerWithServiceContext<Controller_NPad>(HidController::NPad, shared_memory); 64 MakeControllerWithServiceContext<Controller_NPad>(HidController::NPad, shared_memory);
65 MakeController<Controller_Gesture>(HidController::Gesture, shared_memory); 65 MakeController<Controller_Gesture>(HidController::Gesture, shared_memory);
66 MakeController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor, shared_memory); 66 MakeController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor, shared_memory);
67 MakeController<Controller_Stubbed>(HidController::DebugMouse, shared_memory);
67 MakeControllerWithServiceContext<Controller_Palma>(HidController::Palma, shared_memory); 68 MakeControllerWithServiceContext<Controller_Palma>(HidController::Palma, shared_memory);
68 69
69 // Homebrew doesn't try to activate some controllers, so we activate them by default 70 // Homebrew doesn't try to activate some controllers, so we activate them by default
@@ -75,6 +76,7 @@ IAppletResource::IAppletResource(Core::System& system_,
75 GetController<Controller_Stubbed>(HidController::CaptureButton).SetCommonHeaderOffset(0x5000); 76 GetController<Controller_Stubbed>(HidController::CaptureButton).SetCommonHeaderOffset(0x5000);
76 GetController<Controller_Stubbed>(HidController::InputDetector).SetCommonHeaderOffset(0x5200); 77 GetController<Controller_Stubbed>(HidController::InputDetector).SetCommonHeaderOffset(0x5200);
77 GetController<Controller_Stubbed>(HidController::UniquePad).SetCommonHeaderOffset(0x5A00); 78 GetController<Controller_Stubbed>(HidController::UniquePad).SetCommonHeaderOffset(0x5A00);
79 GetController<Controller_Stubbed>(HidController::DebugMouse).SetCommonHeaderOffset(0x3DC00);
78 80
79 // Register update callbacks 81 // Register update callbacks
80 npad_update_event = Core::Timing::CreateEvent( 82 npad_update_event = Core::Timing::CreateEvent(
@@ -237,6 +239,7 @@ Hid::Hid(Core::System& system_)
237 {1, &Hid::ActivateDebugPad, "ActivateDebugPad"}, 239 {1, &Hid::ActivateDebugPad, "ActivateDebugPad"},
238 {11, &Hid::ActivateTouchScreen, "ActivateTouchScreen"}, 240 {11, &Hid::ActivateTouchScreen, "ActivateTouchScreen"},
239 {21, &Hid::ActivateMouse, "ActivateMouse"}, 241 {21, &Hid::ActivateMouse, "ActivateMouse"},
242 {26, nullptr, "ActivateDebugMouse"},
240 {31, &Hid::ActivateKeyboard, "ActivateKeyboard"}, 243 {31, &Hid::ActivateKeyboard, "ActivateKeyboard"},
241 {32, &Hid::SendKeyboardLockKeyEvent, "SendKeyboardLockKeyEvent"}, 244 {32, &Hid::SendKeyboardLockKeyEvent, "SendKeyboardLockKeyEvent"},
242 {40, nullptr, "AcquireXpadIdEventHandle"}, 245 {40, nullptr, "AcquireXpadIdEventHandle"},
@@ -2381,6 +2384,8 @@ public:
2381 {20, nullptr, "DeactivateMouse"}, 2384 {20, nullptr, "DeactivateMouse"},
2382 {21, nullptr, "SetMouseAutoPilotState"}, 2385 {21, nullptr, "SetMouseAutoPilotState"},
2383 {22, nullptr, "UnsetMouseAutoPilotState"}, 2386 {22, nullptr, "UnsetMouseAutoPilotState"},
2387 {25, nullptr, "SetDebugMouseAutoPilotState"},
2388 {26, nullptr, "UnsetDebugMouseAutoPilotState"},
2384 {30, nullptr, "DeactivateKeyboard"}, 2389 {30, nullptr, "DeactivateKeyboard"},
2385 {31, nullptr, "SetKeyboardAutoPilotState"}, 2390 {31, nullptr, "SetKeyboardAutoPilotState"},
2386 {32, nullptr, "UnsetKeyboardAutoPilotState"}, 2391 {32, nullptr, "UnsetKeyboardAutoPilotState"},
@@ -2496,6 +2501,7 @@ public:
2496 {2000, nullptr, "DeactivateDigitizer"}, 2501 {2000, nullptr, "DeactivateDigitizer"},
2497 {2001, nullptr, "SetDigitizerAutoPilotState"}, 2502 {2001, nullptr, "SetDigitizerAutoPilotState"},
2498 {2002, nullptr, "UnsetDigitizerAutoPilotState"}, 2503 {2002, nullptr, "UnsetDigitizerAutoPilotState"},
2504 {2002, nullptr, "ReloadFirmwareDebugSettings"},
2499 }; 2505 };
2500 // clang-format on 2506 // clang-format on
2501 2507
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index 300438eb6..8bbecb1a4 100755
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -33,6 +33,7 @@ enum class HidController : std::size_t {
33 NPad, 33 NPad,
34 Gesture, 34 Gesture,
35 ConsoleSixAxisSensor, 35 ConsoleSixAxisSensor,
36 DebugMouse,
36 Palma, 37 Palma,
37 38
38 MaxControllers, 39 MaxControllers,
diff --git a/src/core/hle/service/hid/hidbus.cpp b/src/core/hle/service/hid/hidbus.cpp
index 0e75ab974..5bdab0a52 100755
--- a/src/core/hle/service/hid/hidbus.cpp
+++ b/src/core/hle/service/hid/hidbus.cpp
@@ -91,7 +91,7 @@ std::optional<std::size_t> HidBus::GetDeviceIndexFromHandle(BusHandle handle) co
91 if (handle.abstracted_pad_id == device_handle.abstracted_pad_id && 91 if (handle.abstracted_pad_id == device_handle.abstracted_pad_id &&
92 handle.internal_index == device_handle.internal_index && 92 handle.internal_index == device_handle.internal_index &&
93 handle.player_number == device_handle.player_number && 93 handle.player_number == device_handle.player_number &&
94 handle.bus_type == device_handle.bus_type && 94 handle.bus_type_id == device_handle.bus_type_id &&
95 handle.is_valid == device_handle.is_valid) { 95 handle.is_valid == device_handle.is_valid) {
96 return i; 96 return i;
97 } 97 }
@@ -123,7 +123,7 @@ void HidBus::GetBusHandle(Kernel::HLERequestContext& ctx) {
123 continue; 123 continue;
124 } 124 }
125 if (static_cast<Core::HID::NpadIdType>(handle.player_number) == parameters.npad_id && 125 if (static_cast<Core::HID::NpadIdType>(handle.player_number) == parameters.npad_id &&
126 handle.bus_type == parameters.bus_type) { 126 handle.bus_type_id == static_cast<u8>(parameters.bus_type)) {
127 is_handle_found = true; 127 is_handle_found = true;
128 handle_index = i; 128 handle_index = i;
129 break; 129 break;
@@ -140,7 +140,7 @@ void HidBus::GetBusHandle(Kernel::HLERequestContext& ctx) {
140 .abstracted_pad_id = static_cast<u8>(i), 140 .abstracted_pad_id = static_cast<u8>(i),
141 .internal_index = static_cast<u8>(i), 141 .internal_index = static_cast<u8>(i),
142 .player_number = static_cast<u8>(parameters.npad_id), 142 .player_number = static_cast<u8>(parameters.npad_id),
143 .bus_type = parameters.bus_type, 143 .bus_type_id = static_cast<u8>(parameters.bus_type),
144 .is_valid = true, 144 .is_valid = true,
145 }; 145 };
146 handle_index = i; 146 handle_index = i;
@@ -172,7 +172,7 @@ void HidBus::IsExternalDeviceConnected(Kernel::HLERequestContext& ctx) {
172 LOG_INFO(Service_HID, 172 LOG_INFO(Service_HID,
173 "Called, abstracted_pad_id={}, bus_type={}, internal_index={}, " 173 "Called, abstracted_pad_id={}, bus_type={}, internal_index={}, "
174 "player_number={}, is_valid={}", 174 "player_number={}, is_valid={}",
175 bus_handle_.abstracted_pad_id, bus_handle_.bus_type, bus_handle_.internal_index, 175 bus_handle_.abstracted_pad_id, bus_handle_.bus_type_id, bus_handle_.internal_index,
176 bus_handle_.player_number, bus_handle_.is_valid); 176 bus_handle_.player_number, bus_handle_.is_valid);
177 177
178 const auto device_index = GetDeviceIndexFromHandle(bus_handle_); 178 const auto device_index = GetDeviceIndexFromHandle(bus_handle_);
@@ -201,7 +201,7 @@ void HidBus::Initialize(Kernel::HLERequestContext& ctx) {
201 LOG_INFO(Service_HID, 201 LOG_INFO(Service_HID,
202 "called, abstracted_pad_id={} bus_type={} internal_index={} " 202 "called, abstracted_pad_id={} bus_type={} internal_index={} "
203 "player_number={} is_valid={}, applet_resource_user_id={}", 203 "player_number={} is_valid={}, applet_resource_user_id={}",
204 bus_handle_.abstracted_pad_id, bus_handle_.bus_type, bus_handle_.internal_index, 204 bus_handle_.abstracted_pad_id, bus_handle_.bus_type_id, bus_handle_.internal_index,
205 bus_handle_.player_number, bus_handle_.is_valid, applet_resource_user_id); 205 bus_handle_.player_number, bus_handle_.is_valid, applet_resource_user_id);
206 206
207 is_hidbus_enabled = true; 207 is_hidbus_enabled = true;
@@ -253,7 +253,7 @@ void HidBus::Finalize(Kernel::HLERequestContext& ctx) {
253 LOG_INFO(Service_HID, 253 LOG_INFO(Service_HID,
254 "called, abstracted_pad_id={}, bus_type={}, internal_index={}, " 254 "called, abstracted_pad_id={}, bus_type={}, internal_index={}, "
255 "player_number={}, is_valid={}, applet_resource_user_id={}", 255 "player_number={}, is_valid={}, applet_resource_user_id={}",
256 bus_handle_.abstracted_pad_id, bus_handle_.bus_type, bus_handle_.internal_index, 256 bus_handle_.abstracted_pad_id, bus_handle_.bus_type_id, bus_handle_.internal_index,
257 bus_handle_.player_number, bus_handle_.is_valid, applet_resource_user_id); 257 bus_handle_.player_number, bus_handle_.is_valid, applet_resource_user_id);
258 258
259 const auto device_index = GetDeviceIndexFromHandle(bus_handle_); 259 const auto device_index = GetDeviceIndexFromHandle(bus_handle_);
@@ -301,7 +301,7 @@ void HidBus::EnableExternalDevice(Kernel::HLERequestContext& ctx) {
301 "called, enable={}, abstracted_pad_id={}, bus_type={}, internal_index={}, " 301 "called, enable={}, abstracted_pad_id={}, bus_type={}, internal_index={}, "
302 "player_number={}, is_valid={}, inval={}, applet_resource_user_id{}", 302 "player_number={}, is_valid={}, inval={}, applet_resource_user_id{}",
303 parameters.enable, parameters.bus_handle.abstracted_pad_id, 303 parameters.enable, parameters.bus_handle.abstracted_pad_id,
304 parameters.bus_handle.bus_type, parameters.bus_handle.internal_index, 304 parameters.bus_handle.bus_type_id, parameters.bus_handle.internal_index,
305 parameters.bus_handle.player_number, parameters.bus_handle.is_valid, parameters.inval, 305 parameters.bus_handle.player_number, parameters.bus_handle.is_valid, parameters.inval,
306 parameters.applet_resource_user_id); 306 parameters.applet_resource_user_id);
307 307
@@ -329,7 +329,7 @@ void HidBus::GetExternalDeviceId(Kernel::HLERequestContext& ctx) {
329 LOG_DEBUG(Service_HID, 329 LOG_DEBUG(Service_HID,
330 "called, abstracted_pad_id={}, bus_type={}, internal_index={}, player_number={}, " 330 "called, abstracted_pad_id={}, bus_type={}, internal_index={}, player_number={}, "
331 "is_valid={}", 331 "is_valid={}",
332 bus_handle_.abstracted_pad_id, bus_handle_.bus_type, bus_handle_.internal_index, 332 bus_handle_.abstracted_pad_id, bus_handle_.bus_type_id, bus_handle_.internal_index,
333 bus_handle_.player_number, bus_handle_.is_valid); 333 bus_handle_.player_number, bus_handle_.is_valid);
334 334
335 const auto device_index = GetDeviceIndexFromHandle(bus_handle_); 335 const auto device_index = GetDeviceIndexFromHandle(bus_handle_);
@@ -357,7 +357,7 @@ void HidBus::SendCommandAsync(Kernel::HLERequestContext& ctx) {
357 LOG_DEBUG(Service_HID, 357 LOG_DEBUG(Service_HID,
358 "called, data_size={}, abstracted_pad_id={}, bus_type={}, internal_index={}, " 358 "called, data_size={}, abstracted_pad_id={}, bus_type={}, internal_index={}, "
359 "player_number={}, is_valid={}", 359 "player_number={}, is_valid={}",
360 data.size(), bus_handle_.abstracted_pad_id, bus_handle_.bus_type, 360 data.size(), bus_handle_.abstracted_pad_id, bus_handle_.bus_type_id,
361 bus_handle_.internal_index, bus_handle_.player_number, bus_handle_.is_valid); 361 bus_handle_.internal_index, bus_handle_.player_number, bus_handle_.is_valid);
362 362
363 const auto device_index = GetDeviceIndexFromHandle(bus_handle_); 363 const auto device_index = GetDeviceIndexFromHandle(bus_handle_);
@@ -384,7 +384,7 @@ void HidBus::GetSendCommandAsynceResult(Kernel::HLERequestContext& ctx) {
384 LOG_DEBUG(Service_HID, 384 LOG_DEBUG(Service_HID,
385 "called, abstracted_pad_id={}, bus_type={}, internal_index={}, player_number={}, " 385 "called, abstracted_pad_id={}, bus_type={}, internal_index={}, player_number={}, "
386 "is_valid={}", 386 "is_valid={}",
387 bus_handle_.abstracted_pad_id, bus_handle_.bus_type, bus_handle_.internal_index, 387 bus_handle_.abstracted_pad_id, bus_handle_.bus_type_id, bus_handle_.internal_index,
388 bus_handle_.player_number, bus_handle_.is_valid); 388 bus_handle_.player_number, bus_handle_.is_valid);
389 389
390 const auto device_index = GetDeviceIndexFromHandle(bus_handle_); 390 const auto device_index = GetDeviceIndexFromHandle(bus_handle_);
@@ -413,7 +413,7 @@ void HidBus::SetEventForSendCommandAsycResult(Kernel::HLERequestContext& ctx) {
413 LOG_INFO(Service_HID, 413 LOG_INFO(Service_HID,
414 "called, abstracted_pad_id={}, bus_type={}, internal_index={}, player_number={}, " 414 "called, abstracted_pad_id={}, bus_type={}, internal_index={}, player_number={}, "
415 "is_valid={}", 415 "is_valid={}",
416 bus_handle_.abstracted_pad_id, bus_handle_.bus_type, bus_handle_.internal_index, 416 bus_handle_.abstracted_pad_id, bus_handle_.bus_type_id, bus_handle_.internal_index,
417 bus_handle_.player_number, bus_handle_.is_valid); 417 bus_handle_.player_number, bus_handle_.is_valid);
418 418
419 const auto device_index = GetDeviceIndexFromHandle(bus_handle_); 419 const auto device_index = GetDeviceIndexFromHandle(bus_handle_);
@@ -464,7 +464,7 @@ void HidBus::EnableJoyPollingReceiveMode(Kernel::HLERequestContext& ctx) {
464 LOG_INFO(Service_HID, 464 LOG_INFO(Service_HID,
465 "called, t_mem_handle=0x{:08X}, polling_mode={}, abstracted_pad_id={}, bus_type={}, " 465 "called, t_mem_handle=0x{:08X}, polling_mode={}, abstracted_pad_id={}, bus_type={}, "
466 "internal_index={}, player_number={}, is_valid={}", 466 "internal_index={}, player_number={}, is_valid={}",
467 t_mem_handle, polling_mode_, bus_handle_.abstracted_pad_id, bus_handle_.bus_type, 467 t_mem_handle, polling_mode_, bus_handle_.abstracted_pad_id, bus_handle_.bus_type_id,
468 bus_handle_.internal_index, bus_handle_.player_number, bus_handle_.is_valid); 468 bus_handle_.internal_index, bus_handle_.player_number, bus_handle_.is_valid);
469 469
470 const auto device_index = GetDeviceIndexFromHandle(bus_handle_); 470 const auto device_index = GetDeviceIndexFromHandle(bus_handle_);
@@ -492,7 +492,7 @@ void HidBus::DisableJoyPollingReceiveMode(Kernel::HLERequestContext& ctx) {
492 LOG_INFO(Service_HID, 492 LOG_INFO(Service_HID,
493 "called, abstracted_pad_id={}, bus_type={}, internal_index={}, player_number={}, " 493 "called, abstracted_pad_id={}, bus_type={}, internal_index={}, player_number={}, "
494 "is_valid={}", 494 "is_valid={}",
495 bus_handle_.abstracted_pad_id, bus_handle_.bus_type, bus_handle_.internal_index, 495 bus_handle_.abstracted_pad_id, bus_handle_.bus_type_id, bus_handle_.internal_index,
496 bus_handle_.player_number, bus_handle_.is_valid); 496 bus_handle_.player_number, bus_handle_.is_valid);
497 497
498 const auto device_index = GetDeviceIndexFromHandle(bus_handle_); 498 const auto device_index = GetDeviceIndexFromHandle(bus_handle_);
diff --git a/src/core/hle/service/hid/hidbus.h b/src/core/hle/service/hid/hidbus.h
index 142b17d34..3fa288677 100755
--- a/src/core/hle/service/hid/hidbus.h
+++ b/src/core/hle/service/hid/hidbus.h
@@ -41,7 +41,7 @@ private:
41 }; 41 };
42 42
43 // This is nn::hidbus::BusType 43 // This is nn::hidbus::BusType
44 enum class BusType : u8 { 44 enum class BusType : u32 {
45 LeftJoyRail, 45 LeftJoyRail,
46 RightJoyRail, 46 RightJoyRail,
47 InternalBus, // Lark microphone 47 InternalBus, // Lark microphone
@@ -54,7 +54,7 @@ private:
54 u32 abstracted_pad_id; 54 u32 abstracted_pad_id;
55 u8 internal_index; 55 u8 internal_index;
56 u8 player_number; 56 u8 player_number;
57 BusType bus_type; 57 u8 bus_type_id;
58 bool is_valid; 58 bool is_valid;
59 }; 59 };
60 static_assert(sizeof(BusHandle) == 0x8, "BusHandle is an invalid size"); 60 static_assert(sizeof(BusHandle) == 0x8, "BusHandle is an invalid size");
diff --git a/src/core/hle/service/ncm/ncm.cpp b/src/core/hle/service/ncm/ncm.cpp
index d9761b423..bf36e1fff 100755
--- a/src/core/hle/service/ncm/ncm.cpp
+++ b/src/core/hle/service/ncm/ncm.cpp
@@ -124,6 +124,7 @@ public:
124 {12, nullptr, "InactivateContentMetaDatabase"}, 124 {12, nullptr, "InactivateContentMetaDatabase"},
125 {13, nullptr, "InvalidateRightsIdCache"}, 125 {13, nullptr, "InvalidateRightsIdCache"},
126 {14, nullptr, "GetMemoryReport"}, 126 {14, nullptr, "GetMemoryReport"},
127 {15, nullptr, "ActivateFsContentStorage"},
127 }; 128 };
128 // clang-format on 129 // clang-format on
129 130
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp
index f03856bb7..2ab12c64e 100755
--- a/src/core/hle/service/ns/ns.cpp
+++ b/src/core/hle/service/ns/ns.cpp
@@ -160,6 +160,8 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
160 {606, nullptr, "GetContentMetaStorage"}, 160 {606, nullptr, "GetContentMetaStorage"},
161 {607, nullptr, "ListAvailableAddOnContent"}, 161 {607, nullptr, "ListAvailableAddOnContent"},
162 {609, nullptr, "ListAvailabilityAssuredAddOnContent"}, 162 {609, nullptr, "ListAvailabilityAssuredAddOnContent"},
163 {610, nullptr, "GetInstalledContentMetaStorage"},
164 {611, nullptr, "PrepareAddOnContent"},
163 {700, nullptr, "PushDownloadTaskList"}, 165 {700, nullptr, "PushDownloadTaskList"},
164 {701, nullptr, "ClearTaskStatusList"}, 166 {701, nullptr, "ClearTaskStatusList"},
165 {702, nullptr, "RequestDownloadTaskList"}, 167 {702, nullptr, "RequestDownloadTaskList"},
@@ -229,6 +231,7 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
229 {1900, nullptr, "IsActiveAccount"}, 231 {1900, nullptr, "IsActiveAccount"},
230 {1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"}, 232 {1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"},
231 {1902, nullptr, "GetApplicationTicketInfo"}, 233 {1902, nullptr, "GetApplicationTicketInfo"},
234 {1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"},
232 {2000, nullptr, "GetSystemDeliveryInfo"}, 235 {2000, nullptr, "GetSystemDeliveryInfo"},
233 {2001, nullptr, "SelectLatestSystemDeliveryInfo"}, 236 {2001, nullptr, "SelectLatestSystemDeliveryInfo"},
234 {2002, nullptr, "VerifyDeliveryProtocolVersion"}, 237 {2002, nullptr, "VerifyDeliveryProtocolVersion"},
@@ -277,8 +280,11 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
277 {2352, nullptr, "RequestResolveNoDownloadRightsError"}, 280 {2352, nullptr, "RequestResolveNoDownloadRightsError"},
278 {2353, nullptr, "GetApplicationDownloadTaskInfo"}, 281 {2353, nullptr, "GetApplicationDownloadTaskInfo"},
279 {2354, nullptr, "PrioritizeApplicationBackgroundTask"}, 282 {2354, nullptr, "PrioritizeApplicationBackgroundTask"},
280 {2355, nullptr, "Unknown2355"}, 283 {2355, nullptr, "PreferStorageEfficientUpdate"},
281 {2356, nullptr, "Unknown2356"}, 284 {2356, nullptr, "RequestStorageEfficientUpdatePreferable"},
285 {2357, nullptr, "EnableMultiCoreDownload"},
286 {2358, nullptr, "DisableMultiCoreDownload"},
287 {2359, nullptr, "IsMultiCoreDownloadEnabled"},
282 {2400, nullptr, "GetPromotionInfo"}, 288 {2400, nullptr, "GetPromotionInfo"},
283 {2401, nullptr, "CountPromotionInfo"}, 289 {2401, nullptr, "CountPromotionInfo"},
284 {2402, nullptr, "ListPromotionInfo"}, 290 {2402, nullptr, "ListPromotionInfo"},
@@ -296,6 +302,7 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
296 {2519, nullptr, "IsQualificationTransitionSupported"}, 302 {2519, nullptr, "IsQualificationTransitionSupported"},
297 {2520, nullptr, "IsQualificationTransitionSupportedByProcessId"}, 303 {2520, nullptr, "IsQualificationTransitionSupportedByProcessId"},
298 {2521, nullptr, "GetRightsUserChangedEvent"}, 304 {2521, nullptr, "GetRightsUserChangedEvent"},
305 {2522, nullptr, "IsRomRedirectionAvailable"},
299 {2800, nullptr, "GetApplicationIdOfPreomia"}, 306 {2800, nullptr, "GetApplicationIdOfPreomia"},
300 {3000, nullptr, "RegisterDeviceLockKey"}, 307 {3000, nullptr, "RegisterDeviceLockKey"},
301 {3001, nullptr, "UnregisterDeviceLockKey"}, 308 {3001, nullptr, "UnregisterDeviceLockKey"},
@@ -312,6 +319,7 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
312 {3012, nullptr, "IsApplicationTitleHidden"}, 319 {3012, nullptr, "IsApplicationTitleHidden"},
313 {3013, nullptr, "IsGameCardEnabled"}, 320 {3013, nullptr, "IsGameCardEnabled"},
314 {3014, nullptr, "IsLocalContentShareEnabled"}, 321 {3014, nullptr, "IsLocalContentShareEnabled"},
322 {3050, nullptr, "ListAssignELicenseTaskResult"},
315 {9999, nullptr, "GetApplicationCertificate"}, 323 {9999, nullptr, "GetApplicationCertificate"},
316 }; 324 };
317 // clang-format on 325 // clang-format on
diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp
index 8d49fc107..c5d786589 100755
--- a/src/core/hle/service/sockets/bsd.cpp
+++ b/src/core/hle/service/sockets/bsd.cpp
@@ -953,6 +953,9 @@ BSDCFG::BSDCFG(Core::System& system_) : ServiceFramework{system_, "bsdcfg"} {
953 {10, nullptr, "ClearArpEntries"}, 953 {10, nullptr, "ClearArpEntries"},
954 {11, nullptr, "ClearArpEntries2"}, 954 {11, nullptr, "ClearArpEntries2"},
955 {12, nullptr, "PrintArpEntries"}, 955 {12, nullptr, "PrintArpEntries"},
956 {13, nullptr, "Unknown13"},
957 {14, nullptr, "Unknown14"},
958 {15, nullptr, "Unknown15"},
956 }; 959 };
957 // clang-format on 960 // clang-format on
958 961
diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp
index e62862a0d..5369d9971 100755
--- a/src/core/hle/service/ssl/ssl.cpp
+++ b/src/core/hle/service/ssl/ssl.cpp
@@ -46,6 +46,14 @@ public:
46 {25, nullptr, "GetCipherInfo"}, 46 {25, nullptr, "GetCipherInfo"},
47 {26, nullptr, "SetNextAlpnProto"}, 47 {26, nullptr, "SetNextAlpnProto"},
48 {27, nullptr, "GetNextAlpnProto"}, 48 {27, nullptr, "GetNextAlpnProto"},
49 {28, nullptr, "SetDtlsSocketDescriptor"},
50 {29, nullptr, "GetDtlsHandshakeTimeout"},
51 {30, nullptr, "SetPrivateOption"},
52 {31, nullptr, "SetSrtpCiphers"},
53 {32, nullptr, "GetSrtpCipher"},
54 {33, nullptr, "ExportKeyingMaterial"},
55 {34, nullptr, "SetIoTimeout"},
56 {35, nullptr, "GetIoTimeout"},
49 }; 57 };
50 // clang-format on 58 // clang-format on
51 59
@@ -69,6 +77,8 @@ public:
69 {9, nullptr, "AddPolicyOid"}, 77 {9, nullptr, "AddPolicyOid"},
70 {10, nullptr, "ImportCrl"}, 78 {10, nullptr, "ImportCrl"},
71 {11, nullptr, "RemoveCrl"}, 79 {11, nullptr, "RemoveCrl"},
80 {12, nullptr, "ImportClientCertKeyPki"},
81 {13, nullptr, "GeneratePrivateKeyAndCert"},
72 }; 82 };
73 RegisterHandlers(functions); 83 RegisterHandlers(functions);
74 } 84 }
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp
index fc388af09..145913806 100755
--- a/src/core/hle/service/vi/vi.cpp
+++ b/src/core/hle/service/vi/vi.cpp
@@ -249,6 +249,9 @@ public:
249 {2053, nullptr, "DestroyIndirectProducerEndPoint"}, 249 {2053, nullptr, "DestroyIndirectProducerEndPoint"},
250 {2054, nullptr, "CreateIndirectConsumerEndPoint"}, 250 {2054, nullptr, "CreateIndirectConsumerEndPoint"},
251 {2055, nullptr, "DestroyIndirectConsumerEndPoint"}, 251 {2055, nullptr, "DestroyIndirectConsumerEndPoint"},
252 {2060, nullptr, "CreateWatermarkCompositor"},
253 {2062, nullptr, "SetWatermarkText"},
254 {2063, nullptr, "SetWatermarkLayerStacks"},
252 {2300, nullptr, "AcquireLayerTexturePresentingEvent"}, 255 {2300, nullptr, "AcquireLayerTexturePresentingEvent"},
253 {2301, nullptr, "ReleaseLayerTexturePresentingEvent"}, 256 {2301, nullptr, "ReleaseLayerTexturePresentingEvent"},
254 {2302, nullptr, "GetDisplayHotplugEvent"}, 257 {2302, nullptr, "GetDisplayHotplugEvent"},
@@ -279,6 +282,8 @@ public:
279 {6011, nullptr, "EnableLayerAutoClearTransitionBuffer"}, 282 {6011, nullptr, "EnableLayerAutoClearTransitionBuffer"},
280 {6012, nullptr, "DisableLayerAutoClearTransitionBuffer"}, 283 {6012, nullptr, "DisableLayerAutoClearTransitionBuffer"},
281 {6013, nullptr, "SetLayerOpacity"}, 284 {6013, nullptr, "SetLayerOpacity"},
285 {6014, nullptr, "AttachLayerWatermarkCompositor"},
286 {6015, nullptr, "DetachLayerWatermarkCompositor"},
282 {7000, nullptr, "SetContentVisibility"}, 287 {7000, nullptr, "SetContentVisibility"},
283 {8000, nullptr, "SetConductorLayer"}, 288 {8000, nullptr, "SetConductorLayer"},
284 {8001, nullptr, "SetTimestampTracking"}, 289 {8001, nullptr, "SetTimestampTracking"},
diff --git a/src/core/hle/service/vi/vi_m.cpp b/src/core/hle/service/vi/vi_m.cpp
index 34326bcbd..6479e8620 100755
--- a/src/core/hle/service/vi/vi_m.cpp
+++ b/src/core/hle/service/vi/vi_m.cpp
@@ -14,6 +14,10 @@ VI_M::VI_M(Core::System& system_, NVFlinger::NVFlinger& nv_flinger_,
14 static const FunctionInfo functions[] = { 14 static const FunctionInfo functions[] = {
15 {2, &VI_M::GetDisplayService, "GetDisplayService"}, 15 {2, &VI_M::GetDisplayService, "GetDisplayService"},
16 {3, nullptr, "GetDisplayServiceWithProxyNameExchange"}, 16 {3, nullptr, "GetDisplayServiceWithProxyNameExchange"},
17 {100, nullptr, "PrepareFatal"},
18 {101, nullptr, "ShowFatal"},
19 {102, nullptr, "DrawFatalRectangle"},
20 {103, nullptr, "DrawFatalText32"},
17 }; 21 };
18 RegisterHandlers(functions); 22 RegisterHandlers(functions);
19} 23}
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index b8782bcaf..4e0aed618 100755
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -212,16 +212,11 @@ void Config::ReadPlayerValue(std::size_t player_index) {
212 } 212 }
213 213
214 if (player_prefix.isEmpty() && Settings::IsConfiguringGlobal()) { 214 if (player_prefix.isEmpty() && Settings::IsConfiguringGlobal()) {
215 const auto controller = static_cast<Settings::ControllerType>( 215 player.controller_type = static_cast<Settings::ControllerType>(
216 qt_config 216 qt_config
217 ->value(QStringLiteral("%1type").arg(player_prefix), 217 ->value(QStringLiteral("%1type").arg(player_prefix),
218 static_cast<u8>(Settings::ControllerType::ProController)) 218 static_cast<u8>(Settings::ControllerType::ProController))
219 .toUInt()); 219 .toUInt());
220
221 if (controller == Settings::ControllerType::LeftJoycon ||
222 controller == Settings::ControllerType::RightJoycon) {
223 player.controller_type = controller;
224 }
225 } else { 220 } else {
226 player.connected = 221 player.connected =
227 ReadSetting(QStringLiteral("%1connected").arg(player_prefix), player_index == 0) 222 ReadSetting(QStringLiteral("%1connected").arg(player_prefix), player_index == 0)
@@ -1313,9 +1308,7 @@ void Config::SaveRendererValues() {
1313 static_cast<u32>(Settings::values.renderer_backend.GetValue(global)), 1308 static_cast<u32>(Settings::values.renderer_backend.GetValue(global)),
1314 static_cast<u32>(Settings::values.renderer_backend.GetDefault()), 1309 static_cast<u32>(Settings::values.renderer_backend.GetDefault()),
1315 Settings::values.renderer_backend.UsingGlobal()); 1310 Settings::values.renderer_backend.UsingGlobal());
1316 WriteSetting(QString::fromStdString(Settings::values.renderer_force_max_clock.GetLabel()), 1311 WriteGlobalSetting(Settings::values.renderer_force_max_clock);
1317 static_cast<u32>(Settings::values.renderer_force_max_clock.GetValue(global)),
1318 static_cast<u32>(Settings::values.renderer_force_max_clock.GetDefault()));
1319 WriteGlobalSetting(Settings::values.vulkan_device); 1312 WriteGlobalSetting(Settings::values.vulkan_device);
1320 WriteSetting(QString::fromStdString(Settings::values.fullscreen_mode.GetLabel()), 1313 WriteSetting(QString::fromStdString(Settings::values.fullscreen_mode.GetLabel()),
1321 static_cast<u32>(Settings::values.fullscreen_mode.GetValue(global)), 1314 static_cast<u32>(Settings::values.fullscreen_mode.GetValue(global)),
diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp
index 789316793..76db11020 100755
--- a/src/yuzu/configuration/configure_graphics_advanced.cpp
+++ b/src/yuzu/configuration/configure_graphics_advanced.cpp
@@ -47,8 +47,6 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {
47 &Settings::values.max_anisotropy); 47 &Settings::values.max_anisotropy);
48 ConfigurationShared::SetHighlight(ui->label_gpu_accuracy, 48 ConfigurationShared::SetHighlight(ui->label_gpu_accuracy,
49 !Settings::values.gpu_accuracy.UsingGlobal()); 49 !Settings::values.gpu_accuracy.UsingGlobal());
50 ConfigurationShared::SetHighlight(ui->renderer_force_max_clock,
51 !Settings::values.renderer_force_max_clock.UsingGlobal());
52 ConfigurationShared::SetHighlight(ui->af_label, 50 ConfigurationShared::SetHighlight(ui->af_label,
53 !Settings::values.max_anisotropy.UsingGlobal()); 51 !Settings::values.max_anisotropy.UsingGlobal());
54 } 52 }
diff --git a/src/yuzu/configuration/configure_input_per_game.cpp b/src/yuzu/configuration/configure_input_per_game.cpp
index 78e65d468..4e77fe00b 100755
--- a/src/yuzu/configuration/configure_input_per_game.cpp
+++ b/src/yuzu/configuration/configure_input_per_game.cpp
@@ -57,7 +57,7 @@ void ConfigureInputPerGame::ApplyConfiguration() {
57} 57}
58 58
59void ConfigureInputPerGame::LoadConfiguration() { 59void ConfigureInputPerGame::LoadConfiguration() {
60 static constexpr size_t HANDHELD_INDEX = 8; 60 static constexpr size_t HANDHELD_INDEX = 0;
61 61
62 auto& hid_core = system.HIDCore(); 62 auto& hid_core = system.HIDCore();
63 for (size_t player_index = 0; player_index < profile_comboboxes.size(); ++player_index) { 63 for (size_t player_index = 0; player_index < profile_comboboxes.size(); ++player_index) {
@@ -69,9 +69,6 @@ void ConfigureInputPerGame::LoadConfiguration() {
69 const auto selection_index = player_combobox->currentIndex(); 69 const auto selection_index = player_combobox->currentIndex();
70 if (selection_index == 0) { 70 if (selection_index == 0) {
71 Settings::values.players.GetValue()[player_index].profile_name = ""; 71 Settings::values.players.GetValue()[player_index].profile_name = "";
72 if (player_index == 0) {
73 Settings::values.players.GetValue()[HANDHELD_INDEX] = {};
74 }
75 Settings::values.players.SetGlobal(true); 72 Settings::values.players.SetGlobal(true);
76 emulated_controller->ReloadFromSettings(); 73 emulated_controller->ReloadFromSettings();
77 continue; 74 continue;
diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp
index 2fff66ef2..a7d188279 100755
--- a/src/yuzu/configuration/configure_input_player.cpp
+++ b/src/yuzu/configuration/configure_input_player.cpp
@@ -1589,7 +1589,6 @@ void ConfigureInputPlayer::LoadProfile() {
1589} 1589}
1590 1590
1591void ConfigureInputPlayer::SaveProfile() { 1591void ConfigureInputPlayer::SaveProfile() {
1592 static constexpr size_t HANDHELD_INDEX = 8;
1593 const QString profile_name = ui->comboProfiles->itemText(ui->comboProfiles->currentIndex()); 1592 const QString profile_name = ui->comboProfiles->itemText(ui->comboProfiles->currentIndex());
1594 1593
1595 if (profile_name.isEmpty()) { 1594 if (profile_name.isEmpty()) {
@@ -1598,12 +1597,7 @@ void ConfigureInputPlayer::SaveProfile() {
1598 1597
1599 ApplyConfiguration(); 1598 ApplyConfiguration();
1600 1599
1601 // When we're in handheld mode, only the handheld emulated controller bindings are updated 1600 if (!profiles->SaveProfile(profile_name.toStdString(), player_index)) {
1602 const bool is_handheld = player_index == 0 && emulated_controller->GetNpadIdType() ==
1603 Core::HID::NpadIdType::Handheld;
1604 const auto profile_player_index = is_handheld ? HANDHELD_INDEX : player_index;
1605
1606 if (!profiles->SaveProfile(profile_name.toStdString(), profile_player_index)) {
1607 QMessageBox::critical(this, tr("Save Input Profile"), 1601 QMessageBox::critical(this, tr("Save Input Profile"),
1608 tr("Failed to save the input profile \"%1\"").arg(profile_name)); 1602 tr("Failed to save the input profile \"%1\"").arg(profile_name));
1609 UpdateInputProfiles(); 1603 UpdateInputProfiles();