void menu_list_pop(file_list_t *list, size_t *directory_ptr) { if (!driver.menu_ctx) goto end; if (list->size != 0) { size_t list_size = list->size - 1; if (driver.menu_ctx->list_delete) driver.menu_ctx->list_delete(list, list_size, list_size); if (driver.menu_ctx->backend->list_delete) driver.menu_ctx->backend->list_delete(list, list_size, list_size); } end: file_list_pop(list, directory_ptr); if (!driver.menu_ctx) return; if (driver.menu_ctx->list_set_selection) driver.menu_ctx->list_set_selection(list); if (driver.menu_ctx->backend->list_set_selection) driver.menu_ctx->backend->list_set_selection(list); }
static bool menu_list_pop_stack(menu_list_t *list, size_t idx, size_t *directory_ptr) { menu_ctx_list_t list_info; bool refresh = false; file_list_t *menu_list = NULL; if (!list) return false; menu_list = list->menu_stack[idx]; if (menu_list_get_stack_size(list, idx) <= 1) return false; list_info.type = MENU_LIST_PLAIN; list_info.action = 0; menu_driver_ctl(RARCH_MENU_CTL_LIST_CACHE, &list_info); if (menu_list->size != 0) { menu_ctx_list_t list_info; list_info.list = menu_list; list_info.idx = menu_list->size - 1; list_info.list_size = menu_list->size - 1; menu_driver_ctl(RARCH_MENU_CTL_LIST_FREE, &list_info); } file_list_pop(menu_list, directory_ptr); menu_driver_ctl(RARCH_MENU_CTL_LIST_SET_SELECTION, menu_list); menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); return true; }
static bool menu_list_pop_stack(menu_list_t *list, size_t idx, size_t *directory_ptr, bool animate) { menu_ctx_list_t list_info; bool refresh = false; file_list_t *menu_list = menu_list_get(list, (unsigned)idx); if (menu_list_get_stack_size(list, idx) <= 1) return false; list_info.type = MENU_LIST_PLAIN; list_info.action = 0; if (animate) menu_driver_list_cache(&list_info); if (menu_list->size != 0) { menu_ctx_list_t list_info; list_info.list = menu_list; list_info.idx = menu_list->size - 1; list_info.list_size = menu_list->size - 1; menu_driver_ctl(RARCH_MENU_CTL_LIST_FREE, &list_info); } file_list_pop(menu_list, directory_ptr); menu_driver_list_set_selection(menu_list); if (animate) menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); return true; }
void menu_list_pop(file_list_t *list, size_t *directory_ptr) { if (list->size != 0) menu_driver_list_free(list, list->size - 1, list->size - 1); file_list_pop(list, directory_ptr); menu_driver_list_set_selection(list); }
void menu_flush_stack_type(void *data, unsigned final_type) { rgui_handle_t *rgui = (rgui_handle_t*)data; unsigned type; type = 0; rgui->need_refresh = true; file_list_get_last(rgui->menu_stack, NULL, &type); while (type != final_type) { file_list_pop(rgui->menu_stack, &rgui->selection_ptr); file_list_get_last(rgui->menu_stack, NULL, &type); } }
void menu_flush_stack_type(unsigned final_type) { const char *path = NULL; const char *label = NULL; unsigned type = 0; if (!driver.menu) return; driver.menu->need_refresh = true; file_list_get_last(driver.menu->menu_stack, &path, &label, &type); while (type != final_type) { file_list_pop(driver.menu->menu_stack, &driver.menu->selection_ptr); file_list_get_last(driver.menu->menu_stack, &path, &label, &type); } }
void menu_list_pop(file_list_t *list, size_t *directory_ptr) { driver_t *driver = driver_get_ptr(); if (!driver->menu_ctx) goto end; if (list->size != 0) menu_driver_list_delete(list, list->size - 1, list->size - 1); end: file_list_pop(list, directory_ptr); if (!driver->menu_ctx) return; menu_driver_list_set_selection(list); }
static bool menu_list_pop_stack(menu_list_t *list, size_t idx, size_t *directory_ptr) { file_list_t *menu_list = NULL; if (!list) return false; menu_list = list->menu_stack[idx]; if (menu_list_get_stack_size(list, idx) <= 1) return false; menu_driver_list_cache(MENU_LIST_PLAIN, 0); if (menu_list->size != 0) menu_driver_list_free(menu_list, menu_list->size - 1, menu_list->size - 1); file_list_pop(menu_list, directory_ptr); menu_driver_list_set_selection(menu_list); menu_entries_set_refresh(false); return true; }
bool menu_iterate(void *data) { unsigned action; static bool initial_held = true; static bool first_held = false; uint64_t input_state; int32_t input_entry_ret, ret; rgui_handle_t *rgui; input_state = 0; input_entry_ret = 0; ret = 0; rgui = (rgui_handle_t*)data; if (!rgui) return false; if (g_extern.lifecycle_state & (1ULL << MODE_MENU_PREINIT)) { rgui->need_refresh = true; g_extern.lifecycle_state &= ~(1ULL << MODE_MENU_PREINIT); rgui->old_input_state |= 1ULL << RARCH_MENU_TOGGLE; } rarch_input_poll(); rarch_check_block_hotkey(); #ifdef HAVE_OVERLAY rarch_check_overlay(); #endif rarch_check_fullscreen(); if (input_key_pressed_func(RARCH_QUIT_KEY) || !video_alive_func()) { g_extern.lifecycle_state |= (1ULL << MODE_GAME); return false; } input_state = menu_input(rgui); if (rgui->do_held) { if (!first_held) { first_held = true; rgui->delay_timer = initial_held ? 12 : 6; rgui->delay_count = 0; } if (rgui->delay_count >= rgui->delay_timer) { first_held = false; rgui->trigger_state = input_state; rgui->scroll_accel = min(rgui->scroll_accel + 1, 64); } initial_held = false; } else { first_held = false; initial_held = true; rgui->scroll_accel = 0; } rgui->delay_count++; rgui->old_input_state = input_state; if (driver.block_input) rgui->trigger_state = 0; action = RGUI_ACTION_NOOP; // don't run anything first frame, only capture held inputs for old_input_state if (rgui->trigger_state & (1ULL << RETRO_DEVICE_ID_JOYPAD_UP)) action = RGUI_ACTION_UP; else if (rgui->trigger_state & (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN)) action = RGUI_ACTION_DOWN; else if (rgui->trigger_state & (1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT)) action = RGUI_ACTION_LEFT; else if (rgui->trigger_state & (1ULL << RETRO_DEVICE_ID_JOYPAD_RIGHT)) action = RGUI_ACTION_RIGHT; else if (rgui->trigger_state & (1ULL << RETRO_DEVICE_ID_JOYPAD_L)) action = RGUI_ACTION_SCROLL_UP; else if (rgui->trigger_state & (1ULL << RETRO_DEVICE_ID_JOYPAD_R)) action = RGUI_ACTION_SCROLL_DOWN; else if (rgui->trigger_state & (1ULL << RETRO_DEVICE_ID_JOYPAD_B)) action = RGUI_ACTION_CANCEL; else if (rgui->trigger_state & (1ULL << RETRO_DEVICE_ID_JOYPAD_A)) action = RGUI_ACTION_OK; else if (rgui->trigger_state & (1ULL << RETRO_DEVICE_ID_JOYPAD_START)) action = RGUI_ACTION_START; if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->iterate) input_entry_ret = driver.menu_ctx->backend->iterate(rgui, action); if (driver.video_data && driver.video_poke && driver.video_poke->set_texture_enable) driver.video_poke->set_texture_enable(driver.video_data, rgui->frame_buf_show, MENU_TEXTURE_FULLSCREEN); rarch_render_cached_frame(); // Throttle in case VSync is broken (avoid 1000+ FPS RGUI). rgui->time = rarch_get_time_usec(); rgui->delta = (rgui->time - rgui->last_time) / 1000; rgui->target_msec = 750 / g_settings.video.refresh_rate; // Try to sleep less, so we can hopefully rely on FPS logger. rgui->sleep_msec = rgui->target_msec - rgui->delta; if (rgui->sleep_msec > 0) rarch_sleep((unsigned int)rgui->sleep_msec); rgui->last_time = rarch_get_time_usec(); if (driver.video_data && driver.video_poke && driver.video_poke->set_texture_enable) driver.video_poke->set_texture_enable(driver.video_data, false, MENU_TEXTURE_FULLSCREEN); if (driver.menu_ctx && driver.menu_ctx->input_postprocess) ret = driver.menu_ctx->input_postprocess(rgui, rgui->old_input_state); if (ret < 0) { unsigned type = 0; file_list_get_last(rgui->menu_stack, NULL, &type); while (type != RGUI_SETTINGS) { file_list_pop(rgui->menu_stack, &rgui->selection_ptr); file_list_get_last(rgui->menu_stack, NULL, &type); } } if (ret || input_entry_ret) return false; return true; }