From 23dc6a44f66be80b8a6d8320b5179a00963af61d Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 28 Jan 2024 10:03:26 +0100 Subject: [PATCH] overlays: implement native sendmessage dialog --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/Cell/Modules/sceNp.cpp | 27 +- rpcs3/Emu/Cell/Modules/sceNp.h | 6 +- .../Network/overlay_sendmessage_dialog.cpp | 372 ++++++++++++++++++ .../Network/overlay_sendmessage_dialog.h | 44 +++ rpcs3/Emu/RSX/Overlays/overlay_list_view.cpp | 8 - rpcs3/Emu/RSX/Overlays/overlay_list_view.hpp | 2 - rpcs3/Emu/localized_string_id.h | 4 + rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 6 + rpcs3/rpcs3qt/localized_emu.h | 5 +- rpcs3/rpcs3qt/sendmessage_dialog_frame.cpp | 11 +- rpcs3/rpcs3qt/sendmessage_dialog_frame.h | 6 +- 13 files changed, 465 insertions(+), 29 deletions(-) create mode 100644 rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp create mode 100644 rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 6745ea7059..edb315eb7e 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -472,6 +472,7 @@ target_sources(rpcs3_emu PRIVATE RSX/Overlays/HomeMenu/overlay_home_menu_page.cpp RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp RSX/Overlays/Network/overlay_recvmessage_dialog.cpp + RSX/Overlays/Network/overlay_sendmessage_dialog.cpp RSX/Overlays/overlay_animated_icon.cpp RSX/Overlays/overlay_animation.cpp RSX/Overlays/overlay_controls.cpp diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index ecf09df6f0..d9dd87d958 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -26,6 +26,7 @@ #include "Emu/RSX/Overlays/overlay_manager.h" #include "Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.h" +#include "Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.h" LOG_CHANNEL(sceNp); @@ -1228,19 +1229,27 @@ error_code sceNpBasicSendMessageGui(vm::cptr msg, sys_ sceNp.trace("Message Data:\n%s", fmt::buf_to_hexstring(msg->data.get_ptr(), msg->size)); - bool result = false; + error_code result = CELL_CANCEL; - input::SetIntercepted(true); - - Emu.BlockingCallFromMainThread([=, &result, msg_data = std::move(msg_data), npids = std::move(npids)]() mutable + if (auto manager = g_fxo->try_get()) { - auto send_dlg = Emu.GetCallbacks().get_sendmessage_dialog(); - result = send_dlg->Exec(msg_data, npids); - }); + auto recv_dlg = manager->create(); + result = recv_dlg->Exec(msg_data, npids); + } + else + { + input::SetIntercepted(true); - input::SetIntercepted(false); + Emu.BlockingCallFromMainThread([=, &result, msg_data = std::move(msg_data), npids = std::move(npids)]() mutable + { + auto send_dlg = Emu.GetCallbacks().get_sendmessage_dialog(); + result = send_dlg->Exec(msg_data, npids); + }); - s32 callback_result = result ? 0 : -1; + input::SetIntercepted(false); + } + + s32 callback_result = result == CELL_OK ? 0 : -1; s32 event = 0; switch (msg->mainType) diff --git a/rpcs3/Emu/Cell/Modules/sceNp.h b/rpcs3/Emu/Cell/Modules/sceNp.h index ee0357c460..45add03846 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.h +++ b/rpcs3/Emu/Cell/Modules/sceNp.h @@ -1712,7 +1712,11 @@ class SendMessageDialogBase public: virtual ~SendMessageDialogBase() = default; - virtual bool Exec(message_data& msg_data, std::set& npids) = 0; + virtual error_code Exec(message_data& msg_data, std::set& npids) = 0; + virtual void callback_handler(u16 ntype, const std::string& username, bool status) = 0; + +protected: + std::shared_ptr m_rpcn; }; class RecvMessageDialogBase diff --git a/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp b/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp new file mode 100644 index 0000000000..5fd693b3e4 --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp @@ -0,0 +1,372 @@ +#include "stdafx.h" +#include "../overlay_manager.h" +#include "overlay_sendmessage_dialog.h" +#include "Emu/RSX/RSXThread.h" +#include "Emu/NP/rpcn_client.h" +#include "Utilities/Thread.h" + +namespace rsx +{ + namespace overlays + { + void sendmessage_friend_callback(void* param, rpcn::NotificationType ntype, const std::string& username, bool status) + { + auto* dlg = static_cast(param); + dlg->callback_handler(ntype, username, status); + } + + sendmessage_dialog::list_entry::list_entry(const std::string& msg) + { + std::unique_ptr text_stack = std::make_unique(); + std::unique_ptr padding = std::make_unique(); + std::unique_ptr text_label = std::make_unique