diff --git a/console/rmenu/rmenu.c b/console/rmenu/rmenu.c index dcaa457458..36584739f0 100644 --- a/console/rmenu/rmenu.c +++ b/console/rmenu/rmenu.c @@ -137,8 +137,9 @@ enum RMENU_DEVICE_NAV_LAST }; -static void populate_setting_item(unsigned i, item *current_item) +static void populate_setting_item(unsigned i, void *data) { + item *current_item = (item*)data; char fname[PATH_MAX]; (void)fname; @@ -492,8 +493,9 @@ static void populate_setting_item(unsigned i, item *current_item) } } -static void display_menubar(menu *current_menu) +static void display_menubar(void *data) { + menu *current_menu = (menu*)data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; filebrowser_t *fb = &browser; char current_path[256], rarch_version[128], msg[128]; @@ -559,10 +561,11 @@ static void display_menubar(menu *current_menu) #endif } -static void browser_update(filebrowser_t * b, uint64_t input, const char *extensions) +static void browser_update(void *data, uint64_t input, const char *extensions) { - bool ret = true; + filebrowser_t *b = (filebrowser_t*)data; filebrowser_action_t action = FILEBROWSER_ACTION_NOOP; + bool ret = true; if (input & (1ULL << RMENU_DEVICE_NAV_DOWN)) action = FILEBROWSER_ACTION_DOWN; @@ -592,8 +595,9 @@ static void browser_update(filebrowser_t * b, uint64_t input, const char *extens rarch_settings_msg(S_MSG_DIR_LOADING_ERROR, S_DELAY_180); } -static void browser_render(filebrowser_t * b) +void browser_render(void *data) { + filebrowser_t *b = (filebrowser_t*)data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; unsigned file_count = b->current_dir.list->size; unsigned int current_index, page_number, page_base, i; @@ -605,7 +609,7 @@ static void browser_render(filebrowser_t * b) page_number = current_index / default_pos.entries_per_page; page_base = page_number * default_pos.entries_per_page; - for ( i = page_base; i < file_count && i < page_base + default_pos.entries_per_page; ++i) + for (i = page_base; i < file_count && i < page_base + default_pos.entries_per_page; ++i) { char fname_tmp[256]; fill_pathname_base(fname_tmp, b->current_dir.list->elems[i].data, sizeof(fname_tmp)); @@ -625,8 +629,9 @@ static void browser_render(filebrowser_t * b) } } -static void select_file(menu *current_menu, uint64_t input) +int select_file(void *data, uint64_t input) { + menu *current_menu = (menu*)data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; char extensions[256], comment[256], path[PATH_MAX]; bool ret = true; @@ -730,10 +735,13 @@ static void select_file(menu *current_menu, uint64_t input) device_ptr->font_ctx->render_msg_place(device_ptr,default_pos.x_position, default_pos.comment_y_position, default_pos.font_size, WHITE, comment); snprintf(comment, sizeof(comment), "[%s] - return to settings [%s] - Reset Startdir", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_X), rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_START)); device_ptr->font_ctx->render_msg_place(device_ptr,default_pos.x_position, default_pos.comment_two_y_position, default_pos.font_size, YELLOW, comment); + + return 1; } -static void select_directory(menu *current_menu, uint64_t input) +int select_directory(void *data, uint64_t input) { + menu *current_menu = (menu*)data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; char path[PATH_MAX], msg[256]; bool ret = true; @@ -819,6 +827,8 @@ static void select_directory(menu *current_menu, uint64_t input) snprintf(msg, sizeof(msg), "INFO - Browse to a directory and assign it as the path by\npressing [%s].", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_Y)); device_ptr->font_ctx->render_msg_place(device_ptr,default_pos.x_position, default_pos.comment_y_position, default_pos.font_size, WHITE, msg); + + return 1; } static void set_keybind_digital(uint64_t default_retro_joypad_id, uint64_t input) @@ -838,7 +848,7 @@ static void set_keybind_digital(uint64_t default_retro_joypad_id, uint64_t input } #ifdef __CELLOS_LV2__ -static void rarch_filename_input_and_save (unsigned filename_type) +static void rarch_filename_input_and_save(unsigned filename_type) { DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; bool filename_entered = false; @@ -924,8 +934,9 @@ static void rarch_filename_input_and_save (unsigned filename_type) } #endif -static void set_setting_action(menu *current_menu, unsigned switchvalue, uint64_t input) +static void set_setting_action(void *data, unsigned switchvalue, uint64_t input) { + (void)data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; switch(switchvalue) @@ -1563,8 +1574,11 @@ static void set_setting_action(menu *current_menu, unsigned switchvalue, uint64_ } } -static void settings_iterate(menu *current_menu, item *items, settings_action_t action) +static void settings_iterate(void *data, void *data_items, settings_action_t action) { + menu *current_menu = (menu*)data; + item *items = (item*)data_items; + switch(action) { case SETTINGS_ACTION_DOWN: @@ -1608,8 +1622,9 @@ static void settings_iterate(menu *current_menu, item *items, settings_action_t } } -static void select_setting(menu *current_menu, uint64_t input) +static int select_setting(void *data, uint64_t input) { + menu *current_menu = (menu*)data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; item *items = (item*)malloc(current_menu->max_settings * sizeof(*items)); unsigned i; @@ -1681,10 +1696,13 @@ static void select_setting(menu *current_menu, uint64_t input) device_ptr->font_ctx->render_msg_place(device_ptr,default_pos.x_position, default_pos.comment_two_y_position, default_pos.font_size, YELLOW, msg); snprintf(msg, sizeof(msg), "[%s] - Reset to default", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_START)); device_ptr->font_ctx->render_msg_place(device_ptr,default_pos.x_position, default_pos.comment_two_y_position + (default_pos.y_position_increment * 1), default_pos.font_size, YELLOW, msg); + + return 1; } -static void menu_romselect_iterate(filebrowser_t *filebrowser, menu_romselect_action_t action) +static void menu_romselect_iterate(void *data, menu_romselect_action_t action) { + filebrowser_t *filebrowser = (filebrowser_t*)data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; bool ret = true; @@ -1728,8 +1746,9 @@ static void menu_romselect_iterate(filebrowser_t *filebrowser, menu_romselect_ac } -static void select_rom(menu *current_menu, uint64_t input) +int select_rom(void *data, uint64_t input) { + menu *current_menu = (menu*)data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; char msg[128]; rmenu_default_positions_t default_pos; @@ -1772,12 +1791,15 @@ static void select_rom(menu *current_menu, uint64_t input) snprintf(msg, sizeof(msg), "[%s] - Settings", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_SELECT)); device_ptr->font_ctx->render_msg_place(device_ptr,default_pos.x_position, default_pos.comment_two_y_position + (default_pos.y_position_increment * 1), default_pos.font_size, YELLOW, msg); + + return 1; } static bool show_menu_screen = true; -static void ingame_menu_resize(menu *current_menu, uint64_t input) +int ingame_menu_resize(void *data, uint64_t input) { + menu *current_menu = (menu*)data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; rmenu_default_positions_t default_pos; @@ -1931,31 +1953,42 @@ static void ingame_menu_resize(menu *current_menu, uint64_t input) snprintf(msg, sizeof(msg), "Press [%s] to reset to defaults.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_X)); device_ptr->font_ctx->render_msg_place(device_ptr,default_pos.x_position, default_pos.comment_y_position, default_pos.font_size, WHITE, msg); } + + return 1; } -static void ingame_menu_screenshot(menu *current_menu, uint64_t input) +int ingame_menu_screenshot(void *data, uint64_t input) { DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; - (void)current_menu; + + g_extern.draw_menu = false; if(g_extern.console.rmenu.state.ingame_menu.enable) { if(input & (1ULL << RMENU_DEVICE_NAV_A)) { menu_stack_pop(); + g_extern.draw_menu = true; } if(input & (1ULL << RMENU_DEVICE_NAV_B)) - device_ptr->ctx_driver->rmenu_screenshot_dump(NULL); + if(device_ptr->ctx_driver->rmenu_screenshot_dump) + device_ptr->ctx_driver->rmenu_screenshot_dump(NULL); } + + return 1; } #define MENU_ITEM_SELECTED(index) (menuitem_colors[index]) -static void ingame_menu(menu *current_menu, uint64_t input) +int ingame_menu(void *data, uint64_t input) { + //if(!g_extern.console.rmenu.state.ingame_menu.enable) + //return false; + + menu *current_menu = (menu*)data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; - char comment[256], strw_buffer[256]; + char strw_buffer[256]; unsigned menuitem_colors[MENU_ITEM_LAST]; rmenu_default_positions_t default_pos; @@ -1982,7 +2015,7 @@ static void ingame_menu(menu *current_menu, uint64_t input) if(input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) rarch_state_slot_increase(); - snprintf(comment, sizeof(comment), "Press [%s] to load the current state.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to load the current state.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); break; case MENU_ITEM_SAVE_STATE: if(input & (1ULL << RMENU_DEVICE_NAV_B)) @@ -1996,15 +2029,15 @@ static void ingame_menu(menu *current_menu, uint64_t input) if(input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) rarch_state_slot_increase(); - snprintf(comment, sizeof(comment), "Press [%s] to save the current state.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to save the current state.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); break; case MENU_ITEM_KEEP_ASPECT_RATIO: set_setting_action(current_menu, SETTING_KEEP_ASPECT_RATIO, input); - snprintf(comment, sizeof(comment), "Press [%s] to reset back to default values.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_START)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to reset back to default values.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_START)); break; case MENU_ITEM_OVERSCAN_AMOUNT: set_setting_action(current_menu, SETTING_HW_OVERSCAN_AMOUNT, input); - snprintf(comment, sizeof(comment), "Press [%s] to reset back to default values.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_START)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to reset back to default values.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_START)); break; case MENU_ITEM_ORIENTATION: if(input & (1ULL << RMENU_DEVICE_NAV_LEFT)) @@ -2024,12 +2057,12 @@ static void ingame_menu(menu *current_menu, uint64_t input) rarch_settings_default(S_DEF_ROTATION); video_ptr.set_rotation(NULL, g_extern.console.screen.orientation); } - snprintf(comment, sizeof(comment), "Press [%s] to reset back to default values.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_START)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to reset back to default values.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_START)); break; #ifdef HAVE_FBO case MENU_ITEM_SCALE_FACTOR: set_setting_action(current_menu, SETTING_SCALE_FACTOR, input); - snprintf(comment, sizeof(comment), "Press [%s] to reset back to default values.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_START)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to reset back to default values.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_START)); break; #endif case MENU_ITEM_FRAME_ADVANCE: @@ -2039,23 +2072,23 @@ static void ingame_menu(menu *current_menu, uint64_t input) rarch_settings_change(S_FRAME_ADVANCE); g_extern.console.rmenu.ingame_menu.idx = MENU_ITEM_FRAME_ADVANCE; } - snprintf(comment, sizeof(comment), "Press [%s] to step one frame.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to step one frame.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); break; case MENU_ITEM_RESIZE_MODE: if(input & (1ULL << RMENU_DEVICE_NAV_B)) menu_stack_push(INGAME_MENU_RESIZE); - snprintf(comment, sizeof(comment), "Allows you to resize the screen."); + snprintf(strw_buffer, sizeof(strw_buffer), "Allows you to resize the screen."); break; case MENU_ITEM_SCREENSHOT_MODE: if(input & (1ULL << RMENU_DEVICE_NAV_B)) menu_stack_push(INGAME_MENU_SCREENSHOT); - snprintf(comment, sizeof(comment), "Press [%s] to go back to the in-game menu.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_A)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to go back to the in-game menu.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_A)); break; case MENU_ITEM_RETURN_TO_GAME: if(input & (1ULL << RMENU_DEVICE_NAV_B)) rarch_settings_change(S_RETURN_TO_GAME); - snprintf(comment, sizeof(comment), "Press [%s] to return to the game.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to return to the game.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); break; case MENU_ITEM_RESET: if(input & (1ULL << RMENU_DEVICE_NAV_B)) @@ -2063,14 +2096,14 @@ static void ingame_menu(menu *current_menu, uint64_t input) rarch_settings_change(S_RETURN_TO_GAME); rarch_game_reset(); } - snprintf(comment, sizeof(comment), "Press [%s] to reset the game.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to reset the game.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); break; case MENU_ITEM_RETURN_TO_MENU: if(input & (1ULL << RMENU_DEVICE_NAV_B)) { rarch_settings_change(S_RETURN_TO_MENU); } - snprintf(comment, sizeof(comment), "Press [%s] to return to the ROM Browser.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to return to the ROM Browser.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); break; case MENU_ITEM_CHANGE_LIBRETRO: if(input & (1ULL << RMENU_DEVICE_NAV_B)) @@ -2079,7 +2112,7 @@ static void ingame_menu(menu *current_menu, uint64_t input) filebrowser_set_root_and_ext(&tmpBrowser, EXT_EXECUTABLES, default_paths.core_dir); set_libretro_core_as_launch = true; } - snprintf(comment, sizeof(comment), "Press [%s] to choose another core.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to choose another core.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); break; #ifdef HAVE_MULTIMAN case MENU_ITEM_RETURN_TO_MULTIMAN: @@ -2090,14 +2123,14 @@ static void ingame_menu(menu *current_menu, uint64_t input) sizeof(g_extern.console.external_launch.launch_app)); rarch_settings_change(S_RETURN_TO_LAUNCHER); } - snprintf(comment, sizeof(comment), "Press [%s] to quit RetroArch and return to multiMAN.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to quit RetroArch and return to multiMAN.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); break; #endif case MENU_ITEM_QUIT_RARCH: if(input & (1ULL << RMENU_DEVICE_NAV_B)) rarch_settings_change(S_QUIT_RARCH); - snprintf(comment, sizeof(comment), "Press [%s] to quit RetroArch.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); + snprintf(strw_buffer, sizeof(strw_buffer), "Press [%s] to quit RetroArch.", rarch_input_find_platform_key_label(1ULL << RETRO_DEVICE_ID_JOYPAD_B)); break; } @@ -2122,6 +2155,8 @@ static void ingame_menu(menu *current_menu, uint64_t input) display_menubar(current_menu); + device_ptr->font_ctx->render_msg_place(device_ptr,default_pos.x_position, default_pos.comment_y_position, default_pos.font_size, WHITE, strw_buffer); + rarch_settings_create_menu_item_label(strw_buffer, S_LBL_LOAD_STATE_SLOT, sizeof(strw_buffer)); device_ptr->font_ctx->render_msg_place(device_ptr, default_pos.x_position, default_pos.y_position, default_pos.font_size, MENU_ITEM_SELECTED(MENU_ITEM_LOAD_STATE), strw_buffer); @@ -2162,12 +2197,12 @@ static void ingame_menu(menu *current_menu, uint64_t input) device_ptr->font_ctx->render_msg_place(device_ptr,default_pos.x_position, (default_pos.y_position+(default_pos.y_position_increment*MENU_ITEM_QUIT_RARCH)), default_pos.font_size, MENU_ITEM_SELECTED(MENU_ITEM_QUIT_RARCH), "Quit RetroArch"); - device_ptr->font_ctx->render_msg_place(device_ptr,default_pos.x_position, default_pos.comment_y_position, default_pos.font_size, WHITE, comment); - rarch_position_t position = {0}; position.x = default_pos.x_position; position.y = (default_pos.y_position+(default_pos.y_position_increment * g_extern.console.rmenu.ingame_menu.idx)); device_ptr->ctx_driver->rmenu_draw_panel(&position); + + return 1; } static void rmenu_filebrowser_init(void) @@ -2183,7 +2218,7 @@ static void rmenu_filebrowser_free(void) filebrowser_free(&tmpBrowser); } -void menu_init (void) +void menu_init(void) { DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; @@ -2198,7 +2233,7 @@ void menu_init (void) device_ptr->ctx_driver->rmenu_init(); } -void menu_free (void) +void menu_free(void) { rmenu_filebrowser_free(); } @@ -2209,7 +2244,6 @@ bool rmenu_iterate(void) const char *msg; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; - menu current_menu; if(preinit) @@ -2242,10 +2276,8 @@ bool rmenu_iterate(void) input_ptr.poll(NULL); for (unsigned i = 0; i < RMENU_DEVICE_NAV_LAST; i++) - { input_state |= input_ptr.input_state(NULL, rmenu_nav_binds, 0, RETRO_DEVICE_JOYPAD, 0, i) ? (1ULL << i) : 0; - } uint64_t trig_state = input_state & ~old_state; //set first button input frame as trigger input_state_first_frame = input_state; //hold onto first button input frame @@ -2291,31 +2323,20 @@ bool rmenu_iterate(void) rarch_render_cached_frame(); + int repeat = true; + + if(current_menu.iterate) + repeat = current_menu.iterate(¤t_menu, trig_state); + filebrowser_t * fb = &browser; switch(current_menu.enum_id) { - case FILE_BROWSER_MENU: - select_rom(¤t_menu, trig_state); - fb = &browser; - break; - case GENERAL_VIDEO_MENU: - case GENERAL_AUDIO_MENU: - case EMU_GENERAL_MENU: - case EMU_VIDEO_MENU: - case EMU_AUDIO_MENU: - case PATH_MENU: - case CONTROLS_MENU: - select_setting(¤t_menu, trig_state); - break; case SHADER_CHOICE: case PRESET_CHOICE: case BORDER_CHOICE: case LIBRETRO_CHOICE: case INPUT_PRESET_CHOICE: - select_file(¤t_menu, trig_state); - fb = &tmpBrowser; - break; case PATH_SAVESTATES_DIR_CHOICE: case PATH_DEFAULT_ROM_DIR_CHOICE: #ifdef HAVE_XML @@ -2323,31 +2344,12 @@ bool rmenu_iterate(void) #endif case PATH_SRAM_DIR_CHOICE: case PATH_SYSTEM_DIR_CHOICE: - select_directory(¤t_menu, trig_state); fb = &tmpBrowser; break; - case INGAME_MENU: - if(g_extern.console.rmenu.state.ingame_menu.enable) - ingame_menu(¤t_menu, trig_state); - break; - case INGAME_MENU_RESIZE: - ingame_menu_resize(¤t_menu, trig_state); - break; - case INGAME_MENU_SCREENSHOT: - ingame_menu_screenshot(¤t_menu, trig_state); - break; } - switch(current_menu.category_id) - { - case CATEGORY_FILEBROWSER: - browser_render(fb); - break; - case CATEGORY_SETTINGS: - case CATEGORY_INGAME_MENU: - default: - break; - } + if(current_menu.browser_draw) + current_menu.browser_draw(fb); old_state = input_state_first_frame; @@ -2375,7 +2377,7 @@ bool rmenu_iterate(void) } } - if(g_extern.console.rmenu.mode == MODE_EMULATION || g_extern.console.rmenu.mode == MODE_EXIT) + if(g_extern.console.rmenu.mode == MODE_EMULATION || g_extern.console.rmenu.mode == MODE_EXIT || repeat == 0) goto deinit; msg = msg_queue_pull(g_extern.msg_queue); diff --git a/console/rmenu/rmenu_stack.c b/console/rmenu/rmenu_stack.c index 374cdfe853..f576ef1048 100644 --- a/console/rmenu/rmenu_stack.c +++ b/console/rmenu/rmenu_stack.c @@ -16,6 +16,17 @@ #include "rmenu_stack.h" +//forward declarations +int select_file(void *data, uint64_t input); +int select_directory(void *data, uint64_t input); +int select_setting(void *data, uint64_t input); +int select_rom(void *data, uint64_t input); +int ingame_menu_resize(void *data, uint64_t input); +int ingame_menu_screenshot(void *data, uint64_t input); +int ingame_menu(void *data, uint64_t input); + +void browser_render(void *data); + static unsigned char menu_stack_enum_array[10]; static unsigned stack_idx = 0; static bool need_refresh = false; @@ -47,6 +58,8 @@ static void menu_stack_get_current_ptr(menu *current_menu) unsigned menu_id = menu_stack_enum_array[stack_idx]; + current_menu->browser_draw = NULL; + switch(menu_id) { case INGAME_MENU: @@ -55,6 +68,7 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_INGAME_MENU; + current_menu->iterate = ingame_menu; break; case INGAME_MENU_RESIZE: strlcpy(current_menu->title, "Resize Menu", sizeof(current_menu->title)); @@ -62,6 +76,7 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_INGAME_MENU; + current_menu->iterate = ingame_menu_resize; break; case INGAME_MENU_SCREENSHOT: strlcpy(current_menu->title, "Ingame Menu", sizeof(current_menu->title)); @@ -69,6 +84,7 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_INGAME_MENU; + current_menu->iterate = ingame_menu_screenshot; break; case FILE_BROWSER_MENU: strlcpy(current_menu->title, "Filebrowser", sizeof(current_menu->title)); @@ -76,6 +92,7 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; + current_menu->iterate = select_rom; break; case LIBRETRO_CHOICE: strlcpy(current_menu->title, "Libretro", sizeof(current_menu->title)); @@ -83,6 +100,7 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; + current_menu->iterate = select_file; break; case PRESET_CHOICE: strlcpy(current_menu->title, "Shader", sizeof(current_menu->title)); @@ -90,6 +108,7 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; + current_menu->iterate = select_file; break; case INPUT_PRESET_CHOICE: strlcpy(current_menu->title, "Input", sizeof(current_menu->title)); @@ -97,6 +116,7 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; + current_menu->iterate = select_file; break; case SHADER_CHOICE: strlcpy(current_menu->title, "Shaders", sizeof(current_menu->title)); @@ -104,6 +124,7 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; + current_menu->iterate = select_file; break; case BORDER_CHOICE: strlcpy(current_menu->title, "Borders", sizeof(current_menu->title)); @@ -111,6 +132,7 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; + current_menu->iterate = select_file; break; case PATH_DEFAULT_ROM_DIR_CHOICE: case PATH_SAVESTATES_DIR_CHOICE: @@ -124,6 +146,7 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; + current_menu->iterate = select_directory; break; case GENERAL_VIDEO_MENU: strlcpy(current_menu->title, "Video", sizeof(current_menu->title)); @@ -133,7 +156,8 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->first_setting = FIRST_VIDEO_SETTING; current_menu->max_settings = MAX_NO_OF_VIDEO_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; - break; + current_menu->iterate = select_setting; + break; case GENERAL_AUDIO_MENU: strlcpy(current_menu->title, "Audio", sizeof(current_menu->title)); current_menu->enum_id = GENERAL_AUDIO_MENU; @@ -142,7 +166,8 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->first_setting = FIRST_AUDIO_SETTING; current_menu->max_settings = MAX_NO_OF_AUDIO_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; - break; + current_menu->iterate = select_setting; + break; case EMU_GENERAL_MENU: strlcpy(current_menu->title, "Retro", sizeof(current_menu->title)); current_menu->enum_id = EMU_GENERAL_MENU; @@ -151,7 +176,8 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->first_setting = FIRST_EMU_SETTING; current_menu->max_settings = MAX_NO_OF_EMU_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; - break; + current_menu->iterate = select_setting; + break; case EMU_VIDEO_MENU: strlcpy(current_menu->title, "Retro Video", sizeof(current_menu->title)); current_menu->enum_id = EMU_VIDEO_MENU; @@ -160,7 +186,8 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->first_setting = FIRST_EMU_VIDEO_SETTING; current_menu->max_settings = MAX_NO_OF_EMU_VIDEO_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; - break; + current_menu->iterate = select_setting; + break; case EMU_AUDIO_MENU: strlcpy(current_menu->title, "Retro Audio", sizeof(current_menu->title)); current_menu->enum_id = EMU_AUDIO_MENU; @@ -169,7 +196,8 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->first_setting = FIRST_EMU_AUDIO_SETTING; current_menu->max_settings = MAX_NO_OF_EMU_AUDIO_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; - break; + current_menu->iterate = select_setting; + break; case PATH_MENU: strlcpy(current_menu->title, "Path", sizeof(current_menu->title)); current_menu->enum_id = PATH_MENU; @@ -178,6 +206,7 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->first_setting = FIRST_PATH_SETTING; current_menu->max_settings = MAX_NO_OF_PATH_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; + current_menu->iterate = select_setting; break; case CONTROLS_MENU: strlcpy(current_menu->title, "Controls", sizeof(current_menu->title)); @@ -187,10 +216,14 @@ static void menu_stack_get_current_ptr(menu *current_menu) current_menu->first_setting = FIRST_CONTROLS_SETTING_PAGE_1; current_menu->max_settings = MAX_NO_OF_CONTROLS_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; - break; - default: + current_menu->iterate = select_setting; + break; + default: break; } + if(current_menu->category_id == CATEGORY_FILEBROWSER) + current_menu->browser_draw = browser_render; + need_refresh = false; } diff --git a/console/rmenu/rmenu_stack.h b/console/rmenu/rmenu_stack.h index 7a2891880c..80f292afbb 100644 --- a/console/rmenu/rmenu_stack.h +++ b/console/rmenu/rmenu_stack.h @@ -26,6 +26,8 @@ typedef struct unsigned char first_setting; unsigned char max_settings; unsigned char category_id; + int (*iterate)(void *data, uint64_t input); + void (*browser_draw)(void *data); } menu; #endif