From 1ff48fcd38ed8d399669273e6a6e4e78ac0dbfbc Mon Sep 17 00:00:00 2001 From: Themaister Date: Fri, 4 Oct 2013 14:53:47 +0200 Subject: [PATCH 1/4] Implement an idea for a start screen. --- frontend/menu/menu_common.h | 2 ++ frontend/menu/rgui.c | 41 ++++++++++++++++++++++++++++++++- frontend/menu/rguidisp_bitmap.c | 1 + 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h index 0e9b5d8039..164750828b 100644 --- a/frontend/menu/menu_common.h +++ b/frontend/menu/menu_common.h @@ -56,6 +56,7 @@ typedef enum RGUI_FILE_DEVICE, RGUI_FILE_USE_DIRECTORY, RGUI_SETTINGS, + RGUI_START_SCREEN, // Shader stuff RGUI_SETTINGS_VIDEO_OPTIONS, @@ -285,6 +286,7 @@ typedef struct size_t selection_ptr; bool need_refresh; bool msg_force; + bool push_start_screen; char base_path[PATH_MAX]; char default_glslp[PATH_MAX]; diff --git a/frontend/menu/rgui.c b/frontend/menu/rgui.c index 38b34833ec..2584c23d90 100644 --- a/frontend/menu/rgui.c +++ b/frontend/menu/rgui.c @@ -142,6 +142,7 @@ static void *rgui_init(void) rgui->selection_buf = (rgui_list_t*)calloc(1, sizeof(rgui_list_t)); rgui_list_push(rgui->menu_stack, "", RGUI_SETTINGS, 0); rgui->selection_ptr = 0; + rgui->push_start_screen = true; rgui_settings_populate_entries(rgui); // Make sure that custom viewport is something sane incase we use it @@ -545,6 +546,35 @@ static int rgui_custom_bind_iterate(rgui_handle_t *rgui, rgui_action_t action) return 0; } +static int rgui_start_screen_iterate(rgui_handle_t *rgui, rgui_action_t action) +{ + render_text(rgui); + render_messagebox(rgui, + "-- Welcome to RetroArch --\n" + " \n" // strtok_r doesn't split empty strings. + +#if !defined(RARCH_CONSOLE) && !defined(RARCH_MOBILE) + "Default keyboard controls: \n" + " Arrow keys: Navigate \n" + " X: Accept/OK \n" + " Z: Back \n" + " F1: Enter/Exit RGUI \n" + " ESC: Exit RetroArch \n" + " \n" +#endif + + "To play a game: \n" + " Load a libretro core (Core).\n" + " Load a ROM (Load Game). \n" + " \n" + + "Press Accept/OK to continue."); + + if (action == RGUI_ACTION_OK) + rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); + return 0; +} + static int rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action) { rarch_viewport_t *custom = &g_extern.console.screen.viewports.custom_vp; @@ -866,6 +896,13 @@ static int rgui_settings_iterate(rgui_handle_t *rgui, rgui_action_t action) render_text(rgui); + // Have to defer it so we let settings refresh. + if (rgui->push_start_screen) + { + rgui->push_start_screen = false; + rgui_list_push(rgui->menu_stack, "", RGUI_START_SCREEN, 0); + } + return 0; } @@ -1025,7 +1062,9 @@ static int rgui_iterate(void *data, unsigned action) driver.video_poke->set_texture_frame(driver.video_data, menu_framebuf, false, RGUI_WIDTH, RGUI_HEIGHT, 1.0f); - if (menu_type_is_settings(menu_type)) + if (menu_type == RGUI_START_SCREEN) + return rgui_start_screen_iterate(rgui, action); + else if (menu_type_is_settings(menu_type)) return rgui_settings_iterate(rgui, action); else if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT || menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2) return rgui_viewport_iterate(rgui, action); diff --git a/frontend/menu/rguidisp_bitmap.c b/frontend/menu/rguidisp_bitmap.c index 1a26173a96..897a18560c 100644 --- a/frontend/menu/rguidisp_bitmap.c +++ b/frontend/menu/rguidisp_bitmap.c @@ -257,6 +257,7 @@ static void render_text(rgui_handle_t *rgui) (menu_type == RGUI_SETTINGS_OPTIONS) || (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT || menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2) || menu_type == RGUI_SETTINGS_CUSTOM_BIND || + menu_type == RGUI_START_SCREEN || menu_type == RGUI_SETTINGS) snprintf(title, sizeof(title), "MENU %s", dir); else if (menu_type == RGUI_SETTINGS_OPEN_HISTORY) From 2d0131ddabe3223f1e5f50a61bcbfbf87fecc0f2 Mon Sep 17 00:00:00 2001 From: Themaister Date: Sat, 5 Oct 2013 11:05:28 +0200 Subject: [PATCH 2/4] Update start screen, and add Help ... entry. --- frontend/menu/menu_settings.c | 4 ++ frontend/menu/rgui.c | 68 +++++++++++++++++++++++++-------- frontend/menu/rguidisp_bitmap.c | 1 + 3 files changed, 57 insertions(+), 16 deletions(-) diff --git a/frontend/menu/menu_settings.c b/frontend/menu/menu_settings.c index de739e1694..08f75418a7 100644 --- a/frontend/menu/menu_settings.c +++ b/frontend/menu/menu_settings.c @@ -88,6 +88,10 @@ int menu_set_settings(unsigned setting, unsigned action) switch (setting) { + case RGUI_START_SCREEN: + if (action == RGUI_ACTION_OK) + rgui_list_push(rgui->menu_stack, "", RGUI_START_SCREEN, 0); + break; case RGUI_SETTINGS_REWIND_ENABLE: if (action == RGUI_ACTION_OK || action == RGUI_ACTION_LEFT || diff --git a/frontend/menu/rgui.c b/frontend/menu/rgui.c index 2584c23d90..f8e9eef024 100644 --- a/frontend/menu/rgui.c +++ b/frontend/menu/rgui.c @@ -277,6 +277,7 @@ static void rgui_settings_populate_entries(rgui_handle_t *rgui) #endif rgui_list_push(rgui->selection_buf, "RetroArch Config", RGUI_SETTINGS_CONFIG, 0); rgui_list_push(rgui->selection_buf, "Save New Config", RGUI_SETTINGS_SAVE_CONFIG, 0); + rgui_list_push(rgui->selection_buf, "Help", RGUI_START_SCREEN, 0); rgui_list_push(rgui->selection_buf, "Quit RetroArch", RGUI_SETTINGS_QUIT_RARCH, 0); } @@ -549,26 +550,61 @@ static int rgui_custom_bind_iterate(rgui_handle_t *rgui, rgui_action_t action) static int rgui_start_screen_iterate(rgui_handle_t *rgui, rgui_action_t action) { render_text(rgui); - render_messagebox(rgui, - "-- Welcome to RetroArch --\n" + char msg[1024]; + + char desc[6][64]; + static const unsigned binds[] = { + RETRO_DEVICE_ID_JOYPAD_UP, + RETRO_DEVICE_ID_JOYPAD_DOWN, + RETRO_DEVICE_ID_JOYPAD_A, + RETRO_DEVICE_ID_JOYPAD_B, + RARCH_MENU_TOGGLE, + RARCH_QUIT_KEY, + }; + + for (unsigned i = 0; i < ARRAY_SIZE(binds); i++) + { + if (driver.input && driver.input->set_keybinds) + { + struct platform_bind key_label; + strlcpy(key_label.desc, "Unknown", sizeof(key_label.desc)); + key_label.joykey = g_settings.input.binds[0][binds[i]].joykey; + driver.input->set_keybinds(&key_label, 0, 0, 0, 1ULL << KEYBINDS_ACTION_GET_BIND_LABEL); + strlcpy(desc[i], key_label.desc, sizeof(desc[i])); + } + else + { + const struct retro_keybind *bind = &g_settings.input.binds[0][binds[i]]; + input_get_bind_string(desc[i], bind, sizeof(desc[i])); + } + } + + snprintf(msg, sizeof(msg), + "-- Welcome to RetroArch / RGUI --\n" " \n" // strtok_r doesn't split empty strings. -#if !defined(RARCH_CONSOLE) && !defined(RARCH_MOBILE) - "Default keyboard controls: \n" - " Arrow keys: Navigate \n" - " X: Accept/OK \n" - " Z: Back \n" - " F1: Enter/Exit RGUI \n" - " ESC: Exit RetroArch \n" - " \n" -#endif - - "To play a game: \n" - " Load a libretro core (Core).\n" - " Load a ROM (Load Game). \n" + "Basic RGUI controls:\n" + " Scroll (Up): %-20s\n" + " Scroll (Down): %-20s\n" + " Accept/OK: %-20s\n" + " Back: %-20s\n" + "Enter/Exit RGUI: %-20s\n" + " Exit RetroArch: %-20s\n" " \n" - "Press Accept/OK to continue."); + "To play a game:\n" + "Load a libretro core (Core).\n" + "Load a ROM (Load Game). \n" + " \n" + + "See Path Options to set directories\n" + "for faster access to files.\n" + " \n" + + "Press Accept/OK to continue.", + desc[0], desc[1], desc[2], desc[3], desc[4], desc[5]); + + render_messagebox(rgui, msg); if (action == RGUI_ACTION_OK) rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); diff --git a/frontend/menu/rguidisp_bitmap.c b/frontend/menu/rguidisp_bitmap.c index 897a18560c..305ffad3c6 100644 --- a/frontend/menu/rguidisp_bitmap.c +++ b/frontend/menu/rguidisp_bitmap.c @@ -569,6 +569,7 @@ static void render_text(rgui_handle_t *rgui) case RGUI_SETTINGS_OPTIONS: case RGUI_SETTINGS_CUSTOM_BIND_ALL: case RGUI_SETTINGS_CUSTOM_BIND_DEFAULT_ALL: + case RGUI_START_SCREEN: strlcpy(type_str, "...", sizeof(type_str)); break; #ifdef HAVE_OVERLAY From cf7232160bf58074ce441d8260a5e15b5dbe1dc6 Mon Sep 17 00:00:00 2001 From: Themaister Date: Sat, 5 Oct 2013 11:11:43 +0200 Subject: [PATCH 3/4] Only show start screen if rgui_show_start_screen is set. Default to true, and set to false on first time. --- config.def.h | 3 +++ frontend/menu/rgui.c | 3 ++- general.h | 1 + settings.c | 4 ++++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index 54eb968b6a..520581b01c 100644 --- a/config.def.h +++ b/config.def.h @@ -406,6 +406,9 @@ static const bool stdin_cmd_enable = false; // Number of entries that will be kept in ROM history file. static const unsigned game_history_size = 100; +// Show RGUI start-up screen on boot. +static const bool rgui_show_start_screen = true; + //////////////////// // Keybinds, Joypad diff --git a/frontend/menu/rgui.c b/frontend/menu/rgui.c index f8e9eef024..438fdcfcd8 100644 --- a/frontend/menu/rgui.c +++ b/frontend/menu/rgui.c @@ -142,7 +142,8 @@ static void *rgui_init(void) rgui->selection_buf = (rgui_list_t*)calloc(1, sizeof(rgui_list_t)); rgui_list_push(rgui->menu_stack, "", RGUI_SETTINGS, 0); rgui->selection_ptr = 0; - rgui->push_start_screen = true; + rgui->push_start_screen = g_settings.rgui_show_start_screen; + g_settings.rgui_show_start_screen = false; rgui_settings_populate_entries(rgui); // Make sure that custom viewport is something sane incase we use it diff --git a/general.h b/general.h index 5c4c1ab14f..846c68e6b3 100644 --- a/general.h +++ b/general.h @@ -286,6 +286,7 @@ struct settings #if defined(HAVE_RGUI) || defined(HAVE_RMENU) || defined(HAVE_RMENU_XUI) char rgui_browser_directory[PATH_MAX]; char rgui_config_directory[PATH_MAX]; + bool rgui_show_start_screen; #endif }; diff --git a/settings.c b/settings.c index a5c5147a7d..b3cb7883ee 100644 --- a/settings.c +++ b/settings.c @@ -230,6 +230,8 @@ void config_set_defaults(void) g_settings.stdin_cmd_enable = stdin_cmd_enable; g_settings.game_history_size = game_history_size; + g_settings.rgui_show_start_screen = rgui_show_start_screen; + rarch_assert(sizeof(g_settings.input.binds[0]) >= sizeof(retro_keybinds_1)); rarch_assert(sizeof(g_settings.input.binds[1]) >= sizeof(retro_keybinds_rest)); memcpy(g_settings.input.binds[0], retro_keybinds_1, sizeof(retro_keybinds_1)); @@ -750,6 +752,7 @@ bool config_load_file(const char *path) CONFIG_GET_PATH(rgui_config_directory, "rgui_config_directory"); if (!strcmp(g_settings.rgui_config_directory, "default")) *g_settings.rgui_config_directory = '\0'; + CONFIG_GET_BOOL(rgui_show_start_screen, "rgui_show_start_screen"); #endif #ifdef HAVE_OVERLAY @@ -1078,6 +1081,7 @@ bool config_save_file(const char *path) #if defined(HAVE_RGUI) || defined(HAVE_RMENU) || defined(HAVE_RMENU_XUI) config_set_string(conf, "rgui_browser_directory", *g_settings.rgui_browser_directory ? g_settings.rgui_browser_directory : "default"); config_set_string(conf, "rgui_config_directory", *g_settings.rgui_config_directory ? g_settings.rgui_config_directory : "default"); + config_set_bool(conf, "rgui_show_start_screen", g_settings.rgui_show_start_screen); #endif config_set_string(conf, "game_history_path", g_settings.game_history_path); From cb280d0d362eea4b94f83d773fcc3af7a92f2860 Mon Sep 17 00:00:00 2001 From: Themaister Date: Sat, 5 Oct 2013 13:08:15 +0200 Subject: [PATCH 4/4] Add description for rgui_show_start_screen in config. --- retroarch.cfg | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/retroarch.cfg b/retroarch.cfg index 1782f1c3d0..038b5e58f6 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -46,6 +46,11 @@ # Sets start directory for RGUI config browser. # rgui_config_directory = +# Show startup screen in RGUI. +# Is automatically set to false when seen for the first time. +# This is only updated in config if config_save_on_exit is set to true, however. +# rgui_show_start_screen = true + # Flushes config to disk on exit. Useful for RGUI as settings can be modified. # Overwrites the config. #include's and comments are not preserved. # config_save_on_exit = false