From 2c73aead45e256cffc34e65cc9159ee2f6b09477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 3 Aug 2026 19:18:19 +0200 Subject: [PATCH] Minor code cleanup on pause screen --- Common/UI/Screen.cpp | 12 ++++++++++++ Common/UI/Screen.h | 1 + UI/PauseScreen.cpp | 35 +++++++++++++++++------------------ UI/PauseScreen.h | 2 ++ 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/Common/UI/Screen.cpp b/Common/UI/Screen.cpp index 3b0ca9ab43..c447483e4b 100644 --- a/Common/UI/Screen.cpp +++ b/Common/UI/Screen.cpp @@ -532,3 +532,15 @@ void ScreenManager::SetBackgroundOverlayScreens(Screen *backgroundScreen, Screen overlayScreen_ = overlayScreen; overlayScreen_->setScreenManager(this); } + +const char *DialogResultToString(DialogResult result) { + switch (result) { + case DR_NONE: return "DR_NONE"; + case DR_OK: return "DR_OK"; + case DR_CANCEL: return "DR_CANCEL"; + case DR_YES: return "DR_YES"; + case DR_NO: return "DR_NO"; + case DR_BACK: return "DR_BACK"; + default: return "(N/A)"; + } +} diff --git a/Common/UI/Screen.h b/Common/UI/Screen.h index e726037f14..347f8ae456 100644 --- a/Common/UI/Screen.h +++ b/Common/UI/Screen.h @@ -36,6 +36,7 @@ enum DialogResult { DR_NO, DR_BACK, }; +const char *DialogResultToString(DialogResult result); class ScreenManager; class UIContext; diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index 0310e3f941..32b2502e8a 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -389,9 +389,7 @@ GamePauseScreen::~GamePauseScreen() { void GamePauseScreen::OnVKey(VirtKey virtualKeyCode, bool down) { // Simple de-bounce using createdTime_, just to be safe. if (down && virtualKeyCode == VIRTKEY_PAUSE && time_now_d() > createdTime_ + 0.1) { - std::lock_guard lock(finishNextFrameMutex_); - finishNextFrame_ = true; - finishNextFrameResult_ = DR_BACK; + FinishNextFrame(DR_BACK); } } @@ -410,9 +408,7 @@ void GamePauseScreen::CreateSavestateControls(UI::LinearLayout *leftColumnItems, int slotNum = v->GetSlot(); auto doLoad = [this, slotNum]() { SaveState::LoadSlot(saveStatePrefix_, slotNum, &ShowMessageAfterSaveStateAction); - std::lock_guard lock(finishNextFrameMutex_); - finishNextFrame_ = true; - finishNextFrameResult_ = DR_CANCEL; + FinishNextFrame(DR_CANCEL); }; if (g_Config.bConfirmLoadState) { screenManager()->push(new LoadStateConfirmScreen(saveStatePrefix_, slotNum, [doLoad](bool result) { @@ -783,16 +779,12 @@ void GamePauseScreen::ShowContextMenu(UI::View *menuButton, bool portrait) { screenManager()->push(new UI::MessagePopupScreen(di->T("Reset"), confirmMessage, di->T("Reset"), di->T("Cancel"), [this](bool result) { if (result) { System_PostUIMessage(UIMessage::REQUEST_GAME_RESET); - std::lock_guard lock(finishNextFrameMutex_); - finishNextFrame_ = true; - finishNextFrameResult_ = DR_BACK; // resume + FinishNextFrame(DR_BACK); // resume } })); } else { System_PostUIMessage(UIMessage::REQUEST_GAME_RESET); - std::lock_guard lock(finishNextFrameMutex_); - finishNextFrameResult_ = DR_BACK; // resume - finishNextFrame_ = true; + FinishNextFrame(DR_BACK); // resume } }); auto dev = GetI18NCategory(I18NCat::DEVELOPER); @@ -827,9 +819,7 @@ void GamePauseScreen::dialogFinished(const Screen *dialog, DialogResult dr) { std::string tag = dialog->tag(); if (tag == "ScreenshotView") { if (dr == DR_OK) { - std::lock_guard lock(finishNextFrameMutex_); - finishNextFrame_ = true; - finishNextFrameResult_ = DR_BACK; + FinishNextFrame(DR_BACK); } else if (dr != DR_CANCEL && dr != DR_BACK) { // Just go back to the pause menu, but refresh the savestate thumbnails in case something changed. SaveState::Rescan(saveStatePrefix_); @@ -904,9 +894,7 @@ void GamePauseScreen::OnExit(UI::EventParams &e) { if (g_Config.bPauseMenuExitsEmulator) { System_ExitApp(); } else { - std::lock_guard lock(finishNextFrameMutex_); - finishNextFrameResult_ = DR_OK; // exit game - finishNextFrame_ = true; + FinishNextFrame(DR_OK); // exit game } } })); @@ -962,3 +950,14 @@ void GamePauseScreen::OnDeleteConfig(UI::EventParams &e) { } })); } + +// This is a bit of a hack that we should try to remove. +void GamePauseScreen::FinishNextFrame(DialogResult finishNextFrameResult) { + std::lock_guard lock(finishNextFrameMutex_); + if (!finishNextFrame_) { + finishNextFrameResult_ = finishNextFrameResult; + finishNextFrame_ = true; + } else { + WARN_LOG(Log::UI, "Duplicate call to FinishNextFrame - we were already finishing with result %d, now trying to finish with result %d", finishNextFrameResult_, finishNextFrameResult); + } +} diff --git a/UI/PauseScreen.h b/UI/PauseScreen.h index 7852b5ed01..2053ebd12b 100644 --- a/UI/PauseScreen.h +++ b/UI/PauseScreen.h @@ -66,6 +66,8 @@ private: void AddExtraOptions(UI::ViewGroup *parent); + void FinishNextFrame(DialogResult finishNextFrameResult); + // hack std::mutex finishNextFrameMutex_; bool finishNextFrame_ = false;