bool menu_entries_init(void *data) { menu_entries_t *entries = NULL; menu_handle_t *menu = (menu_handle_t*)data; if (!menu) goto error; entries = (menu_entries_t*)calloc(1, sizeof(*entries)); if (!entries) goto error; menu->entries = (struct menu_entries*)entries; if (!(entries->menu_list = (menu_list_t*)menu_list_new())) goto error; entries->list_settings = menu_setting_new(); return true; error: if (entries) free(entries); if (menu) menu->entries = NULL; return false; }
bool menu_entries_ctl(enum menu_entries_ctl_state state, void *data) { /* Flagged when menu entries need to be refreshed */ static bool menu_entries_need_refresh = false; static bool menu_entries_nonblocking_refresh = false; static size_t menu_entries_begin = 0; static rarch_setting_t *menu_entries_list_settings = NULL; static menu_list_t *menu_entries_list = NULL; switch (state) { case MENU_ENTRIES_CTL_DEINIT: menu_entries_ctl(MENU_ENTRIES_CTL_SETTINGS_DEINIT, NULL); menu_entries_ctl(MENU_ENTRIES_CTL_LIST_DEINIT, NULL); menu_entries_need_refresh = NULL; menu_entries_nonblocking_refresh = NULL; menu_entries_begin = 0; break; case MENU_ENTRIES_CTL_NEEDS_REFRESH: if (menu_entries_nonblocking_refresh) return false; if (!menu_entries_need_refresh) return false; break; case MENU_ENTRIES_CTL_LIST_GET: { menu_list_t **list = (menu_list_t**)data; if (!list) return false; *list = menu_entries_list; } return true; case MENU_ENTRIES_CTL_LIST_DEINIT: if (menu_entries_list) menu_list_free(menu_entries_list); menu_entries_list = NULL; break; case MENU_ENTRIES_CTL_LIST_INIT: if (!(menu_entries_list = (menu_list_t*)menu_list_new())) return false; break; case MENU_ENTRIES_CTL_SETTINGS_GET: { rarch_setting_t **settings = (rarch_setting_t**)data; if (!settings) return false; *settings = menu_entries_list_settings; } break; case MENU_ENTRIES_CTL_SETTINGS_DEINIT: if (menu_entries_list_settings) menu_setting_free(menu_entries_list_settings); menu_entries_list_settings = NULL; break; case MENU_ENTRIES_CTL_SETTINGS_INIT: menu_entries_list_settings = menu_setting_new(); if (!menu_entries_list_settings) return false; break; case MENU_ENTRIES_CTL_SET_REFRESH: { bool *nonblocking = (bool*)data; if (*nonblocking) menu_entries_nonblocking_refresh = true; else menu_entries_need_refresh = true; } break; case MENU_ENTRIES_CTL_UNSET_REFRESH: { bool *nonblocking = (bool*)data; if (*nonblocking) menu_entries_nonblocking_refresh = false; else menu_entries_need_refresh = false; } break; case MENU_ENTRIES_CTL_SET_START: { size_t *idx = (size_t*)data; if (idx) menu_entries_begin = *idx; } case MENU_ENTRIES_CTL_START_GET: { size_t *idx = (size_t*)data; if (!idx) return 0; *idx = menu_entries_begin; } break; case MENU_ENTRIES_CTL_REFRESH: return menu_entries_refresh(data); case MENU_ENTRIES_CTL_INIT: return menu_entries_init(); case MENU_ENTRIES_CTL_SHOW_BACK: /* Returns true if a Back button should be shown * (i.e. we are at least * one level deep in the menu hierarchy). */ return (menu_entries_get_stack_size(0) > 1); case MENU_ENTRIES_CTL_NONE: default: break; } return true; }