diff --git a/rpcs3/rpcs3qt/memory_viewer_panel.cpp b/rpcs3/rpcs3qt/memory_viewer_panel.cpp index ccc648718a..1ebc895803 100644 --- a/rpcs3/rpcs3qt/memory_viewer_panel.cpp +++ b/rpcs3/rpcs3qt/memory_viewer_panel.cpp @@ -9,6 +9,7 @@ #include "Emu/RSX/RSXThread.h" #include "Emu/RSX/rsx_utils.h" #include "Emu/IdManager.h" +#include "Emu/System.h" #include #include #include @@ -589,6 +590,14 @@ memory_viewer_panel::memory_viewer_panel(QWidget* parent, std::shared_ptr(id, handle_ptr); }); + + if (!g_fxo->try_get()) + { + g_fxo->init(); + } + + auto& fxo = g_fxo->get(); + fxo.last_opened = this; } memory_viewer_panel::~memory_viewer_panel() @@ -1247,20 +1256,23 @@ void memory_viewer_panel::ShowImage(QWidget* parent, u32 addr, color_format form void memory_viewer_panel::ShowAtPC(u32 pc) { - const u32 id = idm::last_id(); - auto handle_ptr = idm::get_unlocked(id); - - if (!handle_ptr) - { - idm::make(nullptr, nullptr, pc); + if (Emu.IsStopped()) return; + + if (const auto* fxo = g_fxo->try_get()) + { + if (auto* panel = fxo->last_opened) + { + panel->SetPC(pc); + panel->raise(); + panel->scroll(0); + if (!panel->isVisible()) + { + panel->show(); + } + return; + } } - handle_ptr->m_mvp->SetPC(pc); - handle_ptr->m_mvp->raise(); - handle_ptr->m_mvp->scroll(0); - if (!handle_ptr->m_mvp->isVisible()) - { - handle_ptr->m_mvp->show(); - } + idm::make(nullptr, nullptr, pc); } diff --git a/rpcs3/rpcs3qt/memory_viewer_panel.h b/rpcs3/rpcs3qt/memory_viewer_panel.h index adc4c4bfad..4623b06c7b 100644 --- a/rpcs3/rpcs3qt/memory_viewer_panel.h +++ b/rpcs3/rpcs3qt/memory_viewer_panel.h @@ -139,3 +139,12 @@ struct memory_viewer_handle public: const std::add_pointer_t m_mvp; }; + +struct memory_viewer_fxo +{ + memory_viewer_panel* last_opened = nullptr; + + memory_viewer_fxo() = default; + memory_viewer_fxo(const memory_viewer_fxo&) = delete; + memory_viewer_fxo& operator=(const memory_viewer_fxo&) = delete; +};