From 62754039079c0aa46c0face7304bd6059ac79c85 Mon Sep 17 00:00:00 2001 From: nfore Date: Sun, 1 Sep 2024 11:17:00 -0500 Subject: [PATCH] Add savestate info messagebox showing date/time modified --- command_event.c | 11 +-------- libretro-common/file/file_path.c | 23 ++++++++++++++++++ libretro-common/include/file/file_path.h | 2 ++ menu/menu_setting.c | 30 +++++++++++++++++++++++- retroarch.c | 15 ++++++++++++ retroarch.h | 2 ++ 6 files changed, 72 insertions(+), 11 deletions(-) diff --git a/command_event.c b/command_event.c index 9f7928c681c9..53b828c9c3b1 100644 --- a/command_event.c +++ b/command_event.c @@ -689,17 +689,8 @@ static void event_main_state(unsigned cmd) { char *path = string_alloc(PATH_MAX_LENGTH); char *msg = string_alloc(PATH_MAX_LENGTH); - global_t *global = global_get_ptr(); - settings_t *settings = config_get_ptr(); - if (settings->state_slot > 0) - snprintf(path, PATH_MAX_LENGTH, "%s%d", - global->savestate_name, settings->state_slot); - else if (settings->state_slot < 0) - snprintf(path, PATH_MAX_LENGTH, "%s.auto", - global->savestate_name); - else - strlcpy(path, global->savestate_name, PATH_MAX_LENGTH); + get_savestate_path(path); if (pretro_serialize_size()) { diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index 2a66680271ee..694e1fe970e9 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -801,3 +801,26 @@ void fill_short_pathname_representation(char* out_rep, else strlcpy(out_rep,path_short, size); } + +time_t path_modified_time(char *path) +{ +#ifdef _WIN32 + FILETIME mtime; + ULARGE_INTEGER ularge; + HANDLE file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + GetFileTime(file, NULL, NULL, &mtime); + CloseHandle(file); + + ularge.LowPart = mtime.dwLowDateTime; + ularge.HighPart = mtime.dwHighDateTime; + + return (time_t)((ularge.QuadPart - 116444736000000000ULL) / 10000000ULL); +#else + struct stat info; + stat(path, &info); + + return info.st_mtime; +#endif +} diff --git a/libretro-common/include/file/file_path.h b/libretro-common/include/file/file_path.h index 63dcac3e39e5..59dc5fae2aa1 100644 --- a/libretro-common/include/file/file_path.h +++ b/libretro-common/include/file/file_path.h @@ -437,6 +437,8 @@ void fill_pathname_slash(char *path, size_t size); void fill_pathname_application_path(char *buf, size_t size); #endif +time_t path_modified_time(char *path); + #ifdef __cplusplus } #endif diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 79693d1d1939..d020ded18eba 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -17,6 +17,7 @@ #include #include +#include #include "menu.h" #include "menu_input.h" @@ -36,6 +37,7 @@ #include "../preempt.h" #include "drivers/rgui.h" #include "../core_history.h" +#include "../retroarch.h" #if defined(__CELLOS_LV2__) #include @@ -2601,7 +2603,7 @@ static rarch_setting_t setting_string_setting_options(enum setting_type type, } static INLINE void setting_get_dl_core_info(char *s, size_t len, - const char* path) + const char* path) { global_t *global = global_get_ptr(); char key[NAME_MAX_LENGTH]; @@ -2611,6 +2613,28 @@ static INLINE void setting_get_dl_core_info(char *s, size_t len, snprintf(s, len, "-- No description available for this core --"); } +static void setting_get_savestate_info(char *s, size_t len) +{ + char *path = string_alloc(PATH_MAX_LENGTH); + settings_t *settings = config_get_ptr(); + + get_savestate_path(path); + + if (path_exists(path)) + { + time_t mtime = path_modified_time(path); + char buf[32]; + + strftime(buf, 32, "%b %d %Y %H:%M:%S", localtime(&mtime)); + snprintf(s, len, "State %i date/time modified:\n%s", + settings->state_slot, buf); + } + else + snprintf(s, len, "State %i is empty", settings->state_slot); + + free(path); +} + static int setting_get_description_compare_label(uint32_t label_hash, settings_t *settings, char *s, size_t len, const char *path, unsigned type, unsigned entry_idx) @@ -3761,6 +3785,10 @@ static int setting_get_description_compare_label(uint32_t label_hash, "content is running or if\n" "file updates are disabled."); break; + case MENU_LABEL_SAVESTATE: + case MENU_LABEL_LOADSTATE: + setting_get_savestate_info(s, len); + break; default: return -1; } diff --git a/retroarch.c b/retroarch.c index 05c10ebb9f54..69828c542b7e 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1552,3 +1552,18 @@ bool rarch_clear_all_thread_waits(unsigned clear_threads, void* data) return true; } + +void get_savestate_path(char *path) +{ + global_t *global = global_get_ptr(); + settings_t *settings = config_get_ptr(); + + if (settings->state_slot > 0) + snprintf(path, PATH_MAX_LENGTH, "%s%d", + global->savestate_name, settings->state_slot); + else if (settings->state_slot < 0) + snprintf(path, PATH_MAX_LENGTH, "%s.auto", + global->savestate_name); + else + strlcpy(path, global->savestate_name, PATH_MAX_LENGTH); +} diff --git a/retroarch.h b/retroarch.h index 91aae17c9712..b36b1657d6d1 100644 --- a/retroarch.h +++ b/retroarch.h @@ -167,6 +167,8 @@ int rarch_info_get_capabilities(enum rarch_capabilities type, char *s, size_t le bool rarch_clear_all_thread_waits(unsigned clear_threads, void* data); +void get_savestate_path(char *path); + #ifdef __cplusplus } #endif