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) {
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<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);
return ORBIS_OK;
}

View File

@ -598,11 +598,11 @@ s32 PS4_SYSV_ABI sceUserServiceGetLoginUserIdList(OrbisUserServiceLoginUserIdLis
std::vector<User> 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",

View File

@ -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<User>& UserManager::GetAllUsers() const {
return m_users.user;
}
std::vector<User> 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();
}

View File

@ -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> user {};
std::vector<User> 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<User>& GetAllUsers() const;
std::vector<User> CreateDefaultUser();
Users CreateDefaultUsers();
bool SetDefaultUser(u32 user_id);
User GetDefaultUser();
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());
// 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;
}

View File

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