diff --git a/config.def.h b/config.def.h index 320aa4be28..04c2cb9fc3 100644 --- a/config.def.h +++ b/config.def.h @@ -559,6 +559,8 @@ static const bool menu_savestate_resume = false; #define DEFAULT_MENU_INSERT_DISK_RESUME true +#define DEFAULT_QUIT_ON_CLOSE_CONTENT QUIT_ON_CLOSE_CONTENT_DISABLED + static const bool content_show_settings = true; static const bool content_show_favorites = true; #ifdef HAVE_IMAGEVIEWER diff --git a/configuration.c b/configuration.c index 26da4a3454..e4f25479a2 100644 --- a/configuration.c +++ b/configuration.c @@ -2027,6 +2027,7 @@ static struct config_uint_setting *populate_settings_uint( SETTING_UINT("core_updater_auto_backup_history_size", &settings->uints.core_updater_auto_backup_history_size, true, DEFAULT_CORE_UPDATER_AUTO_BACKUP_HISTORY_SIZE, false); SETTING_UINT("video_black_frame_insertion", &settings->uints.video_black_frame_insertion, true, DEFAULT_BLACK_FRAME_INSERTION, false); + SETTING_UINT("quit_on_close_content", &settings->uints.quit_on_close_content, true, DEFAULT_QUIT_ON_CLOSE_CONTENT, false); *size = count; return tmp; diff --git a/configuration.h b/configuration.h index 5e76b46d29..b94aff244f 100644 --- a/configuration.h +++ b/configuration.h @@ -271,6 +271,7 @@ typedef struct settings unsigned core_updater_auto_backup_history_size; unsigned video_black_frame_insertion; + unsigned quit_on_close_content; } uints; struct diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index e1841f74f9..29876260ea 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -2072,6 +2072,10 @@ MSG_HASH( MENU_ENUM_LABEL_MENU_INSERT_DISK_RESUME, "menu_insert_disk_resume" ) +MSG_HASH( + MENU_ENUM_LABEL_QUIT_ON_CLOSE_CONTENT, + "quit_on_close_content" + ) MSG_HASH( MENU_ENUM_LABEL_PAUSE_NONACTIVE, "pause_nonactive" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 901e10653b..d0b9253f6d 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3851,6 +3851,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_INSERT_DISK_RESUME, "Automatically close the menu and resume content after inserting or loading a new disc." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUIT_ON_CLOSE_CONTENT, + "Quit on Close Content" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUIT_ON_CLOSE_CONTENT, + "Automatically quit RetroArch when closing content. 'CLI' quits only when content is launched via command line." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE, "Mouse Support" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index a64e1ef6d7..7e0d9f78bf 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -495,6 +495,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_swap_ok_cancel, MENU_ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_pause_libretro, MENU_ENUM_SUBLABEL_PAUSE_LIBRETRO) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_savestate_resume, MENU_ENUM_SUBLABEL_MENU_SAVESTATE_RESUME) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_insert_disk_resume, MENU_ENUM_SUBLABEL_MENU_INSERT_DISK_RESUME) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quit_on_close_content, MENU_ENUM_SUBLABEL_QUIT_ON_CLOSE_CONTENT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_driver, MENU_ENUM_SUBLABEL_VIDEO_DRIVER) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_audio_driver, MENU_ENUM_SUBLABEL_AUDIO_DRIVER) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_driver, MENU_ENUM_SUBLABEL_INPUT_DRIVER) @@ -2846,6 +2847,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_MENU_INSERT_DISK_RESUME: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_insert_disk_resume); break; + case MENU_ENUM_LABEL_QUIT_ON_CLOSE_CONTENT: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_quit_on_close_content); + break; case MENU_ENUM_LABEL_MENU_INPUT_SWAP_OK_CANCEL: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_swap_ok_cancel); break; diff --git a/menu/menu_defines.h b/menu/menu_defines.h index 6fcbd3b3b9..2458bcfe47 100644 --- a/menu/menu_defines.h +++ b/menu/menu_defines.h @@ -384,6 +384,14 @@ enum playlist_entry_remove_enable_type PLAYLIST_ENTRY_REMOVE_ENABLE_LAST }; +enum quit_on_close_content_type +{ + QUIT_ON_CLOSE_CONTENT_DISABLED = 0, + QUIT_ON_CLOSE_CONTENT_ENABLED, + QUIT_ON_CLOSE_CONTENT_CLI, + QUIT_ON_CLOSE_CONTENT_LAST +}; + RETRO_END_DECLS #endif diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 236104a775..ec9ef66911 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -7134,6 +7134,7 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_PAUSE_LIBRETRO, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_MENU_SAVESTATE_RESUME, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_MENU_INSERT_DISK_RESUME, PARSE_ONLY_BOOL, true}, + {MENU_ENUM_LABEL_QUIT_ON_CLOSE_CONTENT, PARSE_ONLY_UINT, true}, {MENU_ENUM_LABEL_MOUSE_ENABLE, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_POINTER_ENABLE, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_THREADED_DATA_RUNLOOP_ENABLE, PARSE_ONLY_BOOL, true}, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 6aa62d3bf5..1a74abbb94 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -6340,6 +6340,27 @@ static void setting_get_string_representation_uint_libretro_log_level( } } +static void setting_get_string_representation_uint_quit_on_close_content( + rarch_setting_t *setting, + char *s, size_t len) +{ + if (!setting) + return; + + switch (*setting->value.target.unsigned_integer) + { + case QUIT_ON_CLOSE_CONTENT_DISABLED: + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len); + break; + case QUIT_ON_CLOSE_CONTENT_ENABLED: + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ON), len); + break; + case QUIT_ON_CLOSE_CONTENT_CLI: + strlcpy(s, "CLI", len); + break; + } +} + enum setting_type menu_setting_get_browser_selection_type(rarch_setting_t *setting) { if (!setting) @@ -13781,6 +13802,22 @@ static bool setting_append_list( SD_FLAG_ADVANCED ); + CONFIG_UINT( + list, list_info, + &settings->uints.quit_on_close_content, + MENU_ENUM_LABEL_QUIT_ON_CLOSE_CONTENT, + MENU_ENUM_LABEL_VALUE_QUIT_ON_CLOSE_CONTENT, + DEFAULT_QUIT_ON_CLOSE_CONTENT, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_uint_quit_on_close_content; + menu_settings_list_current_add_range(list, list_info, 0, QUIT_ON_CLOSE_CONTENT_LAST-1, 1, true, true); + CONFIG_BOOL( list, list_info, &settings->bools.menu_mouse_enable, diff --git a/msg_hash.h b/msg_hash.h index 30f549554d..a16105c685 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -949,6 +949,11 @@ enum msg_hash_enums MENU_LABEL(INPUT_UNIFIED_MENU_CONTROLS), MENU_LABEL(QUIT_PRESS_TWICE), + MENU_LABEL(QUIT_ON_CLOSE_CONTENT), + + MENU_ENUM_LABEL_VALUE_QUIT_ON_CLOSE_CONTENT_DISABLED, + MENU_ENUM_LABEL_VALUE_QUIT_ON_CLOSE_CONTENT_ENABLED, + MENU_ENUM_LABEL_VALUE_QUIT_ON_CLOSE_CONTENT_CLI, /* Video */ MENU_LABEL(CRT_SWITCH_RESOLUTION), diff --git a/retroarch.c b/retroarch.c index e37b21776c..88c1f221cd 100644 --- a/retroarch.c +++ b/retroarch.c @@ -16308,6 +16308,11 @@ bool command_event(enum event_command cmd, void *data) if (is_inited) { + if ( (settings->uints.quit_on_close_content == QUIT_ON_CLOSE_CONTENT_CLI && global->launched_from_cli) + || settings->uints.quit_on_close_content == QUIT_ON_CLOSE_CONTENT_ENABLED + ) + command_event(CMD_EVENT_QUIT, NULL); + if (!task_push_start_dummy_core(&content_info)) return false; }