diff --git a/command.c b/command.c index 76f5599925..b8b1cc324a 100644 --- a/command.c +++ b/command.c @@ -1062,6 +1062,9 @@ bool command_event_save_config( return true; } + if (runloop_get_flags() & RUNLOOP_FLAG_OVERRIDES_ACTIVE) + return false; + if (!string_is_empty(str)) { snprintf(s, len, "%s \"%s\".", @@ -1564,18 +1567,20 @@ void command_event_save_current_config(enum override_type type) switch (type) { + default: case OVERRIDE_NONE: { + char msg[256]; + + msg[0] = '\0'; + if (path_is_empty(RARCH_PATH_CONFIG)) { - char msg[128]; strlcpy(msg, "[Config]: Config directory not set, cannot save configuration.", sizeof(msg)); runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); } else { - char msg[256]; - msg[0] = '\0'; command_event_save_config(path_get(RARCH_PATH_CONFIG), msg, sizeof(msg)); runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); } @@ -1585,18 +1590,77 @@ void command_event_save_current_config(enum override_type type) case OVERRIDE_CORE: case OVERRIDE_CONTENT_DIR: { - char msg[128]; - if (config_save_overrides(type, &runloop_st->system)) + int8_t ret = config_save_overrides(type, &runloop_st->system, false); + char msg[256]; + + msg[0] = '\0'; + + switch (ret) { - strlcpy(msg, msg_hash_to_str(MSG_OVERRIDES_SAVED_SUCCESSFULLY), sizeof(msg)); - /* set overrides to active so the original config can be - restored after closing content */ - runloop_st->flags |= RUNLOOP_FLAG_OVERRIDES_ACTIVE; + case 1: + strlcpy(msg, msg_hash_to_str(MSG_OVERRIDES_SAVED_SUCCESSFULLY), sizeof(msg)); + /* set overrides to active so the original config can be + restored after closing content */ + runloop_st->flags |= RUNLOOP_FLAG_OVERRIDES_ACTIVE; + break; + case -1: + strlcpy(msg, msg_hash_to_str(MSG_OVERRIDES_NOT_SAVED), sizeof(msg)); + break; + default: + case 0: + strlcpy(msg, msg_hash_to_str(MSG_OVERRIDES_ERROR_SAVING), sizeof(msg)); + break; } - else - strlcpy(msg, msg_hash_to_str(MSG_OVERRIDES_ERROR_SAVING), sizeof(msg)); + RARCH_LOG("[Overrides]: %s\n", msg); runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + +#ifdef HAVE_MENU + { + bool refresh = false; + + menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); + menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL); + } +#endif + } + break; + } +} + +void command_event_remove_current_config(enum override_type type) +{ + runloop_state_t *runloop_st = runloop_state_get_ptr(); + + switch (type) + { + default: + case OVERRIDE_NONE: + break; + case OVERRIDE_GAME: + case OVERRIDE_CORE: + case OVERRIDE_CONTENT_DIR: + { + char msg[256]; + + msg[0] = '\0'; + + if (config_save_overrides(type, &runloop_st->system, true)) + strlcpy(msg, msg_hash_to_str(MSG_OVERRIDES_REMOVED_SUCCESSFULLY), sizeof(msg)); + else + strlcpy(msg, msg_hash_to_str(MSG_OVERRIDES_ERROR_REMOVING), sizeof(msg)); + + RARCH_LOG("[Overrides]: %s\n", msg); + runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + +#ifdef HAVE_MENU + { + bool refresh = false; + + menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); + menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL); + } +#endif } break; } diff --git a/command.h b/command.h index fcced8bb95..5111fe4af3 100644 --- a/command.h +++ b/command.h @@ -186,11 +186,14 @@ enum event_command CMD_EVENT_MENU_TOGGLE, /* Configuration saving. */ CMD_EVENT_MENU_RESET_TO_DEFAULT_CONFIG, + CMD_EVENT_MENU_SAVE_CONFIG, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, - CMD_EVENT_MENU_SAVE_CONFIG, + CMD_EVENT_MENU_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE, + CMD_EVENT_MENU_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + CMD_EVENT_MENU_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME, /* Applies shader changes. */ CMD_EVENT_SHADERS_APPLY_CHANGES, /* A new shader preset has been loaded */ @@ -559,6 +562,13 @@ bool command_event_save_core_config( * autosave state. **/ void command_event_save_current_config(enum override_type type); + +/** + * command_event_remove_current_config: + * + * Removes current configuration file from disk. + **/ +void command_event_remove_current_config(enum override_type type); #endif /** diff --git a/configuration.c b/configuration.c index 94f23b4f0a..c0284b7217 100644 --- a/configuration.c +++ b/configuration.c @@ -214,7 +214,7 @@ enum camera_driver_enum enum bluetooth_driver_enum { - BLUETOOTH_BLUETOOTHCTL = CAMERA_NULL + 1, + BLUETOOTH_BLUETOOTHCTL = CAMERA_NULL + 1, BLUETOOTH_BLUEZ, BLUETOOTH_NULL }; @@ -3492,14 +3492,14 @@ static bool config_load_file(global_t *global, _len = strlcpy(prefix, "input_player", sizeof(prefix)); snprintf(prefix + _len, sizeof(prefix) - _len, "%u", i + 1); - strlcpy(buf, prefix, sizeof(buf)); - strlcat(buf, "_joypad_index", sizeof(buf)); - CONFIG_GET_INT_BASE(conf, settings, uints.input_joypad_index[i], buf); - strlcpy(buf, prefix, sizeof(buf)); strlcat(buf, "_analog_dpad_mode", sizeof(buf)); CONFIG_GET_INT_BASE(conf, settings, uints.input_analog_dpad_mode[i], buf); + strlcpy(buf, prefix, sizeof(buf)); + strlcat(buf, "_joypad_index", sizeof(buf)); + CONFIG_GET_INT_BASE(conf, settings, uints.input_joypad_index[i], buf); + strlcpy(buf, prefix, sizeof(buf)); strlcat(buf, "_mouse_index", sizeof(buf)); CONFIG_GET_INT_BASE(conf, settings, uints.input_mouse_index[i], buf); @@ -3687,7 +3687,7 @@ static bool config_load_file(global_t *global, *settings->paths.directory_screenshot = '\0'; else if (!path_is_directory(settings->paths.directory_screenshot)) { - RARCH_WARN("[Config]: 'screenshot_directory' is not an existing directory, ignoring ...\n"); + RARCH_WARN("[Config]: 'screenshot_directory' is not an existing directory, ignoring..\n"); *settings->paths.directory_screenshot = '\0'; } } @@ -3812,7 +3812,7 @@ static bool config_load_file(global_t *global, sizeof(runloop_st->name.savefile)); } else - RARCH_WARN("[Config]: 'savefile_directory' is not a directory, ignoring ...\n"); + RARCH_WARN("[Config]: 'savefile_directory' is not a directory, ignoring..\n"); } if (!retroarch_override_setting_is_set(RARCH_OVERRIDE_SETTING_STATE_PATH, NULL) && @@ -3832,7 +3832,7 @@ static bool config_load_file(global_t *global, sizeof(runloop_st->name.savestate)); } else - RARCH_WARN("[Config]: 'savestate_directory' is not a directory, ignoring ...\n"); + RARCH_WARN("[Config]: 'savestate_directory' is not a directory, ignoring..\n"); } config_read_keybinds_conf(conf); @@ -3859,7 +3859,7 @@ static bool config_load_file(global_t *global, !frontend_driver_set_gamemode(settings->bools.gamemode_enable) && settings->bools.gamemode_enable) { - RARCH_WARN("[Config]: GameMode unsupported - disabling...\n"); + RARCH_WARN("[Config]: GameMode unsupported - disabling..\n"); configuration_set_bool(settings, settings->bools.gamemode_enable, false); } @@ -3941,6 +3941,8 @@ bool config_load_override(void *data) content_dir_name[0] = '\0'; config_directory[0] = '\0'; + path_clear(RARCH_PATH_CONFIG_OVERRIDE); + /* Cannot load an override if we have no core */ if (string_is_empty(core_name)) return false; @@ -4007,6 +4009,7 @@ bool config_load_override(void *data) strlcpy(tmp_path, core_path, sizeof(tmp_path)); path_set(RARCH_PATH_CONFIG_APPEND, tmp_path); + path_set(RARCH_PATH_CONFIG_OVERRIDE, tmp_path); should_append = true; show_notification = true; @@ -4037,6 +4040,7 @@ bool config_load_override(void *data) strlcpy(tmp_path, content_path, sizeof(tmp_path)); path_set(RARCH_PATH_CONFIG_APPEND, tmp_path); + path_set(RARCH_PATH_CONFIG_OVERRIDE, tmp_path); should_append = true; show_notification = true; @@ -4065,6 +4069,7 @@ bool config_load_override(void *data) strlcpy(tmp_path, game_path, sizeof(tmp_path)); path_set(RARCH_PATH_CONFIG_APPEND, tmp_path); + path_set(RARCH_PATH_CONFIG_OVERRIDE, tmp_path); should_append = true; show_notification = true; @@ -4100,6 +4105,58 @@ bool config_load_override(void *data) return true; } +bool config_load_override_file(const char *config_path) +{ + char config_directory[PATH_MAX_LENGTH]; + bool should_append = false; + bool show_notification = true; + settings_t *settings = config_st; + + config_directory[0] = '\0'; + + path_clear(RARCH_PATH_CONFIG_OVERRIDE); + + /* Get base config directory */ + fill_pathname_application_special(config_directory, + sizeof(config_directory), + APPLICATION_SPECIAL_DIRECTORY_CONFIG); + + if (path_is_valid(config_path)) + { + path_set(RARCH_PATH_CONFIG_APPEND, config_path); + path_set(RARCH_PATH_CONFIG_OVERRIDE, config_path); + should_append = true; + } + + if (!should_append) + return false; + + /* Re-load the configuration with any overrides + * that might have been found */ + + /* Toggle has_save_path to false so it resets */ + retroarch_override_setting_unset(RARCH_OVERRIDE_SETTING_STATE_PATH, NULL); + retroarch_override_setting_unset(RARCH_OVERRIDE_SETTING_SAVE_PATH, NULL); + + if (!config_load_file(global_get_ptr(), + path_get(RARCH_PATH_CONFIG), settings)) + return false; + + if (settings->bools.notification_show_config_override_load + && show_notification) + runloop_msg_queue_push(msg_hash_to_str(MSG_CONFIG_OVERRIDE_LOADED), + 1, 100, false, + NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + + /* Reset save paths. */ + retroarch_override_setting_set(RARCH_OVERRIDE_SETTING_STATE_PATH, NULL); + retroarch_override_setting_set(RARCH_OVERRIDE_SETTING_SAVE_PATH, NULL); + + path_clear(RARCH_PATH_CONFIG_APPEND); + + return true; +} + /** * config_unload_override: * @@ -4111,6 +4168,7 @@ bool config_load_override(void *data) bool config_unload_override(void) { path_clear(RARCH_PATH_CONFIG_APPEND); + path_clear(RARCH_PATH_CONFIG_OVERRIDE); /* Toggle has_save_path to false so it resets */ retroarch_override_setting_unset(RARCH_OVERRIDE_SETTING_STATE_PATH, NULL); @@ -4535,9 +4593,59 @@ static void input_config_save_keybinds_user(config_file_t *conf, unsigned user) fill_pathname_join_delim(key, prefix, base, '_', sizeof(key)); input_keymaps_translate_rk_to_str(bind->key, btn, sizeof(btn)); + + config_set_string(conf, key, btn); + input_config_save_keybind(conf, prefix, base, bind, true); + } +} + +/** + * input_config_save_keybinds_user_override: + * @conf : pointer to config file object + * @user : user number + * @bind_id : bind number + * @override_bind : override retro_keybind for comparison and saving + * + * Save the current bind (@override_bind) override of a user (@user) to the + * config file (@conf), and skip binds that are not modified. + */ +static void input_config_save_keybinds_user_override(config_file_t *conf, + unsigned user, unsigned bind_id, + const struct retro_keybind *override_bind) +{ + unsigned i = bind_id; + + if (input_config_bind_map_get_valid(i)) + { + char key[64]; + char btn[64]; + const struct input_bind_map *keybind = + (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(i); + bool meta = keybind ? keybind->meta : false; + const char *prefix = input_config_get_prefix(user, meta); + const struct retro_keybind *bind = &input_config_binds[user][i]; + const char *base = NULL; + + if (!prefix || !bind->valid || !keybind) + return; + + base = keybind->base; + btn[0] = '\0'; + + fill_pathname_join_delim(key, prefix, base, '_', sizeof(key)); + + input_keymaps_translate_rk_to_str(override_bind->key, btn, sizeof(btn)); + config_set_string(conf, key, btn); - input_config_save_keybind(conf, prefix, base, bind, true); + if (bind->joykey != override_bind->joykey) + save_keybind_joykey (conf, prefix, base, override_bind, true); + if (bind->joyaxis != override_bind->joyaxis) + save_keybind_axis (conf, prefix, base, override_bind, true); + if (bind->mbutton != override_bind->mbutton) + save_keybind_mbutton(conf, prefix, base, override_bind, true); + + RARCH_DBG("[Overrides]: %s = \"%s\"\n", key, btn); } } @@ -4810,14 +4918,17 @@ bool config_save_file(const char *path) strlcpy(cfg, "input_device_p", sizeof(cfg)); strlcat(cfg, formatted_number, sizeof(cfg)); config_set_int(conf, cfg, settings->uints.input_device[i]); - strlcpy(cfg, "input_player", sizeof(cfg)); - strlcat(cfg, formatted_number, sizeof(cfg)); - strlcat(cfg, "_joypad_index", sizeof(cfg)); - config_set_int(conf, cfg, settings->uints.input_joypad_index[i]); + strlcpy(cfg, "input_player", sizeof(cfg)); strlcat(cfg, formatted_number, sizeof(cfg)); strlcat(cfg, "_analog_dpad_mode", sizeof(cfg)); config_set_int(conf, cfg, settings->uints.input_analog_dpad_mode[i]); + + strlcpy(cfg, "input_player", sizeof(cfg)); + strlcat(cfg, formatted_number, sizeof(cfg)); + strlcat(cfg, "_joypad_index", sizeof(cfg)); + config_set_int(conf, cfg, settings->uints.input_joypad_index[i]); + strlcpy(cfg, "input_player", sizeof(cfg)); strlcat(cfg, formatted_number, sizeof(cfg)); strlcat(cfg, "_mouse_index", sizeof(cfg)); @@ -4905,13 +5016,15 @@ bool config_save_file(const char *path) * * Writes a config file override to disk. * - * Returns: true (1) on success, otherwise returns false (0). + * Returns: true (1) on success, (-1) if nothing to write, otherwise returns false (0). **/ -bool config_save_overrides(enum override_type type, void *data) +int8_t config_save_overrides(enum override_type type, void *data, bool remove) { int tmp_i = 0; unsigned i = 0; - bool ret = false; + int8_t ret = 0; + retro_keybind_set input_override_binds[MAX_USERS] + = {0}; config_file_t *conf = NULL; settings_t *settings = NULL; struct config_bool_setting *bool_settings = NULL; @@ -4930,10 +5043,8 @@ bool config_save_overrides(enum override_type type, void *data) struct config_path_setting *path_overrides = NULL; char config_directory[PATH_MAX_LENGTH]; char override_directory[PATH_MAX_LENGTH]; - char core_path[PATH_MAX_LENGTH]; - char game_path[PATH_MAX_LENGTH]; - char content_path[PATH_MAX_LENGTH]; char content_dir_name[PATH_MAX_LENGTH]; + char override_path[PATH_MAX_LENGTH]; settings_t *overrides = config_st; int bool_settings_size = sizeof(settings->bools) / sizeof(settings->bools.placeholder); int float_settings_size = sizeof(settings->floats) / sizeof(settings->floats.placeholder); @@ -4948,10 +5059,8 @@ bool config_save_overrides(enum override_type type, void *data) const char *game_name = NULL; bool has_content = !string_is_empty(rarch_path_basename); - core_path[0] = '\0'; - game_path[0] = '\0'; - content_path[0] = '\0'; content_dir_name[0] = '\0'; + override_path[0] = '\0'; /* > Cannot save an override if we have no core * > Cannot save a per-game or per-content-directory @@ -4976,6 +5085,9 @@ bool config_save_overrides(enum override_type type, void *data) if (!path_is_directory(override_directory)) path_mkdir(override_directory); + /* Store current binds as override binds */ + memcpy(input_override_binds, input_config_binds, sizeof(input_override_binds)); + /* Load the original config file in memory */ config_load_file(global_get_ptr(), path_get(RARCH_PATH_CONFIG), settings); @@ -4986,61 +5098,83 @@ bool config_save_overrides(enum override_type type, void *data) int_settings = populate_settings_int(settings, &int_settings_size); tmp_i = sizeof(settings->ints) / sizeof(settings->ints.placeholder); - int_overrides = populate_settings_int (overrides, &tmp_i); + int_overrides = populate_settings_int(overrides, &tmp_i); - uint_settings = populate_settings_uint(settings, &uint_settings_size); + uint_settings = populate_settings_uint(settings, &uint_settings_size); tmp_i = sizeof(settings->uints) / sizeof(settings->uints.placeholder); - uint_overrides = populate_settings_uint (overrides, &tmp_i); + uint_overrides = populate_settings_uint(overrides, &tmp_i); - size_settings = populate_settings_size(settings, &size_settings_size); + size_settings = populate_settings_size(settings, &size_settings_size); tmp_i = sizeof(settings->sizes) / sizeof(settings->sizes.placeholder); - size_overrides = populate_settings_size (overrides, &tmp_i); + size_overrides = populate_settings_size(overrides, &tmp_i); float_settings = populate_settings_float(settings, &float_settings_size); tmp_i = sizeof(settings->floats) / sizeof(settings->floats.placeholder); float_overrides = populate_settings_float(overrides, &tmp_i); array_settings = populate_settings_array(settings, &array_settings_size); - tmp_i = sizeof(settings->arrays) / sizeof(settings->arrays.placeholder); - array_overrides = populate_settings_array (overrides, &tmp_i); + tmp_i = sizeof(settings->arrays) / sizeof(settings->arrays.placeholder); + array_overrides = populate_settings_array(overrides, &tmp_i); - path_settings = populate_settings_path(settings, &path_settings_size); - tmp_i = sizeof(settings->paths) / sizeof(settings->paths.placeholder); - path_overrides = populate_settings_path (overrides, &tmp_i); + path_settings = populate_settings_path(settings, &path_settings_size); + tmp_i = sizeof(settings->paths) / sizeof(settings->paths.placeholder); + path_overrides = populate_settings_path(overrides, &tmp_i); - RARCH_LOG("[Overrides]: Looking for changed settings... \n"); + if (conf->modified) + RARCH_LOG("[Overrides]: Looking for changed settings..\n"); if (conf) { for (i = 0; i < (unsigned)bool_settings_size; i++) { if ((*bool_settings[i].ptr) != (*bool_overrides[i].ptr)) + { config_set_string(conf, bool_overrides[i].ident, (*bool_overrides[i].ptr) ? "true" : "false"); + RARCH_DBG("[Overrides]: %s = \"%s\"\n", + bool_overrides[i].ident, + (*bool_overrides[i].ptr) ? "true" : "false"); + } } for (i = 0; i < (unsigned)int_settings_size; i++) { if ((*int_settings[i].ptr) != (*int_overrides[i].ptr)) + { config_set_int(conf, int_overrides[i].ident, (*int_overrides[i].ptr)); + RARCH_DBG("[Overrides]: %s = \"%d\"\n", + int_overrides[i].ident, *int_overrides[i].ptr); + } } for (i = 0; i < (unsigned)uint_settings_size; i++) { if ((*uint_settings[i].ptr) != (*uint_overrides[i].ptr)) + { config_set_int(conf, uint_overrides[i].ident, (*uint_overrides[i].ptr)); + RARCH_DBG("[Overrides]: %s = \"%d\"\n", + uint_overrides[i].ident, *uint_overrides[i].ptr); + } } for (i = 0; i < (unsigned)size_settings_size; i++) { if ((*size_settings[i].ptr) != (*size_overrides[i].ptr)) + { config_set_int(conf, size_overrides[i].ident, (int)(*size_overrides[i].ptr)); + RARCH_DBG("[Overrides]: %s = \"%d\"\n", + size_overrides[i].ident, *size_overrides[i].ptr); + } } for (i = 0; i < (unsigned)float_settings_size; i++) { if ((*float_settings[i].ptr) != (*float_overrides[i].ptr)) + { config_set_float(conf, float_overrides[i].ident, *float_overrides[i].ptr); + RARCH_DBG("[Overrides]: %s = \"%f\"\n", + float_overrides[i].ident, *float_overrides[i].ptr); + } } for (i = 0; i < (unsigned)array_settings_size; i++) @@ -5065,18 +5199,25 @@ bool config_save_overrides(enum override_type type, void *data) #endif config_set_string(conf, array_overrides[i].ident, array_overrides[i].ptr); + RARCH_DBG("[Overrides]: %s = \"%s\"\n", + array_overrides[i].ident, *array_overrides[i].ptr); } } for (i = 0; i < (unsigned)path_settings_size; i++) { if (!string_is_equal(path_settings[i].ptr, path_overrides[i].ptr)) + { config_set_path(conf, path_overrides[i].ident, path_overrides[i].ptr); + RARCH_DBG("[Overrides]: %s = \"%s\"\n", + path_overrides[i].ident, *path_overrides[i].ptr); + } } for (i = 0; i < MAX_USERS; i++) { + uint8_t j; char cfg[64]; char formatted_number[4]; cfg[0] = formatted_number[0] = '\0'; @@ -5089,6 +5230,17 @@ bool config_save_overrides(enum override_type type, void *data) strlcpy(cfg, "input_device_p", sizeof(cfg)); strlcat(cfg, formatted_number, sizeof(cfg)); config_set_int(conf, cfg, overrides->uints.input_device[i]); + RARCH_DBG("[Overrides]: %s = \"%u\"\n", cfg, overrides->uints.input_device[i]); + } + + if (settings->uints.input_analog_dpad_mode[i] + != overrides->uints.input_analog_dpad_mode[i]) + { + strlcpy(cfg, "input_player", sizeof(cfg)); + strlcat(cfg, formatted_number, sizeof(cfg)); + strlcat(cfg, "_analog_dpad_mode", sizeof(cfg)); + config_set_int(conf, cfg, overrides->uints.input_analog_dpad_mode[i]); + RARCH_DBG("[Overrides]: %s = \"%u\"\n", cfg, overrides->uints.input_analog_dpad_mode[i]); } if (settings->uints.input_joypad_index[i] @@ -5096,53 +5248,105 @@ bool config_save_overrides(enum override_type type, void *data) { strlcpy(cfg, "input_player", sizeof(cfg)); strlcat(cfg, formatted_number, sizeof(cfg)); - strlcpy(cfg, "_joypad_index", sizeof(cfg)); + strlcat(cfg, "_joypad_index", sizeof(cfg)); config_set_int(conf, cfg, overrides->uints.input_joypad_index[i]); + RARCH_DBG("[Overrides]: %s = \"%u\"\n", cfg, overrides->uints.input_joypad_index[i]); + } + + if (settings->uints.input_mouse_index[i] + != overrides->uints.input_mouse_index[i]) + { + strlcpy(cfg, "input_player", sizeof(cfg)); + strlcat(cfg, formatted_number, sizeof(cfg)); + strlcat(cfg, "_mouse_index", sizeof(cfg)); + config_set_int(conf, cfg, overrides->uints.input_mouse_index[i]); + RARCH_DBG("[Overrides]: %s = \"%u\"\n", cfg, overrides->uints.input_mouse_index[i]); + } + + for (j = 0; j < RARCH_BIND_LIST_END; j++) + { + const struct retro_keybind *override_bind = &input_override_binds[i][j]; + const struct retro_keybind *config_bind = &input_config_binds[i][j]; + + if ( config_bind->joyaxis != override_bind->joyaxis + || config_bind->joykey != override_bind->joykey + || config_bind->key != override_bind->key + || config_bind->mbutton != override_bind->mbutton + ) + input_config_save_keybinds_user_override(conf, i, j, override_bind); } } - ret = false; + ret = 0; switch (type) { case OVERRIDE_CORE: - fill_pathname_join_special_ext(core_path, + fill_pathname_join_special_ext(override_path, config_directory, core_name, core_name, FILE_PATH_CONFIG_EXTENSION, - sizeof(core_path)); - RARCH_LOG ("[Overrides]: Path \"%s\".\n", core_path); - ret = config_file_write(conf, core_path, true); + sizeof(override_path)); break; case OVERRIDE_GAME: game_name = path_basename_nocompression(rarch_path_basename); - fill_pathname_join_special_ext(game_path, + fill_pathname_join_special_ext(override_path, config_directory, core_name, game_name, FILE_PATH_CONFIG_EXTENSION, - sizeof(game_path)); - RARCH_LOG ("[Overrides]: Path \"%s\".\n", game_path); - ret = config_file_write(conf, game_path, true); + sizeof(override_path)); break; case OVERRIDE_CONTENT_DIR: fill_pathname_parent_dir_name(content_dir_name, rarch_path_basename, sizeof(content_dir_name)); - fill_pathname_join_special_ext(content_path, + fill_pathname_join_special_ext(override_path, config_directory, core_name, content_dir_name, FILE_PATH_CONFIG_EXTENSION, - sizeof(content_path)); - RARCH_LOG ("[Overrides]: Path \"%s\".\n", content_path); - ret = config_file_write(conf, content_path, true); + sizeof(override_path)); break; case OVERRIDE_NONE: default: break; } + if (!conf->modified && !remove) + ret = -1; + + if (!string_is_empty(override_path)) + { + if (!conf->modified && !remove) + if (path_is_valid(override_path)) + remove = true; + + if ( remove + && path_is_valid(override_path)) + { + if (filestream_delete(override_path) == 0) + { + config_load_override(&runloop_state_get_ptr()->system); + ret = -1; + RARCH_LOG("[Overrides]: %s: \"%s\".\n", + "Deleting", + override_path); + } + } + else if (conf->modified) + { + ret = config_file_write(conf, override_path, true); + path_set(RARCH_PATH_CONFIG_OVERRIDE, override_path); + RARCH_LOG("[Overrides]: %s: \"%s\".\n", + "Saving", + override_path); + } + } + config_file_free(conf); } + /* Since config_load_file resets binds, restore overrides back to current binds */ + memcpy(input_config_binds, input_override_binds, sizeof(input_config_binds)); + if (bool_settings) free(bool_settings); if (bool_overrides) diff --git a/configuration.h b/configuration.h index b3144ffe11..392196b461 100644 --- a/configuration.h +++ b/configuration.h @@ -1087,6 +1087,18 @@ const char *config_get_default_record(void); */ bool config_load_override(void *data); +/** + * config_load_override_file: + * + * Tries to load specified configuration file. + * These settings will always have precedence, thus this feature + * can be used to enforce overrides. + * + * Returns: false if there was an error or no action was performed. + * + */ +bool config_load_override_file(const char *path); + /** * config_unload_override: * @@ -1132,9 +1144,9 @@ bool config_save_file(const char *path); * * Writes a config file override to disk. * - * Returns: true (1) on success, otherwise returns false (0). + * Returns: true (1) on success, (-1) if nothing to write, otherwise returns false (0). **/ -bool config_save_overrides(enum override_type type, void *data); +int8_t config_save_overrides(enum override_type type, void *data, bool remove); /* Replaces currently loaded configuration file with * another one. Will load a dummy core to flush state diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 2ac9a8b4ed..880973e8a3 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -3269,6 +3269,14 @@ MSG_HASH( MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG, "save_current_config" ) +MSG_HASH( + MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD, + "override_file_load" + ) +MSG_HASH( + MENU_ENUM_LABEL_OVERRIDE_UNLOAD, + "override_unload" + ) MSG_HASH( MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, "save_current_config_override_core" @@ -3281,6 +3289,18 @@ MSG_HASH( MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, "save_current_config_override_game" ) +MSG_HASH( + MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE, + "remove_current_config_override_core" + ) +MSG_HASH( + MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + "remove_current_config_override_content_dir" + ) +MSG_HASH( + MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME, + "remove_current_config_override_game" + ) MSG_HASH( MENU_ENUM_LABEL_SAVE_NEW_CONFIG, "save_new_config" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 67205975fd..37a27f990d 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -8258,7 +8258,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_OPTION_OVERRIDE_INFO, - "Active Options File:" + "Active Options File" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_OPTION_OVERRIDE_INFO, + "The current option file in use." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_OPTIONS_RESET, @@ -8302,7 +8306,11 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_INFO, - "Active Remap File:" + "Active Remap File" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMAP_FILE_INFO, + "The current remap file in use." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD, @@ -9018,6 +9026,22 @@ MSG_HASH( /* Quick Menu > Overrides */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERRIDE_FILE_INFO, + "Active Override File" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERRIDE_FILE_INFO, + "The current override file in use." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERRIDE_FILE_LOAD, + "Load Override File" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERRIDE_FILE_LOAD, + "Load and replace current configuration." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, "Save Core Overrides" @@ -9026,6 +9050,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, "Save an override configuration file which will apply for all content loaded with this core. Will take precedence over the main configuration." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE, + "Remove Core Overrides" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE, + "Delete the override configuration file which will apply for all content loaded with this core." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, "Save Content Directory Overrides" @@ -9034,6 +9066,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, "Save an override configuration file which will apply for all content loaded from the same directory as the current file. Will take precedence over the main configuration." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + "Remove Content Directory Overrides" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + "Delete the override configuration file which will apply for all content loaded from the same directory as the current file." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, "Save Game Overrides" @@ -9042,6 +9082,22 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, "Save an override configuration file which will apply for the current content only. Will take precedence over the main configuration." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME, + "Remove Game Overrides" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME, + "Delete the override configuration file which will apply for the current content only." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERRIDE_UNLOAD, + "Unload Override" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERRIDE_UNLOAD, + "Reset all options to global config values." + ) /* Quick Menu > Achievements */ @@ -13606,10 +13662,26 @@ MSG_HASH( MSG_OVERRIDES_ERROR_SAVING, "Error saving overrides." ) +MSG_HASH( + MSG_OVERRIDES_ERROR_REMOVING, + "Error removing overrides." + ) MSG_HASH( MSG_OVERRIDES_SAVED_SUCCESSFULLY, "Overrides saved successfully." ) +MSG_HASH( + MSG_OVERRIDES_REMOVED_SUCCESSFULLY, + "Overrides removed successfully." + ) +MSG_HASH( + MSG_OVERRIDES_UNLOADED_SUCCESSFULLY, + "Overrides unloaded successfully." + ) +MSG_HASH( + MSG_OVERRIDES_NOT_SAVED, + "Nothing to save. Overrides not saved." + ) MSG_HASH( MSG_PAUSED, "Paused." diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 8f6cca20ff..895d4ee567 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -96,7 +96,7 @@ GENERIC_DEFERRED_PUSH(deferred_push_remappings_port, DISPLAYLIST_ GENERIC_DEFERRED_PUSH(deferred_push_video_shader_preset_parameters, DISPLAYLIST_SHADER_PARAMETERS_PRESET) GENERIC_DEFERRED_PUSH(deferred_push_video_shader_parameters, DISPLAYLIST_SHADER_PARAMETERS) GENERIC_DEFERRED_PUSH(deferred_push_video_shader_preset_save, DISPLAYLIST_SHADER_PRESET_SAVE) -GENERIC_DEFERRED_PUSH(deferred_push_video_shader_preset_remove, DISPLAYLIST_SHADER_PRESET_REMOVE) +GENERIC_DEFERRED_PUSH(deferred_push_video_shader_preset_remove, DISPLAYLIST_SHADER_PRESET_REMOVE) GENERIC_DEFERRED_PUSH(deferred_push_settings, DISPLAYLIST_SETTINGS_ALL) GENERIC_DEFERRED_PUSH(deferred_push_shader_options, DISPLAYLIST_OPTIONS_SHADERS) GENERIC_DEFERRED_PUSH(deferred_push_quick_menu_override_options, DISPLAYLIST_OPTIONS_OVERRIDES) @@ -145,6 +145,7 @@ GENERIC_DEFERRED_PUSH(deferred_push_audio_dsp_plugin, DISPLAYLIST_ GENERIC_DEFERRED_PUSH(deferred_push_cheat_file_load, DISPLAYLIST_CHEAT_FILES) GENERIC_DEFERRED_PUSH(deferred_push_cheat_file_load_append, DISPLAYLIST_CHEAT_FILES) GENERIC_DEFERRED_PUSH(deferred_push_remap_file_load, DISPLAYLIST_REMAP_FILES) +GENERIC_DEFERRED_PUSH(deferred_push_override_file_load, DISPLAYLIST_CONFIG_FILES) GENERIC_DEFERRED_PUSH(deferred_push_record_configfile, DISPLAYLIST_RECORD_CONFIG_FILES) GENERIC_DEFERRED_PUSH(deferred_push_stream_configfile, DISPLAYLIST_STREAM_CONFIG_FILES) GENERIC_DEFERRED_PUSH(deferred_push_input_overlay, DISPLAYLIST_OVERLAYS) @@ -875,6 +876,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label( {MENU_ENUM_LABEL_CHEAT_FILE_LOAD, deferred_push_cheat_file_load}, {MENU_ENUM_LABEL_CHEAT_FILE_LOAD_APPEND, deferred_push_cheat_file_load_append}, {MENU_ENUM_LABEL_REMAP_FILE_LOAD, deferred_push_remap_file_load}, + {MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD, deferred_push_override_file_load}, {MENU_ENUM_LABEL_RECORD_CONFIG, deferred_push_record_configfile}, {MENU_ENUM_LABEL_STREAM_CONFIG, deferred_push_stream_configfile}, {MENU_ENUM_LABEL_RGUI_MENU_THEME_PRESET, deferred_push_rgui_theme_preset}, @@ -1031,6 +1033,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_ENUM_LABEL_REMAP_FILE_LOAD: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_remap_file_load); break; + case MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD: + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_override_file_load); + break; case MENU_ENUM_LABEL_RECORD_CONFIG: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_record_configfile); break; diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 45b88b0c2e..b889356de0 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -164,6 +164,31 @@ static void menu_action_setting_disp_set_label_remap_file_info( strlcpy(s2, path, len2); } +static void menu_action_setting_disp_set_label_override_file_info( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *path, + char *s2, size_t len2) +{ + runloop_state_t *runloop_st = runloop_state_get_ptr(); + const char *override_path = path_get(RARCH_PATH_CONFIG_OVERRIDE); + const char *override_file = NULL; + + *w = 19; + + if (!string_is_empty(override_path)) + override_file = path_basename_nocompression(override_path); + + if (!string_is_empty(override_file)) + strlcpy(s, override_file, len); + else + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), len); + + strlcpy(s2, path, len2); +} + static void menu_action_setting_disp_set_label_configurations( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -1878,6 +1903,10 @@ static int menu_cbs_init_bind_get_string_representation_compare_label( BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_remap_file_info); break; + case MENU_ENUM_LABEL_OVERRIDE_FILE_INFO: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_override_file_info); + break; case MENU_ENUM_LABEL_VIDEO_SHADER_FILTER_PASS: #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) BIND_ACTION_GET_VALUE(cbs, diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 9f1baa8dc7..6cef48cad0 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -115,6 +115,7 @@ enum ACTION_OK_LOAD_STREAM_CONFIGFILE, ACTION_OK_LOAD_RECORD_CONFIGFILE, ACTION_OK_LOAD_REMAPPING_FILE, + ACTION_OK_LOAD_OVERRIDE_FILE, ACTION_OK_LOAD_CHEAT_FILE, ACTION_OK_SUBSYSTEM_ADD, ACTION_OK_LOAD_CONFIG_FILE, @@ -1166,6 +1167,28 @@ int generic_action_ok_displaylist_push(const char *path, dl_type = DISPLAYLIST_FILE_BROWSER_SELECT_FILE; } break; + case ACTION_OK_DL_OVERRIDE_FILE: + { + struct retro_system_info *system = &runloop_state_get_ptr()->system.info; + const char *core_name = system ? system->library_name : NULL; + + if (!string_is_empty(core_name)) + { + fill_pathname_join_special(tmp, + settings->paths.directory_menu_config, + core_name, sizeof(tmp)); + if (!path_is_directory(tmp)) + tmp[0] = '\0'; + } + + filebrowser_clear_type(); + info.type = type; + info.directory_ptr = idx; + info_path = !string_is_empty(tmp) ? tmp : settings->paths.directory_menu_config; + info_label = label; + dl_type = DISPLAYLIST_FILE_BROWSER_SELECT_FILE; + } + break; case ACTION_OK_DL_STREAM_CONFIGFILE: { info.type = type; @@ -2168,6 +2191,15 @@ static int generic_action_ok(const char *path, conf = NULL; } } +#endif + break; + case ACTION_OK_LOAD_OVERRIDE_FILE: +#ifdef HAVE_CONFIGFILE + flush_char = msg_hash_to_str(flush_id); + config_unload_override(); + + if (!config_load_override_file(action_path)) + return -1; #endif break; case ACTION_OK_LOAD_CHEAT_FILE: @@ -2316,6 +2348,7 @@ DEFAULT_ACTION_OK_SET(action_ok_cheat_file_load_append, ACTION_OK_LOAD_CHEA DEFAULT_ACTION_OK_SET(action_ok_record_configfile_load, ACTION_OK_LOAD_RECORD_CONFIGFILE, MENU_ENUM_LABEL_RECORDING_SETTINGS) DEFAULT_ACTION_OK_SET(action_ok_stream_configfile_load, ACTION_OK_LOAD_STREAM_CONFIGFILE, MENU_ENUM_LABEL_RECORDING_SETTINGS) DEFAULT_ACTION_OK_SET(action_ok_remap_file_load, ACTION_OK_LOAD_REMAPPING_FILE, MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST) +DEFAULT_ACTION_OK_SET(action_ok_override_file_load, ACTION_OK_LOAD_OVERRIDE_FILE, MENU_ENUM_LABEL_DEFERRED_QUICK_MENU_OVERRIDE_OPTIONS) #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) DEFAULT_ACTION_OK_SET(action_ok_shader_preset_load, ACTION_OK_LOAD_PRESET, MENU_ENUM_LABEL_SHADER_OPTIONS) DEFAULT_ACTION_OK_SET(action_ok_shader_pass_load, ACTION_OK_LOAD_SHADER_PASS, MENU_ENUM_LABEL_SHADER_OPTIONS) @@ -3739,6 +3772,18 @@ static int action_ok_remap_file_flush(const char *path, return 0; } +static int action_ok_override_unload(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + if (!config_unload_override()) + return 0; + runloop_msg_queue_push( + msg_hash_to_str(MSG_OVERRIDES_UNLOADED_SUCCESSFULLY), + 1, 100, true, + NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + return 0; +} + int action_ok_path_use_directory(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -5887,6 +5932,7 @@ DEFAULT_ACTION_OK_FUNC(action_ok_subsystem_add_load, ACTION_OK_DL_SUBSYSTEM_LOAD DEFAULT_ACTION_OK_FUNC(action_ok_record_configfile, ACTION_OK_DL_RECORD_CONFIGFILE) DEFAULT_ACTION_OK_FUNC(action_ok_stream_configfile, ACTION_OK_DL_STREAM_CONFIGFILE) DEFAULT_ACTION_OK_FUNC(action_ok_remap_file, ACTION_OK_DL_REMAP_FILE) +DEFAULT_ACTION_OK_FUNC(action_ok_override_file, ACTION_OK_DL_OVERRIDE_FILE) #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) DEFAULT_ACTION_OK_FUNC(action_ok_shader_preset, ACTION_OK_DL_SHADER_PRESET) DEFAULT_ACTION_OK_FUNC(action_ok_shader_preset_prepend, ACTION_OK_DL_SHADER_PRESET_PREPEND) @@ -8257,7 +8303,6 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, #if defined(HAVE_VIDEO_LAYOUT) {MENU_ENUM_LABEL_VIDEO_LAYOUT_PATH, action_ok_video_layout}, #endif - {MENU_ENUM_LABEL_REMAP_FILE_LOAD, action_ok_remap_file}, {MENU_ENUM_LABEL_RECORD_CONFIG, action_ok_record_configfile}, {MENU_ENUM_LABEL_STREAM_CONFIG, action_ok_stream_configfile}, #ifdef HAVE_RGUI @@ -8379,6 +8424,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_CHEAT_APPLY_CHANGES, action_ok_cheat_apply_changes}, {MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS, action_ok_cheat_file_save_as}, #endif + {MENU_ENUM_LABEL_REMAP_FILE_LOAD, action_ok_remap_file}, {MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE, action_ok_remap_file_save_core}, {MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR, action_ok_remap_file_save_content_dir}, {MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME, action_ok_remap_file_save_game}, @@ -8387,6 +8433,8 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME, action_ok_remap_file_remove_game}, {MENU_ENUM_LABEL_REMAP_FILE_RESET, action_ok_remap_file_reset}, {MENU_ENUM_LABEL_REMAP_FILE_FLUSH, action_ok_remap_file_flush}, + {MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD, action_ok_override_file}, + {MENU_ENUM_LABEL_OVERRIDE_UNLOAD, action_ok_override_unload}, {MENU_ENUM_LABEL_PLAYLISTS_TAB, action_ok_content_collection_list}, {MENU_ENUM_LABEL_BROWSE_URL_LIST, action_ok_browse_url_list}, {MENU_ENUM_LABEL_CORE_LIST, action_ok_core_list}, @@ -8493,6 +8541,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_VIDEO_LAYOUT_PATH, action_ok_video_layout}, #endif {MENU_ENUM_LABEL_REMAP_FILE_LOAD, action_ok_remap_file}, + {MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD, action_ok_override_file}, {MENU_ENUM_LABEL_RECORD_CONFIG, action_ok_record_configfile}, {MENU_ENUM_LABEL_STREAM_CONFIG, action_ok_stream_configfile}, {MENU_ENUM_LABEL_RGUI_MENU_THEME_PRESET, action_ok_rgui_menu_theme_preset}, @@ -8785,6 +8834,11 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs, BIND_ACTION_OK(cbs, action_ok_set_manual_content_scan_dat_file); break; case FILE_TYPE_CONFIG: + if (string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD))) + { + BIND_ACTION_OK(cbs, action_ok_override_file_load); + break; + } BIND_ACTION_OK(cbs, action_ok_config_load); break; case FILE_TYPE_PARENT_DIRECTORY: diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index 620d5739dc..dcb08d81da 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -103,6 +103,22 @@ static int action_start_remap_file_info( return 0; } +static int action_start_override_file_info( + const char *path, const char *label, + unsigned type, size_t idx, size_t entry_idx) +{ + rarch_system_info_t *system = &runloop_state_get_ptr()->system; + bool refresh = false; + + config_load_override(system); + + /* Refresh menu */ + menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); + menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL); + + return 0; +} + static int action_start_shader_preset( const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -795,6 +811,9 @@ static int menu_cbs_init_bind_start_compare_label(menu_file_list_cbs_t *cbs) case MENU_ENUM_LABEL_REMAP_FILE_INFO: BIND_ACTION_START(cbs, action_start_remap_file_info); break; + case MENU_ENUM_LABEL_OVERRIDE_FILE_INFO: + BIND_ACTION_START(cbs, action_start_override_file_info); + break; case MENU_ENUM_LABEL_VIDEO_FILTER: BIND_ACTION_START(cbs, action_start_video_filter_file_load); break; diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 1318337a6d..13ff93bd86 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -906,12 +906,21 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_save_current_config_override_core, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_save_current_config_override_content_dir, MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_save_current_config_override_game, MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remove_current_config_override_core, MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remove_current_config_override_content_dir, + MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remove_current_config_override_game, MENU_ENUM_SUBLABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_shader_options, MENU_ENUM_SUBLABEL_SHADER_OPTIONS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_input_remapping_options, MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_manager_list, MENU_ENUM_SUBLABEL_REMAP_FILE_MANAGER_LIST) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_info, MENU_ENUM_SUBLABEL_REMAP_FILE_INFO) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_reset, MENU_ENUM_SUBLABEL_REMAP_FILE_RESET) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_remap_file_flush, MENU_ENUM_SUBLABEL_REMAP_FILE_FLUSH) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_override_file_info, MENU_ENUM_SUBLABEL_OVERRIDE_FILE_INFO) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_override_file_load, MENU_ENUM_SUBLABEL_OVERRIDE_FILE_LOAD) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_override_unload, MENU_ENUM_SUBLABEL_OVERRIDE_UNLOAD) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_option_override_list, MENU_ENUM_SUBLABEL_CORE_OPTION_OVERRIDE_LIST) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_option_override_info, MENU_ENUM_SUBLABEL_CORE_OPTION_OVERRIDE_INFO) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_options_reset, MENU_ENUM_SUBLABEL_CORE_OPTIONS_RESET) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_options_flush, MENU_ENUM_SUBLABEL_CORE_OPTIONS_FLUSH) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_show_advanced_settings, MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS) @@ -3132,6 +3141,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_option_override_list); break; + case MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_INFO: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_option_override_info); + break; case MENU_ENUM_LABEL_CORE_OPTIONS_RESET: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_options_reset); break; @@ -3144,12 +3156,24 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_REMAP_FILE_MANAGER_LIST: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_manager_list); break; + case MENU_ENUM_LABEL_REMAP_FILE_INFO: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_info); + break; case MENU_ENUM_LABEL_REMAP_FILE_RESET: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_reset); break; case MENU_ENUM_LABEL_REMAP_FILE_FLUSH: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_flush); break; + case MENU_ENUM_LABEL_OVERRIDE_FILE_INFO: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_override_file_info); + break; + case MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_override_file_load); + break; + case MENU_ENUM_LABEL_OVERRIDE_UNLOAD: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_override_unload); + break; case MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS: #ifdef HAVE_CHEATS BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_cheat_options); @@ -3179,6 +3203,15 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_save_current_config_override_content_dir); break; + case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remove_current_config_override_game); + break; + case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remove_current_config_override_core); + break; + case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remove_current_config_override_content_dir); + break; case MENU_ENUM_LABEL_RESTART_CONTENT: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_restart_content); break; diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index a47b57d7f8..873767c30c 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -713,6 +713,7 @@ DEFAULT_TITLE_MACRO(action_get_title_dropdown_disk_index, MENU_ENUM_LABEL_VALUE_ DEFAULT_FILL_TITLE_MACRO(action_get_title_disk_image_append, MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND) DEFAULT_FILL_TITLE_MACRO(action_get_title_remap_file_load, MENU_ENUM_LABEL_VALUE_REMAP_FILE) +DEFAULT_FILL_TITLE_MACRO(action_get_title_override_file_load, MENU_ENUM_LABEL_VALUE_OVERRIDE_FILE_LOAD) DEFAULT_FILL_TITLE_MACRO(action_get_title_video_filter, MENU_ENUM_LABEL_VALUE_VIDEO_FILTER) DEFAULT_FILL_TITLE_MACRO(action_get_title_cheat_directory, MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH) DEFAULT_FILL_TITLE_MACRO(action_get_title_core_directory, MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH) @@ -1273,6 +1274,8 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, action_get_title_cheat_file_load_append}, {MENU_ENUM_LABEL_REMAP_FILE_LOAD, action_get_title_remap_file_load}, + {MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD, + action_get_title_override_file_load}, {MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_CHEEVOS_LIST, action_get_user_accounts_cheevos_list}, {MENU_ENUM_LABEL_DEFERRED_CORE_CONTENT_LIST, @@ -1683,6 +1686,9 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_REMAP_FILE_LOAD: BIND_ACTION_GET_TITLE(cbs, action_get_title_remap_file_load); break; + case MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD: + BIND_ACTION_GET_TITLE(cbs, action_get_title_override_file_load); + break; case MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_CHEEVOS_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_user_accounts_cheevos_list); break; diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 7e8b8c00ef..eea15c8234 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -10662,7 +10662,10 @@ static void materialui_list_insert( node->icon_texture_index = MUI_TEXTURE_UNDO_LOAD_STATE; node->icon_type = MUI_ICON_TYPE_INTERNAL; } - else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_UNDO_SAVE_STATE))) + else if ( + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_UNDO_SAVE_STATE)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_OVERRIDE_UNLOAD)) + ) { node->icon_texture_index = MUI_TEXTURE_UNDO_SAVE_STATE; node->icon_type = MUI_ICON_TYPE_INTERNAL; @@ -10700,6 +10703,9 @@ static void materialui_list_insert( else if ( string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DELETE_ENTRY)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DELETE_PLAYLIST)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_REMOVE)) ) { @@ -10847,6 +10853,7 @@ static void materialui_list_insert( string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_INPUT_META_CHEAT_SEARCH)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_SEARCH_SETTINGS)) || string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_START_OR_CONT)) || diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c index c084476857..e8edd5c6a8 100644 --- a/menu/drivers/ozone.c +++ b/menu/drivers/ozone.c @@ -1798,6 +1798,9 @@ static uintptr_t ozone_entries_icon_get_texture( case MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE: case MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR: case MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME: + case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE: + case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR: + case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME: case MENU_ENUM_LABEL_NETWORK_ON_DEMAND_THUMBNAILS: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SAVESTATE]; case MENU_ENUM_LABEL_LOAD_STATE: @@ -1846,7 +1849,6 @@ static uintptr_t ozone_entries_icon_get_texture( /* Menu icons */ case MENU_ENUM_LABEL_CONTENT_SETTINGS: case MENU_ENUM_LABEL_UPDATE_ASSETS: - case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GLOBAL: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_QUICKMENU]; @@ -1861,7 +1863,6 @@ static uintptr_t ozone_entries_icon_get_texture( case MENU_ENUM_LABEL_UPDATE_INSTALLED_CORES: case MENU_ENUM_LABEL_SWITCH_INSTALLED_CORES_PFD: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE: - case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE: case MENU_ENUM_LABEL_SET_CORE_ASSOCIATION: case MENU_ENUM_LABEL_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION: case MENU_ENUM_LABEL_CORE_INFORMATION: @@ -2023,9 +2024,13 @@ static uintptr_t ozone_entries_icon_get_texture( case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CORE: case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CONTENT_DIR: case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME: + case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE: + case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR: + case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CLOSE]; case MENU_ENUM_LABEL_CORE_OPTIONS_RESET: case MENU_ENUM_LABEL_REMAP_FILE_RESET: + case MENU_ENUM_LABEL_OVERRIDE_UNLOAD: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_UNDO]; case MENU_ENUM_LABEL_CORE_OPTIONS_FLUSH: case MENU_ENUM_LABEL_REMAP_FILE_FLUSH: @@ -2078,7 +2083,6 @@ static uintptr_t ozone_entries_icon_get_texture( case MENU_ENUM_LABEL_ADD_CONTENT_LIST: case MENU_ENUM_LABEL_SCAN_DIRECTORY: case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_LIST: - case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_PARENT: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_FOLDER]; case MENU_ENUM_LABEL_PRIVACY_SETTINGS: @@ -2127,6 +2131,7 @@ static uintptr_t ozone_entries_icon_get_texture( case MENU_ENUM_LABEL_CONFIGURATIONS: case MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS: case MENU_ENUM_LABEL_REMAP_FILE_LOAD: + case MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD: case MENU_ENUM_LABEL_AUTO_OVERRIDES_ENABLE: case MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET: diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index e91171f545..3c735766c3 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -2905,12 +2905,16 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE: case MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR: case MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME: + case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE: + case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR: + case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME: case MENU_ENUM_LABEL_NETWORK_ON_DEMAND_THUMBNAILS: return xmb->textures.list[XMB_TEXTURE_SAVESTATE]; case MENU_ENUM_LABEL_LOAD_STATE: case MENU_ENUM_LABEL_CONFIGURATIONS: case MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS: case MENU_ENUM_LABEL_REMAP_FILE_LOAD: + case MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD: case MENU_ENUM_LABEL_AUTO_OVERRIDES_ENABLE: case MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET: @@ -2952,7 +2956,6 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_SETTINGS_SHOW_DIRECTORY: case MENU_ENUM_LABEL_SCAN_DIRECTORY: case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_LIST: - case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_PARENT: case MENU_ENUM_LABEL_FAVORITES: /* "Start Directory" */ case MENU_ENUM_LABEL_DOWNLOADED_FILE_DETECT_CORE_LIST: @@ -2991,7 +2994,6 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, return xmb->textures.list[XMB_TEXTURE_DISC]; case MENU_ENUM_LABEL_CONTENT_SETTINGS: case MENU_ENUM_LABEL_UPDATE_ASSETS: - case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GLOBAL: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME: return xmb->textures.list[XMB_TEXTURE_QUICKMENU]; @@ -3006,7 +3008,6 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_UPDATE_INSTALLED_CORES: case MENU_ENUM_LABEL_SWITCH_INSTALLED_CORES_PFD: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE: - case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE: case MENU_ENUM_LABEL_SET_CORE_ASSOCIATION: case MENU_ENUM_LABEL_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION: case MENU_ENUM_LABEL_CORE_INFORMATION: @@ -3157,9 +3158,13 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CORE: case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CONTENT_DIR: case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME: + case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE: + case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR: + case MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME: return xmb->textures.list[XMB_TEXTURE_CLOSE]; case MENU_ENUM_LABEL_CORE_OPTIONS_RESET: case MENU_ENUM_LABEL_REMAP_FILE_RESET: + case MENU_ENUM_LABEL_OVERRIDE_UNLOAD: return xmb->textures.list[XMB_TEXTURE_UNDO]; case MENU_ENUM_LABEL_CORE_OPTIONS_FLUSH: case MENU_ENUM_LABEL_REMAP_FILE_FLUSH: diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index 0f2ea3bc8d..784e648354 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -140,6 +140,7 @@ enum ACTION_OK_DL_USER_BINDS_LIST, ACTION_OK_DL_CONTENT_LIST, ACTION_OK_DL_REMAP_FILE, + ACTION_OK_DL_OVERRIDE_FILE, ACTION_OK_DL_RECORD_CONFIGFILE, ACTION_OK_DL_STREAM_CONFIGFILE, ACTION_OK_DL_DISK_IMAGE_APPEND_LIST, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index c6f827fea1..f32552db80 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -13626,42 +13626,156 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, case DISPLAYLIST_OPTIONS_OVERRIDES: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); { - bool has_content = !string_is_empty(path_get(RARCH_PATH_CONTENT)); + runloop_state_t *runloop_st = runloop_state_get_ptr(); + rarch_system_info_t *system = &runloop_st->system; - if (settings->bools.quick_menu_show_save_core_overrides + const char *rarch_path_basename = path_get(RARCH_PATH_BASENAME); + const char *rarch_path_override = path_get(RARCH_PATH_CONFIG_OVERRIDE); + const char *core_name = system ? system->info.library_name : NULL; + char config_directory[PATH_MAX_LENGTH]; + char content_dir_name[PATH_MAX_LENGTH]; + char override_path[PATH_MAX_LENGTH]; + bool has_content = !string_is_empty(path_get(RARCH_PATH_CONTENT)); + bool core_override_remove = false; + bool content_dir_override_remove = false; + bool game_override_remove = false; + + config_directory[0] = '\0'; + content_dir_name[0] = '\0'; + override_path[0] = '\0'; + + if (!string_is_empty(rarch_path_override)) + { + fill_pathname_application_special(config_directory, + sizeof(config_directory), + APPLICATION_SPECIAL_DIRECTORY_CONFIG); + + if (has_content) + { + /* Game-specific path */ + fill_pathname_join_special_ext(override_path, + config_directory, core_name, + path_basename_nocompression(rarch_path_basename), + FILE_PATH_CONFIG_EXTENSION, + sizeof(override_path)); + + game_override_remove = path_is_valid(override_path); + override_path[0] = '\0'; + + /* Contentdir-specific path */ + fill_pathname_parent_dir_name(content_dir_name, + rarch_path_basename, sizeof(content_dir_name)); + fill_pathname_join_special_ext(override_path, + config_directory, core_name, + content_dir_name, + FILE_PATH_CONFIG_EXTENSION, + sizeof(override_path)); + + content_dir_override_remove = path_is_valid(override_path); + override_path[0] = '\0'; + } + + { + /* Core-specific path */ + fill_pathname_join_special_ext(override_path, + config_directory, core_name, + core_name, + FILE_PATH_CONFIG_EXTENSION, + sizeof(override_path)); + + core_override_remove = path_is_valid(override_path); + override_path[0] = '\0'; + } + } + + /* Show currently 'active' override file */ + if (menu_entries_append(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OVERRIDE_FILE_INFO), + msg_hash_to_str(MENU_ENUM_LABEL_OVERRIDE_FILE_INFO), + MENU_ENUM_LABEL_OVERRIDE_FILE_INFO, + MENU_SETTINGS_CORE_INFO_NONE, 0, 0, NULL)) + count++; + + /* Load override file */ + if (menu_entries_append(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OVERRIDE_FILE_LOAD), + msg_hash_to_str(MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD), + MENU_ENUM_LABEL_OVERRIDE_FILE_LOAD, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + + if ( has_content + && settings->bools.quick_menu_show_save_game_overrides && !settings->bools.kiosk_mode_enable) { if (menu_entries_append(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE), - msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE), - MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, - MENU_SETTING_ACTION, 0, 0, NULL)) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME), + msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME), + MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, + MENU_SETTING_ACTION, 0, 0, NULL)) count++; + + if (game_override_remove) + { + if (menu_entries_append(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME), + msg_hash_to_str(MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME), + MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + } } - if (has_content - && settings->bools.quick_menu_show_save_content_dir_overrides + if ( has_content + && settings->bools.quick_menu_show_save_content_dir_overrides && !settings->bools.kiosk_mode_enable) { if (menu_entries_append(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR), - msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR), - MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, - MENU_SETTING_ACTION, 0, 0, NULL)) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR), + msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR), + MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + MENU_SETTING_ACTION, 0, 0, NULL)) count++; + + if (content_dir_override_remove) + { + if (menu_entries_append(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR), + msg_hash_to_str(MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR), + MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + } } - if (has_content - && settings->bools.quick_menu_show_save_game_overrides + if ( settings->bools.quick_menu_show_save_core_overrides && !settings->bools.kiosk_mode_enable) { if (menu_entries_append(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME), - msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME), - MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, - MENU_SETTING_ACTION, 0, 0, NULL)) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE), + msg_hash_to_str(MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE), + MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, + MENU_SETTING_ACTION, 0, 0, NULL)) count++; + + if (core_override_remove) + { + if (menu_entries_append(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE), + msg_hash_to_str(MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE), + MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; + } } + + /* Unload overrides */ + if (menu_entries_append(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OVERRIDE_UNLOAD), + msg_hash_to_str(MENU_ENUM_LABEL_OVERRIDE_UNLOAD), + MENU_ENUM_LABEL_OVERRIDE_UNLOAD, + MENU_SETTING_ACTION, 0, 0, NULL)) + count++; } if (count == 0) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 9e7beb762f..2c74585d5d 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9872,6 +9872,36 @@ static bool setting_append_list( MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_GAME); SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); + CONFIG_ACTION( + list, list_info, + MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE, + MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE, + &group_info, + &subgroup_info, + parent_group); + MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_MENU_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); + + CONFIG_ACTION( + list, list_info, + MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + &group_info, + &subgroup_info, + parent_group); + MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_MENU_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); + + CONFIG_ACTION( + list, list_info, + MENU_ENUM_LABEL_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME, + MENU_ENUM_LABEL_VALUE_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME, + &group_info, + &subgroup_info, + parent_group); + MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_MENU_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); + CONFIG_ACTION( list, list_info, MENU_ENUM_LABEL_HELP_LIST, diff --git a/msg_hash.h b/msg_hash.h index fb4d44786f..07d8555ffc 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -337,10 +337,14 @@ enum msg_hash_enums MSG_LOADING_FAVORITES_FILE, MSG_COULD_NOT_READ_STATE_FROM_MOVIE, MSG_MOVIE_FILE_IS_NOT_A_VALID_BSV1_FILE, + MSG_OVERRIDES_NOT_SAVED, MSG_OVERRIDES_SAVED_SUCCESSFULLY, + MSG_OVERRIDES_REMOVED_SUCCESSFULLY, + MSG_OVERRIDES_UNLOADED_SUCCESSFULLY, + MSG_OVERRIDES_ERROR_SAVING, + MSG_OVERRIDES_ERROR_REMOVING, MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, MSG_AUTOCONFIG_FILE_ERROR_SAVING, - MSG_OVERRIDES_ERROR_SAVING, MSG_FILE_ALREADY_EXISTS_SAVING_TO_BACKUP_BUFFER, MSG_AUTOLOADING_SAVESTATE_FROM, MSG_FOUND_AUTO_SAVESTATE_IN, @@ -381,6 +385,7 @@ enum msg_hash_enums MSG_REMAP_FILE_SAVED_SUCCESSFULLY, MSG_REMAP_FILE_REMOVED_SUCCESSFULLY, MSG_REMAP_FILE_RESET, + MSG_OVERRIDE_UNLOAD, MSG_SHADER_PRESET_SAVED_SUCCESSFULLY, MSG_SHADER_PRESET_REMOVED_SUCCESSFULLY, MSG_ERROR_SAVING_REMAP_FILE, @@ -1769,6 +1774,7 @@ enum msg_hash_enums #endif MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST, MENU_ENUM_LABEL_DEFERRED_REMAPPINGS_PORT_LIST, + MENU_ENUM_LABEL_DEFERRED_OVERRIDE_FILE_MANAGER_LIST, MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST, MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SPECIAL, MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_RESOLUTION, @@ -3073,6 +3079,10 @@ enum msg_hash_enums MENU_LABEL(REMAP_FILE_RESET), MENU_LABEL(REMAP_FILE_FLUSH), + MENU_LABEL(OVERRIDE_FILE_INFO), + MENU_LABEL(OVERRIDE_FILE_LOAD), + MENU_LABEL(OVERRIDE_UNLOAD), + MENU_LABEL(RESTART_CONTENT), MENU_LABEL(RESUME), MENU_LABEL(RESUME_CONTENT), @@ -3377,6 +3387,9 @@ enum msg_hash_enums MENU_LABEL(SAVE_CURRENT_CONFIG_OVERRIDE_CORE), MENU_LABEL(SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR), MENU_LABEL(SAVE_CURRENT_CONFIG_OVERRIDE_GAME), + MENU_LABEL(REMOVE_CURRENT_CONFIG_OVERRIDE_CORE), + MENU_LABEL(REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR), + MENU_LABEL(REMOVE_CURRENT_CONFIG_OVERRIDE_GAME), MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS, MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS, diff --git a/paths.h b/paths.h index becab68332..cd223641db 100644 --- a/paths.h +++ b/paths.h @@ -51,6 +51,7 @@ enum rarch_path_type RARCH_PATH_CONFIG, RARCH_PATH_CONTENT, RARCH_PATH_CONFIG_APPEND, + RARCH_PATH_CONFIG_OVERRIDE, RARCH_PATH_CORE_OPTIONS, RARCH_PATH_DEFAULT_SHADER_PRESET, RARCH_PATH_BASENAME, diff --git a/retroarch.c b/retroarch.c index c3c122c320..4d4d98858e 100644 --- a/retroarch.c +++ b/retroarch.c @@ -314,6 +314,7 @@ struct rarch_state char path_libretro[PATH_MAX_LENGTH]; char path_config_file[PATH_MAX_LENGTH]; char path_config_append_file[PATH_MAX_LENGTH]; + char path_config_override_file[PATH_MAX_LENGTH]; char path_core_options_file[PATH_MAX_LENGTH]; char dir_system[PATH_MAX_LENGTH]; char dir_savefile[PATH_MAX_LENGTH]; @@ -1594,6 +1595,10 @@ char *path_get_ptr(enum rarch_path_type type) if (!path_is_empty(RARCH_PATH_CONFIG_APPEND)) return p_rarch->path_config_append_file; break; + case RARCH_PATH_CONFIG_OVERRIDE: + if (!path_is_empty(RARCH_PATH_CONFIG_OVERRIDE)) + return p_rarch->path_config_override_file; + break; case RARCH_PATH_CORE: return p_rarch->path_libretro; case RARCH_PATH_NONE: @@ -1631,6 +1636,10 @@ const char *path_get(enum rarch_path_type type) if (!path_is_empty(RARCH_PATH_CONFIG_APPEND)) return p_rarch->path_config_append_file; break; + case RARCH_PATH_CONFIG_OVERRIDE: + if (!path_is_empty(RARCH_PATH_CONFIG_OVERRIDE)) + return p_rarch->path_config_override_file; + break; case RARCH_PATH_CORE: return p_rarch->path_libretro; case RARCH_PATH_NONE: @@ -1661,6 +1670,8 @@ size_t path_get_realsize(enum rarch_path_type type) return sizeof(p_rarch->path_config_file); case RARCH_PATH_CONFIG_APPEND: return sizeof(p_rarch->path_config_append_file); + case RARCH_PATH_CONFIG_OVERRIDE: + return sizeof(p_rarch->path_config_override_file); case RARCH_PATH_CORE: return sizeof(p_rarch->path_libretro); case RARCH_PATH_NONE: @@ -1703,6 +1714,10 @@ bool path_set(enum rarch_path_type type, const char *path) strlcpy(p_rarch->path_config_file, path, sizeof(p_rarch->path_config_file)); break; + case RARCH_PATH_CONFIG_OVERRIDE: + strlcpy(p_rarch->path_config_override_file, path, + sizeof(p_rarch->path_config_override_file)); + break; case RARCH_PATH_CORE_OPTIONS: strlcpy(p_rarch->path_core_options_file, path, sizeof(p_rarch->path_core_options_file)); @@ -1742,14 +1757,18 @@ bool path_is_empty(enum rarch_path_type type) if (string_is_empty(p_rarch->path_config_file)) return true; break; - case RARCH_PATH_CORE_OPTIONS: - if (string_is_empty(p_rarch->path_core_options_file)) - return true; - break; case RARCH_PATH_CONFIG_APPEND: if (string_is_empty(p_rarch->path_config_append_file)) return true; break; + case RARCH_PATH_CONFIG_OVERRIDE: + if (string_is_empty(p_rarch->path_config_override_file)) + return true; + break; + case RARCH_PATH_CORE_OPTIONS: + if (string_is_empty(p_rarch->path_core_options_file)) + return true; + break; case RARCH_PATH_CONTENT: if (string_is_empty(p_rarch->path_content)) return true; @@ -1799,6 +1818,9 @@ void path_clear(enum rarch_path_type type) case RARCH_PATH_CONFIG_APPEND: *p_rarch->path_config_append_file = '\0'; break; + case RARCH_PATH_CONFIG_OVERRIDE: + *p_rarch->path_config_override_file = '\0'; + break; case RARCH_PATH_NONE: case RARCH_PATH_NAMES: break; @@ -1818,6 +1840,7 @@ static void path_clear_all(void) path_clear(RARCH_PATH_CONTENT); path_clear(RARCH_PATH_CONFIG); path_clear(RARCH_PATH_CONFIG_APPEND); + path_clear(RARCH_PATH_CONFIG_OVERRIDE); path_clear(RARCH_PATH_CORE_OPTIONS); path_clear(RARCH_PATH_BASENAME); } @@ -3317,6 +3340,21 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_GAME: #ifdef HAVE_CONFIGFILE command_event_save_current_config(OVERRIDE_GAME); +#endif + break; + case CMD_EVENT_MENU_REMOVE_CURRENT_CONFIG_OVERRIDE_CORE: +#ifdef HAVE_CONFIGFILE + command_event_remove_current_config(OVERRIDE_CORE); +#endif + break; + case CMD_EVENT_MENU_REMOVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR: +#ifdef HAVE_CONFIGFILE + command_event_remove_current_config(OVERRIDE_CONTENT_DIR); +#endif + break; + case CMD_EVENT_MENU_REMOVE_CURRENT_CONFIG_OVERRIDE_GAME: +#ifdef HAVE_CONFIGFILE + command_event_remove_current_config(OVERRIDE_GAME); #endif break; case CMD_EVENT_MENU_SAVE_CONFIG: