(RMenu/RGUI) Move menu_iterate to upper-layer menu_common

This commit is contained in:
twinaphex 2013-04-19 17:53:01 +02:00
parent dd9e6029c2
commit b7e71f17b8
4 changed files with 135 additions and 196 deletions

View File

@ -373,6 +373,11 @@ void menu_init(void)
rarch_fail(1, "menu_init()");
}
rgui->trigger_state = 0;
rgui->old_input_state = 0;
rgui->do_held = false;
rgui->frame_buf_show = true;
#ifdef HAVE_FILEBROWSER
if (!(strlen(g_settings.rgui_browser_directory) > 0))
strlcpy(g_settings.rgui_browser_directory, default_paths.filebrowser_startup_dir,
@ -409,3 +414,89 @@ void menu_free(void)
free(rgui);
}
#ifndef HAVE_RMENU_XUI
#if defined(HAVE_RMENU) || defined(HAVE_RGUI)
bool menu_iterate(void)
{
static bool initial_held = true;
static bool first_held = false;
uint64_t input_state = 0;
int input_entry_ret;
if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_PREINIT))
{
if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_INGAME))
rgui->need_refresh = true;
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_MENU_PREINIT);
}
if (driver.video_poke->apply_state_changes)
driver.video_poke->apply_state_changes(driver.video_data);
rarch_input_poll();
#ifdef HAVE_OVERLAY
rarch_check_overlay();
#endif
#ifndef RARCH_PERFORMANCE_MODE
rarch_check_fullscreen();
#endif
if (input_key_pressed_func(RARCH_QUIT_KEY) || !video_alive_func())
{
g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME);
goto deinit;
}
input_state = rgui_input();
if(rgui->do_held)
{
if(!first_held)
{
first_held = true;
g_extern.delay_timer[1] = g_extern.frame_count + (initial_held ? 15 : 7);
}
if (!(g_extern.frame_count < g_extern.delay_timer[1]))
{
first_held = false;
rgui->trigger_state = input_state; //second input frame set as current frame
}
initial_held = false;
}
else
{
first_held = false;
initial_held = true;
}
rgui->old_input_state = input_state;
input_entry_ret = rgui_iterate(rgui);
// draw last frame for loading messages
if (driver.video_poke && driver.video_poke->set_texture_enable)
driver.video_poke->set_texture_enable(driver.video_data, rgui->frame_buf_show, true);
rarch_render_cached_frame();
if (driver.video_poke && driver.video_poke->set_texture_enable)
driver.video_poke->set_texture_enable(driver.video_data, false, true);
if (rgui_input_postprocess(rgui, rgui->old_input_state) || input_entry_ret)
goto deinit;
return true;
deinit:
#ifdef HAVE_RGUI
/* TODO - see if we can remove this */
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_MENU_INGAME);
#endif
return false;
}
#endif
#endif

View File

@ -175,8 +175,13 @@ typedef enum
typedef struct
{
uint64_t old_input_state;
uint64_t trigger_state;
bool do_held;
uint16_t *frame_buf;
size_t frame_buf_pitch;
bool frame_buf_show;
#ifdef HAVE_FILEBROWSER
filebrowser_t *browser;
@ -220,6 +225,13 @@ int rgui_iterate(rgui_handle_t *rgui);
rgui_handle_t *rgui_init(void);
void rgui_free(rgui_handle_t *rgui);
#ifndef HAVE_RMENU_XUI
#if defined(HAVE_RGUI) || defined(HAVE_RMENU)
uint64_t rgui_input(void);
int rgui_input_postprocess(void *data, uint64_t old_state);
#endif
#endif
#ifdef HAVE_SHADER_MANAGER
void shader_manager_init(rgui_handle_t *rgui);
void shader_manager_get_str(struct gfx_shader *shader,

View File

@ -1699,30 +1699,26 @@ static bool directory_parse(rgui_handle_t *rgui, const char *directory, unsigned
return true;
}
static bool do_held = false;
static uint16_t trigger_state = 0;
static uint64_t old_input_state = 0;
int rgui_iterate(rgui_handle_t *rgui)
{
uint64_t action = RGUI_ACTION_NOOP;
// don't run anything first frame, only capture held inputs for old_input_state
if (trigger_state & (1ULL << DEVICE_NAV_UP))
if (rgui->trigger_state & (1ULL << DEVICE_NAV_UP))
action = RGUI_ACTION_UP;
else if (trigger_state & (1ULL << DEVICE_NAV_DOWN))
else if (rgui->trigger_state & (1ULL << DEVICE_NAV_DOWN))
action = RGUI_ACTION_DOWN;
else if (trigger_state & (1ULL << DEVICE_NAV_LEFT))
else if (rgui->trigger_state & (1ULL << DEVICE_NAV_LEFT))
action = RGUI_ACTION_LEFT;
else if (trigger_state & (1ULL << DEVICE_NAV_RIGHT))
else if (rgui->trigger_state & (1ULL << DEVICE_NAV_RIGHT))
action = RGUI_ACTION_RIGHT;
else if (trigger_state & (1ULL << DEVICE_NAV_B))
else if (rgui->trigger_state & (1ULL << DEVICE_NAV_B))
action = RGUI_ACTION_CANCEL;
else if (trigger_state & (1ULL << DEVICE_NAV_A))
else if (rgui->trigger_state & (1ULL << DEVICE_NAV_A))
action = RGUI_ACTION_OK;
else if (trigger_state & (1ULL << DEVICE_NAV_SELECT))
else if (rgui->trigger_state & (1ULL << DEVICE_NAV_SELECT))
action = RGUI_ACTION_START;
else if (trigger_state & (1ULL << DEVICE_NAV_START))
else if (rgui->trigger_state & (1ULL << DEVICE_NAV_START))
action = RGUI_ACTION_SETTINGS;
const char *dir = 0;
@ -1984,7 +1980,7 @@ int rgui_input_postprocess(void *data, uint64_t old_state)
if (!(g_extern.frame_count < g_extern.delay_timer[0]))
{
if ((trigger_state & (1ULL << DEVICE_NAV_MENU)) && g_extern.main_is_init)
if ((rgui->trigger_state & (1ULL << DEVICE_NAV_MENU)) && g_extern.main_is_init)
{
if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_INGAME))
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
@ -2002,7 +1998,7 @@ int rgui_input_postprocess(void *data, uint64_t old_state)
return ret;
}
static uint64_t rgui_input(void)
uint64_t rgui_input(void)
{
uint64_t input_state = 0;
@ -2044,87 +2040,8 @@ static uint64_t rgui_input(void)
input_state |= input_key_pressed_func(RARCH_MENU_TOGGLE) ? (1ULL << DEVICE_NAV_MENU) : 0;
#endif
trigger_state = input_state & ~old_input_state;
do_held = (input_state & ((1ULL << DEVICE_NAV_UP) | (1ULL << DEVICE_NAV_DOWN) | (1ULL << DEVICE_NAV_LEFT) | (1ULL << DEVICE_NAV_RIGHT))) && !(input_state & ((1ULL << DEVICE_NAV_MENU)));
rgui->trigger_state = input_state & ~(rgui->old_input_state);
rgui->do_held = (input_state & ((1ULL << DEVICE_NAV_UP) | (1ULL << DEVICE_NAV_DOWN) | (1ULL << DEVICE_NAV_LEFT) | (1ULL << DEVICE_NAV_RIGHT))) && !(input_state & ((1ULL << DEVICE_NAV_MENU)));
return input_state;
}
bool menu_iterate(void)
{
static bool initial_held = true;
static bool first_held = false;
uint64_t input_state = 0;
int input_entry_ret;
if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_PREINIT))
{
if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_INGAME))
rgui->need_refresh = true;
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_MENU_PREINIT);
}
if (driver.video_poke->apply_state_changes)
driver.video_poke->apply_state_changes(driver.video_data);
rarch_input_poll();
#ifdef HAVE_OVERLAY
rarch_check_overlay();
#endif
#ifndef RARCH_PERFORMANCE_MODE
rarch_check_fullscreen();
#endif
if (input_key_pressed_func(RARCH_QUIT_KEY) || !video_alive_func())
{
g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME);
goto deinit;
}
input_state = rgui_input();
if(do_held)
{
if(!first_held)
{
first_held = true;
g_extern.delay_timer[1] = g_extern.frame_count + (initial_held ? 15 : 7);
}
if (!(g_extern.frame_count < g_extern.delay_timer[1]))
{
first_held = false;
trigger_state = input_state; //second input frame set as current frame
}
initial_held = false;
}
else
{
first_held = false;
initial_held = true;
}
old_input_state = input_state;
input_entry_ret = rgui_iterate(rgui);
// draw last frame for loading messages
if (driver.video_poke && driver.video_poke->set_texture_enable)
driver.video_poke->set_texture_enable(driver.video_data, true, false);
rarch_render_cached_frame();
if (driver.video_poke && driver.video_poke->set_texture_enable)
driver.video_poke->set_texture_enable(driver.video_data, false, false);
if (rgui_input_postprocess(rgui, old_input_state) || input_entry_ret)
goto deinit;
return true;
deinit:
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_MENU_INGAME);
return false;
}

View File

@ -60,10 +60,8 @@ struct texture_image *menu_texture;
struct texture_image *menu_panel;
#endif
static bool menu_bg_show = true;
unsigned currently_selected_controller_menu = 0;
static const struct retro_keybind _rmenu_nav_binds[] = {
{ 0, 0, NULL, (enum retro_key)0, (1ULL << RETRO_DEVICE_ID_JOYPAD_UP) | (1ULL << RARCH_ANALOG_LEFT_Y_DPAD_UP), 0 },
{ 0, 0, NULL, (enum retro_key)0, (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN) | (1ULL << RARCH_ANALOG_LEFT_Y_DPAD_DOWN), 0 },
@ -245,12 +243,12 @@ static void menu_stack_pop(unsigned menu_type)
case INGAME_MENU_CORE_OPTIONS:
case INGAME_MENU_RESIZE:
case INGAME_MENU_SCREENSHOT:
menu_bg_show = true;
rgui->frame_buf_show = true;
break;
#ifdef HAVE_SHADER_MANAGER
case INGAME_MENU_SHADER_MANAGER:
selected = FIRST_INGAME_MENU_SETTING;
menu_bg_show = true;
rgui->frame_buf_show = true;
break;
case CGP_CHOICE:
selected = FIRST_SHADERMAN_SETTING;
@ -2657,9 +2655,9 @@ static int ingame_menu_resize(void *data, uint64_t input)
menu_stack_pop(rgui->menu_type);
if ((input & (1ULL << DEVICE_NAV_Y)))
menu_bg_show = !menu_bg_show;
rgui->frame_buf_show = !rgui->frame_buf_show;
if (menu_bg_show)
if (rgui->frame_buf_show)
{
char viewport_x[32];
char viewport_y[32];
@ -2998,7 +2996,7 @@ static int ingame_menu_core_options(void *data, uint64_t input)
static int ingame_menu_screenshot(void *data, uint64_t input)
{
rgui_handle_t *rgui = (rgui_handle_t*)data;
menu_bg_show = false;
rgui->frame_buf_show = false;
if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_INGAME))
{
@ -3101,18 +3099,16 @@ int rgui_input_postprocess(void *data, uint64_t old_state)
return ret;
}
/*============================================================
RMENU API
============================================================ */
static uint64_t trigger_state = 0;
static uint64_t old_input_state = 0;
static bool do_held = false;
int rgui_iterate(rgui_handle_t *rgui)
{
rgui->menu_type = menu_stack_enum_array[stack_idx - 1];
if (rgui->need_refresh)
{
menu_stack_push(INGAME_MENU, false);
rgui->need_refresh = false;
}
#ifdef HAVE_OSKUTIL
if (rgui->osk_init != NULL)
{
@ -3130,13 +3126,13 @@ int rgui_iterate(rgui_handle_t *rgui)
switch(rgui->menu_type)
{
case INGAME_MENU_RESIZE:
return ingame_menu_resize(rgui, trigger_state);
return ingame_menu_resize(rgui, rgui->trigger_state);
case INGAME_MENU_CORE_OPTIONS:
return ingame_menu_core_options(rgui, trigger_state);
return ingame_menu_core_options(rgui, rgui->trigger_state);
case INGAME_MENU_SCREENSHOT:
return ingame_menu_screenshot(rgui, trigger_state);
return ingame_menu_screenshot(rgui, rgui->trigger_state);
case FILE_BROWSER_MENU:
return select_rom(rgui, trigger_state);
return select_rom(rgui, rgui->trigger_state);
case LIBRETRO_CHOICE:
#ifdef HAVE_SHADER_MANAGER
case CGP_CHOICE:
@ -3144,7 +3140,7 @@ int rgui_iterate(rgui_handle_t *rgui)
#endif
case INPUT_PRESET_CHOICE:
case BORDER_CHOICE:
return select_file(rgui, trigger_state);
return select_file(rgui, rgui->trigger_state);
case PATH_DEFAULT_ROM_DIR_CHOICE:
case PATH_SAVESTATES_DIR_CHOICE:
case PATH_SRAM_DIR_CHOICE:
@ -3152,7 +3148,7 @@ int rgui_iterate(rgui_handle_t *rgui)
case PATH_CHEATS_DIR_CHOICE:
#endif
case PATH_SYSTEM_DIR_CHOICE:
return select_directory(rgui, trigger_state);
return select_directory(rgui, rgui->trigger_state);
case GENERAL_VIDEO_MENU:
case GENERAL_AUDIO_MENU:
case EMU_GENERAL_MENU:
@ -3164,7 +3160,7 @@ int rgui_iterate(rgui_handle_t *rgui)
#ifdef HAVE_SHADER_MANAGER
case INGAME_MENU_SHADER_MANAGER:
#endif
return select_setting(rgui, trigger_state);
return select_setting(rgui, rgui->trigger_state);
}
RARCH_WARN("Menu type %d not implemented, exiting...\n", rgui->menu_type);
@ -3243,88 +3239,11 @@ uint64_t rgui_input(void)
RETRO_DEVICE_JOYPAD, 0, i) ? (1ULL << i) : 0;
//set first button input frame as trigger
trigger_state = input_state & ~(old_input_state);
rgui->trigger_state = input_state & ~(rgui->old_input_state);
bool analog_sticks_pressed = (input_state & (1ULL << DEVICE_NAV_LEFT_ANALOG_L)) || (input_state & (1ULL << DEVICE_NAV_RIGHT_ANALOG_L)) || (input_state & (1ULL << DEVICE_NAV_UP_ANALOG_L)) || (input_state & (1ULL << DEVICE_NAV_DOWN_ANALOG_L)) || (input_state & (1ULL << DEVICE_NAV_LEFT_ANALOG_R)) || (input_state & (1ULL << DEVICE_NAV_RIGHT_ANALOG_R)) || (input_state & (1ULL << DEVICE_NAV_UP_ANALOG_R)) || (input_state & (1ULL << DEVICE_NAV_DOWN_ANALOG_R));
bool shoulder_buttons_pressed = ((input_state & (1ULL << DEVICE_NAV_L2)) || (input_state & (1ULL << DEVICE_NAV_R2)));
do_held = analog_sticks_pressed || shoulder_buttons_pressed;
rgui->do_held = analog_sticks_pressed || shoulder_buttons_pressed;
return input_state;
}
bool menu_iterate(void)
{
static bool initial_held = true;
static bool first_held = false;
uint64_t input_state = 0;
int input_entry_ret;
if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_PREINIT))
{
if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_INGAME))
menu_stack_push(INGAME_MENU, false);
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_MENU_PREINIT);
}
if (driver.video_poke->apply_state_changes)
driver.video_poke->apply_state_changes(driver.video_data);
rarch_input_poll();
#ifdef HAVE_OVERLAY
rarch_check_overlay();
#endif
#ifndef RARCH_PERFORMANCE_MODE
rarch_check_fullscreen();
#endif
if (input_key_pressed_func(RARCH_QUIT_KEY) || !video_alive_func())
{
g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME);
goto deinit;
}
input_state = rgui_input();
if (do_held)
{
if (!first_held)
{
first_held = true;
g_extern.delay_timer[1] = g_extern.frame_count + (initial_held ? 15 : 7);
}
if (!(g_extern.frame_count < g_extern.delay_timer[1]))
{
first_held = false;
trigger_state = input_state; //second input frame set as current frame
}
initial_held = false;
}
else
{
first_held = false;
initial_held = true;
}
old_input_state = input_state;
input_entry_ret = rgui_iterate(rgui);
// draw last frame for loading messages
if (driver.video_poke && driver.video_poke->set_texture_enable)
driver.video_poke->set_texture_enable(driver.video_data, menu_bg_show, true);
rarch_render_cached_frame();
if (driver.video_poke && driver.video_poke->set_texture_enable)
driver.video_poke->set_texture_enable(driver.video_data, false, true);
if (rgui_input_postprocess(rgui, old_input_state) || input_entry_ret)
goto deinit;
return true;
deinit:
return false;
}