From 7fe034f3ca5d7f944109994d8cb836aa62bb1919 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Mon, 9 Mar 2026 13:11:47 +0100 Subject: [PATCH] hook up the new backend's lightbar colour values This temorarily breaks override_controller_color, but that already only worked correctly with one gamepad anyway. --- src/core/libraries/pad/pad.cpp | 17 ++++++- src/core/libraries/system/userservice.cpp | 6 +-- src/core/user_manager.cpp | 59 ++++++++++++++++------- src/core/user_manager.h | 10 ++-- src/core/user_settings.cpp | 35 ++------------ src/input/controller.cpp | 2 +- 6 files changed, 69 insertions(+), 60 deletions(-) diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index 420bcbd1d..a87b839ad 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -284,7 +284,7 @@ int PS4_SYSV_ABI scePadOpen(Libraries::UserService::OrbisUserServiceUserId userI if (!u) { return ORBIS_DEVICE_SERVICE_ERROR_USER_NOT_LOGIN; } - s32 pad_handle = u->controller_port; + s32 pad_handle = u->player_index; LOG_INFO(Lib_Pad, "(DUMMY) called user_id = {} type = {} index = {}, pad_handle = {}", userId, type, index, pad_handle); g_opened = true; @@ -480,7 +480,20 @@ int PS4_SYSV_ABI scePadResetLightBar(s32 handle) { return ORBIS_PAD_ERROR_INVALID_HANDLE; } auto controllers = *Common::Singleton::Instance(); - Input::Colour colour = GameControllers::GetControllerCustomColor(); + s32 colour_index = UserManagement.GetUserByPlayerIndex(handle)->user_color - 1; + Input::Colour colour{255, 0, 0}; + if (colour_index >= 0 && colour_index <= 3) { + static constexpr Input::Colour colours[4]{ + {0, 0, 255}, // blue + {255, 0, 0}, // red + {0, 255, 0}, // green + {255, 0, 255}, // pink + }; + colour = colours[colour_index]; + } else { + LOG_ERROR(Lib_Pad, "Invalid user colour value {} for controller {}, falling back to blue", + colour_index, handle); + } controllers[*controller_id]->SetLightBarRGB(colour.r, colour.g, colour.b); return ORBIS_OK; } diff --git a/src/core/libraries/system/userservice.cpp b/src/core/libraries/system/userservice.cpp index bb5bcd905..01f910298 100644 --- a/src/core/libraries/system/userservice.cpp +++ b/src/core/libraries/system/userservice.cpp @@ -598,11 +598,11 @@ s32 PS4_SYSV_ABI sceUserServiceGetLoginUserIdList(OrbisUserServiceLoginUserIdLis std::vector valid_users; std::copy_if( all_users.begin(), all_users.end(), std::back_inserter(valid_users), - [](const User& user) { return user.controller_port >= 1 && user.controller_port <= 4; }); + [](const User& user) { return user.player_index >= 1 && user.player_index <= 4; }); // Sort filtered users by port assignment (1-4) std::sort(valid_users.begin(), valid_users.end(), - [](const User& a, const User& b) { return a.controller_port < b.controller_port; }); + [](const User& a, const User& b) { return a.player_index < b.player_index; }); // Fill slots consecutively based on sorted valid users int num_users = @@ -611,7 +611,7 @@ s32 PS4_SYSV_ABI sceUserServiceGetLoginUserIdList(OrbisUserServiceLoginUserIdLis for (int i = 0; i < num_users; i++) { userIdList->user_id[i] = valid_users[i].user_id; LOG_DEBUG(Lib_UserService, "Slot {}: User ID {} (port {})", i, valid_users[i].user_id, - valid_users[i].controller_port); + valid_users[i].player_index); } LOG_DEBUG(Lib_UserService, "Returning {} logged-in users with valid port assignments", diff --git a/src/core/user_manager.cpp b/src/core/user_manager.cpp index d85f0a3c7..8a22a35be 100644 --- a/src/core/user_manager.cpp +++ b/src/core/user_manager.cpp @@ -74,7 +74,7 @@ User* UserManager::GetUserByID(s32 user_id) { User* UserManager::GetUserByPlayerIndex(s32 index) { for (auto& u : m_users.user) { - if (u.controller_port == index) + if (u.player_index == index) return &u; } return nullptr; @@ -84,23 +84,48 @@ const std::vector& UserManager::GetAllUsers() const { return m_users.user; } -std::vector UserManager::CreateDefaultUser() { - User default_user; - default_user.user_id = 1; - default_user.user_color = 0; // BLUE - default_user.user_name = "shadPS4"; - default_user.controller_port = 1; +Users UserManager::CreateDefaultUsers() { + Users default_users; + default_users.default_user_id = 1; + default_users.user = { + { + .user_id = 1000, + .user_name = "shadPS4", + .user_color = 1, + .player_index = 1, + }, + { + .user_id = 1001, + .user_name = "shadPS4-2", + .user_color = 2, + .player_index = 2, + }, + { + .user_id = 1002, + .user_name = "shadPS4-3", + .user_color = 3, + .player_index = 3, + }, + { + .user_id = 1003, + .user_name = "shadPS4-4", + .user_color = 4, + .player_index = 4, + }, + }; - const auto user_dir = EmulatorSettings.GetHomeDir() / std::to_string(default_user.user_id); + for (auto& u : default_users.user) { + const auto user_dir = EmulatorSettings.GetHomeDir() / std::to_string(u.user_id); - if (!std::filesystem::exists(user_dir)) { - std::filesystem::create_directory(user_dir); - std::filesystem::create_directory(user_dir / "savedata"); - std::filesystem::create_directory(user_dir / "trophy"); - std::filesystem::create_directory(user_dir / "inputs"); + if (!std::filesystem::exists(user_dir)) { + std::filesystem::create_directory(user_dir); + std::filesystem::create_directory(user_dir / "savedata"); + std::filesystem::create_directory(user_dir / "trophy"); + std::filesystem::create_directory(user_dir / "inputs"); + } } - return {default_user}; + return default_users; } bool UserManager::SetDefaultUser(u32 user_id) { @@ -120,10 +145,10 @@ User UserManager::GetDefaultUser() { void UserManager::SetControllerPort(u32 user_id, int port) { for (auto& u : m_users.user) { - if (u.user_id != user_id && u.controller_port == port) - u.controller_port = -1; + if (u.user_id != user_id && u.player_index == port) + u.player_index = -1; if (u.user_id == user_id) - u.controller_port = port; + u.player_index = port; } Save(); } diff --git a/src/core/user_manager.h b/src/core/user_manager.h index 5caad01a9..89832cfff 100644 --- a/src/core/user_manager.h +++ b/src/core/user_manager.h @@ -10,17 +10,17 @@ struct User { s32 user_id; - u32 user_color; std::string user_name; - int controller_port; // 1-4 + u32 user_color; + int player_index; // 1-4 }; struct Users { int default_user_id = 1; - std::vector user {}; + std::vector user{}; std::string commit_hash{}; }; -NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(User, user_id, user_color, user_name, controller_port) +NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(User, user_id, user_color, user_name, player_index) NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Users, default_user_id, user, commit_hash) class UserManager { @@ -33,7 +33,7 @@ public: User* GetUserByID(s32 user_id); User* GetUserByPlayerIndex(s32 index); const std::vector& GetAllUsers() const; - std::vector CreateDefaultUser(); + Users CreateDefaultUsers(); bool SetDefaultUser(u32 user_id); User GetDefaultUser(); void SetControllerPort(u32 user_id, int port); diff --git a/src/core/user_settings.cpp b/src/core/user_settings.cpp index 08b2fdb77..9f04cc2ce 100644 --- a/src/core/user_settings.cpp +++ b/src/core/user_settings.cpp @@ -62,8 +62,7 @@ bool UserSettingsImpl::Load() { LOG_DEBUG(EmuSettings, "User settings file not found: {}", path.string()); // Create default user if no file exists if (m_userManager.GetUsers().user.empty()) { - m_userManager.GetUsers().user = m_userManager.CreateDefaultUser(); - m_userManager.GetUsers().default_user_id = 1; + m_userManager.GetUsers() = m_userManager.CreateDefaultUsers(); } Save(); // Save default users return false; @@ -79,34 +78,7 @@ bool UserSettingsImpl::Load() { in >> j; // Create a default Users object - Users default_users; - default_users.default_user_id = 1; - default_users.user = { - { - .user_id = 1000, - .user_color = 1, - .user_name = "shadPS4", - .controller_port = 1, - }, - { - .user_id = 1001, - .user_color = 2, - .user_name = "shadPS4-2", - .controller_port = 2, - }, - { - .user_id = 1002, - .user_color = 3, - .user_name = "shadPS4-3", - .controller_port = 3, - }, - { - .user_id = 1003, - .user_color = 4, - .user_name = "shadPS4-4", - .controller_port = 4, - }, - }; + auto default_users = m_userManager.CreateDefaultUsers(); // Convert default_users to json for merging json default_json; @@ -131,8 +103,7 @@ bool UserSettingsImpl::Load() { LOG_ERROR(EmuSettings, "Error loading user settings: {}", e.what()); // Fall back to defaults if (m_userManager.GetUsers().user.empty()) { - m_userManager.GetUsers().user = m_userManager.CreateDefaultUser(); - m_userManager.GetUsers().default_user_id = 1; + m_userManager.GetUsers() = m_userManager.CreateDefaultUsers(); } return false; } diff --git a/src/input/controller.cpp b/src/input/controller.cpp index d4b2fe154..670d66c2e 100644 --- a/src/input/controller.cpp +++ b/src/input/controller.cpp @@ -387,7 +387,7 @@ std::optional GameControllers::GetControllerIndexFromUserID(s32 user_id) { if (!u) { return std::nullopt; } - return u->controller_port - 1; + return u->player_index - 1; } std::optional GameControllers::GetControllerIndexFromControllerID(s32 controller_id) {