From 97ae01391fe2ef3865338d66adcdbd2193b77591 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 21 Jun 2026 11:57:03 +1000 Subject: [PATCH] Hotkeys: Add 'Select Next Slot and Save State' --- src/core/fullscreenui_settings.cpp | 5 +++++ src/core/fullscreenui_strings.h | 2 ++ src/core/hotkeys.cpp | 12 ++++++++++++ 3 files changed, 19 insertions(+) diff --git a/src/core/fullscreenui_settings.cpp b/src/core/fullscreenui_settings.cpp index 051cd6e96..ffec9e1f9 100644 --- a/src/core/fullscreenui_settings.cpp +++ b/src/core/fullscreenui_settings.cpp @@ -3935,6 +3935,11 @@ void FullscreenUI::DrawMemoryCardSettingsPage() "use a single memory card for all discs."), "MemoryCards", "UsePlaylistTitle", true); + DrawToggleSetting(bsi, FSUI_ICONVSTR(ICON_FA_GLOBE, "Enable Global Save States"), + FSUI_VSTR("When enabled, the legacy global save state slots will be available. These slots are " + "independent of the current game."), + "Main", "EnableGlobalStates", false); + EndMenuButtons(); } diff --git a/src/core/fullscreenui_strings.h b/src/core/fullscreenui_strings.h index 0e01bc70b..056343a50 100644 --- a/src/core/fullscreenui_strings.h +++ b/src/core/fullscreenui_strings.h @@ -321,6 +321,7 @@ TRANSLATE_NOOP("FullscreenUI", "Enable Discord Presence"); TRANSLATE_NOOP("FullscreenUI", "Enable Fast Boot"); TRANSLATE_NOOP("FullscreenUI", "Enable GPU-Based Validation"); TRANSLATE_NOOP("FullscreenUI", "Enable GPU-based validation when supported by the host's renderer API. Only for developer use."); +TRANSLATE_NOOP("FullscreenUI", "Enable Global Save States"); TRANSLATE_NOOP("FullscreenUI", "Enable Overclocking"); TRANSLATE_NOOP("FullscreenUI", "Enable Post Processing"); TRANSLATE_NOOP("FullscreenUI", "Enable Recompiler Block Linking"); @@ -896,6 +897,7 @@ TRANSLATE_NOOP("FullscreenUI", "When enabled, DuckStation will assume all achiev TRANSLATE_NOOP("FullscreenUI", "When enabled, DuckStation will list achievements from unofficial sets. These achievements are not tracked by RetroAchievements."); TRANSLATE_NOOP("FullscreenUI", "When enabled, each session will behave as if no achievements have been unlocked."); TRANSLATE_NOOP("FullscreenUI", "When enabled, memory cards and controllers will be overwritten when save states are loaded."); +TRANSLATE_NOOP("FullscreenUI", "When enabled, the legacy global save state slots will be available. These slots are independent of the current game."); TRANSLATE_NOOP("FullscreenUI", "When enabled, the minimum supported output latency will be used for the host API."); TRANSLATE_NOOP("FullscreenUI", "When playing a multi-disc game and using per-game (title) memory cards, use a single memory card for all discs."); TRANSLATE_NOOP("FullscreenUI", "When this option is chosen, the clock speed set below will be used."); diff --git a/src/core/hotkeys.cpp b/src/core/hotkeys.cpp index 4ff98eb2b..07c166af2 100644 --- a/src/core/hotkeys.cpp +++ b/src/core/hotkeys.cpp @@ -713,6 +713,18 @@ static constexpr const HotkeyInfo s_hotkey_list[] = { } }}, + {"SelectNextSlotSaveState", TRANSLATE_NOOP("Hotkeys", "Save States"), + TRANSLATE_NOOP("Hotkeys", "Select Next Slot and Save State"), + [](s32 pressed) { + if (!pressed && System::IsValid()) + { + VideoThread::RunOnThread([]() { + SaveStateSelectorUI::SelectNextSlot(false); + SaveStateSelectorUI::SaveCurrentSlot(); + }); + } + }}, + {"UndoLoadState", TRANSLATE_NOOP("Hotkeys", "Save States"), TRANSLATE_NOOP("Hotkeys", "Undo Load State"), [](s32 pressed) { if (!pressed)