(RARCH_CONSOLE) rmenu.mode is now set with bitmasked values so

as to allow more state management options
This commit is contained in:
twinaphex 2013-01-10 08:46:46 +01:00
parent 6548800152
commit 6ad5d46781
15 changed files with 106 additions and 107 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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(&current_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:

View File

@ -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;

View File

@ -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 (g_extern.console.rmenu.mode & (1ULL << MODE_MENU))
if (rmenu_enable)
g_extern.console.rmenu.mode = MODE_EMULATION;
break;
}
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:

View File

@ -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;

View File

@ -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:

View File

@ -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;
}

View File

@ -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];

View File

@ -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

View File

@ -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;