From 6ad5d46781d3b5a783e26470da93bf3ed6e43d0c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 10 Jan 2013 08:46:46 +0100 Subject: [PATCH] (RARCH_CONSOLE) rmenu.mode is now set with bitmasked values so as to allow more state management options --- console/rarch_console.h | 9 +++--- console/rarch_console_rom_ext.c | 49 ++++++++++++-------------------- console/rarch_console_rom_ext.h | 2 +- console/rarch_console_settings.c | 14 ++++----- frontend/frontend_console.c | 10 +++---- frontend/menu/rgui.c | 8 ++++-- frontend/menu/rmenu.c | 37 +++++++++++++----------- frontend/menu/rmenu_gx.c | 26 +++++++++-------- frontend/menu/rmenu_xui.cpp | 36 ++++++++++++----------- frontend/platform/platform_gx.c | 4 +-- frontend/platform/platform_ps3.c | 2 +- frontend/platform/platform_psp.c | 6 ++-- general.h | 1 + retroarch.c | 7 +++-- settings.c | 2 +- 15 files changed, 106 insertions(+), 107 deletions(-) diff --git a/console/rarch_console.h b/console/rarch_console.h index e58ff74d20..686d894c2c 100644 --- a/console/rarch_console.h +++ b/console/rarch_console.h @@ -68,10 +68,11 @@ enum { enum { - MODE_EMULATION = 0, - MODE_INIT, - MODE_MENU, - MODE_EXIT + MODE_EMULATION = 1 << 0, + MODE_LOAD_GAME = 1 << 1, + MODE_INIT = 1 << 2, + MODE_MENU = 1 << 3, + MODE_EXIT = 1 << 4, }; enum diff --git a/console/rarch_console_rom_ext.c b/console/rarch_console_rom_ext.c index 030eb0da99..2dace90d1f 100644 --- a/console/rarch_console_rom_ext.c +++ b/console/rarch_console_rom_ext.c @@ -209,44 +209,31 @@ int rarch_extract_zipfile(const char *zip_path, char *first_file, size_t first_f #endif -void rarch_console_load_game_wrap(const char *path, unsigned extract_zip_mode, unsigned delay) +void rarch_console_load_game_wrap(const char *path, unsigned extract_zip_mode) { - const char *game_to_load; - char first_file_inzip[PATH_MAX]; - struct retro_system_info info; - bool extract_zip_cond = false; - bool extract_zip_and_load_game_cond = false; - bool load_game = !extract_zip_cond; - - retro_get_system_info(&info); - #ifdef HAVE_ZLIB - extract_zip_cond = (strstr(path, ".zip") || strstr(path, ".ZIP")) - && !info.block_extract; - - if(extract_zip_cond) + if ((strstr(path, ".zip") || strstr(path, ".ZIP")) + && !g_extern.system.block_extract) { - rarch_extract_zipfile(path, first_file_inzip, sizeof(first_file_inzip), extract_zip_mode); + char first_file[PATH_MAX]; + first_file[0] = '\0'; + + rarch_extract_zipfile(path, first_file, sizeof(first_file), extract_zip_mode); if(g_extern.console.rmenu.state.msg_info.enable) rarch_settings_msg(S_MSG_EXTRACTED_ZIPFILE, S_DELAY_180); + + if(g_extern.file_state.zip_extract_mode == ZIP_EXTRACT_TO_CURRENT_DIR_AND_LOAD_FIRST_FILE) + { + snprintf(g_extern.fullpath, sizeof(g_extern.fullpath), first_file); + goto do_init; + } + else + return; } - - extract_zip_and_load_game_cond = (extract_zip_cond && - g_extern.file_state.zip_extract_mode == ZIP_EXTRACT_TO_CURRENT_DIR_AND_LOAD_FIRST_FILE); - load_game = (extract_zip_and_load_game_cond) || (!extract_zip_cond); - - if(extract_zip_and_load_game_cond) - game_to_load = first_file_inzip; else #endif - game_to_load = path; + snprintf(g_extern.fullpath, sizeof(g_extern.fullpath), path); - if(load_game) - { - snprintf(g_extern.fullpath, sizeof(g_extern.fullpath), game_to_load); - rarch_settings_change(S_START_RARCH); - - if(g_extern.console.rmenu.state.msg_info.enable) - rarch_settings_msg(S_MSG_LOADING_ROM, delay); - } +do_init: + g_extern.console.rmenu.mode |= (1ULL << MODE_LOAD_GAME); } diff --git a/console/rarch_console_rom_ext.h b/console/rarch_console_rom_ext.h index 38d862c7dd..f9cb4fdb27 100644 --- a/console/rarch_console_rom_ext.h +++ b/console/rarch_console_rom_ext.h @@ -26,6 +26,6 @@ enum }; #endif -void rarch_console_load_game_wrap(const char *path, unsigned extract_zip_mode, unsigned delay); +void rarch_console_load_game_wrap(const char *path, unsigned extract_zip_mode); #endif diff --git a/console/rarch_console_settings.c b/console/rarch_console_settings.c index 628555c7f6..fca7b1d7e5 100644 --- a/console/rarch_console_settings.c +++ b/console/rarch_console_settings.c @@ -52,7 +52,7 @@ void rarch_settings_change(unsigned setting) break; case S_FRAME_ADVANCE: g_extern.lifecycle_state |= (1ULL << RARCH_FRAMEADVANCE); - g_extern.console.rmenu.mode = MODE_EMULATION; + g_extern.console.rmenu.mode = (1ULL << MODE_EMULATION); break; case S_HW_TEXTURE_FILTER: g_settings.video.smooth = !g_settings.video.smooth; @@ -88,20 +88,20 @@ void rarch_settings_change(unsigned setting) break; case S_QUIT: g_extern.console.rmenu.state.ingame_menu.enable = false; - g_extern.console.rmenu.mode = MODE_EXIT; + g_extern.console.rmenu.mode = (1ULL << MODE_EXIT); break; case S_QUIT_RARCH: - g_extern.console.rmenu.mode = MODE_EXIT; + g_extern.console.rmenu.mode = (1ULL << MODE_EXIT); break; case S_RETURN_TO_GAME: - g_extern.console.rmenu.mode = MODE_EMULATION; + g_extern.console.rmenu.mode = (1ULL << MODE_EMULATION); break; case S_RETURN_TO_LAUNCHER: g_extern.console.external_launch.enable = true; - g_extern.console.rmenu.mode = MODE_EXIT; + g_extern.console.rmenu.mode = (1ULL << MODE_EXIT); break; case S_RETURN_TO_MENU: - g_extern.console.rmenu.mode = MODE_MENU; + g_extern.console.rmenu.mode = (1ULL << MODE_MENU); break; case S_ROTATION_DECREMENT: if(g_extern.console.screen.orientation > 0) @@ -112,7 +112,7 @@ void rarch_settings_change(unsigned setting) g_extern.console.screen.orientation++; break; case S_START_RARCH: - g_extern.console.rmenu.mode = MODE_INIT; + g_extern.console.rmenu.mode = (1ULL << MODE_INIT); break; case S_REWIND: g_settings.rewind_enable = !g_settings.rewind_enable; diff --git a/frontend/frontend_console.c b/frontend/frontend_console.c index 71d92bc884..a67109f50a 100644 --- a/frontend/frontend_console.c +++ b/frontend/frontend_console.c @@ -268,7 +268,7 @@ int main(int argc, char *argv[]) system_process_args(argc, argv); begin_loop: - if(g_extern.console.rmenu.mode == MODE_EMULATION) + if(g_extern.console.rmenu.mode & (1ULL << MODE_EMULATION)) { driver.input->poll(NULL); driver.video->set_aspect_ratio(driver.video_data, g_settings.video.aspect_ratio_idx); @@ -276,7 +276,7 @@ begin_loop: while(rarch_main_iterate()); audio_stop_func(); } - else if (g_extern.console.rmenu.mode == MODE_INIT) + else if (g_extern.console.rmenu.mode & (1ULL << MODE_INIT)) { if(g_extern.main_is_init) rarch_main_deinit(); @@ -295,16 +295,16 @@ begin_loop: if (init_ret == 0) { RARCH_LOG("rarch_main_init succeeded.\n"); - g_extern.console.rmenu.mode = MODE_EMULATION; + g_extern.console.rmenu.mode = (1ULL << MODE_EMULATION); } else { RARCH_ERR("rarch_main_init failed.\n"); - g_extern.console.rmenu.mode = MODE_MENU; + g_extern.console.rmenu.mode = (1ULL << MODE_MENU); rarch_settings_msg(S_MSG_ROM_LOADING_ERROR, S_DELAY_180); } } - else if(g_extern.console.rmenu.mode == MODE_MENU) + else if(g_extern.console.rmenu.mode & (1ULL << MODE_MENU)) while(rmenu_iterate()); else goto begin_shutdown; diff --git a/frontend/menu/rgui.c b/frontend/menu/rgui.c index fbbdacfa0f..febc73e4a6 100644 --- a/frontend/menu/rgui.c +++ b/frontend/menu/rgui.c @@ -361,7 +361,9 @@ static void render_messagebox(rgui_handle_t *rgui, const char *message) static void render_text(rgui_handle_t *rgui) { - if (rgui->need_refresh && g_extern.console.rmenu.mode == MODE_MENU && !rgui->msg_force) + if (rgui->need_refresh && + (g_extern.console.rmenu.mode & (1ULL << MODE_MENU)) + && !rgui->msg_force) return; size_t begin = rgui->directory_ptr >= TERM_HEIGHT / 2 ? @@ -1193,7 +1195,7 @@ void rgui_iterate(rgui_handle_t *rgui, rgui_action_t action) else { snprintf(rgui->path_buf, sizeof(rgui->path_buf), "%s/%s", dir, path); - rarch_console_load_game_wrap(rgui->path_buf, g_extern.file_state.zip_extract_mode, S_DELAY_1); + rarch_console_load_game_wrap(rgui->path_buf, g_extern.file_state.zip_extract_mode); rgui->need_refresh = true; // in case of zip extract rgui->msg_force = true; } @@ -1231,7 +1233,7 @@ void rgui_iterate(rgui_handle_t *rgui, rgui_action_t action) // refresh values in case the stack changed rgui_list_back(rgui->path_stack, &dir, &menu_type, &directory_ptr); - if (rgui->need_refresh && (menu_type == RGUI_FILE_DIRECTORY || menu_type == RGUI_FILE_DEVICE || menu_type == RGUI_SETTINGS_CORE) && g_extern.console.rmenu.mode == MODE_MENU) + if (rgui->need_refresh && (menu_type == RGUI_FILE_DIRECTORY || menu_type == RGUI_FILE_DEVICE || menu_type == RGUI_SETTINGS_CORE) && (g_extern.console.rmenu.mode & (1ULL << MODE_MENU))) { rgui->need_refresh = false; rgui_list_clear(rgui->folder_buf); diff --git a/frontend/menu/rmenu.c b/frontend/menu/rmenu.c index 86d152d482..2aa8e6668d 100644 --- a/frontend/menu/rmenu.c +++ b/frontend/menu/rmenu.c @@ -1799,7 +1799,7 @@ int select_rom(void *data, void *state) rarch_settings_msg(S_MSG_DIR_LOADING_ERROR, S_DELAY_180); } else - rarch_console_load_game_wrap(filebrowser_get_current_path(filebrowser), g_extern.file_state.zip_extract_mode, S_DELAY_45); + rarch_console_load_game_wrap(filebrowser_get_current_path(filebrowser), g_extern.file_state.zip_extract_mode); } else if (input & (1ULL << RMENU_DEVICE_NAV_L1)) { @@ -2340,20 +2340,21 @@ void rmenu_input_process(void *data, void *state) (void)data; rmenu_state_t *rstate = (rmenu_state_t*)state; + if (g_extern.console.rmenu.mode & (1ULL << MODE_LOAD_GAME)) + { + if(g_extern.console.rmenu.state.msg_info.enable) + rarch_settings_msg(S_MSG_LOADING_ROM, 100); + + g_extern.console.rmenu.mode = (1ULL << MODE_INIT); + } + if (!(g_extern.frame_count < g_extern.delay_timer[0])) { bool rmenu_enable = (((rstate->old_state & (1ULL << RMENU_DEVICE_NAV_L3)) && (rstate->old_state & (1ULL << RMENU_DEVICE_NAV_R3)) && g_extern.main_is_init)); - switch(g_extern.console.rmenu.mode) - { - case MODE_EXIT: - case MODE_INIT: - case MODE_EMULATION: - break; - default: - g_extern.console.rmenu.mode = rmenu_enable ? MODE_EMULATION : MODE_MENU; - break; - } + if (g_extern.console.rmenu.mode & (1ULL << MODE_MENU)) + if (rmenu_enable) + g_extern.console.rmenu.mode = (1ULL << MODE_EMULATION); } } @@ -2467,9 +2468,6 @@ bool rmenu_iterate(void) if(current_menu.input_process) current_menu.input_process(¤t_menu, &rmenu_state); - if(g_extern.console.rmenu.mode != MODE_MENU || repeat == 0) - goto deinit; - msg = msg_queue_pull(g_extern.msg_queue); if (msg && g_extern.console.rmenu.state.msg_info.enable) @@ -2484,12 +2482,17 @@ bool rmenu_iterate(void) frame_count = 0; device_ptr->ctx_driver->check_window(&quit, &resize, &width, &height, frame_count); - if (quit) - g_extern.console.rmenu.mode = MODE_EXIT; - if (g_extern.draw_menu) device_ptr->ctx_driver->set_blend(false); + if (quit) + g_extern.console.rmenu.mode = (1ULL << MODE_EXIT); + + if((!(g_extern.console.rmenu.mode & (1ULL << MODE_MENU)) + && !(g_extern.console.rmenu.mode & (1ULL << MODE_LOAD_GAME))) || + repeat == 0) + goto deinit; + return true; deinit: diff --git a/frontend/menu/rmenu_gx.c b/frontend/menu/rmenu_gx.c index b5ba1f7f33..ace7f4327f 100644 --- a/frontend/menu/rmenu_gx.c +++ b/frontend/menu/rmenu_gx.c @@ -156,7 +156,7 @@ void menu_init(void) menu_framebuf, RGUI_WIDTH * sizeof(uint16_t), NULL /* _binary_console_font_bmp_start */, bitmap_bin, folder_cb, NULL); - g_extern.console.rmenu.mode = MODE_MENU; + g_extern.console.rmenu.mode = (1ULL << MODE_MENU); rgui_iterate(rgui, RGUI_ACTION_REFRESH); } @@ -235,24 +235,26 @@ bool rmenu_iterate(void) old_input_state = input_state; + if (g_extern.console.rmenu.mode & (1ULL << MODE_LOAD_GAME)) + { + if(g_extern.console.rmenu.state.msg_info.enable) + rarch_settings_msg(S_MSG_LOADING_ROM, 100); + + if (g_extern.fullpath) + g_extern.console.rmenu.mode = (1ULL << MODE_INIT); + } + if (!(g_extern.frame_count < g_extern.delay_timer[0])) { bool rmenu_enable = ((trigger_state & (1ULL << GX_DEVICE_NAV_MENU)) && g_extern.main_is_init); bool quit_key_pressed = (trigger_state & (1ULL << GX_DEVICE_NAV_QUIT)); - switch(g_extern.console.rmenu.mode) - { - case MODE_EXIT: - case MODE_INIT: - case MODE_EMULATION: - break; - default: - g_extern.console.rmenu.mode = quit_key_pressed ? MODE_EXIT : rmenu_enable ? MODE_EMULATION : MODE_MENU; - break; - } + if (g_extern.console.rmenu.mode & (1ULL << MODE_MENU)) + g_extern.console.rmenu.mode = quit_key_pressed ? (1ULL << MODE_EXIT) : rmenu_enable ? (1ULL << MODE_EMULATION) : (1ULL << MODE_MENU); } - if (g_extern.console.rmenu.mode != MODE_MENU) + if(!(g_extern.console.rmenu.mode & (1ULL << MODE_MENU)) + && !(g_extern.console.rmenu.mode & (1ULL << MODE_LOAD_GAME))) goto deinit; return true; diff --git a/frontend/menu/rmenu_xui.cpp b/frontend/menu/rmenu_xui.cpp index f900e16f43..71128fc2a3 100644 --- a/frontend/menu/rmenu_xui.cpp +++ b/frontend/menu/rmenu_xui.cpp @@ -179,7 +179,7 @@ HRESULT CRetroArchFileBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandle if(path_file_exists(browser->current_dir.list->elems[index].data)) { snprintf(path, sizeof(path), "%s\\%s", filebrowser_get_current_dir(browser), str_buffer); - rarch_console_load_game_wrap(path, g_extern.file_state.zip_extract_mode, S_DELAY_45); + rarch_console_load_game_wrap(path, g_extern.file_state.zip_extract_mode); } else if(browser->current_dir.list->elems[index].attr.b) { @@ -1116,7 +1116,7 @@ void menu_init (void) browser = (filebrowser_t*)filebrowser_init(default_paths.filebrowser_startup_dir, g_extern.system.valid_extensions); tmp_browser = (filebrowser_t*)filebrowser_init(default_paths.filebrowser_startup_dir, ""); - g_extern.console.rmenu.mode = MODE_MENU; + g_extern.console.rmenu.mode = (1ULL << MODE_MENU); } void menu_free (void) @@ -1182,24 +1182,25 @@ bool rmenu_iterate(void) XINPUT_STATE state; XInputGetState(0, &state); + if (g_extern.console.rmenu.mode & (1ULL << MODE_LOAD_GAME)) + { + if(g_extern.console.rmenu.state.msg_info.enable) + rarch_settings_msg(S_MSG_LOADING_ROM, 100); + + if (g_extern.fullpath) + g_extern.console.rmenu.mode = (1ULL << MODE_INIT); + } + if (!(g_extern.frame_count < g_extern.delay_timer[0])) { bool rmenu_enable = ((state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) && (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) && (g_extern.main_is_init)); - switch(g_extern.console.rmenu.mode) - { - case MODE_EXIT: - case MODE_INIT: - case MODE_EMULATION: - break; - case MODE_MENU: - default: - if (rmenu_enable) - g_extern.console.rmenu.mode = MODE_EMULATION; - break; - } + + if (g_extern.console.rmenu.mode & (1ULL << MODE_MENU)) + if (rmenu_enable) + g_extern.console.rmenu.mode = (1ULL << MODE_EMULATION); } rarch_render_cached_frame(); @@ -1219,9 +1220,6 @@ bool rmenu_iterate(void) break; } - if(g_extern.console.rmenu.mode != MODE_MENU) - goto deinit; - msg = msg_queue_pull(g_extern.msg_queue); if (msg) @@ -1229,6 +1227,10 @@ bool rmenu_iterate(void) device_ptr->ctx_driver->swap_buffers(); + if(!(g_extern.console.rmenu.mode & (1ULL << MODE_MENU)) + && !(g_extern.console.rmenu.mode & (1ULL << MODE_LOAD_GAME))) + goto deinit; + return true; deinit: diff --git a/frontend/platform/platform_gx.c b/frontend/platform/platform_gx.c index b832e3dd01..b11228c881 100644 --- a/frontend/platform/platform_gx.c +++ b/frontend/platform/platform_gx.c @@ -375,14 +375,14 @@ static void system_process_args(int argc, char *argv[]) g_extern.console.external_launch.support = EXTERN_LAUNCHER_CHANNEL; snprintf(rom, sizeof(rom), "%s%s", argv[1], argv[2]); g_extern.file_state.zip_extract_mode = ZIP_EXTRACT_TO_CURRENT_DIR_AND_LOAD_FIRST_FILE; - rarch_console_load_game_wrap(rom, g_extern.file_state.zip_extract_mode, S_DELAY_1); + rarch_console_load_game_wrap(rom, g_extern.file_state.zip_extract_mode); rgui_iterate(rgui, RGUI_ACTION_MESSAGE); g_extern.draw_menu = true; rarch_render_cached_frame(); g_extern.draw_menu = false; - g_extern.console.rmenu.mode = MODE_INIT; + g_extern.console.rmenu.mode = (1ULL << MODE_INIT); } else g_extern.console.external_launch.support = EXTERN_LAUNCHER_SALAMANDER; diff --git a/frontend/platform/platform_ps3.c b/frontend/platform/platform_ps3.c index c0035f4ff4..e3fb0e99f9 100644 --- a/frontend/platform/platform_ps3.c +++ b/frontend/platform/platform_ps3.c @@ -387,7 +387,7 @@ static void system_process_args(int argc, char *argv[]) switch(g_extern.console.external_launch.support) { case EXTERN_LAUNCHER_SALAMANDER: - g_extern.console.rmenu.mode = MODE_MENU; + g_extern.console.rmenu.mode = (1ULL << MODE_MENU); break; #ifdef HAVE_MULTIMAN case EXTERN_LAUNCHER_MULTIMAN: diff --git a/frontend/platform/platform_psp.c b/frontend/platform/platform_psp.c index c66ae55d4b..8a0c6df97e 100644 --- a/frontend/platform/platform_psp.c +++ b/frontend/platform/platform_psp.c @@ -94,7 +94,7 @@ static int setup_callback(void) void menu_init (void) { - g_extern.console.rmenu.mode = MODE_MENU; + g_extern.console.rmenu.mode = (1ULL << MODE_MENU); } bool rmenu_iterate(void) @@ -102,8 +102,8 @@ bool rmenu_iterate(void) char game_rom[256]; snprintf(game_rom, sizeof(game_rom), "%s%s", default_paths.port_dir, "dkc.sfc"); RARCH_LOG("game ROM: %s\n", game_rom); - rarch_console_load_game_wrap(game_rom, 0, 0); - g_extern.console.rmenu.mode = MODE_EMULATION; + rarch_console_load_game_wrap(game_rom, 0); + g_extern.console.rmenu.mode = (1ULL << MODE_INIT); return false; } diff --git a/general.h b/general.h index 12a6bedc1f..fb58ad52af 100644 --- a/general.h +++ b/general.h @@ -318,6 +318,7 @@ struct global unsigned performance_level; enum retro_pixel_format pix_fmt; + bool block_extract; bool force_nonblock; const char *input_desc_btn[MAX_PLAYERS][RARCH_FIRST_CUSTOM_BIND]; diff --git a/retroarch.c b/retroarch.c index ed351c26b0..de28593382 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2606,6 +2606,7 @@ void rarch_init_system_info(void) info->library_name, info->library_version); strlcpy(g_extern.system.valid_extensions, info->valid_extensions ? info->valid_extensions : DEFAULT_EXT, sizeof(g_extern.system.valid_extensions)); + g_extern.system.block_extract = info->block_extract; } static void init_system_av_info(void) @@ -2781,7 +2782,7 @@ bool rarch_main_iterate(void) if (g_extern.system.shutdown) { #ifdef HAVE_RMENU - g_extern.console.rmenu.mode = MODE_EXIT; + g_extern.console.rmenu.mode = (1ULL << MODE_EXIT); #endif return false; } @@ -2796,7 +2797,7 @@ bool rarch_main_iterate(void) if (rmenu_enable || (g_extern.console.rmenu.state.ingame_menu.enable && !rmenu_enable)) { - g_extern.console.rmenu.mode = MODE_MENU; + g_extern.console.rmenu.mode = (1ULL << MODE_MENU); g_extern.delay_timer[0] = g_extern.frame_count + 30; } #endif @@ -2848,7 +2849,7 @@ bool rarch_main_iterate(void) { g_extern.lifecycle_state &= ~(1ULL << RARCH_FRAMEADVANCE); g_extern.console.rmenu.state.ingame_menu.enable = true; - g_extern.console.rmenu.mode = MODE_MENU; + g_extern.console.rmenu.mode = (1ULL << MODE_MENU); return false; } #endif diff --git a/settings.c b/settings.c index 7ade1a6761..70a576dcad 100644 --- a/settings.c +++ b/settings.c @@ -294,7 +294,7 @@ void config_set_defaults(void) g_extern.audio_data.mute = 0; g_extern.verbose = true; - g_extern.console.rmenu.mode = MODE_MENU; + g_extern.console.rmenu.mode = (1ULL << MODE_MENU); g_extern.console.rmenu.font_size = 1.0f; g_extern.console.sound.mode = SOUND_MODE_NORMAL; g_extern.console.screen.viewports.custom_vp.width = 0;