From 3f924d1494aa7f94e51dabfd64b8b35b998e300f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 10 Jul 2023 21:04:22 +0200 Subject: [PATCH 1/4] Smoothly remove any left-over overlays on emuscreen exit. --- Common/System/OSD.cpp | 29 +++++++++++++++++++++++++++++ Common/System/OSD.h | 3 +++ UI/EmuScreen.cpp | 5 +++-- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Common/System/OSD.cpp b/Common/System/OSD.cpp index 02d1e4d2c9..4dc226b3e6 100644 --- a/Common/System/OSD.cpp +++ b/Common/System/OSD.cpp @@ -235,3 +235,32 @@ void OnScreenDisplay::RemoveProgressBar(std::string id) { } } } + +// Fades out everything related to achievements. Should be used on game shutdown. +void OnScreenDisplay::ClearAchievementStuff() { + double now = time_now_d(); + for (auto &iter : entries_) { + switch (iter.type) { + case OSDType::ACHIEVEMENT_CHALLENGE_INDICATOR: + case OSDType::ACHIEVEMENT_UNLOCKED: + case OSDType::ACHIEVEMENT_PROGRESS: + case OSDType::LEADERBOARD_TRACKER: + iter.endTime = now; + break; + default: + break; + } + } + for (auto &iter : sideEntries_) { + switch (iter.type) { + case OSDType::ACHIEVEMENT_CHALLENGE_INDICATOR: + case OSDType::ACHIEVEMENT_UNLOCKED: + case OSDType::ACHIEVEMENT_PROGRESS: + case OSDType::LEADERBOARD_TRACKER: + iter.endTime = now; + break; + default: + break; + } + } +} diff --git a/Common/System/OSD.h b/Common/System/OSD.h index 53253c9fec..7cba61df46 100644 --- a/Common/System/OSD.h +++ b/Common/System/OSD.h @@ -57,6 +57,9 @@ public: void SetShowSidebar(bool show) { showSidebar_ = show; } bool ShowSidebar() const { return showSidebar_; } + // Fades out everything related to achievements. Should be used on game shutdown. + void ClearAchievementStuff(); + struct Entry { OSDType type; std::string text; diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index faac87a4ac..a1df637b0f 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -404,11 +404,12 @@ void EmuScreen::bootComplete() { } EmuScreen::~EmuScreen() { + // If we were invalid, it would already be shutdown. + Achievements::UnloadGame(); if (!invalid_ || bootPending_) { - // If we were invalid, it would already be shutdown. - Achievements::UnloadGame(); PSP_Shutdown(); } + g_OSD.ClearAchievementStuff(); SetExtraAssertInfo(nullptr); From 636fcb9714cddf91a721d4aee99f29f9f07beea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 11 Jul 2023 10:05:06 +0200 Subject: [PATCH 2/4] Fix challenge mode check, fixing savestates not showing up if logged out --- Core/RetroAchievements.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/RetroAchievements.cpp b/Core/RetroAchievements.cpp index c7170955b0..73ecc2d788 100644 --- a/Core/RetroAchievements.cpp +++ b/Core/RetroAchievements.cpp @@ -121,7 +121,7 @@ bool ChallengeModeActive() { if (!g_rcClient) { return false; } - return rc_client_get_hardcore_enabled(g_rcClient); + return IsLoggedIn() && rc_client_get_hardcore_enabled(g_rcClient); } bool WarnUserIfChallengeModeActive(const char *message) { From 41594d319ab799e7bcf4ac2432954f263ac35c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 11 Jul 2023 10:05:55 +0200 Subject: [PATCH 3/4] Fix updating the UI on logout --- Core/RetroAchievements.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Core/RetroAchievements.cpp b/Core/RetroAchievements.cpp index 73ecc2d788..3b080cbfaf 100644 --- a/Core/RetroAchievements.cpp +++ b/Core/RetroAchievements.cpp @@ -411,6 +411,8 @@ void Logout() { NativeSaveSecret(RA_TOKEN_SECRET_NAME, ""); g_Config.Save("Achievements logout"); g_activeChallenges.clear(); + + OnAchievementsLoginStateChange(); } void UpdateSettings() { From bf3acd9208319ed5431fe80ab63a2ab1be89faf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 11 Jul 2023 10:16:58 +0200 Subject: [PATCH 4/4] Fix some minor login issues, center login dialog on Windows. --- Core/RetroAchievements.cpp | 14 +++++++++++--- Windows/InputBox.cpp | 31 ++++++++++++++++--------------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/Core/RetroAchievements.cpp b/Core/RetroAchievements.cpp index 3b080cbfaf..dcfd8fa320 100644 --- a/Core/RetroAchievements.cpp +++ b/Core/RetroAchievements.cpp @@ -355,9 +355,14 @@ void Initialize() { INFO_LOG(ACHIEVEMENTS, "Achievements are disabled, not initializing."); return; } - _assert_msg_(g_Config.bAchievementsEnable, "Achievements are enabled"); + _assert_msg_(!g_rcClient, "Achievements already initialized"); g_rcClient = rc_client_create(read_memory_callback, server_call_callback); + if (!g_rcClient) { + // Shouldn't happen really. + return; + } + // Provide a logging function to simplify debugging rc_client_enable_logging(g_rcClient, RC_CLIENT_LOG_LEVEL_VERBOSE, log_message_callback); @@ -370,6 +375,8 @@ void Initialize() { if (!api_token.empty()) { rc_client_begin_login_with_token(g_rcClient, g_Config.sAchievementsUserName.c_str(), api_token.c_str(), &login_token_callback, nullptr); } + + INFO_LOG(ACHIEVEMENTS, "Achievements initialized."); } static void login_password_callback(int result, const char *error_message, rc_client_t *client, void *userdata) { @@ -416,13 +423,13 @@ void Logout() { } void UpdateSettings() { - if (!g_Config.bAchievementsEnable) { + if (g_rcClient && !g_Config.bAchievementsEnable) { // we're done here Shutdown(); return; } - if (!g_rcClient) { + if (!g_rcClient && g_Config.bAchievementsEnable) { // we just got enabled. Initialize(); } @@ -432,6 +439,7 @@ bool Shutdown() { g_activeChallenges.clear(); rc_client_destroy(g_rcClient); g_rcClient = nullptr; + INFO_LOG(ACHIEVEMENTS, "Achievements shut down."); return true; } diff --git a/Windows/InputBox.cpp b/Windows/InputBox.cpp index 45cee40f77..9db0b10dbd 100644 --- a/Windows/InputBox.cpp +++ b/Windows/InputBox.cpp @@ -2,6 +2,7 @@ #include "Common/CommonWindows.h" #include "Windows/InputBox.h" #include "Windows/resource.h" +#include "Windows/W32Util/Misc.h" #include "Common/Data/Encoding/Utf8.h" static std::wstring textBoxContents; @@ -18,34 +19,31 @@ static INT_PTR CALLBACK InputBoxFunc(HWND hDlg, UINT message, WPARAM wParam, LPA case WM_INITDIALOG: SetWindowText(GetDlgItem(hDlg, IDC_INPUTBOX), textBoxContents.c_str()); SetWindowText(hDlg, windowTitle.c_str()); - if (defaultSelected == false) PostMessage(GetDlgItem(hDlg,IDC_INPUTBOX),EM_SETSEL,-1,-1); + if (defaultSelected == false) + PostMessage(GetDlgItem(hDlg,IDC_INPUTBOX),EM_SETSEL,-1,-1); + W32Util::CenterWindow(hDlg); return TRUE; case WM_COMMAND: - switch (wParam) - { + switch (wParam) { case IDOK: { - wchar_t temp[256]; - GetWindowText(GetDlgItem(hDlg, IDC_INPUTBOX), temp, 255); + wchar_t temp[512]; + GetWindowText(GetDlgItem(hDlg, IDC_INPUTBOX), temp, ARRAY_SIZE(temp) - 1); out = temp; + EndDialog(hDlg, IDOK); + return TRUE; } - EndDialog(hDlg, IDOK); - return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; + default: + return FALSE; } default: return FALSE; } } -template -void InputBoxFunc() -{ - -} - bool InputBox_GetString(HINSTANCE hInst, HWND hParent, const wchar_t *title, const std::string &defaultValue, std::string &outvalue, bool selected) { defaultSelected = selected; @@ -151,6 +149,7 @@ static INT_PTR CALLBACK UserPasswordBoxFunc(HWND hDlg, UINT message, WPARAM wPar SetWindowText(hDlg, windowTitle.c_str()); PostMessage(GetDlgItem(hDlg, IDC_INPUTBOX), EM_SETSEL, -1, -1); PostMessage(GetDlgItem(hDlg, IDC_PASSWORDBOX), EM_SETSEL, -1, -1); + W32Util::CenterWindow(hDlg); return TRUE; case WM_COMMAND: switch (wParam) @@ -162,12 +161,14 @@ static INT_PTR CALLBACK UserPasswordBoxFunc(HWND hDlg, UINT message, WPARAM wPar g_userName = ConvertWStringToUTF8(temp); GetWindowText(GetDlgItem(hDlg, IDC_PASSWORDBOX), temp, 255); g_passWord = ConvertWStringToUTF8(temp); + EndDialog(hDlg, IDOK); + return TRUE; } - EndDialog(hDlg, IDOK); - return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; + default: + return FALSE; } default: return FALSE;