From 3da6f25c59b5726e2825c58efd6c48e5f5e93a08 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 12 Jun 2025 16:20:21 +0300 Subject: [PATCH 01/11] using common OrbisUserServiceUserId from Userservice --- src/core/libraries/audio3d/audio3d.cpp | 6 +++--- src/core/libraries/audio3d/audio3d.h | 7 +++---- .../game_live_streaming/gamelivestreaming.h | 5 +++-- src/core/libraries/ime/error_dialog.cpp | 3 ++- src/core/libraries/ime/error_dialog.h | 2 -- src/core/libraries/ime/ime.cpp | 5 +++-- src/core/libraries/ime/ime.h | 5 +++-- src/core/libraries/ime/ime_common.h | 3 ++- src/core/libraries/np_manager/np_manager.cpp | 17 ++++++++++------ src/core/libraries/np_manager/np_manager.h | 20 +++++++++++-------- src/core/libraries/np_trophy/np_trophy.cpp | 10 ++++++---- src/core/libraries/pad/pad.cpp | 11 ++++++---- src/core/libraries/pad/pad.h | 10 +++++++--- src/core/libraries/remote_play/remoteplay.cpp | 4 +++- src/core/libraries/remote_play/remoteplay.h | 4 +++- src/core/libraries/share_play/shareplay.h | 4 ++-- src/core/libraries/system/userservice.cpp | 8 +++++--- src/core/libraries/system/userservice.h | 8 +++++--- src/core/libraries/videoout/video_out.cpp | 3 ++- src/core/libraries/videoout/video_out.h | 7 +++---- 20 files changed, 85 insertions(+), 57 deletions(-) diff --git a/src/core/libraries/audio3d/audio3d.cpp b/src/core/libraries/audio3d/audio3d.cpp index 646c28949..2a2552e0d 100644 --- a/src/core/libraries/audio3d/audio3d.cpp +++ b/src/core/libraries/audio3d/audio3d.cpp @@ -29,8 +29,8 @@ s32 PS4_SYSV_ABI sceAudio3dAudioOutClose(const s32 handle) { return AudioOut::sceAudioOutClose(handle); } -s32 PS4_SYSV_ABI -sceAudio3dAudioOutOpen(const OrbisAudio3dPortId port_id, const OrbisUserServiceUserId user_id, +s32 PS4_SYSV_ABI sceAudio3dAudioOutOpen( + const OrbisAudio3dPortId port_id, const Libraries::UserService::OrbisUserServiceUserId user_id, s32 type, const s32 index, const u32 len, const u32 freq, const AudioOut::OrbisAudioOutParamExtendedInformation param) { LOG_INFO(Lib_Audio3d, @@ -421,7 +421,7 @@ s32 PS4_SYSV_ABI sceAudio3dPortGetStatus() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceAudio3dPortOpen(const OrbisUserServiceUserId user_id, +s32 PS4_SYSV_ABI sceAudio3dPortOpen(const Libraries::UserService::OrbisUserServiceUserId user_id, const OrbisAudio3dOpenParameters* parameters, OrbisAudio3dPortId* port_id) { LOG_INFO(Lib_Audio3d, "called, user_id = {}, parameters = {}, id = {}", user_id, diff --git a/src/core/libraries/audio3d/audio3d.h b/src/core/libraries/audio3d/audio3d.h index f4e9ada8a..23d22298e 100644 --- a/src/core/libraries/audio3d/audio3d.h +++ b/src/core/libraries/audio3d/audio3d.h @@ -15,8 +15,6 @@ class SymbolsResolver; namespace Libraries::Audio3d { -using OrbisUserServiceUserId = s32; - enum class OrbisAudio3dRate : u32 { ORBIS_AUDIO3D_RATE_48000 = 0, }; @@ -91,7 +89,8 @@ struct Audio3dState { }; s32 PS4_SYSV_ABI sceAudio3dAudioOutClose(s32 handle); -s32 PS4_SYSV_ABI sceAudio3dAudioOutOpen(OrbisAudio3dPortId port_id, OrbisUserServiceUserId user_id, +s32 PS4_SYSV_ABI sceAudio3dAudioOutOpen(OrbisAudio3dPortId port_id, + Libraries::UserService::OrbisUserServiceUserId user_id, s32 type, s32 index, u32 len, u32 freq, AudioOut::OrbisAudioOutParamExtendedInformation param); s32 PS4_SYSV_ABI sceAudio3dAudioOutOutput(s32 handle, void* ptr); @@ -127,7 +126,7 @@ s32 PS4_SYSV_ABI sceAudio3dPortGetQueueLevel(OrbisAudio3dPortId port_id, u32* qu u32* queue_available); s32 PS4_SYSV_ABI sceAudio3dPortGetState(); s32 PS4_SYSV_ABI sceAudio3dPortGetStatus(); -s32 PS4_SYSV_ABI sceAudio3dPortOpen(OrbisUserServiceUserId user_id, +s32 PS4_SYSV_ABI sceAudio3dPortOpen(Libraries::UserService::OrbisUserServiceUserId user_id, const OrbisAudio3dOpenParameters* parameters, OrbisAudio3dPortId* port_id); s32 PS4_SYSV_ABI sceAudio3dPortPush(OrbisAudio3dPortId port_id, OrbisAudio3dBlocking blocking); diff --git a/src/core/libraries/game_live_streaming/gamelivestreaming.h b/src/core/libraries/game_live_streaming/gamelivestreaming.h index 468750fd1..08f26e554 100644 --- a/src/core/libraries/game_live_streaming/gamelivestreaming.h +++ b/src/core/libraries/game_live_streaming/gamelivestreaming.h @@ -3,6 +3,7 @@ #pragma once +#include #include "common/types.h" namespace Core::Loader { @@ -15,11 +16,11 @@ struct OrbisGameLiveStreamingStatus { bool isOnAir; u8 align[3]; u32 spectatorCounts; - s32 userId; + Libraries::UserService::OrbisUserServiceUserId userId; u8 reserved[60]; }; struct OrbisGameLiveStreamingStatus2 { - s32 userId; + Libraries::UserService::OrbisUserServiceUserId userId; bool isOnAir; u8 align[3]; u32 spectatorCounts; diff --git a/src/core/libraries/ime/error_dialog.cpp b/src/core/libraries/ime/error_dialog.cpp index 07580fe1d..913b4bfe8 100644 --- a/src/core/libraries/ime/error_dialog.cpp +++ b/src/core/libraries/ime/error_dialog.cpp @@ -13,6 +13,7 @@ #include "error_dialog.h" #include "imgui/imgui_layer.h" #include "imgui/imgui_std.h" +#include static constexpr ImVec2 BUTTON_SIZE{100.0f, 30.0f}; @@ -117,7 +118,7 @@ static ErrorDialogUi g_dialog_ui; struct Param { s32 size; s32 errorCode; - OrbisUserServiceUserId userId; + Libraries::UserService::OrbisUserServiceUserId userId; s32 _reserved; }; diff --git a/src/core/libraries/ime/error_dialog.h b/src/core/libraries/ime/error_dialog.h index 3e6651d4a..42b37da66 100644 --- a/src/core/libraries/ime/error_dialog.h +++ b/src/core/libraries/ime/error_dialog.h @@ -11,8 +11,6 @@ class SymbolsResolver; } namespace Libraries::ErrorDialog { -using OrbisUserServiceUserId = s32; - struct Param; CommonDialog::Error PS4_SYSV_ABI sceErrorDialogClose(); diff --git a/src/core/libraries/ime/ime.cpp b/src/core/libraries/ime/ime.cpp index 1c61bc276..c14122bb0 100644 --- a/src/core/libraries/ime/ime.cpp +++ b/src/core/libraries/ime/ime.cpp @@ -247,7 +247,7 @@ s32 PS4_SYSV_ABI sceImeGetPanelSize(const OrbisImeParam* param, u32* width, u32* return ORBIS_OK; } -s32 PS4_SYSV_ABI sceImeKeyboardClose(s32 userId) { +s32 PS4_SYSV_ABI sceImeKeyboardClose(Libraries::UserService::OrbisUserServiceUserId userId) { LOG_INFO(Lib_Ime, "(STUBBED) called"); if (!g_keyboard_handler) { @@ -268,7 +268,8 @@ int PS4_SYSV_ABI sceImeKeyboardGetResourceId() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceImeKeyboardOpen(s32 userId, const OrbisImeKeyboardParam* param) { +s32 PS4_SYSV_ABI sceImeKeyboardOpen(Libraries::UserService::OrbisUserServiceUserId userId, + const OrbisImeKeyboardParam* param) { LOG_INFO(Lib_Ime, "called"); if (!param) { diff --git a/src/core/libraries/ime/ime.h b/src/core/libraries/ime/ime.h index fcf381048..4a8c39c98 100644 --- a/src/core/libraries/ime/ime.h +++ b/src/core/libraries/ime/ime.h @@ -99,10 +99,11 @@ int PS4_SYSV_ABI sceImeFilterText(); int PS4_SYSV_ABI sceImeForTestFunction(); int PS4_SYSV_ABI sceImeGetPanelPositionAndForm(); s32 PS4_SYSV_ABI sceImeGetPanelSize(const OrbisImeParam* param, u32* width, u32* height); -s32 PS4_SYSV_ABI sceImeKeyboardClose(s32 userId); +s32 PS4_SYSV_ABI sceImeKeyboardClose(Libraries::UserService::OrbisUserServiceUserId userId); int PS4_SYSV_ABI sceImeKeyboardGetInfo(); int PS4_SYSV_ABI sceImeKeyboardGetResourceId(); -s32 PS4_SYSV_ABI sceImeKeyboardOpen(s32 userId, const OrbisImeKeyboardParam* param); +s32 PS4_SYSV_ABI sceImeKeyboardOpen(Libraries::UserService::OrbisUserServiceUserId userId, + const OrbisImeKeyboardParam* param); int PS4_SYSV_ABI sceImeKeyboardOpenInternal(); int PS4_SYSV_ABI sceImeKeyboardSetMode(); int PS4_SYSV_ABI sceImeKeyboardUpdate(); diff --git a/src/core/libraries/ime/ime_common.h b/src/core/libraries/ime/ime_common.h index 96f073dc5..ee00ad8ae 100644 --- a/src/core/libraries/ime/ime_common.h +++ b/src/core/libraries/ime/ime_common.h @@ -5,6 +5,7 @@ #include "common/types.h" #include "core/libraries/rtc/rtc.h" +#include enum class OrbisImeType : u32 { Default = 0, @@ -141,7 +142,7 @@ struct OrbisImeKeycode { }; struct OrbisImeKeyboardResourceIdArray { - s32 userId; + Libraries::UserService::OrbisUserServiceUserId userId; u32 resourceId[5]; }; diff --git a/src/core/libraries/np_manager/np_manager.cpp b/src/core/libraries/np_manager/np_manager.cpp index bc920b5a9..54a33fc52 100644 --- a/src/core/libraries/np_manager/np_manager.cpp +++ b/src/core/libraries/np_manager/np_manager.cpp @@ -924,7 +924,7 @@ int PS4_SYSV_ABI sceNpGetAccountCountry() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpGetAccountCountryA(OrbisUserServiceUserId user_id, +int PS4_SYSV_ABI sceNpGetAccountCountryA(Libraries::UserService::OrbisUserServiceUserId user_id, OrbisNpCountryCode* country_code) { LOG_INFO(Lib_NpManager, "(STUBBED) called, user_id = {}", user_id); if (country_code == nullptr) { @@ -955,7 +955,8 @@ int PS4_SYSV_ABI sceNpGetAccountId(OrbisNpOnlineId* online_id, u64* account_id) return SIGNEDIN_STATUS; } -int PS4_SYSV_ABI sceNpGetAccountIdA(OrbisUserServiceUserId user_id, u64* account_id) { +int PS4_SYSV_ABI sceNpGetAccountIdA(Libraries::UserService::OrbisUserServiceUserId user_id, + u64* account_id) { LOG_DEBUG(Lib_NpManager, "user_id {}", user_id); if (account_id == nullptr) { return ORBIS_NP_ERROR_INVALID_ARGUMENT; @@ -989,7 +990,8 @@ int PS4_SYSV_ABI sceNpGetGamePresenceStatusA() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpGetNpId(OrbisUserServiceUserId user_id, OrbisNpId* np_id) { +int PS4_SYSV_ABI sceNpGetNpId(Libraries::UserService::OrbisUserServiceUserId user_id, + OrbisNpId* np_id) { LOG_DEBUG(Lib_NpManager, "user_id {}", user_id); if (np_id == nullptr) { return ORBIS_NP_ERROR_INVALID_ARGUMENT; @@ -1004,7 +1006,8 @@ int PS4_SYSV_ABI sceNpGetNpReachabilityState() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpGetOnlineId(OrbisUserServiceUserId user_id, OrbisNpOnlineId* online_id) { +int PS4_SYSV_ABI sceNpGetOnlineId(Libraries::UserService::OrbisUserServiceUserId user_id, + OrbisNpOnlineId* online_id) { LOG_DEBUG(Lib_NpManager, "user_id {}", user_id); if (online_id == nullptr) { return ORBIS_NP_ERROR_INVALID_ARGUMENT; @@ -1024,7 +1027,8 @@ int PS4_SYSV_ABI sceNpGetParentalControlInfoA() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpGetState(OrbisUserServiceUserId user_id, OrbisNpState* state) { +int PS4_SYSV_ABI sceNpGetState(Libraries::UserService::OrbisUserServiceUserId user_id, + OrbisNpState* state) { if (state == nullptr) { return ORBIS_NP_ERROR_INVALID_ARGUMENT; } @@ -1043,7 +1047,8 @@ int PS4_SYSV_ABI sceNpGetUserIdByOnlineId() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpHasSignedUp(OrbisUserServiceUserId user_id, bool* has_signed_up) { +int PS4_SYSV_ABI sceNpHasSignedUp(Libraries::UserService::OrbisUserServiceUserId user_id, + bool* has_signed_up) { LOG_DEBUG(Lib_NpManager, "called"); if (has_signed_up == nullptr) { return ORBIS_NP_ERROR_INVALID_ARGUMENT; diff --git a/src/core/libraries/np_manager/np_manager.h b/src/core/libraries/np_manager/np_manager.h index 1078a9f3e..705c91e79 100644 --- a/src/core/libraries/np_manager/np_manager.h +++ b/src/core/libraries/np_manager/np_manager.h @@ -4,6 +4,7 @@ #pragma once #include "common/types.h" +#include namespace Core::Loader { class SymbolsResolver; @@ -18,8 +19,6 @@ using OrbisNpStateCallbackForNpToolkit = PS4_SYSV_ABI void (*)(s32 userId, Orbis constexpr int ORBIS_NP_ONLINEID_MAX_LENGTH = 16; -using OrbisUserServiceUserId = s32; - struct OrbisNpOnlineId { char data[ORBIS_NP_ONLINEID_MAX_LENGTH]; char term; @@ -221,26 +220,31 @@ int PS4_SYSV_ABI sceNpCreateRequest(); int PS4_SYSV_ABI sceNpDeleteRequest(int reqId); int PS4_SYSV_ABI sceNpGetAccountAge(); int PS4_SYSV_ABI sceNpGetAccountCountry(); -int PS4_SYSV_ABI sceNpGetAccountCountryA(OrbisUserServiceUserId user_id, +int PS4_SYSV_ABI sceNpGetAccountCountryA(Libraries::UserService::OrbisUserServiceUserId user_id, OrbisNpCountryCode* country_code); int PS4_SYSV_ABI sceNpGetAccountDateOfBirth(); int PS4_SYSV_ABI sceNpGetAccountDateOfBirthA(); int PS4_SYSV_ABI sceNpGetAccountId(OrbisNpOnlineId* online_id, u64* account_id); -int PS4_SYSV_ABI sceNpGetAccountIdA(OrbisUserServiceUserId user_id, u64* account_id); +int PS4_SYSV_ABI sceNpGetAccountIdA(Libraries::UserService::OrbisUserServiceUserId user_id, + u64* account_id); int PS4_SYSV_ABI sceNpGetAccountLanguage(); int PS4_SYSV_ABI sceNpGetAccountLanguage2(); int PS4_SYSV_ABI sceNpGetAccountLanguageA(); int PS4_SYSV_ABI sceNpGetGamePresenceStatus(); int PS4_SYSV_ABI sceNpGetGamePresenceStatusA(); -int PS4_SYSV_ABI sceNpGetNpId(OrbisUserServiceUserId user_id, OrbisNpId* np_id); +int PS4_SYSV_ABI sceNpGetNpId(Libraries::UserService::OrbisUserServiceUserId user_id, + OrbisNpId* np_id); int PS4_SYSV_ABI sceNpGetNpReachabilityState(); -int PS4_SYSV_ABI sceNpGetOnlineId(OrbisUserServiceUserId user_id, OrbisNpOnlineId* online_id); +int PS4_SYSV_ABI sceNpGetOnlineId(Libraries::UserService::OrbisUserServiceUserId user_id, + OrbisNpOnlineId* online_id); int PS4_SYSV_ABI sceNpGetParentalControlInfo(); int PS4_SYSV_ABI sceNpGetParentalControlInfoA(); -int PS4_SYSV_ABI sceNpGetState(OrbisUserServiceUserId user_id, OrbisNpState* state); +int PS4_SYSV_ABI sceNpGetState(Libraries::UserService::OrbisUserServiceUserId user_id, + OrbisNpState* state); int PS4_SYSV_ABI sceNpGetUserIdByAccountId(); int PS4_SYSV_ABI sceNpGetUserIdByOnlineId(); -int PS4_SYSV_ABI sceNpHasSignedUp(OrbisUserServiceUserId user_id, bool* has_signed_up); +int PS4_SYSV_ABI sceNpHasSignedUp(Libraries::UserService::OrbisUserServiceUserId user_id, + bool* has_signed_up); int PS4_SYSV_ABI sceNpIdMapperAbortRequest(); int PS4_SYSV_ABI sceNpIdMapperAccountIdToNpId(); int PS4_SYSV_ABI sceNpIdMapperAccountIdToOnlineId(); diff --git a/src/core/libraries/np_trophy/np_trophy.cpp b/src/core/libraries/np_trophy/np_trophy.cpp index e3c5ce35e..a82e62eac 100644 --- a/src/core/libraries/np_trophy/np_trophy.cpp +++ b/src/core/libraries/np_trophy/np_trophy.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "common/logging/log.h" #include "common/path_util.h" #include "common/slot_vector.h" @@ -147,7 +148,8 @@ int PS4_SYSV_ABI sceNpTrophyConfigHasGroupFeature() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceNpTrophyCreateContext(OrbisNpTrophyContext* context, int32_t user_id, +s32 PS4_SYSV_ABI sceNpTrophyCreateContext(OrbisNpTrophyContext* context, + Libraries::UserService::OrbisUserServiceUserId userId, uint32_t service_label, uint64_t options) { ASSERT(options == 0ull); if (!context) { @@ -158,16 +160,16 @@ s32 PS4_SYSV_ABI sceNpTrophyCreateContext(OrbisNpTrophyContext* context, int32_t return ORBIS_NP_TROPHY_ERROR_CONTEXT_EXCEEDS_MAX; } - const auto& key = ContextKey{user_id, service_label}; + const auto& key = ContextKey{userId, service_label}; if (contexts_internal.contains(key)) { return ORBIS_NP_TROPHY_ERROR_CONTEXT_ALREADY_EXISTS; } - const auto ctx_id = trophy_contexts.insert(user_id, service_label); + const auto ctx_id = trophy_contexts.insert(userId, service_label); *context = ctx_id.index + 1; contexts_internal[key].context_id = *context; - LOG_INFO(Lib_NpTrophy, "New context = {}, user_id = {} service label = {}", *context, user_id, + LOG_INFO(Lib_NpTrophy, "New context = {}, user_id = {} service label = {}", *context, userId, service_label); return ORBIS_OK; diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index 42582783b..c616b7d27 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include "common/config.h" #include "common/logging/log.h" #include "common/singleton.h" @@ -156,7 +157,8 @@ int PS4_SYSV_ABI scePadGetFeatureReport() { return ORBIS_OK; } -int PS4_SYSV_ABI scePadGetHandle(s32 userId, s32 type, s32 index) { +int PS4_SYSV_ABI scePadGetHandle(Libraries::UserService::OrbisUserServiceUserId userId, s32 type, + s32 index) { if (userId == -1) { return ORBIS_PAD_ERROR_DEVICE_NO_HANDLE; } @@ -249,7 +251,8 @@ int PS4_SYSV_ABI scePadMbusTerm() { return ORBIS_OK; } -int PS4_SYSV_ABI scePadOpen(s32 userId, s32 type, s32 index, const OrbisPadOpenParam* pParam) { +int PS4_SYSV_ABI scePadOpen(Libraries::UserService::OrbisUserServiceUserId userId, s32 type, + s32 index, const OrbisPadOpenParam* pParam) { if (userId == -1) { return ORBIS_PAD_ERROR_DEVICE_NO_HANDLE; } @@ -265,8 +268,8 @@ int PS4_SYSV_ABI scePadOpen(s32 userId, s32 type, s32 index, const OrbisPadOpenP return 1; // dummy } -int PS4_SYSV_ABI scePadOpenExt(s32 userId, s32 type, s32 index, - const OrbisPadOpenExtParam* pParam) { +int PS4_SYSV_ABI scePadOpenExt(Libraries::UserService::OrbisUserServiceUserId userId, s32 type, + s32 index, const OrbisPadOpenExtParam* pParam) { LOG_ERROR(Lib_Pad, "(STUBBED) called"); if (Config::getUseSpecialPad()) { if (type != ORBIS_PAD_PORT_TYPE_SPECIAL) diff --git a/src/core/libraries/pad/pad.h b/src/core/libraries/pad/pad.h index 68943b460..c24a78b93 100644 --- a/src/core/libraries/pad/pad.h +++ b/src/core/libraries/pad/pad.h @@ -3,6 +3,7 @@ #pragma once +#include #include "common/enum.h" #include "common/types.h" @@ -276,7 +277,8 @@ int PS4_SYSV_ABI scePadGetExtControllerInformation(s32 handle, OrbisPadExtendedControllerInformation* pInfo); int PS4_SYSV_ABI scePadGetExtensionUnitInfo(); int PS4_SYSV_ABI scePadGetFeatureReport(); -int PS4_SYSV_ABI scePadGetHandle(s32 userId, s32 type, s32 index); +int PS4_SYSV_ABI scePadGetHandle(Libraries::UserService::OrbisUserServiceUserId userId, s32 type, + s32 index); int PS4_SYSV_ABI scePadGetIdleCount(); int PS4_SYSV_ABI scePadGetInfo(); int PS4_SYSV_ABI scePadGetInfoByPortType(); @@ -294,8 +296,10 @@ int PS4_SYSV_ABI scePadIsMoveReproductionModel(); int PS4_SYSV_ABI scePadIsValidHandle(); int PS4_SYSV_ABI scePadMbusInit(); int PS4_SYSV_ABI scePadMbusTerm(); -int PS4_SYSV_ABI scePadOpen(s32 userId, s32 type, s32 index, const OrbisPadOpenParam* pParam); -int PS4_SYSV_ABI scePadOpenExt(s32 userId, s32 type, s32 index, const OrbisPadOpenExtParam* pParam); +int PS4_SYSV_ABI scePadOpen(Libraries::UserService::OrbisUserServiceUserId userId, s32 type, + s32 index, const OrbisPadOpenParam* pParam); +int PS4_SYSV_ABI scePadOpenExt(Libraries::UserService::OrbisUserServiceUserId userId, s32 type, + s32 index, const OrbisPadOpenExtParam* pParam); int PS4_SYSV_ABI scePadOpenExt2(); int PS4_SYSV_ABI scePadOutputReport(); int PS4_SYSV_ABI scePadRead(s32 handle, OrbisPadData* pData, s32 num); diff --git a/src/core/libraries/remote_play/remoteplay.cpp b/src/core/libraries/remote_play/remoteplay.cpp index b7402173e..14ede107a 100644 --- a/src/core/libraries/remote_play/remoteplay.cpp +++ b/src/core/libraries/remote_play/remoteplay.cpp @@ -3,6 +3,7 @@ #include "remoteplay.h" +#include #include "common/logging/log.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" @@ -54,7 +55,8 @@ int PS4_SYSV_ABI sceRemoteplayGetConnectHistory() { return ORBIS_OK; } -int PS4_SYSV_ABI sceRemoteplayGetConnectionStatus(s32 userId, int* pStatus) { +int PS4_SYSV_ABI sceRemoteplayGetConnectionStatus( + Libraries::UserService::OrbisUserServiceUserId userId, int* pStatus) { *pStatus = ORBIS_REMOTEPLAY_CONNECTION_STATUS_DISCONNECT; return ORBIS_OK; } diff --git a/src/core/libraries/remote_play/remoteplay.h b/src/core/libraries/remote_play/remoteplay.h index 979f73a9e..159d6ab58 100644 --- a/src/core/libraries/remote_play/remoteplay.h +++ b/src/core/libraries/remote_play/remoteplay.h @@ -3,6 +3,7 @@ #pragma once +#include #include "common/types.h" namespace Core::Loader { @@ -24,7 +25,8 @@ int PS4_SYSV_ABI sceRemoteplayDisconnect(); int PS4_SYSV_ABI sceRemoteplayGeneratePinCode(); int PS4_SYSV_ABI sceRemoteplayGetApMode(); int PS4_SYSV_ABI sceRemoteplayGetConnectHistory(); -int PS4_SYSV_ABI sceRemoteplayGetConnectionStatus(s32 userId, int* pStatus); +int PS4_SYSV_ABI sceRemoteplayGetConnectionStatus( + Libraries::UserService::OrbisUserServiceUserId userId, int* pStatus); int PS4_SYSV_ABI sceRemoteplayGetConnectUserId(); int PS4_SYSV_ABI sceRemoteplayGetMbusDeviceInfo(); int PS4_SYSV_ABI sceRemoteplayGetOperationStatus(); diff --git a/src/core/libraries/share_play/shareplay.h b/src/core/libraries/share_play/shareplay.h index 8b1ad5f47..d71cafb6d 100644 --- a/src/core/libraries/share_play/shareplay.h +++ b/src/core/libraries/share_play/shareplay.h @@ -21,8 +21,8 @@ struct OrbisSharePlayConnectionInfo { int mode; Libraries::NpManager::OrbisNpOnlineId hostOnlineId; Libraries::NpManager::OrbisNpOnlineId visitorOnlineId; - s32 hostUserId; - s32 visitorUserId; + Libraries::UserService::OrbisUserServiceUserId hostUserId; + Libraries::UserService::OrbisUserServiceUserId visitorUserId; }; int PS4_SYSV_ABI sceSharePlayCrashDaemon(); diff --git a/src/core/libraries/system/userservice.cpp b/src/core/libraries/system/userservice.cpp index b4bf189ea..631ac6234 100644 --- a/src/core/libraries/system/userservice.cpp +++ b/src/core/libraries/system/userservice.cpp @@ -490,7 +490,7 @@ int PS4_SYSV_ABI sceUserServiceGetImeRunCount() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceUserServiceGetInitialUser(int* user_id) { +s32 PS4_SYSV_ABI sceUserServiceGetInitialUser(OrbisUserServiceUserId* user_id) { LOG_DEBUG(Lib_UserService, "called"); if (user_id == nullptr) { LOG_ERROR(Lib_UserService, "user_id is null"); @@ -1041,7 +1041,8 @@ int PS4_SYSV_ABI sceUserServiceGetTraditionalChineseInputType() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceUserServiceGetUserColor(int user_id, OrbisUserServiceUserColor* color) { +s32 PS4_SYSV_ABI sceUserServiceGetUserColor(OrbisUserServiceUserId user_id, + OrbisUserServiceUserColor* color) { // TODO fix me better LOG_DEBUG(Lib_UserService, "called user_id = {}", user_id); if (color == nullptr) { @@ -1067,7 +1068,8 @@ int PS4_SYSV_ABI sceUserServiceGetUserGroupNum() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceUserServiceGetUserName(int user_id, char* user_name, std::size_t size) { +s32 PS4_SYSV_ABI sceUserServiceGetUserName(OrbisUserServiceUserId user_id, char* user_name, + std::size_t size) { LOG_DEBUG(Lib_UserService, "called user_id = {} ,size = {} ", user_id, size); if (user_name == nullptr) { LOG_ERROR(Lib_UserService, "user_name is null"); diff --git a/src/core/libraries/system/userservice.h b/src/core/libraries/system/userservice.h index 66ac2b69d..35038b840 100644 --- a/src/core/libraries/system/userservice.h +++ b/src/core/libraries/system/userservice.h @@ -151,7 +151,7 @@ int PS4_SYSV_ABI sceUserServiceGetImeLastUnit(); int PS4_SYSV_ABI sceUserServiceGetImePointerMode(); int PS4_SYSV_ABI sceUserServiceGetImePredictiveTextEnabled(); int PS4_SYSV_ABI sceUserServiceGetImeRunCount(); -s32 PS4_SYSV_ABI sceUserServiceGetInitialUser(int* user_id); +s32 PS4_SYSV_ABI sceUserServiceGetInitialUser(OrbisUserServiceUserId* user_id); int PS4_SYSV_ABI sceUserServiceGetIPDLeft(); int PS4_SYSV_ABI sceUserServiceGetIPDRight(); int PS4_SYSV_ABI sceUserServiceGetIsFakePlus(); @@ -258,11 +258,13 @@ int PS4_SYSV_ABI sceUserServiceGetTopMenuLimitItem(); int PS4_SYSV_ABI sceUserServiceGetTopMenuNotificationFlag(); int PS4_SYSV_ABI sceUserServiceGetTopMenuTutorialFlag(); int PS4_SYSV_ABI sceUserServiceGetTraditionalChineseInputType(); -s32 PS4_SYSV_ABI sceUserServiceGetUserColor(int user_id, OrbisUserServiceUserColor* color); +s32 PS4_SYSV_ABI sceUserServiceGetUserColor(OrbisUserServiceUserId user_id, + OrbisUserServiceUserColor* color); int PS4_SYSV_ABI sceUserServiceGetUserGroupName(); int PS4_SYSV_ABI sceUserServiceGetUserGroupNameList(); int PS4_SYSV_ABI sceUserServiceGetUserGroupNum(); -s32 PS4_SYSV_ABI sceUserServiceGetUserName(int user_id, char* user_name, std::size_t size); +s32 PS4_SYSV_ABI sceUserServiceGetUserName(OrbisUserServiceUserId user_id, char* user_name, + std::size_t size); int PS4_SYSV_ABI sceUserServiceGetUserStatus(); int PS4_SYSV_ABI sceUserServiceGetVibrationEnabled(); int PS4_SYSV_ABI sceUserServiceGetVoiceRecognitionLastUsedOsk(); diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp index da715b3bf..404fff316 100644 --- a/src/core/libraries/videoout/video_out.cpp +++ b/src/core/libraries/videoout/video_out.cpp @@ -291,7 +291,8 @@ s32 PS4_SYSV_ABI sceVideoOutGetResolutionStatus(s32 handle, SceVideoOutResolutio return ORBIS_OK; } -s32 PS4_SYSV_ABI sceVideoOutOpen(SceUserServiceUserId userId, s32 busType, s32 index, +s32 PS4_SYSV_ABI sceVideoOutOpen(Libraries::UserService::OrbisUserServiceUserId userId, s32 busType, + s32 index, const void* param) { LOG_INFO(Lib_VideoOut, "called"); ASSERT(busType == SCE_VIDEO_OUT_BUS_TYPE_MAIN); diff --git a/src/core/libraries/videoout/video_out.h b/src/core/libraries/videoout/video_out.h index 7db09530b..575c52d74 100644 --- a/src/core/libraries/videoout/video_out.h +++ b/src/core/libraries/videoout/video_out.h @@ -3,6 +3,7 @@ #pragma once +#include #include "core/libraries/kernel/equeue.h" #include "core/libraries/videoout/buffer.h" @@ -12,8 +13,6 @@ class SymbolsResolver; namespace Libraries::VideoOut { -using SceUserServiceUserId = s32; // TODO move it to proper place - // SceVideoOutBusType constexpr int SCE_VIDEO_OUT_BUS_TYPE_MAIN = 0; // Main output constexpr int SCE_VIDEO_OUT_BUS_TYPE_AUX_SOCIAL_SCREEN = 5; // Aux output for social @@ -131,8 +130,8 @@ s32 PS4_SYSV_ABI sceVideoOutWaitVblank(s32 handle); s32 PS4_SYSV_ABI sceVideoOutSubmitFlip(s32 handle, s32 bufferIndex, s32 flipMode, s64 flipArg); s32 PS4_SYSV_ABI sceVideoOutGetFlipStatus(s32 handle, FlipStatus* status); s32 PS4_SYSV_ABI sceVideoOutGetResolutionStatus(s32 handle, SceVideoOutResolutionStatus* status); -s32 PS4_SYSV_ABI sceVideoOutOpen(SceUserServiceUserId userId, s32 busType, s32 index, - const void* param); +s32 PS4_SYSV_ABI sceVideoOutOpen(Libraries::UserService::OrbisUserServiceUserId userId, s32 busType, + s32 index, const void* param); s32 PS4_SYSV_ABI sceVideoOutClose(s32 handle); s32 PS4_SYSV_ABI sceVideoOutGetEventId(const Kernel::SceKernelEvent* ev); s32 PS4_SYSV_ABI sceVideoOutGetEventData(const Kernel::SceKernelEvent* ev, s64* data); From 0e2f414cb6998116cca7b3e367176178ec3975db Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 12 Jun 2025 18:03:44 +0300 Subject: [PATCH 02/11] initial user management dialog --- CMakeLists.txt | 2 + REUSE.toml | 1 + src/images/users_icon.png | Bin 0 -> 3736 bytes src/qt_gui/main_window.cpp | 7 +++ src/qt_gui/main_window_ui.h | 6 ++ src/qt_gui/user_management_dialog.cpp | 68 ++++++++++++++++++++++ src/qt_gui/user_management_dialog.h | 20 +++++++ src/shadps4.qrc | 79 +++++++++++++------------- 8 files changed, 144 insertions(+), 39 deletions(-) create mode 100644 src/images/users_icon.png create mode 100644 src/qt_gui/user_management_dialog.cpp create mode 100644 src/qt_gui/user_management_dialog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 12ff0b53a..17d09909c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1059,6 +1059,8 @@ set(QT_GUI src/qt_gui/about_dialog.cpp src/qt_gui/gui_settings.h src/qt_gui/settings.cpp src/qt_gui/settings.h + src/qt_gui/user_management_dialog.cpp + src/qt_gui/user_management_dialog.h ${EMULATOR} ${RESOURCE_FILES} ${TRANSLATIONS} diff --git a/REUSE.toml b/REUSE.toml index 662987611..b1a5e4850 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -53,6 +53,7 @@ path = [ "src/images/refreshlist_icon.png", "src/images/settings_icon.png", "src/images/fullscreen_icon.png", + "src/images/users_icon.png", "src/images/stop_icon.png", "src/images/utils_icon.png", "src/images/shadPS4.icns", diff --git a/src/images/users_icon.png b/src/images/users_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..43e5ab73f8a9cb680d81eaa6b34402aa5214af2c GIT binary patch literal 3736 zcmb7{S5(t$62Si3IG77vC$376OH?~ zu(6!{y$DzGiGl>`8Q)<$d68^?C!g5tSR=bY004*lTR>4`v6K_1aFD)jkd+@gDAYB; z9S98#Rq*ol4s>(Hx-0kvc;v5ZivR$O-}uJ0J7EQDg%N3Dcg6azdW14c2_X}NhVP$D zmozpq;A4-^*D`*W}rxdid74Az(=jRnhbariN&E;tXE`~lRYoOv~6rPFr z=%&0Y<4*-7c#0j`wL=o^p`1VLP-D1N|>E9NCEN;6~F~30M;HPC)w9Nh2Uk+;{@tX!?Y9i zY3<}37KBvrCSMMEKyc(=z~pmQ(ofRlE*Xx!=E3H$uDg@sD;YQK;@~ls_cXDJA4UA% zqbYwHc>}G9?+R)oSO)}^nqeu&p2Xb@ni%v@K)p3FMGohoyn8T~%RuD*BFRv4X>7DW zmF0anHj#P|&An5}gjm_L;i88k?-pZfr^|5Hl@{K0!l&IX2 z1)G;mVZZLp7>>{xeOG-N}HvUDGr z=m_>H%omLm9}NsPCe5Iue$LNSmoNc|v@=07`V{U!Xhmh3x1@pQ$p9tCTlfNtM}*AIJ|qsP`m6@v`c|V znEC3HC>{=D=9;AOBk!K@d6eejw(se#-xNEpa{24V@n>I?EDUIkQ>XBL);6)+=dUsh`Px0??eg{ETZvN(TKMBG~b zn@7K8brErIN?q!Dglap?ygLRZT+Z9(mn#w0?DYOKizL5p#duLxO_BPzKBntOmYn>o z;MB;@rE^gV|Jj?anV#rN{G_6*Q)7)Yh9PQ8NN6yfEMl*$&g5%zf8M8O3DP#%_<0)_ z$V0u$vB_QUB%3o8`=q5twJ~+3^Gqh8y7@8vgG?6CK%F6Fqjv2~Ud}uowE>T$nBusK z8phLWuEGUz+rR8kyV*^*mkpjZ#$4r|B9dbHw)MMJTJmTy((;a~7esQ$NK8GhyLE~v ziQ1D|!>&Eg0e3D0At7Z-qiehlD6{PHR`W#?v{`Z}5PsmZ4v z2aSavKm*!2RfTqQ7xn0EEm7o6U-M`=tgXsT6NRR{Rs#IFns6R$fNveNH zJWh-8fxzAG^0fGmL*>Q`)S@?f-kHZnR);h(3qhu1<;kz`PnC9?KL%h{YQ)`UZ9ja9 ztf}ml#O502B*3W3RrSa@QO#%<@`e2k;@7tOO+FUniNCS*J#t<7r!{)QV9l|ABWd2bc!HBcAK!+Tzz5goM76zpAW?B&BdZQuSee06j&1L!G62aZ+1s?>Ntd_@I@ zEp%>I}P~LyAv7gZJLzHpsVYBwmBp0tDk}B!JzT6>wOKauVc~E!U`Seu4GRN z=G8D>p818=gHR=Ug@_nmGp099P4A>`X6tGj`f{UA%FsRB+yh$8cYe{#q$=^}3wys@ z==fJxNuTZpQPp>lH*&fagl&??g~@vYM3&-CDuXJoe5 zXy1%iGh&}XRrO2y$YJf_(s&=C1mR?Tr`F|XbYrj775B02jtq8DZKg0A(ZkCcP6x^o z8*1l8L)Bzw!&Hpe=HBV}|GuoGX{aT@ag+{ukr&76yr#7CT0>YvXcw~}K$|xRML!HF zjE@*XX((?>dHmh`H|w!Uv6=yzJLaI@N*>;TVQ&Wwt|{vn%|qp#b_%)FPS3Ttv%I-G~>fWdgH zj(gf&u5bISOooI_bFnLDpLi3aF5QD5_B)5SQK5qLVB)rbOM4Xa z*+`ioE2o}&m^h_e8-K0fCH}Fr;gd&peUnZ$fFBd7Z;X?NvFJr~4#Zlj|^7abGZ)|V^`;MR;sY8|2q(Iu5-=o{tv+-_~A@5nn@eNK{nXjV4G|UK4A&YDx3MMmL?rp z7JnG;#h~zu!@Rv~xQckN$;-jq=GfL^_WC*%#Yo4H2c}{B14a;4HP?~+ZwZ^5E`QyJ zB3(J8HfEQ(vvxs@PNftKhNqYqmcIwKoSzMWL}y{ z+Lb@M5!Nfl?Hsk_0HkVvae;(wm-vB#ke!_u;8ys5(sz|QSLnt(`(rgcZ*}*DZ2upW e`Y+P@6`fSXJs1?cVRJ%}fU&;WjVe84?7sl_W%Ww{ literal 0 HcmV?d00001 diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index c6da49182..10004da99 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -27,6 +27,7 @@ #ifdef ENABLE_DISCORD_RPC #include "common/discord_rpc_handler.h" #endif +#include "user_management_dialog.h" MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); @@ -440,6 +441,11 @@ void MainWindow::CreateConnects() { settingsDialog->exec(); }); + connect(ui->userManagement, &QAction::triggered, this, [this]() { + user_manager_dialog user_manager(this); + user_manager.exec(); + }); + connect(ui->settingsButton, &QPushButton::clicked, this, [this]() { auto settingsDialog = new SettingsDialog(m_gui_settings, m_compat_info, this); @@ -1103,6 +1109,7 @@ void MainWindow::SetUiIcons(bool isWhite) { ui->menuGame_List_Mode->setIcon(RecolorIcon(ui->menuGame_List_Mode->icon(), isWhite)); ui->trophyViewerAct->setIcon(RecolorIcon(ui->trophyViewerAct->icon(), isWhite)); ui->configureAct->setIcon(RecolorIcon(ui->configureAct->icon(), isWhite)); + ui->userManagement->setIcon(RecolorIcon(ui->userManagement->icon(), isWhite)); ui->addElfFolderAct->setIcon(RecolorIcon(ui->addElfFolderAct->icon(), isWhite)); } diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index 4ce71013e..37ce273ac 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -32,6 +32,7 @@ public: #endif QAction* aboutAct; QAction* configureAct; + QAction* userManagement; QAction* setThemeDark; QAction* setThemeLight; QAction* setThemeGreen; @@ -155,6 +156,9 @@ public: configureAct = new QAction(MainWindow); configureAct->setObjectName("configureAct"); configureAct->setIcon(QIcon(":images/settings_icon.png")); + userManagement = new QAction(MainWindow); + userManagement->setObjectName("userManagement"); + userManagement->setIcon(QIcon(":images/users_icon.png")); setThemeDark = new QAction(MainWindow); setThemeDark->setObjectName("setThemeDark"); setThemeDark->setCheckable(true); @@ -329,6 +333,7 @@ public: menuGame_List_Mode->addAction(setlistModeGridAct); menuGame_List_Mode->addAction(setlistElfAct); menuSettings->addAction(configureAct); + menuSettings->addAction(userManagement); menuSettings->addAction(gameInstallPathAct); menuSettings->addAction(menuUtils->menuAction()); menuUtils->addAction(downloadCheatsPatchesAct); @@ -355,6 +360,7 @@ public: #endif aboutAct->setText(QCoreApplication::translate("MainWindow", "About shadPS4", nullptr)); configureAct->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr)); + userManagement->setText(QCoreApplication::translate("MainWindow", "User Management", nullptr)); #if QT_CONFIG(tooltip) #endif // QT_CONFIG(tooltip) menuRecent->setTitle(QCoreApplication::translate("MainWindow", "Recent Games", nullptr)); diff --git a/src/qt_gui/user_management_dialog.cpp b/src/qt_gui/user_management_dialog.cpp new file mode 100644 index 000000000..735b72b1d --- /dev/null +++ b/src/qt_gui/user_management_dialog.cpp @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "user_management_dialog.h" + +user_manager_dialog::user_manager_dialog(QWidget* parent) : QDialog(parent) { + setWindowTitle(tr("User Manager")); + setMinimumSize(QSize(500, 400)); + setModal(true); + + Init(); +} + +void user_manager_dialog::Init() { + // Table + m_table = new QTableWidget(this); + m_table->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection); + m_table->setSelectionBehavior(QAbstractItemView::SelectRows); + m_table->setContextMenuPolicy(Qt::CustomContextMenu); + m_table->setColumnCount(2); + m_table->setCornerButtonEnabled(false); + m_table->setAlternatingRowColors(true); + m_table->setHorizontalHeaderLabels(QStringList() << tr("User ID") << tr("User Name")); + m_table->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); + m_table->horizontalHeader()->setStretchLastSection(true); + m_table->horizontalHeader()->setDefaultSectionSize(150); + m_table->installEventFilter(this); + + QPushButton* push_remove_user = new QPushButton(tr("&Delete User"), this); + push_remove_user->setAutoDefault(false); + + QPushButton* push_create_user = new QPushButton(tr("&Create User"), this); + push_create_user->setAutoDefault(false); + + QPushButton* push_rename_user = new QPushButton(tr("&Rename User"), this); + push_rename_user->setAutoDefault(false); + + QPushButton* push_close = new QPushButton(tr("&Close"), this); + push_close->setAutoDefault(false); + + // Button Layout + QHBoxLayout* hbox_buttons = new QHBoxLayout(); + hbox_buttons->addWidget(push_create_user); + hbox_buttons->addWidget(push_rename_user); + hbox_buttons->addWidget(push_remove_user); + hbox_buttons->addStretch(); + hbox_buttons->addWidget(push_close); + + // Main Layout + QVBoxLayout* vbox_main = new QVBoxLayout(); + vbox_main->setAlignment(Qt::AlignCenter); + vbox_main->addWidget(m_table); + vbox_main->addLayout(hbox_buttons); + setLayout(vbox_main); +} \ No newline at end of file diff --git a/src/qt_gui/user_management_dialog.h b/src/qt_gui/user_management_dialog.h new file mode 100644 index 000000000..ee0d3d4c1 --- /dev/null +++ b/src/qt_gui/user_management_dialog.h @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +class user_manager_dialog : public QDialog { + Q_OBJECT + +public: + explicit user_manager_dialog(QWidget* parent = nullptr); + +private: + void Init(); + + QTableWidget* m_table = nullptr; + +}; \ No newline at end of file diff --git a/src/shadps4.qrc b/src/shadps4.qrc index 2aee394c8..09bc2acf8 100644 --- a/src/shadps4.qrc +++ b/src/shadps4.qrc @@ -1,41 +1,42 @@ - - images/shadps4.ico - images/shadps4.png - images/about_icon.png - images/dump_icon.png - images/play_icon.png - images/pause_icon.png - images/stop_icon.png - images/utils_icon.png - images/file_icon.png - images/folder_icon.png - images/themes_icon.png - images/iconsize_icon.png - images/list_icon.png - images/grid_icon.png - images/exit_icon.png - images/settings_icon.png - images/controller_icon.png - images/restart_game_icon.png - images/update_icon.png - images/list_mode_icon.png - images/flag_jp.png - images/flag_eu.png - images/flag_unk.png - images/flag_us.png - images/flag_world.png - images/flag_china.png - images/github.png - images/discord.png - images/ko-fi.png - images/youtube.png - images/website.png - images/ps4_controller.png - images/keyboard_icon.png - images/KBM.png - images/fullscreen_icon.png - images/refreshlist_icon.png - images/trophy_icon.png - + + images/shadps4.ico + images/shadps4.png + images/about_icon.png + images/dump_icon.png + images/play_icon.png + images/pause_icon.png + images/stop_icon.png + images/utils_icon.png + images/file_icon.png + images/folder_icon.png + images/themes_icon.png + images/iconsize_icon.png + images/list_icon.png + images/grid_icon.png + images/exit_icon.png + images/settings_icon.png + images/users_icon.png + images/controller_icon.png + images/restart_game_icon.png + images/update_icon.png + images/list_mode_icon.png + images/flag_jp.png + images/flag_eu.png + images/flag_unk.png + images/flag_us.png + images/flag_world.png + images/flag_china.png + images/github.png + images/discord.png + images/ko-fi.png + images/youtube.png + images/website.png + images/ps4_controller.png + images/keyboard_icon.png + images/KBM.png + images/fullscreen_icon.png + images/refreshlist_icon.png + images/trophy_icon.png + From dbaf2cc38edd53d0b1963ce0434b35504e2e4103 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 12 Jun 2025 18:10:47 +0300 Subject: [PATCH 03/11] clang fix --- src/core/libraries/audio3d/audio3d.cpp | 4 ++-- src/core/libraries/ime/error_dialog.cpp | 2 +- src/core/libraries/ime/ime_common.h | 2 +- src/core/libraries/np_manager/np_manager.h | 2 +- src/core/libraries/videoout/video_out.cpp | 3 +-- src/qt_gui/main_window_ui.h | 3 ++- src/qt_gui/user_management_dialog.h | 1 - 7 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/core/libraries/audio3d/audio3d.cpp b/src/core/libraries/audio3d/audio3d.cpp index 2a2552e0d..332386be2 100644 --- a/src/core/libraries/audio3d/audio3d.cpp +++ b/src/core/libraries/audio3d/audio3d.cpp @@ -31,8 +31,8 @@ s32 PS4_SYSV_ABI sceAudio3dAudioOutClose(const s32 handle) { s32 PS4_SYSV_ABI sceAudio3dAudioOutOpen( const OrbisAudio3dPortId port_id, const Libraries::UserService::OrbisUserServiceUserId user_id, - s32 type, const s32 index, const u32 len, const u32 freq, - const AudioOut::OrbisAudioOutParamExtendedInformation param) { + s32 type, const s32 index, const u32 len, const u32 freq, + const AudioOut::OrbisAudioOutParamExtendedInformation param) { LOG_INFO(Lib_Audio3d, "called, port_id = {}, user_id = {}, type = {}, index = {}, len = {}, freq = {}", port_id, user_id, type, index, len, freq); diff --git a/src/core/libraries/ime/error_dialog.cpp b/src/core/libraries/ime/error_dialog.cpp index 913b4bfe8..a5a0223f3 100644 --- a/src/core/libraries/ime/error_dialog.cpp +++ b/src/core/libraries/ime/error_dialog.cpp @@ -5,6 +5,7 @@ #include #include +#include #include "common/assert.h" #include "common/logging/log.h" #include "core/libraries/error_codes.h" @@ -13,7 +14,6 @@ #include "error_dialog.h" #include "imgui/imgui_layer.h" #include "imgui/imgui_std.h" -#include static constexpr ImVec2 BUTTON_SIZE{100.0f, 30.0f}; diff --git a/src/core/libraries/ime/ime_common.h b/src/core/libraries/ime/ime_common.h index ee00ad8ae..227f8aeeb 100644 --- a/src/core/libraries/ime/ime_common.h +++ b/src/core/libraries/ime/ime_common.h @@ -3,9 +3,9 @@ #pragma once +#include #include "common/types.h" #include "core/libraries/rtc/rtc.h" -#include enum class OrbisImeType : u32 { Default = 0, diff --git a/src/core/libraries/np_manager/np_manager.h b/src/core/libraries/np_manager/np_manager.h index 705c91e79..a3f12cac4 100644 --- a/src/core/libraries/np_manager/np_manager.h +++ b/src/core/libraries/np_manager/np_manager.h @@ -3,8 +3,8 @@ #pragma once -#include "common/types.h" #include +#include "common/types.h" namespace Core::Loader { class SymbolsResolver; diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp index 404fff316..ac8f58959 100644 --- a/src/core/libraries/videoout/video_out.cpp +++ b/src/core/libraries/videoout/video_out.cpp @@ -292,8 +292,7 @@ s32 PS4_SYSV_ABI sceVideoOutGetResolutionStatus(s32 handle, SceVideoOutResolutio } s32 PS4_SYSV_ABI sceVideoOutOpen(Libraries::UserService::OrbisUserServiceUserId userId, s32 busType, - s32 index, - const void* param) { + s32 index, const void* param) { LOG_INFO(Lib_VideoOut, "called"); ASSERT(busType == SCE_VIDEO_OUT_BUS_TYPE_MAIN); diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index 37ce273ac..604a9dc91 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -360,7 +360,8 @@ public: #endif aboutAct->setText(QCoreApplication::translate("MainWindow", "About shadPS4", nullptr)); configureAct->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr)); - userManagement->setText(QCoreApplication::translate("MainWindow", "User Management", nullptr)); + userManagement->setText( + QCoreApplication::translate("MainWindow", "User Management", nullptr)); #if QT_CONFIG(tooltip) #endif // QT_CONFIG(tooltip) menuRecent->setTitle(QCoreApplication::translate("MainWindow", "Recent Games", nullptr)); diff --git a/src/qt_gui/user_management_dialog.h b/src/qt_gui/user_management_dialog.h index ee0d3d4c1..9190752eb 100644 --- a/src/qt_gui/user_management_dialog.h +++ b/src/qt_gui/user_management_dialog.h @@ -16,5 +16,4 @@ private: void Init(); QTableWidget* m_table = nullptr; - }; \ No newline at end of file From 7d6b79b19e568ee18fe5acb67595ba34f8825b6f Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 12 Jun 2025 18:50:12 +0300 Subject: [PATCH 04/11] adding home dir --- src/common/path_util.cpp | 1 + src/common/path_util.h | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/common/path_util.cpp b/src/common/path_util.cpp index 3270c24dd..383e15b61 100644 --- a/src/common/path_util.cpp +++ b/src/common/path_util.cpp @@ -137,6 +137,7 @@ static auto UserPaths = [] { create_path(PathType::PatchesDir, user_dir / PATCHES_DIR); create_path(PathType::MetaDataDir, user_dir / METADATA_DIR); create_path(PathType::CustomTrophy, user_dir / CUSTOM_TROPHY); + create_path(PathType::HomeDir, user_dir / HOME_DIR); std::ofstream notice_file(user_dir / CUSTOM_TROPHY / "Notice.txt"); if (notice_file.is_open()) { diff --git a/src/common/path_util.h b/src/common/path_util.h index b8053a229..8418a74f5 100644 --- a/src/common/path_util.h +++ b/src/common/path_util.h @@ -27,6 +27,7 @@ enum class PathType { PatchesDir, // Where patches are stored. MetaDataDir, // Where game metadata (e.g. trophies and menu backgrounds) is stored. CustomTrophy, // Where custom files for trophies are stored. + HomeDir, // PS4 home directory }; constexpr auto PORTABLE_DIR = "user"; @@ -44,6 +45,7 @@ constexpr auto CHEATS_DIR = "cheats"; constexpr auto PATCHES_DIR = "patches"; constexpr auto METADATA_DIR = "game_data"; constexpr auto CUSTOM_TROPHY = "custom_trophy"; +constexpr auto HOME_DIR = "home"; // Filenames constexpr auto LOG_FILE = "shad_log.txt"; From 4bccf7a2db94e0dc71fbacd5431cc0f4ddd590aa Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 13 Jun 2025 17:51:45 +0300 Subject: [PATCH 05/11] some more draft work --- CMakeLists.txt | 2 ++ src/common/config.cpp | 5 +++++ src/common/config.h | 1 + src/core/user_account.cpp | 18 ++++++++++++++++++ src/core/user_account.h | 29 +++++++++++++++++++++++++++++ src/qt_gui/main.cpp | 6 ++++++ 6 files changed, 61 insertions(+) create mode 100644 src/core/user_account.cpp create mode 100644 src/core/user_account.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 17d09909c..2c6d03015 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -794,6 +794,8 @@ set(CORE src/core/aerolib/stubs.cpp src/core/thread.h src/core/tls.cpp src/core/tls.h + src/core/user_account.cpp + src/core/user_account.h ) if (ARCHITECTURE STREQUAL "x86_64") diff --git a/src/common/config.cpp b/src/common/config.cpp index d8f46a17d..e8d4bd902 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -74,7 +74,12 @@ static bool compatibilityData = false; static bool checkCompatibilityOnStartup = false; static std::string trophyKey; static bool isPSNSignedIn = false; +std::string userid{"00000001"}; +std::string selectedUserid{"00000001"}; +std::string getDefaultUserId() { + return userid; +} // Gui static bool load_game_size = true; static std::vector settings_install_dirs = {}; diff --git a/src/common/config.h b/src/common/config.h index 414bc122e..63d09a9ce 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -34,6 +34,7 @@ bool getEnableDiscordRPC(); bool getCompatibilityEnabled(); bool getCheckCompatibilityOnStartup(); bool getPSNSignedIn(); +std::string getDefaultUserId(); std::string getLogFilter(); std::string getLogType(); diff --git a/src/core/user_account.cpp b/src/core/user_account.cpp new file mode 100644 index 000000000..ee4f4711c --- /dev/null +++ b/src/core/user_account.cpp @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include "user_account.h" + +user_account::user_account(const std::string& user_id) { + // Setting userId. + m_user_id = user_id; + // TODO +} + +std::map user_account::GetUserAccounts(const std::string& base_dir) { + std::map user_list; + // TODO + + return user_list; +} diff --git a/src/core/user_account.h b/src/core/user_account.h new file mode 100644 index 000000000..1689c416d --- /dev/null +++ b/src/core/user_account.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +#include +#include +#include "common/types.h" + +class user_account { +public: + explicit user_account(const std::string& user_id = "00000001"); + + const std::string& GetUserId() const { + return m_user_id; + } + const std::string& GetUserDir() const { + return m_user_dir; + } + const std::string& GetUsername() const { + return m_username; + } + + static std::map GetUserAccounts(const std::string& base_dir); + +private: + std::string m_user_id; + std::string m_user_dir; + std::string m_username; +}; diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index b7de517e8..a527874ee 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -32,6 +32,12 @@ int main(int argc, char* argv[]) { const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); Config::load(user_dir / "config.toml"); + const auto& default_user_dir = + Common::FS::GetUserPath(Common::FS::PathType::HomeDir) / Config::getDefaultUserId(); + if (!std::filesystem::exists(default_user_dir)) { + std::filesystem::create_directory(default_user_dir); + } + bool has_command_line_argument = argc > 1; bool show_gui = false, has_game_argument = false; std::string game_path; From 7b0d6c4bf8753fd5ba2181579dd2f94cecfe0766 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 13 Jun 2025 19:10:42 +0300 Subject: [PATCH 06/11] use json to read local file --- .gitmodules | 3 +++ CMakeLists.txt | 2 +- externals/CMakeLists.txt | 4 ++++ externals/json | 1 + src/core/user_account.cpp | 26 +++++++++++++++++++++++++- 5 files changed, 34 insertions(+), 2 deletions(-) create mode 160000 externals/json diff --git a/.gitmodules b/.gitmodules index 25b5d307b..716d3fb95 100644 --- a/.gitmodules +++ b/.gitmodules @@ -106,3 +106,6 @@ [submodule "externals/libusb"] path = externals/libusb url = https://github.com/libusb/libusb-cmake.git +[submodule "externals/json"] + path = externals/json + url = https://github.com/nlohmann/json.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c6d03015..b2a380471 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1104,7 +1104,7 @@ endif() create_target_directory_groups(shadps4) target_link_libraries(shadps4 PRIVATE magic_enum::magic_enum fmt::fmt toml11::toml11 tsl::robin_map xbyak::xbyak Tracy::TracyClient RenderDoc::API FFmpeg::ffmpeg Dear_ImGui gcn half::half ZLIB::ZLIB PNG::PNG) -target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers libusb::usb) +target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers libusb::usb nlohmann_json::nlohmann_json) target_compile_definitions(shadps4 PRIVATE IMGUI_USER_CONFIG="imgui/imgui_config.h") target_compile_definitions(Dear_ImGui PRIVATE IMGUI_USER_CONFIG="${PROJECT_SOURCE_DIR}/src/imgui/imgui_config.h") diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 89b0fbfdd..a283769b5 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -230,3 +230,7 @@ if (APPLE) add_subdirectory(MoltenVK) endif() endif() + +#nlohmann json +set(JSON_BuildTests OFF CACHE INTERNAL "") +add_subdirectory(json) \ No newline at end of file diff --git a/externals/json b/externals/json new file mode 160000 index 000000000..568b708fd --- /dev/null +++ b/externals/json @@ -0,0 +1 @@ +Subproject commit 568b708fd46deeb23a959381393a7564f1586588 diff --git a/src/core/user_account.cpp b/src/core/user_account.cpp index ee4f4711c..83bd9bf4c 100644 --- a/src/core/user_account.cpp +++ b/src/core/user_account.cpp @@ -2,12 +2,36 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include +#include +#include +#include "common/config.h" #include "user_account.h" +using json = nlohmann::json; + user_account::user_account(const std::string& user_id) { // Setting userId. m_user_id = user_id; - // TODO + + m_user_dir = Common::FS::GetUserPathString(Common::FS::PathType::HomeDir) + "/" + + Config::getDefaultUserId() + "/"; + + Common::FS::IOFile userfile(m_user_dir + "localuser.json", Common::FS::FileAccessMode::Read); + if (userfile.IsOpen()) { + nlohmann::json jsonfile; + try { + jsonfile = nlohmann::json::parse(userfile.ReadString(userfile.GetSize())); + } catch (const nlohmann::json::parse_error& e) { + // TODO error code + } + userfile.Close(); + m_username = jsonfile.value("username", "shadps4"); + if (m_username.length() > 16) // max of 16 chars allowed + { + m_username = m_username.substr(0, 16); // substring 16 only characters to display + } + } } std::map user_account::GetUserAccounts(const std::string& base_dir) { From 32fcd80a66923544f5e6ebc1bb27dbebb9a162e6 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 13 Jun 2025 21:02:07 +0300 Subject: [PATCH 07/11] added createdDefaultUser --- src/core/user_account.cpp | 22 ++++++++++++++++++++-- src/core/user_account.h | 1 + src/main.cpp | 3 +++ src/qt_gui/main.cpp | 7 ++----- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/core/user_account.cpp b/src/core/user_account.cpp index 83bd9bf4c..bbf703fe2 100644 --- a/src/core/user_account.cpp +++ b/src/core/user_account.cpp @@ -14,8 +14,8 @@ user_account::user_account(const std::string& user_id) { // Setting userId. m_user_id = user_id; - m_user_dir = Common::FS::GetUserPathString(Common::FS::PathType::HomeDir) + "/" + - Config::getDefaultUserId() + "/"; + m_user_dir = + Common::FS::GetUserPathString(Common::FS::PathType::HomeDir) + "/" + m_user_id + "/"; Common::FS::IOFile userfile(m_user_dir + "localuser.json", Common::FS::FileAccessMode::Read); if (userfile.IsOpen()) { @@ -40,3 +40,21 @@ std::map user_account::GetUserAccounts(const std::string& bas return user_list; } + +void user_account::createdDefaultUser() { + const auto& default_user_dir = + Common::FS::GetUserPath(Common::FS::PathType::HomeDir) / Config::getDefaultUserId(); + if (!std::filesystem::exists(default_user_dir)) { + std::filesystem::create_directory(default_user_dir); + Common::FS::IOFile userfile(default_user_dir / "localuser.json", + Common::FS::FileAccessMode::Write); + nlohmann::json jsonfile; + + // Assign values + jsonfile["username"] = "shadps4"; + + std::string jsonStr = jsonfile.dump(4); + userfile.WriteString(jsonStr); + userfile.Close(); + } +} diff --git a/src/core/user_account.h b/src/core/user_account.h index 1689c416d..fb965c0a3 100644 --- a/src/core/user_account.h +++ b/src/core/user_account.h @@ -21,6 +21,7 @@ public: } static std::map GetUserAccounts(const std::string& base_dir); + static void createdDefaultUser(); private: std::string m_user_id; diff --git a/src/main.cpp b/src/main.cpp index fe245d104..931709cdc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,6 +7,7 @@ #include "system_error" #include "unordered_map" +#include #include #include "common/config.h" #include "common/memory_patcher.h" @@ -27,6 +28,8 @@ int main(int argc, char* argv[]) { const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); Config::load(user_dir / "config.toml"); + user_account::createdDefaultUser(); + bool has_game_argument = false; std::string game_path; std::vector game_args{}; diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index a527874ee..0fe2325f0 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -5,6 +5,7 @@ #include "system_error" #include "unordered_map" +#include #include "common/config.h" #include "common/memory_patcher.h" #include "core/file_sys/fs.h" @@ -32,11 +33,7 @@ int main(int argc, char* argv[]) { const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); Config::load(user_dir / "config.toml"); - const auto& default_user_dir = - Common::FS::GetUserPath(Common::FS::PathType::HomeDir) / Config::getDefaultUserId(); - if (!std::filesystem::exists(default_user_dir)) { - std::filesystem::create_directory(default_user_dir); - } + user_account::createdDefaultUser(); bool has_command_line_argument = argc > 1; bool show_gui = false, has_game_argument = false; From 5990d0c02abd26c2e6df2004ae4cfd2dbb08c043 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sat, 21 Jun 2025 11:09:47 +0300 Subject: [PATCH 08/11] fixup merge --- src/common/config.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/config.h b/src/common/config.h index 38114983f..62ce63466 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -129,5 +129,6 @@ void setDefaultValues(); // todo: name and function location pending std::filesystem::path GetFoolproofKbmConfigFile(const std::string& game_id = ""); +std::string getDefaultUserId(); -}; // namespace Config +}; // namespace Config \ No newline at end of file From a542c3294db1250c73b55c86fcee9bf008944a43 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 22 Jun 2025 22:51:06 +0300 Subject: [PATCH 09/11] Update shadps4.qrc --- src/shadps4.qrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shadps4.qrc b/src/shadps4.qrc index c5ea41947..1c08e7fa6 100644 --- a/src/shadps4.qrc +++ b/src/shadps4.qrc @@ -37,7 +37,7 @@ images/fullscreen_icon.png images/refreshlist_icon.png images/favorite_icon.png - images/trophy_icon.png + images/trophy_icon.png images/users_icon.png From 93feb220ea52eabc3a510ce4356ffd7d8e6766d3 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 24 Jun 2025 00:35:23 +0300 Subject: [PATCH 10/11] some more WIP in gui --- src/common/config.cpp | 4 ++++ src/common/config.h | 1 + src/qt_gui/user_management_dialog.cpp | 10 +++++++--- src/qt_gui/user_management_dialog.h | 1 + 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 6cb921b97..57eef8590 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -79,6 +79,10 @@ std::string selectedUserid{"00000001"}; std::string getDefaultUserId() { return userid; } +std::string getActiveUserId() { + return selectedUserid; +} + // Gui static bool load_game_size = true; static std::vector settings_install_dirs = {}; diff --git a/src/common/config.h b/src/common/config.h index 62ce63466..959565a1d 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -130,5 +130,6 @@ void setDefaultValues(); // todo: name and function location pending std::filesystem::path GetFoolproofKbmConfigFile(const std::string& game_id = ""); std::string getDefaultUserId(); +std::string getActiveUserId(); }; // namespace Config \ No newline at end of file diff --git a/src/qt_gui/user_management_dialog.cpp b/src/qt_gui/user_management_dialog.cpp index 735b72b1d..3b9b72fc2 100644 --- a/src/qt_gui/user_management_dialog.cpp +++ b/src/qt_gui/user_management_dialog.cpp @@ -45,8 +45,8 @@ void user_manager_dialog::Init() { QPushButton* push_create_user = new QPushButton(tr("&Create User"), this); push_create_user->setAutoDefault(false); - QPushButton* push_rename_user = new QPushButton(tr("&Rename User"), this); - push_rename_user->setAutoDefault(false); + QPushButton* push_edit_user = new QPushButton(tr("&Edit User"), this); + push_edit_user->setAutoDefault(false); QPushButton* push_close = new QPushButton(tr("&Close"), this); push_close->setAutoDefault(false); @@ -54,7 +54,7 @@ void user_manager_dialog::Init() { // Button Layout QHBoxLayout* hbox_buttons = new QHBoxLayout(); hbox_buttons->addWidget(push_create_user); - hbox_buttons->addWidget(push_rename_user); + hbox_buttons->addWidget(push_edit_user); hbox_buttons->addWidget(push_remove_user); hbox_buttons->addStretch(); hbox_buttons->addWidget(push_close); @@ -65,4 +65,8 @@ void user_manager_dialog::Init() { vbox_main->addWidget(m_table); vbox_main->addLayout(hbox_buttons); setLayout(vbox_main); + + // get active user + m_active_user = Config::getActiveUserId(); + } \ No newline at end of file diff --git a/src/qt_gui/user_management_dialog.h b/src/qt_gui/user_management_dialog.h index 9190752eb..51332aa1e 100644 --- a/src/qt_gui/user_management_dialog.h +++ b/src/qt_gui/user_management_dialog.h @@ -16,4 +16,5 @@ private: void Init(); QTableWidget* m_table = nullptr; + std::string m_active_user; }; \ No newline at end of file From 731196f4ab903d36b2c93045bca728f146097b24 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 24 Jun 2025 21:37:22 +0300 Subject: [PATCH 11/11] populate table with active user --- src/core/user_account.cpp | 14 ++++++- src/core/user_account.h | 10 +++++ src/qt_gui/user_management_dialog.cpp | 56 ++++++++++++++++++++++++++- src/qt_gui/user_management_dialog.h | 3 ++ 4 files changed, 81 insertions(+), 2 deletions(-) diff --git a/src/core/user_account.cpp b/src/core/user_account.cpp index bbf703fe2..88bdb1bf9 100644 --- a/src/core/user_account.cpp +++ b/src/core/user_account.cpp @@ -36,7 +36,19 @@ user_account::user_account(const std::string& user_id) { std::map user_account::GetUserAccounts(const std::string& base_dir) { std::map user_list; - // TODO + for (const auto& entry : std::filesystem::directory_iterator(base_dir)) { + if (entry.is_directory()) { + std::string folder_name = entry.path().filename().string(); + const u32 key = check_user(folder_name); + if (key == 0) { + continue; + } + const std::filesystem::path account_file = entry.path() / "localuser.json"; + if (std::filesystem::exists(account_file)) { + user_list.emplace(key, user_account(folder_name)); + } + } + } return user_list; } diff --git a/src/core/user_account.h b/src/core/user_account.h index fb965c0a3..5ed807a14 100644 --- a/src/core/user_account.h +++ b/src/core/user_account.h @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include #include #include "common/types.h" @@ -22,6 +23,15 @@ public: static std::map GetUserAccounts(const std::string& base_dir); static void createdDefaultUser(); + static u32 check_user(const std::string& user) { + u32 id = 0; + + if (user.size() == 8) { + std::from_chars(&user.front(), &user.back() + 1, id); + } + + return id; + } private: std::string m_user_id; diff --git a/src/qt_gui/user_management_dialog.cpp b/src/qt_gui/user_management_dialog.cpp index 3b9b72fc2..0fa9986d9 100644 --- a/src/qt_gui/user_management_dialog.cpp +++ b/src/qt_gui/user_management_dialog.cpp @@ -1,3 +1,4 @@ +#include "user_management_dialog.h" // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -14,6 +15,8 @@ #include #include #include +#include +#include "common/config.h" #include "user_management_dialog.h" user_manager_dialog::user_manager_dialog(QWidget* parent) : QDialog(parent) { @@ -68,5 +71,56 @@ void user_manager_dialog::Init() { // get active user m_active_user = Config::getActiveUserId(); + RefreshTable(); +} +void user_manager_dialog::RefreshTable() { -} \ No newline at end of file + // For indicating logged-in user. + QFont bold_font; + bold_font.setBold(true); + + m_user_list.clear(); + const auto& home_dir = Common::FS::GetUserPathString(Common::FS::PathType::HomeDir); + m_user_list = user_account::GetUserAccounts(home_dir); + + // Clear and then repopulate the table with the list gathered above. + m_table->setRowCount(static_cast(m_user_list.size())); + + int row = 0; + for (auto& [id, account] : m_user_list) { + QTableWidgetItem* user_id_item = + new QTableWidgetItem(QString::fromStdString(account.GetUserId())); + user_id_item->setData(Qt::UserRole, id); + user_id_item->setFlags(user_id_item->flags() & ~Qt::ItemIsEditable); + m_table->setItem(row, 0, user_id_item); + + QTableWidgetItem* username_item = + new QTableWidgetItem(QString::fromStdString(account.GetUsername())); + username_item->setData(Qt::UserRole, id); + username_item->setFlags(username_item->flags() & ~Qt::ItemIsEditable); + m_table->setItem(row, 1, username_item); + + // make bold the user that is active + if (m_active_user.starts_with(account.GetUserId())) { + user_id_item->setFont(bold_font); + username_item->setFont(bold_font); + } + ++row; + } + + // GUI resizing + m_table->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents); + m_table->verticalHeader()->resizeSections(QHeaderView::ResizeToContents); + + const QSize table_size(m_table->verticalHeader()->width() + + m_table->horizontalHeader()->length() + m_table->frameWidth() * 2, + m_table->horizontalHeader()->height() + + m_table->verticalHeader()->length() + m_table->frameWidth() * 2); + + const QSize preferred_size = + minimumSize().expandedTo(sizeHint() - m_table->sizeHint() + table_size).expandedTo(size()); + const QSize max_size(preferred_size.width(), + static_cast(QGuiApplication::primaryScreen()->size().height() * 0.6)); + + resize(preferred_size.boundedTo(max_size)); +} diff --git a/src/qt_gui/user_management_dialog.h b/src/qt_gui/user_management_dialog.h index 51332aa1e..3c6848a4b 100644 --- a/src/qt_gui/user_management_dialog.h +++ b/src/qt_gui/user_management_dialog.h @@ -5,6 +5,7 @@ #include #include +#include class user_manager_dialog : public QDialog { Q_OBJECT @@ -14,7 +15,9 @@ public: private: void Init(); + void RefreshTable(); QTableWidget* m_table = nullptr; std::string m_active_user; + std::map m_user_list; }; \ No newline at end of file