From 70956dca6fe6dc8c5dda2037a68c119fccf2f657 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 5 Aug 2017 12:31:58 -0500 Subject: [PATCH 01/16] add new variables for "content dir" --- config.def.h | 5 +++++ configuration.c | 5 +++++ configuration.h | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/config.def.h b/config.def.h index 86d2475636..f426c5b61b 100644 --- a/config.def.h +++ b/config.def.h @@ -295,6 +295,11 @@ static bool default_auto_shaders_enable = true; static bool default_sort_savefiles_enable = false; static bool default_sort_savestates_enable = false; +static bool default_savestates_in_content_dir = false; +static bool default_savefiles_in_content_dir = false; +static bool default_systemfiles_in_content_dir = false; +static bool default_screenshots_in_content_dir = false; + #if defined(__CELLOS_LV2__) || defined(_XBOX1) || defined(_XBOX360) static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L3_R3; #elif defined(VITA) diff --git a/configuration.c b/configuration.c index 1704386fbb..0e7482f967 100644 --- a/configuration.c +++ b/configuration.c @@ -1258,6 +1258,11 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, SETTING_BOOL("audio_wasapi_float_format", &settings->bools.audio_wasapi_float_format, true, wasapi_float_format, false); #endif + SETTING_BOOL("savestates_in_content_dir", &settings->bools.savestates_in_content_dir, true, default_savestates_in_content_dir, false); + SETTING_BOOL("savefiles_in_content_dir", &settings->bools.savefiles_in_content_dir, true, default_savefiles_in_content_dir, false); + SETTING_BOOL("systemfiles_in_content_dir", &settings->bools.systemfiles_in_content_dir, true, default_systemfiles_in_content_dir, false); + SETTING_BOOL("screenshots_in_content_dir", &settings->bools.screenshots_in_content_dir, true, default_screenshots_in_content_dir, false); + if (global) { SETTING_BOOL("custom_bgm_enable", &global->console.sound.system_bgm_enable, true, false, false); diff --git a/configuration.h b/configuration.h index 8d20c8daaf..4486bd6913 100644 --- a/configuration.h +++ b/configuration.h @@ -209,6 +209,11 @@ typedef struct settings bool sort_savestates_enable; bool config_save_on_exit; bool show_hidden_files; + + bool savefiles_in_content_dir; + bool savestates_in_content_dir; + bool screenshots_in_content_dir; + bool systemfiles_in_content_dir; #ifdef HAVE_LAKKA bool ssh_enable; bool samba_enable; From 7af556e200ae4d7ea64b78706e7cefd04166fa43 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 5 Aug 2017 13:14:26 -0500 Subject: [PATCH 02/16] add menu settings --- intl/msg_hash_lbl.h | 8 ++++++++ intl/msg_hash_us.h | 8 ++++++++ menu/menu_displaylist.c | 12 ++++++++++++ menu/menu_setting.c | 26 +++++++++++++++++++++++++- msg_hash.h | 4 ++++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 4444ac9ec3..218d75b180 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -909,6 +909,14 @@ MSG_HASH(MENU_ENUM_LABEL_SORT_SAVEFILES_ENABLE, "sort_savefiles_enable") MSG_HASH(MENU_ENUM_LABEL_SORT_SAVESTATES_ENABLE, "sort_savestates_enable") +MSG_HASH(MENU_ENUM_LABEL_SAVEFILES_IN_CONTENT_DIR_ENABLE, + "savefiles_in_content_dir_enable") +MSG_HASH(MENU_ENUM_LABEL_SAVESTATES_IN_CONTENT_DIR_ENABLE, + "savestates_in_content_dir_enable") +MSG_HASH(MENU_ENUM_LABEL_SYSTEMFILES_IN_CONTENT_DIR_ENABLE, + "systemfiles_in_content_dir_enable") +MSG_HASH(MENU_ENUM_LABEL_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, + "screenshots_in_content_dir_enable") MSG_HASH(MENU_ENUM_LABEL_SSH_ENABLE, "ssh_enable") MSG_HASH(MENU_ENUM_LABEL_START_CORE, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index c14eb00878..9d56b867a9 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1323,6 +1323,14 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, "Sort Saves In Folders") MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, "Sort Savestates In Folders") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATES_IN_CONTENT_DIR_ENABLE, + "Write Savestates to Content Dir") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVEFILES_IN_CONTENT_DIR_ENABLE, + "Write Saves to Content Dir") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEMFILES_IN_CONTENT_DIR_ENABLE, + "System Files are in Content Dir") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, + "Write Screenshots to Content Dir") MSG_HASH(MENU_ENUM_LABEL_VALUE_SSH_ENABLE, "SSH Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_CORE, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index c5c3121493..c8bdada29f 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -4880,6 +4880,18 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SAVESTATE_THUMBNAIL_ENABLE, PARSE_ONLY_BOOL, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_SAVEFILES_IN_CONTENT_DIR_ENABLE, + PARSE_ONLY_BOOL, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_SAVESTATES_IN_CONTENT_DIR_ENABLE, + PARSE_ONLY_BOOL, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_SYSTEMFILES_IN_CONTENT_DIR_ENABLE, + PARSE_ONLY_BOOL, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, + PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 692c6b3543..3302aed629 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -3048,7 +3048,7 @@ static bool setting_append_list( case SETTINGS_LIST_SAVING: { unsigned i; - struct bool_entry bool_entries[7]; + struct bool_entry bool_entries[11]; START_GROUP(list, list_info, &group_info, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS), parent_group); parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SAVING_SETTINGS); @@ -3098,6 +3098,30 @@ static bool setting_append_list( bool_entries[6].default_value = savestate_thumbnail_enable; bool_entries[6].flags = SD_FLAG_ADVANCED; + bool_entries[7].target = &settings->bools.savefiles_in_content_dir; + bool_entries[7].name_enum_idx = MENU_ENUM_LABEL_SAVEFILES_IN_CONTENT_DIR_ENABLE; + bool_entries[7].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SAVEFILES_IN_CONTENT_DIR_ENABLE; + bool_entries[7].default_value = default_savefiles_in_content_dir; + bool_entries[7].flags = SD_FLAG_ADVANCED; + + bool_entries[8].target = &settings->bools.savestates_in_content_dir; + bool_entries[8].name_enum_idx = MENU_ENUM_LABEL_SAVESTATES_IN_CONTENT_DIR_ENABLE; + bool_entries[8].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SAVESTATES_IN_CONTENT_DIR_ENABLE; + bool_entries[8].default_value = default_savestates_in_content_dir; + bool_entries[8].flags = SD_FLAG_ADVANCED; + + bool_entries[9].target = &settings->bools.systemfiles_in_content_dir; + bool_entries[9].name_enum_idx = MENU_ENUM_LABEL_SYSTEMFILES_IN_CONTENT_DIR_ENABLE; + bool_entries[9].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SYSTEMFILES_IN_CONTENT_DIR_ENABLE; + bool_entries[9].default_value = default_systemfiles_in_content_dir; + bool_entries[9].flags = SD_FLAG_ADVANCED; + + bool_entries[10].target = &settings->bools.screenshots_in_content_dir; + bool_entries[10].name_enum_idx = MENU_ENUM_LABEL_SCREENSHOTS_IN_CONTENT_DIR_ENABLE; + bool_entries[10].SHORT_enum_idx = MENU_ENUM_LABEL_VALUE_SCREENSHOTS_IN_CONTENT_DIR_ENABLE; + bool_entries[10].default_value = default_screenshots_in_content_dir; + bool_entries[10].flags = SD_FLAG_ADVANCED; + for (i = 0; i < ARRAY_SIZE(bool_entries); i++) { CONFIG_BOOL( diff --git a/msg_hash.h b/msg_hash.h index 39660d6006..3d5d7343a8 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1067,6 +1067,10 @@ enum msg_hash_enums MENU_LABEL(NETPLAY_NAT_TRAVERSAL), MENU_LABEL(SORT_SAVEFILES_ENABLE), MENU_LABEL(SORT_SAVESTATES_ENABLE), + MENU_LABEL(SAVEFILES_IN_CONTENT_DIR_ENABLE), + MENU_LABEL(SAVESTATES_IN_CONTENT_DIR_ENABLE), + MENU_LABEL(SYSTEMFILES_IN_CONTENT_DIR_ENABLE), + MENU_LABEL(SCREENSHOTS_IN_CONTENT_DIR_ENABLE), MENU_LABEL(NETPLAY_IP_ADDRESS), MENU_LABEL(NETPLAY_PASSWORD), MENU_LABEL(NETPLAY_SPECTATE_PASSWORD), From 9858b94e87fcd5c1c0361d5ca67fb22ec330f5ac Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 5 Aug 2017 13:41:05 -0500 Subject: [PATCH 03/16] allow savestates and savefiles to go into content dir via bool setting in addition of the empty string --- paths.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/paths.c b/paths.c index b8ba14c0b5..19aabd16c3 100644 --- a/paths.c +++ b/paths.c @@ -67,6 +67,7 @@ void path_set_redirect(void) const char *old_savefile_dir = dir_get(RARCH_DIR_SAVEFILE); const char *old_savestate_dir = dir_get(RARCH_DIR_SAVESTATE); rarch_system_info_t *info = runloop_get_system_info(); + settings_t *settings = config_get_ptr(); new_savefile_dir[0] = new_savestate_dir[0] = '\0'; @@ -93,10 +94,8 @@ void path_set_redirect(void) if (check_library_name_hash) { - settings_t *settings = config_get_ptr(); - /* per-core saves: append the library_name to the save location */ - if ( settings->bools.sort_savefiles_enable + if (settings->bools.sort_savefiles_enable && !string_is_empty(old_savefile_dir)) { fill_pathname_join( @@ -154,13 +153,21 @@ void path_set_redirect(void) } /* Set savefile directory if empty based on content directory */ - if (string_is_empty(new_savefile_dir)) + if (string_is_empty(new_savefile_dir) || settings->bools.savefiles_in_content_dir) { strlcpy(new_savefile_dir, path_main_basename, sizeof(new_savefile_dir)); path_basedir(new_savefile_dir); } + /* Set savestate directory if empty based on content directory */ + if (string_is_empty(new_savestate_dir) || settings->bools.savestates_in_content_dir) + { + strlcpy(new_savestate_dir, path_main_basename, + sizeof(new_savestate_dir)); + path_basedir(new_savestate_dir); + } + if (global) { if(path_is_directory(new_savefile_dir)) From a4192bf99b3b591825cff2cf9064b7966c1cfcb6 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 5 Aug 2017 13:48:37 -0500 Subject: [PATCH 04/16] allow systemfiles into content dir via bool setting in addition of the empty string --- dynamic.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dynamic.c b/dynamic.c index 6e07579230..17d67ad17f 100644 --- a/dynamic.c +++ b/dynamic.c @@ -1016,7 +1016,7 @@ bool rarch_environment_cb(unsigned cmd, void *data) break; case RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY: - if (string_is_empty(settings->paths.directory_system)) + if (string_is_empty(settings->paths.directory_system) || settings->bools.systemfiles_in_content_dir) { const char *fullpath = path_get(RARCH_PATH_CONTENT); if (!string_is_empty(fullpath)) @@ -1025,8 +1025,9 @@ bool rarch_environment_cb(unsigned cmd, void *data) temp_path[0] = '\0'; - RARCH_WARN("SYSTEM DIR is empty, assume CONTENT DIR %s\n", - fullpath); + if (string_is_empty(settings->paths.directory_system)) + RARCH_WARN("SYSTEM DIR is empty, assume CONTENT DIR %s\n", + fullpath); fill_pathname_basedir(temp_path, fullpath, sizeof(temp_path)); dir_set(RARCH_DIR_SYSTEM, temp_path); } From cf8783644df346e5f7762078fb1d9f0db2adc7e4 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 5 Aug 2017 13:57:24 -0500 Subject: [PATCH 05/16] allow screenshots into content dir via bool setting in addition of the empty string --- tasks/task_screenshot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index 990839e7f6..ac960cd049 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -211,7 +211,7 @@ static bool screenshot_dump( screenshot_path[0] = '\0'; - if (string_is_empty(screenshot_dir)) + if (string_is_empty(screenshot_dir) || settings->bools.screenshots_in_content_dir) { fill_pathname_basedir(screenshot_path, name_base, sizeof(screenshot_path)); From 2cd552b7601789ca9779fb453d2b31c161b2827c Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 5 Aug 2017 14:38:50 -0500 Subject: [PATCH 06/16] make all the directories reseteable --- menu/menu_setting.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 3302aed629..868909ca17 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -6557,13 +6557,14 @@ static bool setting_append_list( sizeof(settings->paths.directory_system), MENU_ENUM_LABEL_SYSTEM_DIRECTORY, MENU_ENUM_LABEL_VALUE_SYSTEM_DIRECTORY, - "", + g_defaults.dirs[DEFAULT_DIR_SYSTEM], MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT, &group_info, &subgroup_info, parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].action_start = directory_action_start_generic; CONFIG_DIR( list, list_info, @@ -6601,13 +6602,14 @@ static bool setting_append_list( sizeof(settings->paths.directory_dynamic_wallpapers), MENU_ENUM_LABEL_DYNAMIC_WALLPAPERS_DIRECTORY, MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY, - "", + g_defaults.dirs[DEFAULT_DIR_WALLPAPERS], MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT, &group_info, &subgroup_info, parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].action_start = directory_action_start_generic; CONFIG_DIR( list, list_info, @@ -6668,6 +6670,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); menu_settings_list_current_add_cmd(list, list_info, CMD_EVENT_CORE_INFO_INIT); + (*list)[list_info->index - 1].action_start = directory_action_start_generic; CONFIG_DIR( list, list_info, @@ -6683,6 +6686,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); menu_settings_list_current_add_cmd(list, list_info, CMD_EVENT_CORE_INFO_INIT); + (*list)[list_info->index - 1].action_start = directory_action_start_generic; #ifdef HAVE_LIBRETRODB CONFIG_DIR( @@ -6774,6 +6778,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].action_start = directory_action_start_generic; if (string_is_not_equal_fast(settings->arrays.record_driver, "null", 4)) { @@ -6821,6 +6826,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].action_start = directory_action_start_generic; #endif CONFIG_DIR( @@ -6859,13 +6865,14 @@ static bool setting_append_list( sizeof(settings->paths.directory_input_remapping), MENU_ENUM_LABEL_INPUT_REMAPPING_DIRECTORY, MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY, - "", + g_defaults.dirs[DEFAULT_DIR_REMAP], MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE, &group_info, &subgroup_info, parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].action_start = directory_action_start_generic; CONFIG_DIR( list, list_info, @@ -6888,13 +6895,14 @@ static bool setting_append_list( dir_get_size(RARCH_DIR_SAVEFILE), MENU_ENUM_LABEL_SAVEFILE_DIRECTORY, MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY, - "", + g_defaults.dirs[DEFAULT_DIR_SRAM], MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT, &group_info, &subgroup_info, parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].action_start = directory_action_start_generic; CONFIG_DIR( list, list_info, @@ -6902,13 +6910,14 @@ static bool setting_append_list( dir_get_size(RARCH_DIR_SAVESTATE), MENU_ENUM_LABEL_SAVESTATE_DIRECTORY, MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY, - "", + g_defaults.dirs[DEFAULT_DIR_SAVESTATE], MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT, &group_info, &subgroup_info, parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].action_start = directory_action_start_generic; CONFIG_DIR( list, list_info, From a17e23dc6c723971bf450df12c4d211f93fd854d Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 5 Aug 2017 14:39:17 -0500 Subject: [PATCH 07/16] update win32 platform driver --- frontend/drivers/platform_win32.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index 5133f0c27e..854f651771 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -278,9 +278,9 @@ static void frontend_win32_environment_get(int *argc, char *argv[], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], ":\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG], - ":\\records_config", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG])); + ":\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG])); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT], - ":\\records", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT])); + ":\\recordings", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT])); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], ":\\config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG])); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_REMAP], @@ -303,6 +303,12 @@ static void frontend_win32_environment_get(int *argc, char *argv[], ":\\downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], ":\\screenshots", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SRAM], + ":\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], + ":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], + ":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); #ifdef HAVE_MENU #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) From 8bb3852944549fdafbdb9521046634487d60bbe3 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 5 Aug 2017 14:52:16 -0500 Subject: [PATCH 08/16] update android platform driver --- frontend/drivers/platform_unix.c | 75 ++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 22 deletions(-) diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c index b53cf33e35..a5fc5f2c5b 100644 --- a/frontend/drivers/platform_unix.c +++ b/frontend/drivers/platform_unix.c @@ -1557,18 +1557,6 @@ static void frontend_unix_get_env(int *argc, fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS], app_dir, "assets/wallpapers", sizeof(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS])); - if(!string_is_empty(downloads_dir) && test_permissions(downloads_dir)) - { - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], - downloads_dir, "", - sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); - } - else - { - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], - app_dir, "downloads", - sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); - } __android_log_print(ANDROID_LOG_INFO, "RetroArch", "[ENV]: default download folder: [%s]", @@ -1576,8 +1564,7 @@ static void frontend_unix_get_env(int *argc, switch (perms) { - /* Set defaults for this since we can't guarantee - * saving on content dir will work in this case */ + /* only sdcard/Android/data/com.retroarch is writable */ case INTERNAL_STORAGE_APPDIR_WRITABLE: fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SRAM], internal_storage_app_path, "saves", @@ -1605,11 +1592,11 @@ static void frontend_unix_get_env(int *argc, internal_storage_app_path, "cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); - if( !string_is_empty(screenshot_dir) - && test_permissions(screenshot_dir)) + if(!string_is_empty(screenshot_dir) + && test_permissions(screenshot_dir)) { fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], - screenshot_dir, "", + screenshot_dir, "RetroArch", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); } else @@ -1619,10 +1606,24 @@ static void frontend_unix_get_env(int *argc, sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); } + if(!string_is_empty(downloads_dir) + && test_permissions(downloads_dir)) + { + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], + downloads_dir, "RetroArch", + sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); + } + else + { + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], + internal_storage_app_path, "downloads", + sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); + } + break; + + /* only the internal app dir is writable, this should never happen*/ case INTERNAL_STORAGE_NOT_WRITABLE: - /* Set defaults for this since we can't guarantee - * saving on content dir will work in this case. */ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SRAM], app_dir, "saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); @@ -1653,7 +1654,7 @@ static void frontend_unix_get_env(int *argc, && test_permissions(screenshot_dir)) { fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], - screenshot_dir, "", + screenshot_dir, "RetroArch", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); } else @@ -1663,10 +1664,40 @@ static void frontend_unix_get_env(int *argc, sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); } + if(!string_is_empty(downloads_dir) + && test_permissions(downloads_dir)) + { + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], + downloads_dir, "RetroArch", + sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); + } + else + { + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], + app_dir, "downloads", + sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); + } + break; + /* sdcard is writable, this should be the case most of the time*/ case INTERNAL_STORAGE_WRITABLE: - /* Don't set defaults for saves, states, system or screenshots - in this case to be able to honour saving on content dir */ + + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SRAM], + internal_storage_path, "saves", + sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], + internal_storage_path, "states", + sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], + internal_storage_path, "system", + sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], + internal_storage_path, "screenshots", + sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], + internal_storage_path, "downloads", + sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], internal_storage_path, "RetroArch/config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG])); From 27d9b04080543a3249958d0d62b8a460b7496914 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 5 Aug 2017 15:01:43 -0500 Subject: [PATCH 09/16] update CHANGES.md --- CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index afb55b0acb..e8562f4c35 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,11 +1,14 @@ # 1.6.4 (future) - ANDROID: Fire Stick & Fire TV remote overrides gamepad port 0 on button press and viceversa like SHIELD devices +- ANDROID: Provide default save / system / state / screenshot locations - AUDIO: Audio mixer supports MOD/S3M/XM file types now! - INPUT: input swap override flag (for remotes) is cleared correctly - COMMON: Add 'Delete Core'option to Core Information menu. - COMMON: Allow Max Timing Skew to be set to 0. +- COMMON: Change the "content dir" behavior so it works on either a flag or an empty directory setting, now platform drivers can provide defaults for save / system / state / screenshot dirs and still allow the content dir functionality, these settings are under settings / saving and flagged as advanced - LOCALIZATION: Update Russian translation +- WINDOWS: Provide default save / system / state / screenshot locations - WINDOWS 98/ME/2K: Set default directory for MSVC 2005 RetroArch version. - WIIU: Exception handler rewritten. From a8d3b205ca4dd069e3bae6e6e642d711d596539d Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sat, 5 Aug 2017 20:06:11 +0000 Subject: [PATCH 10/16] update CHANGES.md --- CHANGES.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index afb55b0acb..bb69c5fb77 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,14 +3,16 @@ - ANDROID: Fire Stick & Fire TV remote overrides gamepad port 0 on button press and viceversa like SHIELD devices - AUDIO: Audio mixer supports MOD/S3M/XM file types now! - INPUT: input swap override flag (for remotes) is cleared correctly -- COMMON: Add 'Delete Core'option to Core Information menu. +- COMMON: Add 'Delete Core' option to Core Information menu. - COMMON: Allow Max Timing Skew to be set to 0. - LOCALIZATION: Update Russian translation +- LOBBIES: Show what country the host is in +- MENU: Enable OSD text rendering for gdi and libcaca drivers - WINDOWS 98/ME/2K: Set default directory for MSVC 2005 RetroArch version. - WIIU: Exception handler rewritten. # 1.6.3 -- IOS: Fix GL regression - 32bit color format cores were no longer rendering +- IOS: Fix GL regression - 32bit color format cores were no longer rendering - CHEEVOS: Add support for N64 cheevos and other small fixes. - CHEEVOS: Add 'Achievements -> Achievements Verbose Mode'. Ability to display cheevos related messages in OSD, useful for RetroAchievements users. - AUDIO: Audio mixer's volume can now be independently increased/decreased, and muted. From 944eb01fb41da2d2f634230623f0c1e2bd80924d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 6 Aug 2017 01:29:41 +0200 Subject: [PATCH 11/16] Updates --- libretro-common/rthreads/rthreads.c | 31 ++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/libretro-common/rthreads/rthreads.c b/libretro-common/rthreads/rthreads.c index c4ffce1d5c..1abcf1a3ed 100644 --- a/libretro-common/rthreads/rthreads.c +++ b/libretro-common/rthreads/rthreads.c @@ -437,11 +437,17 @@ void scond_free(scond_t *cond) #ifdef USE_WIN32_THREADS static bool _scond_wait_win32(scond_t *cond, slock_t *lock, DWORD dwMilliseconds) { - static bool beginPeriod = false; - struct QueueEntry myentry; struct QueueEntry **ptr; + +#if _WIN32_WINNT >= 0x0500 + static LARGE_INTEGER performanceCounterFrequency = { .QuadPart = 0 }; + LARGE_INTEGER tsBegin; +#else + static bool beginPeriod = false; DWORD tsBegin; +#endif + DWORD waitResult; DWORD dwFinalTimeout = dwMilliseconds; /* Careful! in case we begin in the head, we don't do the hot potato stuff, @@ -453,16 +459,27 @@ static bool _scond_wait_win32(scond_t *cond, slock_t *lock, DWORD dwMilliseconds /* since this library is meant for realtime game software * I have no problem setting this to 1 and forgetting about it. */ +#if _WIN32_WINNT >= 0x0500 + if (performanceCounterFrequency.QuadPart == 0) + { + QueryPerformanceFrequency(&performanceCounterFrequency); + } +#else if (!beginPeriod) { beginPeriod = true; timeBeginPeriod(1); } +#endif /* Now we can take a good timestamp for use in faking the timeout ourselves. */ /* But don't bother unless we need to (to save a little time) */ if (dwMilliseconds != INFINITE) +#if _WIN32_WINNT >= 0x0500 + QueryPerformanceCounter(&tsBegin); +#else tsBegin = timeGetTime(); +#endif /* add ourselves to a queue of waiting threads */ ptr = &cond->head; @@ -504,8 +521,16 @@ static bool _scond_wait_win32(scond_t *cond, slock_t *lock, DWORD dwMilliseconds /* Assess the remaining timeout time */ if (dwMilliseconds != INFINITE) { - DWORD now = timeGetTime(); +#if _WIN32_WINNT >= 0x0500 + LARGE_INTEGER now; + QueryPerformanceCounter(&now); + LONGLONG elapsed = now.QuadPart - tsBegin.QuadPart; + elapsed *= 1000; + elapsed /= performanceCounterFrequency.QuadPart; +#else + DWORD now = timeGetTime(); DWORD elapsed = now - tsBegin; +#endif /* Try one last time with a zero timeout (keeps the code simpler) */ if (elapsed > dwMilliseconds) From e259a8c63bda0de1e89d3fff99bf0f4f15fcdbd0 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 6 Aug 2017 01:44:34 +0200 Subject: [PATCH 12/16] Try to avoid direct initialization --- libretro-common/rthreads/rthreads.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libretro-common/rthreads/rthreads.c b/libretro-common/rthreads/rthreads.c index 1abcf1a3ed..a059bc2f04 100644 --- a/libretro-common/rthreads/rthreads.c +++ b/libretro-common/rthreads/rthreads.c @@ -441,8 +441,9 @@ static bool _scond_wait_win32(scond_t *cond, slock_t *lock, DWORD dwMilliseconds struct QueueEntry **ptr; #if _WIN32_WINNT >= 0x0500 - static LARGE_INTEGER performanceCounterFrequency = { .QuadPart = 0 }; + static LARGE_INTEGER performanceCounterFrequency; LARGE_INTEGER tsBegin; + static bool first_init = true; #else static bool beginPeriod = false; DWORD tsBegin; @@ -460,6 +461,12 @@ static bool _scond_wait_win32(scond_t *cond, slock_t *lock, DWORD dwMilliseconds /* since this library is meant for realtime game software * I have no problem setting this to 1 and forgetting about it. */ #if _WIN32_WINNT >= 0x0500 + if (first_init) + { + performanceCounterFrequency.QuadPart = 0; + first_init = false; + } + if (performanceCounterFrequency.QuadPart == 0) { QueryPerformanceFrequency(&performanceCounterFrequency); From 86f7972aa8af0d2f20b2775e49f0e89a8c918e51 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 6 Aug 2017 04:40:55 +0200 Subject: [PATCH 13/16] (Wii) Backport https://github.com/SuperrSonic/RA-SS/commit/0574b91595a231e15bafa9f2778d1b9b14944ba6 - untested --- gfx/drivers/gx_gfx.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/gfx/drivers/gx_gfx.c b/gfx/drivers/gx_gfx.c index f7f6cfeef8..1b1e050642 100644 --- a/gfx/drivers/gx_gfx.c +++ b/gfx/drivers/gx_gfx.c @@ -92,6 +92,9 @@ static volatile bool g_draw_done = false; static bool g_vsync = false; static uint32_t g_orientation = 0; +static uint32_t retraceCount; +static uint32_t referenceRetraceCount; + static uint8_t gx_fifo[256 * 1024] ATTRIBUTE_ALIGN(32); static uint8_t display_list[1024] ATTRIBUTE_ALIGN(32); static size_t display_list_size; @@ -213,9 +216,15 @@ unsigned menu_gx_resolutions[][2] = { static void retrace_callback(u32 retrace_count) { + u32 level = 0; + (void)retrace_count; + g_draw_done = true; OSSignalCond(g_video_cond); + _CPU_ISR_Disable(level); + retraceCount = retrace_count; + _CPU_ISR_Restore(level); } static bool gx_isValidXOrigin(int origin) @@ -249,7 +258,7 @@ static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines, VIDEO_SetPostRetraceCallback(NULL); g_draw_done = false; /* wait for next even field */ - /* this prevents screen artefacts when switching + /* this prevents screen artifacts when switching * between interlaced & non-interlaced modes */ do VIDEO_WaitVSync(); while (!VIDEO_GetNextField()); @@ -293,13 +302,13 @@ static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines, max_height = VI_MAX_HEIGHT_MPAL; break; case VI_EURGB60: - max_width = VI_MAX_WIDTH_NTSC; - max_height = VI_MAX_HEIGHT_NTSC; + max_width = VI_MAX_WIDTH_EURGB60; + max_height = VI_MAX_HEIGHT_EURGB60; break; default: tvmode = VI_NTSC; - max_width = VI_MAX_WIDTH_EURGB60; - max_height = VI_MAX_HEIGHT_EURGB60; + max_width = VI_MAX_WIDTH_NTSC; + max_height = VI_MAX_HEIGHT_NTSC; break; } @@ -575,6 +584,10 @@ static void init_vtx(void *data, const video_info_t *video) { Mtx44 m; gx_video_t *gx = (gx_video_t*)data; + u32 level = 0; + _CPU_ISR_Disable(level); + referenceRetraceCount = retraceCount; + _CPU_ISR_Restore(level); GX_SetCullMode(GX_CULL_NONE); GX_SetClipMode(GX_CLIP_DISABLE); @@ -1440,6 +1453,7 @@ static bool gx_frame(void *data, const void *frame, char fps_text_buf[128]; gx_video_t *gx = (gx_video_t*)data; u8 clear_efb = GX_FALSE; + u32 level = 0; fps_text_buf[0] = '\0'; @@ -1524,6 +1538,12 @@ static bool gx_frame(void *data, const void *frame, gx_render_overlay(gx); #endif + _CPU_ISR_Disable(level); + if (referenceRetraceCount > retraceCount) + VIDEO_WaitVSync(); + referenceRetraceCount = retraceCount; + _CPU_ISR_Restore(level); + GX_DrawDone(); if (video_info->fps_show) @@ -1564,6 +1584,10 @@ static bool gx_frame(void *data, const void *frame, VIDEO_SetNextFramebuffer(gx->framebuf[g_current_framebuf]); VIDEO_Flush(); + CPU_ISR_Disable(level); + ++referenceRetraceCount; + _CPU_ISR_Restore(level); + return true; } From 4387dd7c15a7d5908a8d95f51fbc780596da9163 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 5 Aug 2017 21:56:52 -0500 Subject: [PATCH 14/16] fix new android paths --- frontend/drivers/platform_unix.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c index a5fc5f2c5b..eddd9a99eb 100644 --- a/frontend/drivers/platform_unix.c +++ b/frontend/drivers/platform_unix.c @@ -1683,19 +1683,19 @@ static void frontend_unix_get_env(int *argc, case INTERNAL_STORAGE_WRITABLE: fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SRAM], - internal_storage_path, "saves", + internal_storage_path, "RetroArch/saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], - internal_storage_path, "states", + internal_storage_path, "RetroArch/states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], - internal_storage_path, "system", + internal_storage_path, "RetroArch/system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], - internal_storage_path, "screenshots", + internal_storage_path, "RetroArch/screenshots", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], - internal_storage_path, "downloads", + internal_storage_path, "RetroArch/downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], From 740ad823ab8c1d110be891ac3fd9bea1c98302cf Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 6 Aug 2017 05:52:40 +0200 Subject: [PATCH 15/16] (GX) Buildfix --- gfx/drivers/gx_gfx.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/gfx/drivers/gx_gfx.c b/gfx/drivers/gx_gfx.c index 1b1e050642..7b43d19a6b 100644 --- a/gfx/drivers/gx_gfx.c +++ b/gfx/drivers/gx_gfx.c @@ -42,6 +42,21 @@ #include "../../configuration.h" #include "../../driver.h" +#ifndef _CPU_ISR_Disable +#define _CPU_ISR_Disable( _isr_cookie ) \ + { register u32 _disable_mask = 0; \ + _isr_cookie = 0; \ + __asm__ __volatile__ ( \ + "mfmsr %0\n" \ + "rlwinm %1,%0,0,17,15\n" \ + "mtmsr %1\n" \ + "extrwi %0,%0,1,16" \ + : "=&r" ((_isr_cookie)), "=&r" ((_disable_mask)) \ + : "0" ((_isr_cookie)), "1" ((_disable_mask)) \ + ); \ + } +#endif + extern syssram* __SYS_LockSram(void); extern u32 __SYS_UnlockSram(u32 write); From 169aea5ae16ba63a3492b39d8ee5543aa7bd3ed2 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 6 Aug 2017 05:54:46 +0200 Subject: [PATCH 16/16] (GX) Another buildfix --- gfx/drivers/gx_gfx.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gfx/drivers/gx_gfx.c b/gfx/drivers/gx_gfx.c index 7b43d19a6b..f50a41db9b 100644 --- a/gfx/drivers/gx_gfx.c +++ b/gfx/drivers/gx_gfx.c @@ -57,6 +57,22 @@ } #endif +#ifndef _CPU_ISR_Restore +#define _CPU_ISR_Restore( _isr_cookie ) \ + { register u32 _enable_mask = 0; \ + __asm__ __volatile__ ( \ + " cmpwi %0,0\n" \ + " beq 1f\n" \ + " mfmsr %1\n" \ + " ori %1,%1,0x8000\n" \ + " mtmsr %1\n" \ + "1:" \ + : "=r"((_isr_cookie)),"=&r" ((_enable_mask)) \ + : "0"((_isr_cookie)),"1" ((_enable_mask)) \ + ); \ + } +#endif + extern syssram* __SYS_LockSram(void); extern u32 __SYS_UnlockSram(u32 write);