Override bind save + menu manager overhaul (#14895)

* Input bind override conf saving

* Override menu overhaul
This commit is contained in:
sonninnos 2023-01-24 02:42:50 +02:00 committed by GitHub
parent 9a0ecaab4b
commit c6dc92fc07
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 838 additions and 96 deletions

View file

@ -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;
}

View file

@ -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
/**

View file

@ -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)

View file

@ -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

View file

@ -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"

View file

@ -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."

View file

@ -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;

View file

@ -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,

View file

@ -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:

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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)) ||

View file

@ -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:

View file

@ -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:

View file

@ -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,

View file

@ -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)

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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: