From bd4824f0bdaf625675465d542fc41f3436ad9ff2 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 7 Apr 2026 19:00:04 +0300 Subject: [PATCH] more fixups --- .../np_profile_dialog/np_profile_dialog.cpp | 40 ++++++++++++++----- .../np/np_profile_dialog/np_profile_dialog.h | 13 +++++- .../np_profile_dialog_ui.cpp | 23 +++++++---- .../np_profile_dialog/np_profile_dialog_ui.h | 10 +++-- 4 files changed, 64 insertions(+), 22 deletions(-) diff --git a/src/core/libraries/np/np_profile_dialog/np_profile_dialog.cpp b/src/core/libraries/np/np_profile_dialog/np_profile_dialog.cpp index 06b7af5d0..f35f484b6 100644 --- a/src/core/libraries/np/np_profile_dialog/np_profile_dialog.cpp +++ b/src/core/libraries/np/np_profile_dialog/np_profile_dialog.cpp @@ -13,8 +13,7 @@ namespace Libraries::Np::NpProfileDialog { static auto g_status = Libraries::CommonDialog::Status::NONE; static NpProfileDialogState g_state{}; -// static DialogResult g_result{}; -static int g_result = 0; // TODO use real result when implementing dialog +static OrbisNpProfileDialogResult g_result{}; static NpProfileDialogUi g_profile_dialog_ui; Libraries::CommonDialog::Error PS4_SYSV_ABI @@ -27,8 +26,11 @@ sceNpProfileDialogOpen(OrbisNpProfileDialogParam* param) { LOG_ERROR(Lib_NpProfileDialog, "(STUBBED) called"); NpProfileDialogState state{}; state.onlineId = std::string(param->targetOnlineId.data); + state.hasAccountId = false; state.userId = param->userId; g_state = state; + g_result = {}; + g_result.userData = param->userData; g_status = Libraries::CommonDialog::Status::RUNNING; g_profile_dialog_ui = NpProfileDialogUi(&g_state, &g_status, &g_result); return Libraries::CommonDialog::Error::OK; @@ -39,13 +41,18 @@ Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogClose() { if (g_status != Libraries::CommonDialog::Status::RUNNING) { return Libraries::CommonDialog::Error::NOT_RUNNING; } - g_profile_dialog_ui.Finish(0); + g_profile_dialog_ui.Finish(Libraries::CommonDialog::Result::OK); return Libraries::CommonDialog::Error::OK; } -s32 PS4_SYSV_ABI sceNpProfileDialogGetResult() { - LOG_ERROR(Lib_NpProfileDialog, "(STUBBED) called"); - return ORBIS_OK; +Libraries::CommonDialog::Error PS4_SYSV_ABI +sceNpProfileDialogGetResult(OrbisNpProfileDialogResult* result) { + LOG_DEBUG(Lib_NpProfileDialog, "called"); + if (result == nullptr) { + return Libraries::CommonDialog::Error::PARAM_INVALID; + } + *result = g_result; + return Libraries::CommonDialog::Error::OK; } Libraries::CommonDialog::Status PS4_SYSV_ABI sceNpProfileDialogGetStatus() { @@ -69,9 +76,24 @@ Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogInitialize() { return Libraries::CommonDialog::Error::OK; } -s32 PS4_SYSV_ABI sceNpProfileDialogOpenA(OrbisNpProfileDialogParamA* param) { +Libraries::CommonDialog::Error PS4_SYSV_ABI +sceNpProfileDialogOpenA(OrbisNpProfileDialogParamA* param) { + if (g_status != Libraries::CommonDialog::Status::INITIALIZED && + g_status != Libraries::CommonDialog::Status::FINISHED) { + LOG_INFO(Lib_NpProfileDialog, "called without initialize"); + return Libraries::CommonDialog::Error::INVALID_STATE; + } LOG_ERROR(Lib_NpProfileDialog, "(STUBBED) called"); - return ORBIS_OK; + NpProfileDialogState state{}; + state.accountId = param->targetAccountId; + state.hasAccountId = true; + state.userId = param->userId; + g_state = state; + g_result = {}; + g_result.userData = param->userData; + g_status = Libraries::CommonDialog::Status::RUNNING; + g_profile_dialog_ui = NpProfileDialogUi(&g_state, &g_status, &g_result); + return Libraries::CommonDialog::Error::OK; } Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogTerminate() { @@ -112,4 +134,4 @@ void RegisterLib(Core::Loader::SymbolsResolver* sym) { sceNpProfileDialogUpdateStatus); }; -} // namespace Libraries::Np::NpProfileDialog \ No newline at end of file +} // namespace Libraries::Np::NpProfileDialog diff --git a/src/core/libraries/np/np_profile_dialog/np_profile_dialog.h b/src/core/libraries/np/np_profile_dialog/np_profile_dialog.h index b09870f2e..5c7ae66eb 100644 --- a/src/core/libraries/np/np_profile_dialog/np_profile_dialog.h +++ b/src/core/libraries/np/np_profile_dialog/np_profile_dialog.h @@ -48,13 +48,22 @@ struct OrbisNpProfileDialogParamA { }; }; +struct OrbisNpProfileDialogResult { + s32 result; + CommonDialog::Result userAction; + void* userData; + u8 reserved[32]; +}; + Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogOpen(OrbisNpProfileDialogParam* param); Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogClose(); -s32 PS4_SYSV_ABI sceNpProfileDialogGetResult(); +Libraries::CommonDialog::Error PS4_SYSV_ABI +sceNpProfileDialogGetResult(OrbisNpProfileDialogResult* result); Libraries::CommonDialog::Status PS4_SYSV_ABI sceNpProfileDialogGetStatus(); Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogInitialize(); -s32 PS4_SYSV_ABI sceNpProfileDialogOpenA(OrbisNpProfileDialogParamA* param); +Libraries::CommonDialog::Error PS4_SYSV_ABI +sceNpProfileDialogOpenA(OrbisNpProfileDialogParamA* param); Libraries::CommonDialog::Error PS4_SYSV_ABI sceNpProfileDialogTerminate(); Libraries::CommonDialog::Status PS4_SYSV_ABI sceNpProfileDialogUpdateStatus(); diff --git a/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.cpp b/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.cpp index 67a702910..23d6b21e6 100644 --- a/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.cpp +++ b/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.cpp @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: Copyright 2025-2026 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include - #include #include #include "np_profile_dialog_ui.h" @@ -15,7 +15,8 @@ namespace Libraries::Np::NpProfileDialog { static constexpr ImVec2 BUTTON_SIZE{100.0f, 30.0f}; -NpProfileDialogUi::NpProfileDialogUi(NpProfileDialogState* state, Status* status, int* result) +NpProfileDialogUi::NpProfileDialogUi(NpProfileDialogState* state, Status* status, + OrbisNpProfileDialogResult* result) : state(state), status(status), result(result) { if (status && *status == Status::RUNNING) { first_render = true; @@ -24,7 +25,7 @@ NpProfileDialogUi::NpProfileDialogUi(NpProfileDialogState* state, Status* status } NpProfileDialogUi::~NpProfileDialogUi() { - Finish(0); + Finish(Result::USER_CANCELED); } NpProfileDialogUi::NpProfileDialogUi(NpProfileDialogUi&& other) noexcept @@ -46,9 +47,10 @@ NpProfileDialogUi& NpProfileDialogUi::operator=(NpProfileDialogUi other) { return *this; } -void NpProfileDialogUi::Finish(int result_code) { +void NpProfileDialogUi::Finish(Result user_action) { if (result) { - *result = result_code; + result->result = 0; // ORBIS_OK for normal termination + result->userAction = user_action; } if (status) { *status = Status::FINISHED; @@ -82,8 +84,13 @@ void NpProfileDialogUi::Draw() { Separator(); Spacing(); - Text("Online ID:"); - Text("%s", state->onlineId.c_str()); + if (state->hasAccountId) { + Text("Account ID:"); + Text("%" PRIu64, state->accountId); + } else { + Text("Online ID:"); + Text("%s", state->onlineId.c_str()); + } Spacing(); SetCursorPos({ @@ -92,7 +99,7 @@ void NpProfileDialogUi::Draw() { }); if (Button("OK", BUTTON_SIZE)) { - Finish(0); + Finish(Result::USER_CANCELED); } if (first_render) { diff --git a/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.h b/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.h index 1c5c5491b..6f035b13c 100644 --- a/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.h +++ b/src/core/libraries/np/np_profile_dialog/np_profile_dialog_ui.h @@ -10,32 +10,36 @@ #include "common/types.h" #include "core/libraries/system/commondialog.h" #include "imgui/imgui_layer.h" +#include "np_profile_dialog.h" namespace Libraries::Np::NpProfileDialog { struct NpProfileDialogState { std::string onlineId; + OrbisNpAccountId accountId{}; + bool hasAccountId{false}; int userId{}; }; class NpProfileDialogUi : public ImGui::Layer { public: explicit NpProfileDialogUi(NpProfileDialogState* state = nullptr, - CommonDialog::Status* status = nullptr, int* result = nullptr); + CommonDialog::Status* status = nullptr, + OrbisNpProfileDialogResult* result = nullptr); ~NpProfileDialogUi() override; NpProfileDialogUi(const NpProfileDialogUi& other) = delete; NpProfileDialogUi(NpProfileDialogUi&& other) noexcept; NpProfileDialogUi& operator=(NpProfileDialogUi other); - void Finish(int result_code); + void Finish(CommonDialog::Result user_action); void Draw() override; private: NpProfileDialogState* state{}; CommonDialog::Status* status{}; - int* result{}; + OrbisNpProfileDialogResult* result{}; bool first_render{false}; };