diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h index 465ca14c65..5c9f1533dd 100644 --- a/frontend/menu/menu_common.h +++ b/frontend/menu/menu_common.h @@ -66,6 +66,8 @@ typedef enum MENU_FILE_PLAYLIST_ENTRY, MENU_FILE_USE_DIRECTORY, MENU_FILE_SWITCH, + MENU_FILE_CARCHIVE, + MENU_FILE_IN_CARCHIVE, MENU_SETTINGS, } menu_file_type_t; diff --git a/frontend/menu/menu_entries.c b/frontend/menu/menu_entries.c index dce6059142..8c8dc11bd2 100644 --- a/frontend/menu/menu_entries.c +++ b/frontend/menu/menu_entries.c @@ -629,6 +629,7 @@ int menu_parse_check(const char *label, unsigned menu_type) RARCH_LOG("label is menu_parse_check: %s\n", label); #endif if (!((menu_type == MENU_FILE_DIRECTORY || + menu_type == MENU_FILE_CARCHIVE || menu_common_type_is(label, menu_type) == MENU_SETTINGS_SHADER_OPTIONS || menu_common_type_is(label, menu_type) == MENU_FILE_DIRECTORY || !strcmp(label, "input_overlay") || @@ -793,7 +794,17 @@ int menu_parse_and_resolve(file_list_t *list, file_list_t *menu_list) else exts = g_extern.system.valid_extensions; - struct string_list *str_list = dir_list_new(dir, exts, true); + struct string_list *str_list = NULL; + + if (path_is_compressed_file(dir)) + { + printf("Uncompressing file_list from dir\n."); + str_list = compressed_file_list_new(dir,exts); + } + else + { + str_list = dir_list_new(dir, exts, true); + } if (!str_list) return -1; @@ -806,7 +817,24 @@ int menu_parse_and_resolve(file_list_t *list, file_list_t *menu_list) list_size = str_list->size; for (i = 0; i < str_list->size; i++) { - bool is_dir = (str_list->elems[i].attr.i == RARCH_DIRECTORY); + menu_file_type_t file_type = 0; + switch (str_list->elems[i].attr.i) + { + case RARCH_DIRECTORY: + file_type = MENU_FILE_DIRECTORY; + break; + case RARCH_COMPRESSED_ARCHIVE: + file_type = MENU_FILE_CARCHIVE; + break; + case RARCH_COMPRESSED_FILE_IN_ARCHIVE: + file_type = MENU_FILE_IN_CARCHIVE; + break; + case RARCH_PLAIN_FILE: + default: + file_type = MENU_FILE_PLAIN; + break; + } + bool is_dir = (file_type == MENU_FILE_DIRECTORY); if ((menu_common_type_is(label, menu_type) == MENU_FILE_DIRECTORY) && !is_dir) continue; @@ -827,11 +855,17 @@ int menu_parse_and_resolve(file_list_t *list, file_list_t *menu_list) /* Push menu_type further down in the chain. * Needed for shader manager currently. */ if (!strcmp(label, "core_list")) + { + /* Compressed cores are unsupported */ + if (file_type == MENU_FILE_CARCHIVE) + continue; + file_list_push(list, path, "", is_dir ? MENU_FILE_DIRECTORY : MENU_FILE_CORE, 0); + } else file_list_push(list, path, "", - is_dir ? MENU_FILE_DIRECTORY : MENU_FILE_PLAIN, 0); + file_type, 0); } menu_entries_push_list(driver.menu, list,