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