/** * Before a refresh, we could have deleted a * file on disk, causing selection_ptr to * suddendly be out of range. * * Ensure it doesn't overflow. **/ void menu_entries_refresh(file_list_t *list) { size_t list_size, selection; if (!list) return; if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection)) return; menu_entries_build_scroll_indices(list); list_size = menu_entries_get_size(); if ((selection >= list_size) && list_size) { size_t idx = list_size - 1; bool scroll = true; menu_navigation_ctl(MENU_NAVIGATION_CTL_SET_SELECTION, &idx); menu_navigation_ctl(MENU_NAVIGATION_CTL_SET, &scroll); } else if (!list_size) { bool pending_push = true; menu_navigation_ctl(MENU_NAVIGATION_CTL_CLEAR, &pending_push); } }
int menu_list_populate_generic(file_list_t *list, const char *path, const char *label, unsigned type) { menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; menu->navigation.scroll.indices.size = 0; menu_entries_build_scroll_indices(list); menu_entries_refresh(list); menu_driver_populate_entries(path, label, type); return 0; }
/** * Before a refresh, we could have deleted a * file on disk, causing selection_ptr to * suddendly be out of range. * * Ensure it doesn't overflow. **/ static bool menu_entries_refresh(void *data) { size_t list_size; file_list_t *list = (file_list_t*)data; size_t selection = menu_navigation_get_selection(); menu_entries_build_scroll_indices(list); list_size = menu_entries_get_size(); if ((selection >= list_size) && list_size) { size_t idx = list_size - 1; menu_navigation_set_selection(idx); menu_driver_navigation_set(true); } else if (!list_size) { bool pending_push = true; menu_driver_ctl(MENU_NAVIGATION_CTL_CLEAR, &pending_push); } return true; }