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.
This commit is contained in:
kalaposfos13 2026-03-09 13:11:47 +01:00
parent d0580a11fa
commit 7fe034f3ca
6 changed files with 69 additions and 60 deletions

View File

@ -284,7 +284,7 @@ int PS4_SYSV_ABI scePadOpen(Libraries::UserService::OrbisUserServiceUserId userI
if (!u) { if (!u) {
return ORBIS_DEVICE_SERVICE_ERROR_USER_NOT_LOGIN; 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, LOG_INFO(Lib_Pad, "(DUMMY) called user_id = {} type = {} index = {}, pad_handle = {}", userId,
type, index, pad_handle); type, index, pad_handle);
g_opened = true; g_opened = true;
@ -480,7 +480,20 @@ int PS4_SYSV_ABI scePadResetLightBar(s32 handle) {
return ORBIS_PAD_ERROR_INVALID_HANDLE; return ORBIS_PAD_ERROR_INVALID_HANDLE;
} }
auto controllers = *Common::Singleton<GameControllers>::Instance(); auto controllers = *Common::Singleton<GameControllers>::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); controllers[*controller_id]->SetLightBarRGB(colour.r, colour.g, colour.b);
return ORBIS_OK; return ORBIS_OK;
} }

View File

@ -598,11 +598,11 @@ s32 PS4_SYSV_ABI sceUserServiceGetLoginUserIdList(OrbisUserServiceLoginUserIdLis
std::vector<User> valid_users; std::vector<User> valid_users;
std::copy_if( std::copy_if(
all_users.begin(), all_users.end(), std::back_inserter(valid_users), 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) // Sort filtered users by port assignment (1-4)
std::sort(valid_users.begin(), valid_users.end(), 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 // Fill slots consecutively based on sorted valid users
int num_users = int num_users =
@ -611,7 +611,7 @@ s32 PS4_SYSV_ABI sceUserServiceGetLoginUserIdList(OrbisUserServiceLoginUserIdLis
for (int i = 0; i < num_users; i++) { for (int i = 0; i < num_users; i++) {
userIdList->user_id[i] = valid_users[i].user_id; userIdList->user_id[i] = valid_users[i].user_id;
LOG_DEBUG(Lib_UserService, "Slot {}: User ID {} (port {})", 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", LOG_DEBUG(Lib_UserService, "Returning {} logged-in users with valid port assignments",

View File

@ -74,7 +74,7 @@ User* UserManager::GetUserByID(s32 user_id) {
User* UserManager::GetUserByPlayerIndex(s32 index) { User* UserManager::GetUserByPlayerIndex(s32 index) {
for (auto& u : m_users.user) { for (auto& u : m_users.user) {
if (u.controller_port == index) if (u.player_index == index)
return &u; return &u;
} }
return nullptr; return nullptr;
@ -84,23 +84,48 @@ const std::vector<User>& UserManager::GetAllUsers() const {
return m_users.user; return m_users.user;
} }
std::vector<User> UserManager::CreateDefaultUser() { Users UserManager::CreateDefaultUsers() {
User default_user; Users default_users;
default_user.user_id = 1; default_users.default_user_id = 1;
default_user.user_color = 0; // BLUE default_users.user = {
default_user.user_name = "shadPS4"; {
default_user.controller_port = 1; .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)) { if (!std::filesystem::exists(user_dir)) {
std::filesystem::create_directory(user_dir); std::filesystem::create_directory(user_dir);
std::filesystem::create_directory(user_dir / "savedata"); std::filesystem::create_directory(user_dir / "savedata");
std::filesystem::create_directory(user_dir / "trophy"); std::filesystem::create_directory(user_dir / "trophy");
std::filesystem::create_directory(user_dir / "inputs"); std::filesystem::create_directory(user_dir / "inputs");
}
} }
return {default_user}; return default_users;
} }
bool UserManager::SetDefaultUser(u32 user_id) { bool UserManager::SetDefaultUser(u32 user_id) {
@ -120,10 +145,10 @@ User UserManager::GetDefaultUser() {
void UserManager::SetControllerPort(u32 user_id, int port) { void UserManager::SetControllerPort(u32 user_id, int port) {
for (auto& u : m_users.user) { for (auto& u : m_users.user) {
if (u.user_id != user_id && u.controller_port == port) if (u.user_id != user_id && u.player_index == port)
u.controller_port = -1; u.player_index = -1;
if (u.user_id == user_id) if (u.user_id == user_id)
u.controller_port = port; u.player_index = port;
} }
Save(); Save();
} }

View File

@ -10,17 +10,17 @@
struct User { struct User {
s32 user_id; s32 user_id;
u32 user_color;
std::string user_name; std::string user_name;
int controller_port; // 1-4 u32 user_color;
int player_index; // 1-4
}; };
struct Users { struct Users {
int default_user_id = 1; int default_user_id = 1;
std::vector<User> user {}; std::vector<User> user{};
std::string commit_hash{}; 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) NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Users, default_user_id, user, commit_hash)
class UserManager { class UserManager {
@ -33,7 +33,7 @@ public:
User* GetUserByID(s32 user_id); User* GetUserByID(s32 user_id);
User* GetUserByPlayerIndex(s32 index); User* GetUserByPlayerIndex(s32 index);
const std::vector<User>& GetAllUsers() const; const std::vector<User>& GetAllUsers() const;
std::vector<User> CreateDefaultUser(); Users CreateDefaultUsers();
bool SetDefaultUser(u32 user_id); bool SetDefaultUser(u32 user_id);
User GetDefaultUser(); User GetDefaultUser();
void SetControllerPort(u32 user_id, int port); void SetControllerPort(u32 user_id, int port);

View File

@ -62,8 +62,7 @@ bool UserSettingsImpl::Load() {
LOG_DEBUG(EmuSettings, "User settings file not found: {}", path.string()); LOG_DEBUG(EmuSettings, "User settings file not found: {}", path.string());
// Create default user if no file exists // Create default user if no file exists
if (m_userManager.GetUsers().user.empty()) { if (m_userManager.GetUsers().user.empty()) {
m_userManager.GetUsers().user = m_userManager.CreateDefaultUser(); m_userManager.GetUsers() = m_userManager.CreateDefaultUsers();
m_userManager.GetUsers().default_user_id = 1;
} }
Save(); // Save default users Save(); // Save default users
return false; return false;
@ -79,34 +78,7 @@ bool UserSettingsImpl::Load() {
in >> j; in >> j;
// Create a default Users object // Create a default Users object
Users default_users; auto default_users = m_userManager.CreateDefaultUsers();
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,
},
};
// Convert default_users to json for merging // Convert default_users to json for merging
json default_json; json default_json;
@ -131,8 +103,7 @@ bool UserSettingsImpl::Load() {
LOG_ERROR(EmuSettings, "Error loading user settings: {}", e.what()); LOG_ERROR(EmuSettings, "Error loading user settings: {}", e.what());
// Fall back to defaults // Fall back to defaults
if (m_userManager.GetUsers().user.empty()) { if (m_userManager.GetUsers().user.empty()) {
m_userManager.GetUsers().user = m_userManager.CreateDefaultUser(); m_userManager.GetUsers() = m_userManager.CreateDefaultUsers();
m_userManager.GetUsers().default_user_id = 1;
} }
return false; return false;
} }

View File

@ -387,7 +387,7 @@ std::optional<u8> GameControllers::GetControllerIndexFromUserID(s32 user_id) {
if (!u) { if (!u) {
return std::nullopt; return std::nullopt;
} }
return u->controller_port - 1; return u->player_index - 1;
} }
std::optional<u8> GameControllers::GetControllerIndexFromControllerID(s32 controller_id) { std::optional<u8> GameControllers::GetControllerIndexFromControllerID(s32 controller_id) {