diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 8840511fb7..a06480016f 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -732,6 +732,10 @@ MSG_HASH( MENU_ENUM_LABEL_DEFERRED_CORE_SETTINGS_LIST, "deferred_core_settings_list" ) +MSG_HASH( + MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_LIST, + "deferred_core_information_list" + ) MSG_HASH( MENU_ENUM_LABEL_DEFERRED_CORE_UPDATER_LIST, "core_updater" diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 0e805cb5fc..e97883bd30 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -134,7 +134,6 @@ generic_deferred_push(deferred_push_video_layout_path, DISPLAYLIST_ generic_deferred_push(deferred_push_video_font_path, DISPLAYLIST_FONTS) generic_deferred_push(deferred_push_xmb_font_path, DISPLAYLIST_FONTS) generic_deferred_push(deferred_push_content_history_path, DISPLAYLIST_CONTENT_HISTORY) -generic_deferred_push(deferred_push_core_information, DISPLAYLIST_CORE_INFO) generic_deferred_push(deferred_push_disc_information, DISPLAYLIST_DISC_INFO) generic_deferred_push(deferred_push_system_information, DISPLAYLIST_SYSTEM_INFO) generic_deferred_push(deferred_push_network_information, DISPLAYLIST_NETWORK_INFO) @@ -146,6 +145,7 @@ generic_deferred_push(deferred_user_binds_list, DISPLAYLIST_ generic_deferred_push(deferred_push_accounts_list, DISPLAYLIST_ACCOUNTS_LIST) generic_deferred_push(deferred_push_driver_settings_list, DISPLAYLIST_DRIVER_SETTINGS_LIST) generic_deferred_push(deferred_push_core_settings_list, DISPLAYLIST_CORE_SETTINGS_LIST) +generic_deferred_push(deferred_push_core_information_list, DISPLAYLIST_CORE_INFO) generic_deferred_push(deferred_push_video_settings_list, DISPLAYLIST_VIDEO_SETTINGS_LIST) generic_deferred_push(deferred_push_video_fullscreen_mode_settings_list, DISPLAYLIST_VIDEO_FULLSCREEN_MODE_SETTINGS_LIST) generic_deferred_push(deferred_push_video_windowed_mode_settings_list, DISPLAYLIST_VIDEO_WINDOWED_MODE_SETTINGS_LIST) @@ -705,6 +705,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label( {MENU_ENUM_LABEL_DEFERRED_BROWSE_URL_LIST, deferred_push_browse_url_list}, {MENU_ENUM_LABEL_DEFERRED_BROWSE_URL_START, deferred_push_browse_url_start}, {MENU_ENUM_LABEL_DEFERRED_CORE_SETTINGS_LIST, deferred_push_core_settings_list}, + {MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_LIST, deferred_push_core_information_list}, {MENU_ENUM_LABEL_DEFERRED_CONFIGURATION_SETTINGS_LIST, deferred_push_configuration_settings_list}, {MENU_ENUM_LABEL_DEFERRED_SAVING_SETTINGS_LIST, deferred_push_saving_settings_list}, {MENU_ENUM_LABEL_DEFERRED_MIXER_STREAM_SETTINGS_LIST, deferred_push_mixer_stream_settings_list}, @@ -757,7 +758,6 @@ static int menu_cbs_init_bind_deferred_push_compare_label( {MENU_ENUM_LABEL_DEFERRED_INPUT_HAPTIC_FEEDBACK_SETTINGS_LIST, deferred_push_input_haptic_feedback_settings_list}, {MENU_ENUM_LABEL_DEFERRED_AI_SERVICE_SETTINGS_LIST, deferred_push_ai_service_settings_list}, {MENU_ENUM_LABEL_DEFERRED_ACCESSIBILITY_SETTINGS_LIST, deferred_push_accessibility_settings_list}, - {MENU_ENUM_LABEL_CORE_INFORMATION, deferred_push_core_information}, {MENU_ENUM_LABEL_DISC_INFORMATION, deferred_push_disc_information}, {MENU_ENUM_LABEL_SYSTEM_INFORMATION, deferred_push_system_information}, {MENU_ENUM_LABEL_DEFERRED_RPL_ENTRY_ACTIONS, deferred_push_rpl_entry_actions}, @@ -1246,6 +1246,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_ENUM_LABEL_DEFERRED_CORE_SETTINGS_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_settings_list); break; + case MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_LIST: + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_information_list); + break; case MENU_ENUM_LABEL_DEFERRED_DUMP_DISC_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_dump_disk_list); break; diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 838540fce0..401ab085d0 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -426,6 +426,51 @@ static void menu_action_setting_disp_set_label_menu_file_core( strlcpy(s2, alt, len2); } +#ifdef HAVE_NETWORKING +static void menu_action_setting_disp_set_label_core_updater_entry( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *path, + char *s2, size_t len2) +{ + core_updater_list_t *core_list = core_updater_list_get_cached(); + const core_updater_list_entry_t *entry = NULL; + const char *alt = NULL; + + *s = '\0'; + *w = 0; + + menu_entries_get_at_offset(list, i, NULL, + NULL, NULL, NULL, &alt); + + if (alt) + strlcpy(s2, alt, len2); + + /* Search for specified core */ + if (core_list && + core_updater_list_get_filename(core_list, path, &entry) && + !string_is_empty(entry->local_core_path)) + { + core_info_ctx_find_t core_info; + + /* Check whether core is installed + * > Note: We search core_info here instead + * of calling path_is_valid() since we don't + * want to perform disk access every frame */ + core_info.inf = NULL; + core_info.path = entry->local_core_path; + + if (core_info_find(&core_info, entry->local_core_path)) + { + strlcpy(s, "[#]", len); + *w = (unsigned)STRLEN_CONST("[#]"); + } + } +} +#endif + static void menu_action_setting_disp_set_label_input_desc( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -972,25 +1017,6 @@ static void menu_action_setting_disp_set_label_menu_file_filter( path, "(FILTER)", s2, len2); } -static void menu_action_setting_disp_set_label_menu_file_url_core( - file_list_t* list, - unsigned *w, unsigned type, unsigned i, - const char *label, - char *s, size_t len, - const char *path, - char *s2, size_t len2) -{ - const char *alt = NULL; - strlcpy(s, "(CORE)", len); - - menu_entries_get_at_offset(list, i, NULL, - NULL, NULL, NULL, &alt); - - *w = (unsigned)strlen(s); - if (alt) - strlcpy(s2, alt, len2); -} - static void menu_action_setting_disp_set_label_menu_file_rdb( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -1647,6 +1673,12 @@ static int menu_cbs_init_bind_get_string_representation_compare_type( BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_menu_file_core); break; +#ifdef HAVE_NETWORKING + case FILE_TYPE_DOWNLOAD_CORE: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_core_updater_entry); + break; +#endif case FILE_TYPE_PLAIN: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_menu_file_plain); @@ -1715,10 +1747,6 @@ static int menu_cbs_init_bind_get_string_representation_compare_type( BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_menu_file_filter); break; - case FILE_TYPE_DOWNLOAD_CORE: - BIND_ACTION_GET_VALUE(cbs, - menu_action_setting_disp_set_label_menu_file_url_core); - break; case FILE_TYPE_RDB: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_menu_file_rdb); diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 71b6236a50..467efcd580 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -210,6 +210,8 @@ static enum msg_hash_enums action_ok_dl_to_enum(unsigned lbl) return MENU_ENUM_LABEL_DEFERRED_DRIVER_SETTINGS_LIST; case ACTION_OK_DL_CORE_SETTINGS_LIST: return MENU_ENUM_LABEL_DEFERRED_CORE_SETTINGS_LIST; + case ACTION_OK_DL_CORE_INFORMATION_LIST: + return MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_LIST; case ACTION_OK_DL_VIDEO_SETTINGS_LIST: return MENU_ENUM_LABEL_DEFERRED_VIDEO_SETTINGS_LIST; case ACTION_OK_DL_VIDEO_SYNCHRONIZATION_SETTINGS_LIST: @@ -1106,6 +1108,7 @@ int generic_action_ok_displaylist_push(const char *path, case ACTION_OK_DL_LATENCY_SETTINGS_LIST: case ACTION_OK_DL_DRIVER_SETTINGS_LIST: case ACTION_OK_DL_CORE_SETTINGS_LIST: + case ACTION_OK_DL_CORE_INFORMATION_LIST: case ACTION_OK_DL_VIDEO_SETTINGS_LIST: case ACTION_OK_DL_VIDEO_SYNCHRONIZATION_SETTINGS_LIST: case ACTION_OK_DL_VIDEO_FULLSCREEN_MODE_SETTINGS_LIST: @@ -5144,6 +5147,7 @@ default_action_ok_func(action_ok_push_video_scaling_settings_list, ACTION_OK_DL_ default_action_ok_func(action_ok_push_video_output_settings_list, ACTION_OK_DL_VIDEO_OUTPUT_SETTINGS_LIST) default_action_ok_func(action_ok_push_configuration_settings_list, ACTION_OK_DL_CONFIGURATION_SETTINGS_LIST) default_action_ok_func(action_ok_push_core_settings_list, ACTION_OK_DL_CORE_SETTINGS_LIST) +default_action_ok_func(action_ok_push_core_information_list, ACTION_OK_DL_CORE_INFORMATION_LIST) default_action_ok_func(action_ok_push_audio_settings_list, ACTION_OK_DL_AUDIO_SETTINGS_LIST) default_action_ok_func(action_ok_push_audio_output_settings_list, ACTION_OK_DL_AUDIO_OUTPUT_SETTINGS_LIST) default_action_ok_func(action_ok_push_audio_resampler_settings_list, ACTION_OK_DL_AUDIO_RESAMPLER_SETTINGS_LIST) @@ -6463,21 +6467,38 @@ static int action_ok_netplay_disconnect(const char *path, static int action_ok_core_delete(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - const char *path_core = path_get(RARCH_PATH_CORE); - char *core_path = !string_is_empty(path_core) - ? strdup(path_core) : NULL; + const char *core_path = label; + const char *core = NULL; + const char *running_core_path = NULL; + const char *running_core = NULL; - if (!core_path) - return 0; + if (string_is_empty(core_path)) + return -1; - generic_action_ok_command(CMD_EVENT_UNLOAD_CORE); - menu_entries_flush_stack(0, 0); + /* Get core file name */ + core = path_basename(core_path); + if (string_is_empty(core)) + return -1; - if (filestream_delete(core_path) != 0) { } + /* Get running core file name */ + running_core_path = path_get(RARCH_PATH_CORE); + if (!string_is_empty(running_core_path)) + running_core = path_basename(running_core_path); - free(core_path); + /* Check if core to be deleted is currently + * running - if so, unload it */ + if (!string_is_empty(running_core) && + string_is_equal(core, running_core)) + generic_action_ok_command(CMD_EVENT_UNLOAD_CORE); - return 0; + /* Delete core file */ + filestream_delete(core_path); + + /* Reload core info files */ + command_event(CMD_EVENT_CORE_INFO_INIT, NULL); + + /* Return to higher level menu */ + return action_cancel_pop_default(NULL, NULL, 0, 0); } static int action_ok_delete_playlist(const char *path, @@ -6841,6 +6862,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_AUDIO_RESAMPLER_SETTINGS, action_ok_push_audio_resampler_settings_list}, {MENU_ENUM_LABEL_LATENCY_SETTINGS, action_ok_push_latency_settings_list}, {MENU_ENUM_LABEL_CORE_SETTINGS, action_ok_push_core_settings_list}, + {MENU_ENUM_LABEL_CORE_INFORMATION, action_ok_push_core_information_list}, {MENU_ENUM_LABEL_CONFIGURATION_SETTINGS, action_ok_push_configuration_settings_list}, {MENU_ENUM_LABEL_PLAYLIST_SETTINGS, action_ok_push_playlist_settings_list}, {MENU_ENUM_LABEL_PLAYLIST_MANAGER_LIST, action_ok_push_playlist_manager_list}, @@ -6858,7 +6880,6 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_CORE_OPTIONS, action_ok_push_default}, {MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS, action_ok_push_default}, {MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, action_ok_push_default}, - {MENU_ENUM_LABEL_CORE_INFORMATION, action_ok_push_default}, {MENU_ENUM_LABEL_DISC_INFORMATION, action_ok_push_default}, {MENU_ENUM_LABEL_SYSTEM_INFORMATION, action_ok_push_default}, {MENU_ENUM_LABEL_NETWORK_INFORMATION, action_ok_push_default}, diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index d7fce732cb..cc0f1a0548 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -44,14 +44,18 @@ #include "../../config.def.h" +#ifdef HAVE_NETWORKING +#include "../../core_updater_list.h" +#endif + #ifndef BIND_ACTION_START #define BIND_ACTION_START(cbs, name) (cbs)->action_start = (name) #endif /* Forward declarations */ int generic_action_ok_command(enum event_command cmd); - int action_ok_push_playlist_manager_settings(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx); +int action_ok_push_core_information_list(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx); #ifdef HAVE_AUDIOMIXER static int action_start_audio_mixer_stream_volume( @@ -469,6 +473,28 @@ static int action_start_load_core( return ret; } +#ifdef HAVE_NETWORKING +static int action_start_core_updater_entry( + const char *path, const char *label, + unsigned type, size_t idx, size_t entry_idx) +{ + core_updater_list_t *core_list = core_updater_list_get_cached(); + const core_updater_list_entry_t *entry = NULL; + + /* If specified core is installed, go to core + * information menu */ + if (core_list && + core_updater_list_get_filename(core_list, path, &entry) && + !string_is_empty(entry->local_core_path) && + path_is_valid(entry->local_core_path)) + return action_ok_push_core_information_list( + entry->local_core_path, label, type, idx, entry_idx); + + /* Otherwise do nothing */ + return 0; +} +#endif + static int action_start_lookup_setting( const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -605,6 +631,11 @@ static int menu_cbs_init_bind_start_compare_type(menu_file_list_cbs_t *cbs, case FILE_TYPE_PLAYLIST_COLLECTION: BIND_ACTION_START(cbs, action_ok_push_playlist_manager_settings); break; +#ifdef HAVE_NETWORKING + case FILE_TYPE_DOWNLOAD_CORE: + BIND_ACTION_START(cbs, action_start_core_updater_entry); + break; +#endif default: return -1; } diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index 86638311f5..14208f91ee 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -324,7 +324,6 @@ default_title_macro(action_get_user_accounts_youtube_list, MENU_ENUM_LABEL_ default_title_macro(action_get_user_accounts_twitch_list, MENU_ENUM_LABEL_VALUE_ACCOUNTS_TWITCH) default_title_macro(action_get_download_core_content_list, MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT) default_title_macro(action_get_user_accounts_list, MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST) -default_title_macro(action_get_core_information_list, MENU_ENUM_LABEL_VALUE_CORE_INFORMATION) default_title_macro(action_get_core_list, MENU_ENUM_LABEL_VALUE_CORE_LIST) default_title_macro(action_get_online_updater_list, MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER) default_title_macro(action_get_netplay_list, MENU_ENUM_LABEL_VALUE_NETPLAY) @@ -347,6 +346,7 @@ default_title_macro(action_get_playlist_manager_list, MENU_ENUM_LABEL_ default_title_macro(action_get_input_hotkey_binds_settings_list,MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS) default_title_macro(action_get_driver_settings_list, MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS) default_title_macro(action_get_core_settings_list, MENU_ENUM_LABEL_VALUE_CORE_SETTINGS) +default_title_macro(action_get_core_information_list, MENU_ENUM_LABEL_VALUE_CORE_INFORMATION) default_title_macro(action_get_video_settings_list, MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS) default_title_macro(action_get_video_fullscreen_mode_settings_list, MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_MODE_SETTINGS) default_title_macro(action_get_video_windowed_mode_settings_list, MENU_ENUM_LABEL_VALUE_VIDEO_WINDOWED_MODE_SETTINGS) @@ -657,6 +657,7 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, title_info_list_t info_list[] = { {MENU_ENUM_LABEL_DEFERRED_REMAPPINGS_PORT_LIST, action_get_title_remap_port}, {MENU_ENUM_LABEL_DEFERRED_CORE_SETTINGS_LIST, action_get_core_settings_list}, + {MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_LIST, action_get_core_information_list}, {MENU_ENUM_LABEL_DEFERRED_DUMP_DISC_LIST, action_get_dump_disc_list}, {MENU_ENUM_LABEL_DEFERRED_LOAD_DISC_LIST, action_get_load_disc_list}, {MENU_ENUM_LABEL_DEFERRED_CONFIGURATION_SETTINGS_LIST, action_get_configuration_settings_list }, @@ -823,8 +824,6 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, action_get_database_manager_list}, {MENU_ENUM_LABEL_CURSOR_MANAGER_LIST, action_get_cursor_manager_list}, - {MENU_ENUM_LABEL_CORE_INFORMATION, - action_get_core_information_list}, {MENU_ENUM_LABEL_CORE_LIST, action_get_core_list}, {MENU_ENUM_LABEL_LOAD_CONTENT_SPECIAL, @@ -1112,9 +1111,6 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CURSOR_MANAGER_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_cursor_manager_list); break; - case MENU_ENUM_LABEL_CORE_INFORMATION: - BIND_ACTION_GET_TITLE(cbs, action_get_core_information_list); - break; case MENU_ENUM_LABEL_CORE_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_core_list); break; @@ -1213,6 +1209,9 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_DEFERRED_CORE_SETTINGS_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_core_settings_list); break; + case MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_LIST: + BIND_ACTION_GET_TITLE(cbs, action_get_core_information_list); + break; case MENU_ENUM_LABEL_DEFERRED_INPUT_SETTINGS_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_input_settings_list); break; diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 68d34eaabe..8389b4d767 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -7614,8 +7614,7 @@ static void materialui_populate_entries( * Note: MENU_ENUM_LABEL_FAVORITES is always set * as the 'label' when navigating directories after * selecting load content */ - mui->is_file_list = mui->is_core_updater_list || - string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SCAN_DIRECTORY)) || + mui->is_file_list = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SCAN_DIRECTORY)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_SCAN_FILE)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_IMAGES_LIST)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_MUSIC_LIST)) || @@ -8991,6 +8990,10 @@ static int materialui_pointer_up(void *userdata, return materialui_pointer_up_swipe_horz_plain_list( mui, entry, height, header_height, y, selection, true); + /* If this is the core updater list, swipes are used + * to open the core information menu */ + else if (mui->is_core_updater_list) + return materialui_menu_entry_action(mui, entry, selection, MENU_ACTION_START); /* In all other cases, just perform a normal 'left' * navigation event */ else @@ -9015,6 +9018,10 @@ static int materialui_pointer_up(void *userdata, return materialui_pointer_up_swipe_horz_plain_list( mui, entry, height, header_height, y, selection, false); + /* If this is the core updater list, swipes are used + * to open the core information menu */ + else if (mui->is_core_updater_list) + return materialui_menu_entry_action(mui, entry, selection, MENU_ACTION_START); /* In all other cases, just perform a normal 'right' * navigation event */ else @@ -9150,6 +9157,10 @@ static void materialui_list_insert( node->icon_texture_index = MUI_TEXTURE_SETTINGS; node->has_icon = true; break; + case MENU_SETTING_ACTION_CORE_DELETE: + node->icon_texture_index = MUI_TEXTURE_REMOVE; + node->has_icon = true; + break; default: if ( string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_INFORMATION_LIST)) || @@ -9241,7 +9252,8 @@ static void materialui_list_insert( node->icon_texture_index = MUI_TEXTURE_SHADERS; node->has_icon = true; } - else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CORE_LIST))) + else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CORE_LIST)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CORE_INFORMATION))) { node->icon_texture_index = MUI_TEXTURE_CORES; node->has_icon = true; diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index 733077f4da..2bf9e73ae4 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -111,6 +111,7 @@ enum ACTION_OK_DL_CHEAT_DETAILS_SETTINGS_LIST, ACTION_OK_DL_CHEAT_SEARCH_SETTINGS_LIST, ACTION_OK_DL_CORE_SETTINGS_LIST, + ACTION_OK_DL_CORE_INFORMATION_LIST, ACTION_OK_DL_INPUT_HOTKEY_BINDS_LIST, ACTION_OK_DL_RECORDING_SETTINGS_LIST, ACTION_OK_DL_PLAYLIST_SETTINGS_LIST, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 8b0bc79531..aae56e0af3 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -129,32 +129,56 @@ struct menu_displaylist_state static struct menu_displaylist_state menu_displist_st; -static int menu_displaylist_parse_core_info(file_list_t *list) +static int menu_displaylist_parse_core_info(menu_displaylist_info_t *info) { char tmp[PATH_MAX_LENGTH]; unsigned i, count = 0; core_info_t *core_info = NULL; + const char *core_path = NULL; settings_t *settings = config_get_ptr(); bool menu_show_core_updater = settings->bools.menu_show_core_updater; tmp[0] = '\0'; - core_info_get_current_core(&core_info); + /* Check whether we are parsing information for a + * core updater entry or the currently loaded core */ + if (info->type == FILE_TYPE_DOWNLOAD_CORE) + { + core_info_ctx_find_t core_info_finder; + + core_path = info->path; + + /* Core updater entry - search for corresponding + * core info */ + core_info_finder.inf = NULL; + core_info_finder.path = core_path; + + if (core_info_find(&core_info_finder, core_path)) + core_info = core_info_finder.inf; + } + else + if (core_info_get_current_core(&core_info)) + core_path = core_info->path; if (!core_info || !core_info->config_data) { - if (menu_entries_append_enum(list, + if (menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_CORE_INFORMATION_AVAILABLE), msg_hash_to_str(MENU_ENUM_LABEL_NO_CORE_INFORMATION_AVAILABLE), MENU_ENUM_LABEL_NO_CORE_INFORMATION_AVAILABLE, 0, 0, 0)) count++; - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_DELETE), - msg_hash_to_str(MENU_ENUM_LABEL_CORE_DELETE), - MENU_ENUM_LABEL_CORE_DELETE, - MENU_SETTING_ACTION_CORE_DELETE, 0, 0)) - count++; + + if (menu_show_core_updater && + !string_is_empty(core_path)) + { + if (menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_DELETE), + core_path, + MENU_ENUM_LABEL_CORE_DELETE, + MENU_SETTING_ACTION_CORE_DELETE, 0, 0)) + count++; + } return count; } @@ -188,7 +212,7 @@ static int menu_displaylist_parse_core_info(file_list_t *list) ": ", info_list[i].name, sizeof(tmp)); - if (menu_entries_append_enum(list, tmp, "", + if (menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0)) count++; @@ -203,7 +227,7 @@ static int menu_displaylist_parse_core_info(file_list_t *list) sizeof(tmp)); string_list_join_concat(tmp, sizeof(tmp), core_info->categories_list, ", "); - if (menu_entries_append_enum(list, tmp, "", + if (menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0)) count++; } @@ -216,7 +240,7 @@ static int menu_displaylist_parse_core_info(file_list_t *list) sizeof(tmp)); string_list_join_concat(tmp, sizeof(tmp), core_info->authors_list, ", "); - if (menu_entries_append_enum(list, tmp, "", + if (menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0)) count++; } @@ -229,7 +253,7 @@ static int menu_displaylist_parse_core_info(file_list_t *list) sizeof(tmp)); string_list_join_concat(tmp, sizeof(tmp), core_info->permissions_list, ", "); - if (menu_entries_append_enum(list, tmp, "", + if (menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0)) count++; } @@ -242,7 +266,7 @@ static int menu_displaylist_parse_core_info(file_list_t *list) sizeof(tmp)); string_list_join_concat(tmp, sizeof(tmp), core_info->licenses_list, ", "); - if (menu_entries_append_enum(list, tmp, "", + if (menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0)) count++; } @@ -255,7 +279,7 @@ static int menu_displaylist_parse_core_info(file_list_t *list) sizeof(tmp)); string_list_join_concat(tmp, sizeof(tmp), core_info->supported_extensions_list, ", "); - if (menu_entries_append_enum(list, tmp, "", + if (menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0)) count++; } @@ -268,7 +292,7 @@ static int menu_displaylist_parse_core_info(file_list_t *list) sizeof(tmp)); string_list_join_concat(tmp, sizeof(tmp), core_info->required_hw_api_list, ", "); - if (menu_entries_append_enum(list, tmp, "", + if (menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0)) count++; } @@ -296,7 +320,7 @@ static int menu_displaylist_parse_core_info(file_list_t *list) ": ", sizeof(tmp)); - if (menu_entries_append_enum(list, tmp, "", + if (menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0)) count++; @@ -320,7 +344,7 @@ static int menu_displaylist_parse_core_info(file_list_t *list) msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_NAME) ); - if (menu_entries_append_enum(list, tmp, "", + if (menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0)) count++; @@ -334,7 +358,7 @@ static int menu_displaylist_parse_core_info(file_list_t *list) { strlcpy(tmp, core_info->note_list->elems[i].data, sizeof(tmp)); - if (menu_entries_append_enum(list, tmp, "", + if (menu_entries_append_enum(info->list, tmp, "", MENU_ENUM_LABEL_CORE_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0)) count++; } @@ -342,15 +366,16 @@ static int menu_displaylist_parse_core_info(file_list_t *list) #if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP #else - if (menu_show_core_updater) - { - if (menu_entries_append_enum(list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_DELETE), - msg_hash_to_str(MENU_ENUM_LABEL_CORE_DELETE), - MENU_ENUM_LABEL_CORE_DELETE, - MENU_SETTING_ACTION_CORE_DELETE, 0, 0)) - count++; - } + if (menu_show_core_updater && + !string_is_empty(core_path)) + { + if (menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_DELETE), + core_path, + MENU_ENUM_LABEL_CORE_DELETE, + MENU_SETTING_ACTION_CORE_DELETE, 0, 0)) + count++; + } #endif return count; @@ -8878,7 +8903,6 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, info->need_push = true; info->need_refresh = true; - info->need_clear = true; break; case DISPLAYLIST_THUMBNAILS_UPDATER: @@ -9371,7 +9395,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, break; case DISPLAYLIST_CORE_INFO: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - count = menu_displaylist_parse_core_info(info->list); + count = menu_displaylist_parse_core_info(info); info->need_push = true; break; case DISPLAYLIST_CORE_OPTIONS: diff --git a/msg_hash.h b/msg_hash.h index d49ba15dfa..3d69493162 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1391,6 +1391,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_DEFERRED_AUDIO_SYNCHRONIZATION_SETTINGS_LIST, MENU_ENUM_LABEL_DEFERRED_AUDIO_MIXER_SETTINGS_LIST, MENU_ENUM_LABEL_DEFERRED_CORE_SETTINGS_LIST, + MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_LIST, MENU_ENUM_LABEL_DEFERRED_USER_BINDS_LIST, MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_CHEEVOS_LIST, MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_TWITCH_LIST, diff --git a/tasks/task_core_updater.c b/tasks/task_core_updater.c index b79ac822fe..6107eac3bd 100644 --- a/tasks/task_core_updater.c +++ b/tasks/task_core_updater.c @@ -442,6 +442,15 @@ error: /* Download core */ /*****************/ +static void cb_task_core_updater_download( + retro_task_t *task, void *task_data, + void *user_data, const char *err) +{ + /* Reload core info files + * > This must be done on the main thread */ + command_event(CMD_EVENT_CORE_INFO_INIT, NULL); +} + static void cb_decompress_task_core_updater_download( retro_task_t *task, void *task_data, void *user_data, const char *err) @@ -757,9 +766,6 @@ static void task_core_updater_download_handler(retro_task_t *task) task_title[0] = '\0'; - /* Reload core info files */ - command_event(CMD_EVENT_CORE_INFO_INIT, NULL); - /* Set final task title */ task_free_title(task); @@ -894,6 +900,7 @@ void *task_push_core_updater_download( task->title = strdup(task_title); task->alternative_look = true; task->progress = 0; + task->callback = cb_task_core_updater_download; /* Push task */ task_queue_push(task);