diff --git a/command.c b/command.c index 2f145803ad..b3f482472b 100644 --- a/command.c +++ b/command.c @@ -1588,6 +1588,12 @@ static void command_event_main_state(unsigned cmd) snprintf(buf, sizeof(buf), "%s.undo", buf); command_event_load_state(buf, msg, sizeof(msg), true); break; + case CMD_EVENT_UNDO_SAVE_STATE: + strlcpy(buf, path, sizeof(buf)); + path_remove_extension(buf); + snprintf(buf, sizeof(buf), "%s.last", buf); + command_event_load_state(buf, msg, sizeof(msg), true); + break; } } else @@ -1711,6 +1717,9 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_UNDO_LOAD_STATE: command_event_main_state(cmd); break; + case CMD_EVENT_UNDO_SAVE_STATE: + command_event_main_state(cmd); + break; case CMD_EVENT_RESIZE_WINDOWED_SCALE: { unsigned idx = 0; diff --git a/command.h b/command.h index 1d6c76e8a0..205728fde4 100644 --- a/command.h +++ b/command.h @@ -49,6 +49,7 @@ enum event_command CMD_EVENT_UNLOAD_CORE, CMD_EVENT_LOAD_STATE, CMD_EVENT_UNDO_LOAD_STATE, + CMD_EVENT_UNDO_SAVE_STATE, CMD_EVENT_SAVE_STATE, CMD_EVENT_SAVE_STATE_DECREMENT, CMD_EVENT_SAVE_STATE_INCREMENT, diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 04069bef13..3f3f8726e5 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1274,6 +1274,14 @@ static int action_ok_load_state(const char *path, return generic_action_ok_command(CMD_EVENT_RESUME); } +static int action_ok_save_state(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + if (generic_action_ok_command(CMD_EVENT_SAVE_STATE) == -1) + return menu_cbs_exit(); + return generic_action_ok_command(CMD_EVENT_RESUME); +} + static int action_ok_undo_load_state(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -1282,10 +1290,10 @@ static int action_ok_undo_load_state(const char *path, return generic_action_ok_command(CMD_EVENT_RESUME); } -static int action_ok_save_state(const char *path, +static int action_ok_undo_save_state(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - if (generic_action_ok_command(CMD_EVENT_SAVE_STATE) == -1) + if (generic_action_ok_command(CMD_EVENT_UNDO_SAVE_STATE) == -1) return menu_cbs_exit(); return generic_action_ok_command(CMD_EVENT_RESUME); } @@ -2383,6 +2391,9 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_LABEL_UNDOLOADSTATE: BIND_ACTION_OK(cbs, action_ok_undo_load_state); break; + case MENU_LABEL_UNDOSAVESTATE: + BIND_ACTION_OK(cbs, action_ok_undo_save_state); + break; case MENU_LABEL_RESUME_CONTENT: BIND_ACTION_OK(cbs, action_ok_resume_content); break; diff --git a/menu/intl/menu_hash_us.c b/menu/intl/menu_hash_us.c index 9b506333eb..b9b79900bd 100644 --- a/menu/intl/menu_hash_us.c +++ b/menu/intl/menu_hash_us.c @@ -660,6 +660,8 @@ static const char *menu_hash_to_str_us_label(uint32_t hash) return "loadstate"; case MENU_LABEL_UNDO_LOAD_STATE: return "undoloadstate"; + case MENU_LABEL_UNDO_SAVE_STATE: + return "undosavestate"; case MENU_LABEL_RESUME_CONTENT: return "resume_content"; case MENU_LABEL_INPUT_DRIVER: @@ -1378,6 +1380,8 @@ const char *menu_hash_to_str_us(uint32_t hash) return "Load State"; case MENU_LABEL_VALUE_UNDO_LOAD_STATE: return "Undo Load State"; + case MENU_LABEL_VALUE_UNDO_SAVE_STATE: + return "Undo Save State"; case MENU_LABEL_VALUE_RESUME_CONTENT: return "Resume"; case MENU_LABEL_VALUE_INPUT_DRIVER: diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index ac3ca1a4da..18edcdc60c 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2281,6 +2281,11 @@ static int menu_displaylist_parse_load_content_settings( menu_hash_to_str(MENU_LABEL_UNDO_LOAD_STATE), MENU_SETTING_ACTION_LOADSTATE, 0, 0); + menu_entries_add(info->list, + menu_hash_to_str(MENU_LABEL_VALUE_UNDO_SAVE_STATE), + menu_hash_to_str(MENU_LABEL_UNDO_SAVE_STATE), + MENU_SETTING_ACTION_LOADSTATE, 0, 0); + menu_entries_add(info->list, menu_hash_to_str(MENU_LABEL_VALUE_CORE_OPTIONS), menu_hash_to_str(MENU_LABEL_CORE_OPTIONS), diff --git a/menu/menu_hash.h b/menu/menu_hash.h index 64224ea6e2..a3f4c3f183 100644 --- a/menu/menu_hash.h +++ b/menu/menu_hash.h @@ -299,9 +299,11 @@ extern "C" { #define MENU_LABEL_SAVE_STATE 0x3a4849b5U #define MENU_LABEL_VALUE_LOAD_STATE 0xd23ba706U #define MENU_LABEL_VALUE_UNDO_LOAD_STATE 0xc83f09fcU +#define MENU_LABEL_VALUE_UNDO_SAVE_STATE 0x341b870bU #define MENU_LABEL_VALUE_SAVE_STATE 0x3e182415U #define MENU_LABEL_LOAD_STATE 0xa39eb286U #define MENU_LABEL_UNDO_LOAD_STATE 0x464aaf5cU +#define MENU_LABEL_UNDO_SAVE_STATE 0xdcf4468bU #define MENU_LABEL_REWIND 0x1931d5aeU #define MENU_LABEL_NETPLAY_FLIP_PLAYERS 0x801425abU #define MENU_LABEL_CHEAT_INDEX_MINUS 0x57f58b6cU @@ -958,6 +960,7 @@ extern "C" { #define MENU_LABEL_SAVESTATE 0x3a4849b5U #define MENU_LABEL_LOADSTATE 0xa39eb286U #define MENU_LABEL_UNDOLOADSTATE 0x464aaf5cU +#define MENU_LABEL_UNDOSAVESTATE 0xdcf4468bU #define MENU_LABEL_RESUME_CONTENT 0xd9f088b0U #define MENU_LABEL_VALUE_RESUME_CONTENT 0xae6e5911U #define MENU_LABEL_VALUE_RESUME 0xce8ac2f6U