diff --git a/frontend/menu/rmenu.c b/frontend/menu/rmenu.c index 666d25ecad..a9b13c1441 100644 --- a/frontend/menu/rmenu.c +++ b/frontend/menu/rmenu.c @@ -60,7 +60,6 @@ struct texture_image *menu_panel; static bool menu_bg_show = true; filebrowser_t *browser; -filebrowser_t *tmpBrowser; unsigned currently_selected_controller_menu = 0; #ifdef HAVE_SHADER_MANAGER @@ -298,12 +297,44 @@ static unsigned stack_idx = 0; static void menu_stack_pop(void) { + if (browser->prev_dir.directory_path[0] != '\0') + { + strlcpy(browser->current_dir.directory_path, browser->prev_dir.directory_path, + sizeof(browser->current_dir.directory_path)); + strlcpy(browser->current_dir.extensions, browser->prev_dir.extensions, + sizeof(browser->current_dir.extensions)); + strlcpy(browser->current_dir.root_dir, browser->prev_dir.root_dir, + sizeof(browser->current_dir.root_dir)); + filebrowser_iterate(browser, FILEBROWSER_ACTION_RESET_CURRENT_DIR); + browser->current_dir.ptr = browser->prev_dir.ptr; + strlcpy(browser->current_dir.path, browser->prev_dir.path, + sizeof(browser->current_dir.path)); + browser->prev_dir.ptr = 0; + browser->prev_dir.path[0] = '\0'; + browser->prev_dir.directory_path[0] = '\0'; + browser->prev_dir.extensions[0] = '\0'; + browser->prev_dir.root_dir[0] = '\0'; + } + if (stack_idx > 1) stack_idx--; } -static void menu_stack_push(unsigned menu_id) +static void menu_stack_push(unsigned menu_id, bool prev_dir) { + if (prev_dir) + { + strlcpy(browser->prev_dir.directory_path, browser->current_dir.directory_path, + sizeof(browser->prev_dir.directory_path)); + strlcpy(browser->prev_dir.extensions, browser->current_dir.extensions, + sizeof(browser->prev_dir.extensions)); + strlcpy(browser->prev_dir.root_dir, browser->current_dir.root_dir, + sizeof(browser->prev_dir.root_dir)); + strlcpy(browser->prev_dir.path, browser->current_dir.path, + sizeof(browser->prev_dir.path)); + browser->prev_dir.ptr = browser->current_dir.ptr; + } + menu_stack_enum_array[stack_idx] = menu_id; stack_idx++; } @@ -864,8 +895,6 @@ static void display_menubar(uint8_t menu_type) char msg[128]; font_params_t font_parms = {0}; - filebrowser_t *fb = browser; - font_parms.x = POSITION_X; font_parms.y = CURRENT_PATH_Y_POSITION; font_parms.scale = CURRENT_PATH_FONT_SIZE; @@ -1006,9 +1035,8 @@ static void display_menubar(uint8_t menu_type) #endif case PATH_SRAM_DIR_CHOICE: case PATH_SYSTEM_DIR_CHOICE: - fb = tmpBrowser; case FILE_BROWSER_MENU: - snprintf(msg, sizeof(msg), "PATH: %s", fb->directory_path); + snprintf(msg, sizeof(msg), "PATH: %s", browser->current_dir.directory_path); if (driver.video_poke->set_osd_msg) driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms); @@ -1045,7 +1073,6 @@ static void display_menubar(uint8_t menu_type) static void browser_update(void *data, uint64_t input, const char *extensions) { - filebrowser_t *b = (filebrowser_t*)data; filebrowser_action_t action = FILEBROWSER_ACTION_NOOP; bool ret = true; @@ -1064,7 +1091,7 @@ static void browser_update(void *data, uint64_t input, const char *extensions) else if (input & (1ULL << RMENU_DEVICE_NAV_A)) { char tmp_str[256]; - fill_pathname_parent_dir(tmp_str, b->directory_path, sizeof(tmp_str)); + fill_pathname_parent_dir(tmp_str, browser->current_dir.directory_path, sizeof(tmp_str)); if (tmp_str[0] != '\0') action = FILEBROWSER_ACTION_CANCEL; @@ -1072,12 +1099,13 @@ static void browser_update(void *data, uint64_t input, const char *extensions) else if (input & (1ULL << RMENU_DEVICE_NAV_START)) { action = FILEBROWSER_ACTION_RESET; - filebrowser_set_root_and_ext(b, NULL, default_paths.filesystem_root_dir); - strlcpy(b->extensions, extensions, sizeof(b->extensions)); + filebrowser_set_root_and_ext(browser, NULL, default_paths.filesystem_root_dir); + strlcpy(browser->current_dir.extensions, extensions, + sizeof(browser->current_dir.extensions)); } if (action != FILEBROWSER_ACTION_NOOP) - ret = filebrowser_iterate(b, action); + ret = filebrowser_iterate(browser, action); if (!ret) msg_queue_push(g_extern.msg_queue, "ERROR - Failed to open directory.", 1, 180); @@ -1085,8 +1113,7 @@ static void browser_update(void *data, uint64_t input, const char *extensions) static void browser_render(void *data) { - filebrowser_t *b = (filebrowser_t*)data; - unsigned file_count = b->current_dir.list->size; + unsigned file_count = browser->list->size; unsigned current_index = 0; unsigned page_number = 0; unsigned page_base = 0; @@ -1094,7 +1121,7 @@ static void browser_render(void *data) float y_increment = POSITION_Y_START; font_params_t font_parms = {0}; - current_index = b->current_dir.ptr; + current_index = browser->current_dir.ptr; page_number = current_index / NUM_ENTRY_PER_PAGE; page_base = page_number * NUM_ENTRY_PER_PAGE; @@ -1103,13 +1130,12 @@ static void browser_render(void *data) for (i = page_base; i < file_count && i < page_base + NUM_ENTRY_PER_PAGE; ++i) { char fname_tmp[128]; - fill_pathname_base(fname_tmp, b->current_dir.list->elems[i].data, sizeof(fname_tmp)); + fill_pathname_base(fname_tmp, browser->list->elems[i].data, sizeof(fname_tmp)); y_increment += POSITION_Y_INCREMENT; #ifdef HAVE_MENU_PANEL //check if this is the currently selected file - const char *current_pathname = b->current_path; - if (strcmp(current_pathname, b->current_dir.list->elems[i].data) == 0) + if (strcmp(browser->current_dir.path, browser->list->elems[i].data) == 0) { menu_panel->x = 0; menu_panel->y = y_increment; @@ -1120,7 +1146,7 @@ static void browser_render(void *data) font_parms.x = POSITION_X; font_parms.y = y_increment; - font_parms.color = i == current_index ? RED : b->current_dir.list->elems[i].attr.b ? GREEN : WHITE; + font_parms.color = i == current_index ? RED : browser->list->elems[i].attr.b ? GREEN : WHITE; if (driver.video_poke->set_osd_msg) driver.video_poke->set_osd_msg(driver.video_data, fname_tmp, &font_parms); @@ -1135,10 +1161,9 @@ static int select_file(uint8_t menu_type, uint64_t input) char comment[128]; char path[PATH_MAX]; bool ret = true; + bool pop_menu_stack = false; font_params_t font_parms = {0}; - filebrowser_t *filebrowser = tmpBrowser; - switch(menu_type) { case SHADER_CHOICE: @@ -1163,15 +1188,15 @@ static int select_file(uint8_t menu_type, uint64_t input) break; } - browser_update(filebrowser, input, extensions); + browser_update(browser, input, extensions); if (input & (1ULL << RMENU_DEVICE_NAV_B)) { - if (filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR)) - ret = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK); + if (filebrowser_iterate(browser, FILEBROWSER_ACTION_PATH_ISDIR)) + ret = filebrowser_iterate(browser, FILEBROWSER_ACTION_OK); else { - strlcpy(path, filebrowser->current_path, sizeof(path)); + strlcpy(path, browser->current_dir.path, sizeof(path)); switch(menu_type) { @@ -1246,13 +1271,16 @@ static int select_file(uint8_t menu_type, uint64_t input) break; } - menu_stack_pop(); + pop_menu_stack = true; } if (!ret) msg_queue_push(g_extern.msg_queue, "INFO - You need to restart RetroArch.", 1, 180); } else if (input & (1ULL << RMENU_DEVICE_NAV_X)) + pop_menu_stack = true; + + if (pop_menu_stack) menu_stack_pop(); display_menubar(menu_type); @@ -1286,7 +1314,7 @@ static int select_file(uint8_t menu_type, uint64_t input) if (driver.video_poke->set_osd_msg) driver.video_poke->set_osd_msg(driver.video_data, comment, &font_parms); - browser_render(filebrowser); + browser_render(browser); return 0; } @@ -1299,16 +1327,15 @@ static int select_directory(uint8_t menu_type, uint64_t input) char msg[256]; bool ret = true; - filebrowser_t *filebrowser = tmpBrowser; - - bool is_dir = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR); - browser_update(filebrowser, input, "empty"); + bool is_dir = filebrowser_iterate(browser, FILEBROWSER_ACTION_PATH_ISDIR); + bool pop_menu_stack = false; + browser_update(browser, input, "empty"); if (input & (1ULL << RMENU_DEVICE_NAV_Y)) { if (is_dir) { - strlcpy(path, filebrowser->current_path, sizeof(path)); + strlcpy(path, browser->current_dir.path, sizeof(path)); switch(menu_type) { @@ -1330,7 +1357,7 @@ static int select_directory(uint8_t menu_type, uint64_t input) strlcpy(g_settings.system_directory, path, sizeof(g_settings.system_directory)); break; } - menu_stack_pop(); + pop_menu_stack = true; } } else if (input & (1ULL << RMENU_DEVICE_NAV_X)) @@ -1356,15 +1383,17 @@ static int select_directory(uint8_t menu_type, uint64_t input) strlcpy(g_settings.system_directory, path, sizeof(g_settings.system_directory)); break; } - - menu_stack_pop(); + pop_menu_stack = true; } else if (input & (1ULL << RMENU_DEVICE_NAV_B)) { if (is_dir) - ret = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK); + ret = filebrowser_iterate(browser, FILEBROWSER_ACTION_OK); } + if (pop_menu_stack) + menu_stack_pop(); + if (!ret) msg_queue_push(g_extern.msg_queue, "ERROR - Failed to open directory.", 1, 180); @@ -1417,7 +1446,7 @@ static int select_directory(uint8_t menu_type, uint64_t input) if (driver.video_poke->set_osd_msg) driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms); - browser_render(filebrowser); + browser_render(browser); return 0; } @@ -1534,7 +1563,6 @@ static uint8_t selected = 0; static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t input) { DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; - filebrowser_t *filebrowser = tmpBrowser; switch (switchvalue) { @@ -1595,8 +1623,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t case SETTING_EMU_SKIN: if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) { - menu_stack_push(BORDER_CHOICE); - filebrowser_set_root_and_ext(filebrowser, EXT_IMAGES, default_paths.border_dir); + menu_stack_push(BORDER_CHOICE, true); + filebrowser_set_root_and_ext(browser, EXT_IMAGES, default_paths.border_dir); } if (input & (1ULL << RMENU_DEVICE_NAV_START)) { @@ -1883,8 +1911,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t case SETTING_RARCH_DEFAULT_EMU: if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) { - menu_stack_push(LIBRETRO_CHOICE); - filebrowser_set_root_and_ext(filebrowser, EXT_EXECUTABLES, default_paths.core_dir); + menu_stack_push(LIBRETRO_CHOICE, true); + filebrowser_set_root_and_ext(browser, EXT_EXECUTABLES, default_paths.core_dir); set_libretro_core_as_launch = true; } if (input & (1ULL << RMENU_DEVICE_NAV_START)) @@ -1952,8 +1980,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t case SETTING_PATH_DEFAULT_ROM_DIRECTORY: if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) { - menu_stack_push(PATH_DEFAULT_ROM_DIR_CHOICE); - filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir); + menu_stack_push(PATH_DEFAULT_ROM_DIR_CHOICE, true); + filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir); } if (input & (1ULL << RMENU_DEVICE_NAV_START)) @@ -1962,8 +1990,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t case SETTING_PATH_SAVESTATES_DIRECTORY: if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) { - menu_stack_push(PATH_SAVESTATES_DIR_CHOICE); - filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir); + menu_stack_push(PATH_SAVESTATES_DIR_CHOICE, true); + filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir); } if (input & (1ULL << RMENU_DEVICE_NAV_START)) @@ -1973,8 +2001,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t case SETTING_PATH_SRAM_DIRECTORY: if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) { - menu_stack_push(PATH_SRAM_DIR_CHOICE); - filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir); + menu_stack_push(PATH_SRAM_DIR_CHOICE, true); + filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir); } if (input & (1ULL << RMENU_DEVICE_NAV_START)) @@ -1984,8 +2012,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t case SETTING_PATH_CHEATS: if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) { - menu_stack_push(PATH_CHEATS_DIR_CHOICE); - filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.filesystem_root_dir); + menu_stack_push(PATH_CHEATS_DIR_CHOICE, true); + filebrowser_set_root_and_ext(browser, "empty", default_paths.filesystem_root_dir); } if (input & (1ULL << RMENU_DEVICE_NAV_START)) @@ -1995,8 +2023,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t case SETTING_PATH_SYSTEM: if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) { - menu_stack_push(PATH_SYSTEM_DIR_CHOICE); - filebrowser_set_root_and_ext(filebrowser, "empty", default_paths.system_dir); + menu_stack_push(PATH_SYSTEM_DIR_CHOICE, true); + filebrowser_set_root_and_ext(browser, "empty", default_paths.system_dir); } if (input & (1ULL << RMENU_DEVICE_NAV_START)) @@ -2039,8 +2067,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t case SETTING_CONTROLS_SCHEME: if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)) || (input & (1ULL << RMENU_DEVICE_NAV_START))) { - menu_stack_push(INPUT_PRESET_CHOICE); - filebrowser_set_root_and_ext(filebrowser, EXT_INPUT_PRESETS, default_paths.input_presets_dir); + menu_stack_push(INPUT_PRESET_CHOICE, true); + filebrowser_set_root_and_ext(browser, EXT_INPUT_PRESETS, default_paths.input_presets_dir); } break; case SETTING_CONTROLS_NUMBER: @@ -2236,15 +2264,15 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t break; case INGAME_MENU_RESIZE_MODE: if (input & (1ULL << RMENU_DEVICE_NAV_B)) - menu_stack_push(INGAME_MENU_RESIZE); + menu_stack_push(INGAME_MENU_RESIZE, false); break; case INGAME_MENU_CORE_OPTIONS_MODE: if (input & (1ULL << RMENU_DEVICE_NAV_B)) - menu_stack_push(INGAME_MENU_CORE_OPTIONS); + menu_stack_push(INGAME_MENU_CORE_OPTIONS, false); break; case INGAME_MENU_SCREENSHOT_MODE: if (input & (1ULL << RMENU_DEVICE_NAV_B)) - menu_stack_push(INGAME_MENU_SCREENSHOT); + menu_stack_push(INGAME_MENU_SCREENSHOT, false); break; case INGAME_MENU_RETURN_TO_GAME: if (input & (1ULL << RMENU_DEVICE_NAV_B)) @@ -2275,8 +2303,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t case INGAME_MENU_CHANGE_LIBRETRO_CORE: if (input & (1ULL << RMENU_DEVICE_NAV_B)) { - menu_stack_push(LIBRETRO_CHOICE); - filebrowser_set_root_and_ext(filebrowser, EXT_EXECUTABLES, default_paths.core_dir); + menu_stack_push(LIBRETRO_CHOICE, true); + filebrowser_set_root_and_ext(browser, EXT_EXECUTABLES, default_paths.core_dir); set_libretro_core_as_launch = true; } break; @@ -2307,14 +2335,14 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t if (input & (1ULL << RMENU_DEVICE_NAV_B)) { selected = FIRST_SHADERMAN_SETTING; - menu_stack_push(INGAME_MENU_SHADER_MANAGER); + menu_stack_push(INGAME_MENU_SHADER_MANAGER, false); } break; case SHADERMAN_LOAD_CGP: if ((input & (1ULL << RMENU_DEVICE_NAV_LEFT)) || (input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B))) { - menu_stack_push(PRESET_CHOICE); - filebrowser_set_root_and_ext(filebrowser, EXT_CGP_PRESETS, g_settings.video.shader_dir); + menu_stack_push(PRESET_CHOICE, true); + filebrowser_set_root_and_ext(browser, EXT_CGP_PRESETS, g_settings.video.shader_dir); } if (input & (1ULL << RMENU_DEVICE_NAV_START)) strlcpy(g_extern.file_state.cgp_path, "", sizeof(g_extern.file_state.cgp_path)); @@ -2357,8 +2385,8 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t (input & (1ULL << RMENU_DEVICE_NAV_LEFT))) { shader_choice_set_shader_slot = index; - menu_stack_push(SHADER_CHOICE); - filebrowser_set_root_and_ext(tmpBrowser, EXT_SHADERS, g_settings.video.shader_dir); + menu_stack_push(SHADER_CHOICE, true); + filebrowser_set_root_and_ext(browser, EXT_SHADERS, g_settings.video.shader_dir); } if (input & (1ULL << RMENU_DEVICE_NAV_START)) @@ -2689,7 +2717,7 @@ static int select_setting(uint8_t menu_type, uint64_t input) if (menu_type == PATH_MENU) selected = FIRST_CONTROLS_SETTING_PAGE_1; - menu_stack_push(menu_type + 1); + menu_stack_push(menu_type + 1, false); page_number = 0; break; case CONTROLS_MENU: @@ -2749,7 +2777,6 @@ static int select_rom(uint8_t menu_type, uint64_t input) { font_params_t font_parms = {0}; char msg[128]; - filebrowser_t *filebrowser = browser; struct platform_bind key_label_b = {0}; struct platform_bind key_label_l3 = {0}; @@ -2773,22 +2800,22 @@ static int select_rom(uint8_t menu_type, uint64_t input) driver.input->set_keybinds(&key_label_b, 0, 0, 0, (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL)); } - browser_update(filebrowser, input, g_extern.system.valid_extensions); + browser_update(browser, input, g_extern.system.valid_extensions); if (input & (1ULL << RMENU_DEVICE_NAV_SELECT)) - menu_stack_push(GENERAL_VIDEO_MENU); + menu_stack_push(GENERAL_VIDEO_MENU, false); else if (input & (1ULL << RMENU_DEVICE_NAV_B)) { - if (filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR)) + if (filebrowser_iterate(browser, FILEBROWSER_ACTION_PATH_ISDIR)) { - bool ret = filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK); + bool ret = filebrowser_iterate(browser, FILEBROWSER_ACTION_OK); if (!ret) msg_queue_push(g_extern.msg_queue, "ERROR - Failed to open directory.", 1, 180); } else { - strlcpy(g_extern.fullpath, filebrowser->current_path, sizeof(g_extern.fullpath)); + strlcpy(g_extern.fullpath, browser->current_dir.path, sizeof(g_extern.fullpath)); g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_GAME); } } @@ -2797,8 +2824,8 @@ static int select_rom(uint8_t menu_type, uint64_t input) const char * drive_map = menu_drive_mapping_previous(); if (drive_map != NULL) { - filebrowser_set_root_and_ext(filebrowser, g_extern.system.valid_extensions, drive_map); - browser_update(filebrowser, 1ULL << RMENU_DEVICE_NAV_B, g_extern.system.valid_extensions); + filebrowser_set_root_and_ext(browser, g_extern.system.valid_extensions, drive_map); + browser_update(browser, 1ULL << RMENU_DEVICE_NAV_B, g_extern.system.valid_extensions); } } else if (input & (1ULL << RMENU_DEVICE_NAV_R1)) @@ -2806,12 +2833,12 @@ static int select_rom(uint8_t menu_type, uint64_t input) const char * drive_map = menu_drive_mapping_next(); if (drive_map != NULL) { - filebrowser_set_root_and_ext(filebrowser, g_extern.system.valid_extensions, drive_map); - browser_update(filebrowser, 1ULL << RMENU_DEVICE_NAV_B, g_extern.system.valid_extensions); + filebrowser_set_root_and_ext(browser, g_extern.system.valid_extensions, drive_map); + browser_update(browser, 1ULL << RMENU_DEVICE_NAV_B, g_extern.system.valid_extensions); } } - if (filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_PATH_ISDIR)) + if (filebrowser_iterate(browser, FILEBROWSER_ACTION_PATH_ISDIR)) snprintf(msg, sizeof(msg), "INFO - Press [%s] to enter the directory.", key_label_b.desc); else snprintf(msg, sizeof(msg), "INFO - Press [%s] to load the game.", key_label_b.desc); @@ -2841,7 +2868,7 @@ static int select_rom(uint8_t menu_type, uint64_t input) if (driver.video_poke->set_osd_msg) driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms); - browser_render(filebrowser); + browser_render(browser); return 0; } @@ -3375,22 +3402,15 @@ static int menu_input_process(uint8_t menu_type, uint64_t old_state) void menu_init(void) { browser = (filebrowser_t*)calloc(1, sizeof(*browser)); - tmpBrowser = (filebrowser_t*)calloc(1, sizeof(*tmpBrowser)); - strlcpy(browser->extensions, g_extern.system.valid_extensions, - sizeof(browser->extensions)); - strlcpy(browser->root_dir, g_extern.console.main_wrap.default_rom_startup_dir, - sizeof(browser->root_dir)); - - strlcpy(tmpBrowser->extensions, "", - sizeof(tmpBrowser->extensions)); - strlcpy(tmpBrowser->root_dir, default_paths.filesystem_root_dir, - sizeof(tmpBrowser->root_dir)); + strlcpy(browser->current_dir.extensions, g_extern.system.valid_extensions, + sizeof(browser->current_dir.extensions)); + strlcpy(browser->current_dir.root_dir, g_extern.console.main_wrap.default_rom_startup_dir, + sizeof(browser->current_dir.root_dir)); filebrowser_iterate(browser, FILEBROWSER_ACTION_RESET); - filebrowser_iterate(tmpBrowser, FILEBROWSER_ACTION_RESET); - menu_stack_push(FILE_BROWSER_MENU); + menu_stack_push(FILE_BROWSER_MENU, false); rmenu_gfx_init(); } @@ -3401,7 +3421,6 @@ void menu_free(void) rmenu_gfx_free(); filebrowser_free(browser); - filebrowser_free(tmpBrowser); } bool menu_iterate(void) @@ -3416,7 +3435,7 @@ bool menu_iterate(void) if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_INGAME)) { selected = FIRST_INGAME_MENU_SETTING; - menu_stack_push(INGAME_MENU); + menu_stack_push(INGAME_MENU, false); } #ifndef __CELLOS_LV2__ diff --git a/frontend/menu/utils/file_browser.c b/frontend/menu/utils/file_browser.c index 279ac2baae..b9bdc8661e 100644 --- a/frontend/menu/utils/file_browser.c +++ b/frontend/menu/utils/file_browser.c @@ -23,19 +23,21 @@ static bool directory_parse(void *data, const char *path) { filebrowser_t *filebrowser = (filebrowser_t*)data; - struct string_list *list = dir_list_new(path, filebrowser->extensions, true); + struct string_list *list = dir_list_new(path, + filebrowser->current_dir.extensions, true); if(!list) return false; dir_list_sort(list, true); filebrowser->current_dir.ptr = 0; - strlcpy(filebrowser->directory_path, path, sizeof(filebrowser->directory_path)); + strlcpy(filebrowser->current_dir.directory_path, + path, sizeof(filebrowser->current_dir.directory_path)); - if(filebrowser->current_dir.list) - dir_list_free(filebrowser->current_dir.list); + if(filebrowser->list) + dir_list_free(filebrowser->list); - filebrowser->current_dir.list = list; + filebrowser->list = list; return true; @@ -45,8 +47,8 @@ void filebrowser_free(void *data) { filebrowser_t *filebrowser = (filebrowser_t*)data; - dir_list_free(filebrowser->current_dir.list); - filebrowser->current_dir.list = NULL; + dir_list_free(filebrowser->list); + filebrowser->list = NULL; filebrowser->current_dir.ptr = 0; free(filebrowser); } @@ -56,17 +58,15 @@ void filebrowser_set_root_and_ext(void *data, const char *ext, const char *root_ filebrowser_t *filebrowser = (filebrowser_t*)data; if (ext) - strlcpy(filebrowser->extensions, ext, sizeof(filebrowser->extensions)); + strlcpy(filebrowser->current_dir.extensions, ext, + sizeof(filebrowser->current_dir.extensions)); - strlcpy(filebrowser->root_dir, root_dir, sizeof(filebrowser->root_dir)); + strlcpy(filebrowser->current_dir.root_dir, + root_dir, sizeof(filebrowser->current_dir.root_dir)); filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_RESET); } -static inline const char *filebrowser_get_current_path (void *data) -{ - filebrowser_t *filebrowser = (filebrowser_t*)data; - return filebrowser->current_dir.list->elems[filebrowser->current_dir.ptr].data; -} +#define GET_CURRENT_PATH(browser) (browser->list->elems[browser->current_dir.ptr].data) bool filebrowser_iterate(void *data, unsigned action) { @@ -78,12 +78,12 @@ bool filebrowser_iterate(void *data, unsigned action) { case FILEBROWSER_ACTION_UP: filebrowser->current_dir.ptr--; - if (filebrowser->current_dir.ptr >= filebrowser->current_dir.list->size) - filebrowser->current_dir.ptr = filebrowser->current_dir.list->size - 1; + if (filebrowser->current_dir.ptr >= filebrowser->list->size) + filebrowser->current_dir.ptr = filebrowser->list->size - 1; break; case FILEBROWSER_ACTION_DOWN: filebrowser->current_dir.ptr++; - if (filebrowser->current_dir.ptr >= filebrowser->current_dir.list->size) + if (filebrowser->current_dir.ptr >= filebrowser->list->size) filebrowser->current_dir.ptr = 0; break; case FILEBROWSER_ACTION_LEFT: @@ -94,7 +94,7 @@ bool filebrowser_iterate(void *data, unsigned action) break; case FILEBROWSER_ACTION_RIGHT: filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr + 5, - filebrowser->current_dir.list->size-1)); + filebrowser->list->size-1)); break; case FILEBROWSER_ACTION_SCROLL_UP: if (filebrowser->current_dir.ptr <= entries_to_scroll) @@ -104,28 +104,34 @@ bool filebrowser_iterate(void *data, unsigned action) break; case FILEBROWSER_ACTION_SCROLL_DOWN: filebrowser->current_dir.ptr = (min(filebrowser->current_dir.ptr + - entries_to_scroll, filebrowser->current_dir.list->size-1)); + entries_to_scroll, filebrowser->list->size-1)); break; case FILEBROWSER_ACTION_OK: - ret = directory_parse(filebrowser, filebrowser_get_current_path(filebrowser)); + ret = directory_parse(filebrowser, GET_CURRENT_PATH(filebrowser)); break; case FILEBROWSER_ACTION_CANCEL: - fill_pathname_parent_dir(filebrowser->directory_path, filebrowser->directory_path, sizeof(filebrowser->directory_path)); + fill_pathname_parent_dir(filebrowser->current_dir.directory_path, + filebrowser->current_dir.directory_path, + sizeof(filebrowser->current_dir.directory_path)); - ret = directory_parse(filebrowser, filebrowser->directory_path); + ret = directory_parse(filebrowser, filebrowser->current_dir.directory_path); break; case FILEBROWSER_ACTION_RESET: - ret = directory_parse(filebrowser, filebrowser->root_dir); + ret = directory_parse(filebrowser, filebrowser->current_dir.root_dir); + break; + case FILEBROWSER_ACTION_RESET_CURRENT_DIR: + ret = directory_parse(filebrowser, filebrowser->current_dir.directory_path); break; case FILEBROWSER_ACTION_PATH_ISDIR: - ret = filebrowser->current_dir.list->elems[filebrowser->current_dir.ptr].attr.b; + ret = filebrowser->list->elems[filebrowser->current_dir.ptr].attr.b; break; case FILEBROWSER_ACTION_NOOP: default: break; } - strlcpy(filebrowser->current_path, filebrowser_get_current_path(filebrowser), sizeof(filebrowser->current_path)); + strlcpy(filebrowser->current_dir.path, GET_CURRENT_PATH(filebrowser), + sizeof(filebrowser->current_dir.path)); return ret; } diff --git a/frontend/menu/utils/file_browser.h b/frontend/menu/utils/file_browser.h index f70178c857..7ea6559f18 100644 --- a/frontend/menu/utils/file_browser.h +++ b/frontend/menu/utils/file_browser.h @@ -21,14 +21,18 @@ typedef struct { + size_t ptr; char directory_path[PATH_MAX]; - struct { - struct string_list *list; - size_t ptr; - } current_dir; - char current_path[PATH_MAX]; - char root_dir[PATH_MAX]; char extensions[PATH_MAX]; + char root_dir[PATH_MAX]; + char path[PATH_MAX]; +} filebrowser_dir_type_t; + +typedef struct +{ + struct string_list *list; + filebrowser_dir_type_t current_dir; + filebrowser_dir_type_t prev_dir; } filebrowser_t; typedef enum @@ -42,6 +46,7 @@ typedef enum FILEBROWSER_ACTION_SCROLL_UP, FILEBROWSER_ACTION_SCROLL_DOWN, FILEBROWSER_ACTION_RESET, + FILEBROWSER_ACTION_RESET_CURRENT_DIR, FILEBROWSER_ACTION_PATH_ISDIR, FILEBROWSER_ACTION_NOOP } filebrowser_action_t;