mirror of
https://github.com/libretro/RetroArch.git
synced 2024-11-23 07:59:42 +00:00
Add 'Manage Remap Files' submenu + automatically save input remaps when closing content
This commit is contained in:
parent
96ddb301b6
commit
ea77410037
@ -2634,7 +2634,7 @@ void config_set_defaults(void *data)
|
||||
#endif
|
||||
|
||||
input_config_reset();
|
||||
input_remapping_deinit();
|
||||
input_remapping_deinit(false);
|
||||
input_remapping_set_defaults(false);
|
||||
|
||||
/* Verify that binds are in proper order. */
|
||||
@ -5102,7 +5102,7 @@ bool input_remapping_load_file(void *data, const char *path)
|
||||
|
||||
if (!string_is_empty(runloop_st->name.remapfile))
|
||||
{
|
||||
input_remapping_deinit();
|
||||
input_remapping_deinit(false);
|
||||
input_remapping_set_defaults(false);
|
||||
}
|
||||
runloop_st->name.remapfile = strdup(path);
|
||||
@ -5213,7 +5213,7 @@ bool input_remapping_load_file(void *data, const char *path)
|
||||
|
||||
/**
|
||||
* input_remapping_save_file:
|
||||
* @path : Path to remapping file (relative path).
|
||||
* @path : Path to remapping file.
|
||||
*
|
||||
* Saves remapping values to file.
|
||||
*
|
||||
@ -5223,23 +5223,33 @@ bool input_remapping_save_file(const char *path)
|
||||
{
|
||||
bool ret;
|
||||
unsigned i, j;
|
||||
char remap_file[PATH_MAX_LENGTH];
|
||||
char remap_file_dir[PATH_MAX_LENGTH];
|
||||
char key_strings[RARCH_FIRST_CUSTOM_BIND + 8][8] = {
|
||||
"b", "y", "select", "start",
|
||||
"up", "down", "left", "right",
|
||||
"a", "x", "l", "r", "l2", "r2",
|
||||
"l3", "r3", "l_x+", "l_x-", "l_y+", "l_y-", "r_x+", "r_x-", "r_y+", "r_y-" };
|
||||
config_file_t *conf = NULL;
|
||||
settings_t *settings = config_st;
|
||||
unsigned max_users = settings->uints.input_max_users;
|
||||
const char *dir_input_remapping = settings->paths.directory_input_remapping;
|
||||
const char *remap_file = path;
|
||||
config_file_t *conf = NULL;
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
settings_t *settings = config_st;
|
||||
unsigned max_users = settings->uints.input_max_users;
|
||||
|
||||
remap_file[0] = '\0';
|
||||
remap_file_dir[0] = '\0';
|
||||
|
||||
fill_pathname_join_concat(remap_file, dir_input_remapping, path,
|
||||
FILE_PATH_REMAP_EXTENSION,
|
||||
sizeof(remap_file));
|
||||
if (string_is_empty(remap_file))
|
||||
return false;
|
||||
|
||||
/* Create output directory, if required */
|
||||
strlcpy(remap_file_dir, remap_file, sizeof(remap_file_dir));
|
||||
path_parent_dir(remap_file_dir);
|
||||
|
||||
if (!string_is_empty(remap_file_dir) &&
|
||||
!path_is_directory(remap_file_dir) &&
|
||||
!path_mkdir(remap_file_dir))
|
||||
return false;
|
||||
|
||||
/* Attempt to load file */
|
||||
if (!(conf = config_file_new_from_path_to_string(remap_file)))
|
||||
{
|
||||
if (!(conf = config_file_new_alloc()))
|
||||
@ -5361,18 +5371,18 @@ bool input_remapping_save_file(const char *path)
|
||||
ret = config_file_write(conf, remap_file, true);
|
||||
config_file_free(conf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
/* Cache remap file path
|
||||
* > Must guard against the case where
|
||||
* runloop_st->name.remapfile itself
|
||||
* is passed to this function... */
|
||||
if (runloop_st->name.remapfile != remap_file)
|
||||
{
|
||||
if (runloop_st->name.remapfile)
|
||||
free(runloop_st->name.remapfile);
|
||||
runloop_st->name.remapfile = strdup(remap_file);
|
||||
}
|
||||
|
||||
bool input_remapping_remove_file(const char *path,
|
||||
const char *dir_input_remapping)
|
||||
{
|
||||
char remap_file[PATH_MAX_LENGTH];
|
||||
remap_file[0] = '\0';
|
||||
fill_pathname_join_concat(remap_file, dir_input_remapping, path,
|
||||
FILE_PATH_REMAP_EXTENSION,
|
||||
sizeof(remap_file));
|
||||
return filestream_delete(remap_file) == 0 ? true : false;
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -5254,11 +5254,16 @@ void input_remapping_update_port_map(void)
|
||||
}
|
||||
}
|
||||
|
||||
void input_remapping_deinit(void)
|
||||
void input_remapping_deinit(bool save_remap)
|
||||
{
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
if (runloop_st->name.remapfile)
|
||||
{
|
||||
if (save_remap)
|
||||
input_remapping_save_file(runloop_st->name.remapfile);
|
||||
|
||||
free(runloop_st->name.remapfile);
|
||||
}
|
||||
runloop_st->name.remapfile = NULL;
|
||||
runloop_st->remaps_core_active = false;
|
||||
runloop_st->remaps_content_dir_active = false;
|
||||
|
@ -40,15 +40,12 @@ bool input_remapping_load_file(void *data, const char *path);
|
||||
/**
|
||||
* Saves remapping values to file.
|
||||
*
|
||||
* @param path Relative path to remapping file.
|
||||
* @param path Path to remapping file.
|
||||
*
|
||||
* @return true (1) if successful, otherwise false (0).
|
||||
**/
|
||||
bool input_remapping_save_file(const char *path);
|
||||
|
||||
bool input_remapping_remove_file(const char *path,
|
||||
const char *dir_input_remapping);
|
||||
|
||||
/**
|
||||
* Caches any global configuration settings that should not be overwritten by
|
||||
* input remap changes made while content is running. Must be called on each
|
||||
@ -86,8 +83,12 @@ void input_remapping_update_port_map(void);
|
||||
/**
|
||||
* Frees runloop_st->name.remapfile and sets these runloop_state flags to false:
|
||||
* remaps_core_active, remaps_content_dir_active, and remaps_game_active.
|
||||
*
|
||||
* @param save_remap If true, current remap settings will be saved to
|
||||
* runloop_st->name.remapfile before performing
|
||||
* deinitialisation.
|
||||
*/
|
||||
void input_remapping_deinit(void);
|
||||
void input_remapping_deinit(bool save_remap);
|
||||
|
||||
/**
|
||||
* Used to set the default mapping values within the `settings` struct
|
||||
|
@ -2784,6 +2784,18 @@ MSG_HASH(
|
||||
MENU_ENUM_LABEL_RECORD_USE_OUTPUT_DIRECTORY,
|
||||
"record_use_output_directory"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST,
|
||||
"deferred_remap_file_manager_list"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_REMAP_FILE_MANAGER_LIST,
|
||||
"remap_file_manager_list"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_REMAP_FILE_INFO,
|
||||
"remap_file_info"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_REMAP_FILE_LOAD,
|
||||
"remap_file_load"
|
||||
@ -2812,6 +2824,8 @@ MSG_HASH(
|
||||
MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME,
|
||||
"remap_file_remove_game"
|
||||
)
|
||||
|
||||
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_RESTART_CONTENT,
|
||||
"restart_content"
|
||||
|
@ -7051,6 +7051,21 @@ MSG_HASH(
|
||||
|
||||
/* Quick Menu > Controls */
|
||||
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_REMAP_FILE_MANAGER_LIST,
|
||||
"Manage Remap Files"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_REMAP_FILE_MANAGER_LIST,
|
||||
"Load, save or remove input remap files for the current content."
|
||||
)
|
||||
|
||||
/* Quick Menu > Controls > Manage Remap Files */
|
||||
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_REMAP_FILE_INFO,
|
||||
"Active Remap File:"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD,
|
||||
"Load Remap File"
|
||||
@ -7080,7 +7095,7 @@ MSG_HASH(
|
||||
"Delete Game Remap File"
|
||||
)
|
||||
|
||||
/* Quick Menu > Controls > Load Remap File */
|
||||
/* Quick Menu > Controls > Manage Remap Files > Load Remap File */
|
||||
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_REMAP_FILE,
|
||||
|
@ -127,6 +127,7 @@ GENERIC_DEFERRED_PUSH(deferred_push_core_counters, DISPLAYLIST_
|
||||
GENERIC_DEFERRED_PUSH(deferred_push_frontend_counters, DISPLAYLIST_PERFCOUNTERS_FRONTEND)
|
||||
GENERIC_DEFERRED_PUSH(deferred_push_core_cheat_options, DISPLAYLIST_OPTIONS_CHEATS)
|
||||
GENERIC_DEFERRED_PUSH(deferred_push_core_input_remapping_options, DISPLAYLIST_OPTIONS_REMAPPINGS)
|
||||
GENERIC_DEFERRED_PUSH(deferred_push_remap_file_manager, DISPLAYLIST_REMAP_FILE_MANAGER)
|
||||
GENERIC_DEFERRED_PUSH(deferred_push_core_options, DISPLAYLIST_CORE_OPTIONS)
|
||||
GENERIC_DEFERRED_PUSH(deferred_push_core_option_override_list, DISPLAYLIST_CORE_OPTION_OVERRIDE_LIST)
|
||||
GENERIC_DEFERRED_PUSH(deferred_push_disk_options, DISPLAYLIST_OPTIONS_DISK)
|
||||
@ -857,6 +858,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label(
|
||||
{MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE, deferred_push_video_shader_preset_save},
|
||||
{MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS, deferred_push_core_cheat_options},
|
||||
{MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, deferred_push_core_input_remapping_options},
|
||||
{MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST, deferred_push_remap_file_manager},
|
||||
{MENU_ENUM_LABEL_VIDEO_SHADER_PRESET, deferred_push_video_shader_preset},
|
||||
{MENU_ENUM_LABEL_VIDEO_SHADER_PASS, deferred_push_video_shader_pass},
|
||||
{MENU_ENUM_LABEL_VIDEO_FILTER, deferred_push_video_filter},
|
||||
@ -1169,6 +1171,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label(
|
||||
case MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS:
|
||||
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_input_remapping_options);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST:
|
||||
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_remap_file_manager);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_CORE_LIST:
|
||||
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_list);
|
||||
break;
|
||||
|
@ -140,7 +140,7 @@ static void menu_action_setting_disp_set_label_cheevos_entry(
|
||||
}
|
||||
#endif
|
||||
|
||||
static void menu_action_setting_disp_set_label_remap_file_load(
|
||||
static void menu_action_setting_disp_set_label_remap_file_info(
|
||||
file_list_t* list,
|
||||
unsigned *w, unsigned type, unsigned i,
|
||||
const char *label,
|
||||
@ -149,12 +149,21 @@ static void menu_action_setting_disp_set_label_remap_file_load(
|
||||
char *s2, size_t len2)
|
||||
{
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
const char *remap_path = runloop_st->name.remapfile;
|
||||
const char *remap_file = NULL;
|
||||
|
||||
*s = '\0';
|
||||
*w = 19;
|
||||
|
||||
if (!string_is_empty(remap_path))
|
||||
remap_file = path_basename_nocompression(remap_path);
|
||||
|
||||
if (!string_is_empty(remap_file))
|
||||
strlcpy(s, remap_file, len);
|
||||
else
|
||||
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), len);
|
||||
|
||||
strlcpy(s2, path, len2);
|
||||
if (!string_is_empty(runloop_st->name.remapfile))
|
||||
fill_pathname_base(s, runloop_st->name.remapfile,
|
||||
len);
|
||||
}
|
||||
|
||||
static void menu_action_setting_disp_set_label_configurations(
|
||||
@ -1887,9 +1896,9 @@ static int menu_cbs_init_bind_get_string_representation_compare_label(
|
||||
menu_action_setting_disp_set_label_cheat_num_passes);
|
||||
#endif
|
||||
break;
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_LOAD:
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_INFO:
|
||||
BIND_ACTION_GET_VALUE(cbs,
|
||||
menu_action_setting_disp_set_label_remap_file_load);
|
||||
menu_action_setting_disp_set_label_remap_file_info);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_VIDEO_SHADER_FILTER_PASS:
|
||||
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
|
||||
|
@ -494,6 +494,8 @@ static enum msg_hash_enums action_ok_dl_to_enum(unsigned lbl)
|
||||
#endif
|
||||
case ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST:
|
||||
return MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST;
|
||||
case ACTION_OK_DL_REMAP_FILE_MANAGER_LIST:
|
||||
return MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -1584,6 +1586,7 @@ int generic_action_ok_displaylist_push(const char *path,
|
||||
case ACTION_OK_DL_CORE_MANAGER_STEAM_LIST:
|
||||
#endif
|
||||
case ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST:
|
||||
case ACTION_OK_DL_REMAP_FILE_MANAGER_LIST:
|
||||
ACTION_OK_DL_LBL(action_ok_dl_to_enum(action_type), DISPLAYLIST_GENERIC);
|
||||
break;
|
||||
case ACTION_OK_DL_CDROM_INFO_DETAIL_LIST:
|
||||
@ -2226,7 +2229,7 @@ DEFAULT_ACTION_OK_SET(action_ok_cheat_file_load, ACTION_OK_LOAD_CHEAT_FILE,
|
||||
DEFAULT_ACTION_OK_SET(action_ok_cheat_file_load_append, ACTION_OK_LOAD_CHEAT_FILE_APPEND, MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS)
|
||||
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_CORE_INPUT_REMAPPING_OPTIONS )
|
||||
DEFAULT_ACTION_OK_SET(action_ok_remap_file_load, ACTION_OK_LOAD_REMAPPING_FILE, MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST)
|
||||
#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)
|
||||
@ -3420,63 +3423,63 @@ static int generic_action_ok_remap_file_operation(const char *path,
|
||||
unsigned action_type)
|
||||
{
|
||||
#ifdef HAVE_CONFIGFILE
|
||||
char directory[PATH_MAX_LENGTH];
|
||||
char file[PATH_MAX_LENGTH];
|
||||
char content_dir[PATH_MAX_LENGTH];
|
||||
struct retro_system_info *system = &runloop_state_get_ptr()->system.info;
|
||||
const char *core_name = system ? system->library_name : NULL;
|
||||
const char *rarch_path_basename = path_get(RARCH_PATH_BASENAME);
|
||||
bool has_content = !string_is_empty(rarch_path_basename);
|
||||
settings_t *settings = config_get_ptr();
|
||||
const char *path_dir_input_remapping = settings->paths.directory_input_remapping;
|
||||
char content_dir_name[PATH_MAX_LENGTH];
|
||||
char remap_file_path[PATH_MAX_LENGTH];
|
||||
rarch_system_info_t *system = &runloop_state_get_ptr()->system;
|
||||
const char *core_name = system ? system->info.library_name : NULL;
|
||||
const char *rarch_path_basename = path_get(RARCH_PATH_BASENAME);
|
||||
bool has_content = !string_is_empty(rarch_path_basename);
|
||||
settings_t *settings = config_get_ptr();
|
||||
const char *directory_input_remapping = settings->paths.directory_input_remapping;
|
||||
bool refresh = false;
|
||||
|
||||
directory[0] = '\0';
|
||||
file[0] = '\0';
|
||||
content_dir[0] = '\0';
|
||||
content_dir_name[0] = '\0';
|
||||
remap_file_path[0] = '\0';
|
||||
|
||||
/* Cannot perform remap file operation if we
|
||||
* have no core */
|
||||
if (string_is_empty(core_name))
|
||||
return menu_cbs_exit();
|
||||
|
||||
/* Get base remap file directory */
|
||||
fill_pathname_join(
|
||||
directory,
|
||||
path_dir_input_remapping,
|
||||
core_name,
|
||||
sizeof(directory));
|
||||
|
||||
if (!path_is_directory(directory))
|
||||
path_mkdir(directory);
|
||||
|
||||
switch (action_type)
|
||||
{
|
||||
case ACTION_OK_REMAP_FILE_SAVE_CORE:
|
||||
case ACTION_OK_REMAP_FILE_REMOVE_CORE:
|
||||
fill_pathname_join(file, core_name, core_name, sizeof(file));
|
||||
fill_pathname_join_special_ext(remap_file_path,
|
||||
directory_input_remapping, core_name,
|
||||
core_name,
|
||||
FILE_PATH_REMAP_EXTENSION,
|
||||
sizeof(remap_file_path));
|
||||
break;
|
||||
case ACTION_OK_REMAP_FILE_SAVE_GAME:
|
||||
case ACTION_OK_REMAP_FILE_REMOVE_GAME:
|
||||
if (has_content)
|
||||
fill_pathname_join(file, core_name,
|
||||
path_basename(rarch_path_basename), sizeof(file));
|
||||
fill_pathname_join_special_ext(remap_file_path,
|
||||
directory_input_remapping, core_name,
|
||||
path_basename(rarch_path_basename),
|
||||
FILE_PATH_REMAP_EXTENSION,
|
||||
sizeof(remap_file_path));
|
||||
break;
|
||||
case ACTION_OK_REMAP_FILE_SAVE_CONTENT_DIR:
|
||||
case ACTION_OK_REMAP_FILE_REMOVE_CONTENT_DIR:
|
||||
if (has_content)
|
||||
{
|
||||
fill_pathname_parent_dir_name(content_dir,
|
||||
rarch_path_basename, sizeof(content_dir));
|
||||
fill_pathname_join(file, core_name,
|
||||
content_dir, sizeof(file));
|
||||
fill_pathname_parent_dir_name(content_dir_name,
|
||||
rarch_path_basename, sizeof(content_dir_name));
|
||||
|
||||
fill_pathname_join_special_ext(remap_file_path,
|
||||
directory_input_remapping, core_name,
|
||||
content_dir_name,
|
||||
FILE_PATH_REMAP_EXTENSION,
|
||||
sizeof(remap_file_path));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (action_type < ACTION_OK_REMAP_FILE_REMOVE_CORE)
|
||||
{
|
||||
if (!string_is_empty(file) &&
|
||||
input_remapping_save_file(file))
|
||||
if (!string_is_empty(remap_file_path) &&
|
||||
input_remapping_save_file(remap_file_path))
|
||||
{
|
||||
switch (action_type)
|
||||
{
|
||||
@ -3504,29 +3507,29 @@ static int generic_action_ok_remap_file_operation(const char *path,
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!string_is_empty(file) &&
|
||||
input_remapping_remove_file(file, path_dir_input_remapping))
|
||||
if (!string_is_empty(remap_file_path) &&
|
||||
(filestream_delete(remap_file_path) == 0))
|
||||
{
|
||||
switch (action_type)
|
||||
{
|
||||
case ACTION_OK_REMAP_FILE_REMOVE_CORE:
|
||||
if (retroarch_ctl(RARCH_CTL_IS_REMAPS_CORE_ACTIVE, NULL))
|
||||
{
|
||||
input_remapping_deinit();
|
||||
input_remapping_deinit(false);
|
||||
input_remapping_set_defaults(false);
|
||||
}
|
||||
break;
|
||||
case ACTION_OK_REMAP_FILE_REMOVE_GAME:
|
||||
if (retroarch_ctl(RARCH_CTL_IS_REMAPS_GAME_ACTIVE, NULL))
|
||||
{
|
||||
input_remapping_deinit();
|
||||
input_remapping_deinit(false);
|
||||
input_remapping_set_defaults(false);
|
||||
}
|
||||
break;
|
||||
case ACTION_OK_REMAP_FILE_REMOVE_CONTENT_DIR:
|
||||
if (retroarch_ctl(RARCH_CTL_IS_REMAPS_CONTENT_DIR_ACTIVE, NULL))
|
||||
{
|
||||
input_remapping_deinit();
|
||||
input_remapping_deinit(false);
|
||||
input_remapping_set_defaults(false);
|
||||
}
|
||||
break;
|
||||
@ -3536,6 +3539,11 @@ static int generic_action_ok_remap_file_operation(const char *path,
|
||||
msg_hash_to_str(MSG_REMAP_FILE_REMOVED_SUCCESSFULLY),
|
||||
1, 100, true,
|
||||
NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
|
||||
/* After removing a remap file, attempt to
|
||||
* load any remaining remap file with the
|
||||
* next highest priority */
|
||||
config_load_remap(directory_input_remapping, system);
|
||||
}
|
||||
else
|
||||
runloop_msg_queue_push(
|
||||
@ -3543,6 +3551,10 @@ static int generic_action_ok_remap_file_operation(const char *path,
|
||||
1, 100, true,
|
||||
NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
}
|
||||
|
||||
/* Refresh menu */
|
||||
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
|
||||
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@ -5809,6 +5821,7 @@ DEFAULT_ACTION_OK_FUNC(action_ok_push_core_manager_list, ACTION_OK_DL_CORE_MANAG
|
||||
DEFAULT_ACTION_OK_FUNC(action_ok_push_core_manager_steam_list, ACTION_OK_DL_CORE_MANAGER_STEAM_LIST)
|
||||
#endif
|
||||
DEFAULT_ACTION_OK_FUNC(action_ok_push_core_option_override_list, ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST)
|
||||
DEFAULT_ACTION_OK_FUNC(action_ok_push_remap_file_manager_list, ACTION_OK_DL_REMAP_FILE_MANAGER_LIST)
|
||||
DEFAULT_ACTION_OK_FUNC(action_ok_push_core_options_list, ACTION_OK_DL_CORE_OPTIONS_LIST)
|
||||
|
||||
static int action_ok_open_uwp_permission_settings(const char *path,
|
||||
@ -8138,6 +8151,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs,
|
||||
{MENU_ENUM_LABEL_SHADER_OPTIONS, action_ok_push_default},
|
||||
{MENU_ENUM_LABEL_CORE_OPTIONS, action_ok_push_core_options_list},
|
||||
{MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST, action_ok_push_core_option_override_list},
|
||||
{MENU_ENUM_LABEL_REMAP_FILE_MANAGER_LIST, action_ok_push_remap_file_manager_list},
|
||||
{MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS, action_ok_push_default},
|
||||
{MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, action_ok_push_default},
|
||||
{MENU_ENUM_LABEL_DISC_INFORMATION, action_ok_push_default},
|
||||
|
@ -81,12 +81,24 @@ static int action_start_audio_mixer_stream_volume(
|
||||
}
|
||||
#endif
|
||||
|
||||
static int action_start_remap_file_load(
|
||||
static int action_start_remap_file_info(
|
||||
const char *path, const char *label,
|
||||
unsigned type, size_t idx, size_t entry_idx)
|
||||
{
|
||||
input_remapping_deinit();
|
||||
settings_t *settings = config_get_ptr();
|
||||
const char *directory_input_remapping = settings ?
|
||||
settings->paths.directory_input_remapping : NULL;
|
||||
rarch_system_info_t *system = &runloop_state_get_ptr()->system;
|
||||
bool refresh = false;
|
||||
|
||||
input_remapping_deinit(false);
|
||||
input_remapping_set_defaults(false);
|
||||
config_load_remap(directory_input_remapping, system);
|
||||
|
||||
/* Refresh menu */
|
||||
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
|
||||
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -712,8 +724,8 @@ static int menu_cbs_init_bind_start_compare_label(menu_file_list_cbs_t *cbs)
|
||||
case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET:
|
||||
BIND_ACTION_START(cbs, action_start_shader_preset);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_LOAD:
|
||||
BIND_ACTION_START(cbs, action_start_remap_file_load);
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_INFO:
|
||||
BIND_ACTION_START(cbs, action_start_remap_file_info);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_VIDEO_FILTER:
|
||||
BIND_ACTION_START(cbs, action_start_video_filter_file_load);
|
||||
|
@ -833,6 +833,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_save_current_config_override_content
|
||||
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_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_core_option_override_list, MENU_ENUM_SUBLABEL_CORE_OPTION_OVERRIDE_LIST)
|
||||
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)
|
||||
@ -2893,6 +2894,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
|
||||
case MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS:
|
||||
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_input_remapping_options);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_MANAGER_LIST:
|
||||
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_file_manager_list);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS:
|
||||
#ifdef HAVE_CHEATS
|
||||
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_cheat_options);
|
||||
|
@ -586,6 +586,7 @@ DEFAULT_TITLE_MACRO(action_get_configurations_list, MENU_ENUM_LABEL_
|
||||
DEFAULT_TITLE_MACRO(action_get_core_option_override_list, MENU_ENUM_LABEL_VALUE_CORE_OPTION_OVERRIDE_LIST)
|
||||
DEFAULT_TITLE_MACRO(action_get_quick_menu_list, MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS)
|
||||
DEFAULT_TITLE_MACRO(action_get_input_remapping_options_list, MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS)
|
||||
DEFAULT_TITLE_MACRO(action_get_remap_file_manager_list, MENU_ENUM_LABEL_VALUE_REMAP_FILE_MANAGER_LIST)
|
||||
DEFAULT_TITLE_MACRO(action_get_shader_options_list, MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS)
|
||||
DEFAULT_TITLE_MACRO(action_get_disk_options_list, MENU_ENUM_LABEL_VALUE_DISK_OPTIONS)
|
||||
DEFAULT_TITLE_MACRO(action_get_frontend_counters_list, MENU_ENUM_LABEL_VALUE_FRONTEND_COUNTERS)
|
||||
@ -1174,6 +1175,8 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs,
|
||||
action_get_quick_menu_list},
|
||||
{MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS,
|
||||
action_get_input_remapping_options_list},
|
||||
{MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST,
|
||||
action_get_remap_file_manager_list},
|
||||
{MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS,
|
||||
action_get_core_cheat_options_list},
|
||||
{MENU_ENUM_LABEL_SHADER_OPTIONS,
|
||||
@ -1509,6 +1512,9 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs,
|
||||
case MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS:
|
||||
BIND_ACTION_GET_TITLE(cbs, action_get_input_remapping_options_list);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST:
|
||||
BIND_ACTION_GET_TITLE(cbs, action_get_remap_file_manager_list);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS:
|
||||
BIND_ACTION_GET_TITLE(cbs, action_get_core_cheat_options_list);
|
||||
break;
|
||||
|
@ -10131,6 +10131,8 @@ static void materialui_list_insert(
|
||||
node->icon_type = MUI_ICON_TYPE_INTERNAL;
|
||||
break;
|
||||
case MENU_SETTING_ACTION_CORE_OPTION_OVERRIDE_LIST:
|
||||
case MENU_SETTING_ACTION_REMAP_FILE_MANAGER_LIST:
|
||||
case MENU_SETTING_ACTION_REMAP_FILE_LOAD:
|
||||
node->icon_texture_index = MUI_TEXTURE_SETTINGS;
|
||||
node->icon_type = MUI_ICON_TYPE_INTERNAL;
|
||||
break;
|
||||
@ -10186,12 +10188,18 @@ static void materialui_list_insert(
|
||||
case MENU_SETTING_ACTION_AUDIO_DSP_PLUGIN_REMOVE:
|
||||
case MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_REMOVE:
|
||||
case MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE:
|
||||
case MENU_SETTING_ACTION_REMAP_FILE_REMOVE_CORE:
|
||||
case MENU_SETTING_ACTION_REMAP_FILE_REMOVE_CONTENT_DIR:
|
||||
case MENU_SETTING_ACTION_REMAP_FILE_REMOVE_GAME:
|
||||
node->icon_texture_index = MUI_TEXTURE_REMOVE;
|
||||
node->icon_type = MUI_ICON_TYPE_INTERNAL;
|
||||
break;
|
||||
case MENU_SETTING_ACTION_CORE_CREATE_BACKUP:
|
||||
case MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_CREATE:
|
||||
case MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE:
|
||||
case MENU_SETTING_ACTION_REMAP_FILE_SAVE_CORE:
|
||||
case MENU_SETTING_ACTION_REMAP_FILE_SAVE_CONTENT_DIR:
|
||||
case MENU_SETTING_ACTION_REMAP_FILE_SAVE_GAME:
|
||||
node->icon_texture_index = MUI_TEXTURE_SAVE_STATE;
|
||||
node->icon_type = MUI_ICON_TYPE_INTERNAL;
|
||||
break;
|
||||
|
@ -1648,6 +1648,9 @@ static uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone,
|
||||
case MENU_ENUM_LABEL_CORE_CREATE_BACKUP:
|
||||
case MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_CREATE:
|
||||
case MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE:
|
||||
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:
|
||||
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SAVESTATE];
|
||||
case MENU_ENUM_LABEL_LOAD_STATE:
|
||||
case MENU_ENUM_LABEL_CORE_RESTORE_BACKUP_LIST:
|
||||
@ -1692,7 +1695,6 @@ static uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone,
|
||||
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_REMAP_FILE_SAVE_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];
|
||||
@ -1707,7 +1709,6 @@ static uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone,
|
||||
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_REMAP_FILE_SAVE_CORE:
|
||||
case MENU_ENUM_LABEL_SET_CORE_ASSOCIATION:
|
||||
case MENU_ENUM_LABEL_CORE_INFORMATION:
|
||||
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CORE];
|
||||
@ -1819,9 +1820,6 @@ static uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone,
|
||||
case MENU_ENUM_LABEL_QUICK_MENU_STOP_STREAMING:
|
||||
case MENU_ENUM_LABEL_QUICK_MENU_STOP_RECORDING:
|
||||
case MENU_ENUM_LABEL_CHEAT_DELETE_ALL:
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CORE:
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME:
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CONTENT_DIR:
|
||||
case MENU_ENUM_LABEL_CORE_DELETE:
|
||||
case MENU_ENUM_LABEL_DELETE_PLAYLIST:
|
||||
case MENU_ENUM_LABEL_CORE_DELETE_BACKUP_LIST:
|
||||
@ -1829,6 +1827,9 @@ static uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone,
|
||||
case MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN_REMOVE:
|
||||
case MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_REMOVE:
|
||||
case MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE:
|
||||
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:
|
||||
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CLOSE];
|
||||
case MENU_ENUM_LABEL_CORE_OPTIONS_RESET:
|
||||
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_UNDO];
|
||||
@ -1869,7 +1870,6 @@ static uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone,
|
||||
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_REMAP_FILE_SAVE_CONTENT_DIR:
|
||||
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];
|
||||
@ -2020,6 +2020,7 @@ static uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone,
|
||||
else
|
||||
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CORE_OPTIONS];
|
||||
case MENU_SETTING_ACTION_CORE_OPTION_OVERRIDE_LIST:
|
||||
case MENU_SETTING_ACTION_REMAP_FILE_MANAGER_LIST:
|
||||
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SETTING];
|
||||
case MENU_SETTING_ACTION_CORE_INPUT_REMAPPING_OPTIONS:
|
||||
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_REMAPPING_OPTIONS];
|
||||
|
@ -2565,6 +2565,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
|
||||
case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE:
|
||||
return xmb->textures.list[XMB_TEXTURE_CORE_OPTIONS];
|
||||
case MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST:
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_MANAGER_LIST:
|
||||
return xmb->textures.list[XMB_TEXTURE_SETTING];
|
||||
case MENU_ENUM_LABEL_ADD_TO_FAVORITES:
|
||||
case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST:
|
||||
@ -2595,6 +2596,9 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
|
||||
case MENU_ENUM_LABEL_CORE_CREATE_BACKUP:
|
||||
case MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_CREATE:
|
||||
case MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE:
|
||||
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:
|
||||
return xmb->textures.list[XMB_TEXTURE_SAVESTATE];
|
||||
case MENU_ENUM_LABEL_LOAD_STATE:
|
||||
case MENU_ENUM_LABEL_CONFIGURATIONS:
|
||||
@ -2630,7 +2634,6 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
|
||||
case MENU_ENUM_LABEL_DIRECTORY_SETTINGS:
|
||||
case MENU_ENUM_LABEL_SCAN_DIRECTORY:
|
||||
case MENU_ENUM_LABEL_MANUAL_CONTENT_SCAN_LIST:
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR:
|
||||
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" */
|
||||
@ -2667,7 +2670,6 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
|
||||
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_REMAP_FILE_SAVE_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];
|
||||
@ -2682,7 +2684,6 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
|
||||
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_REMAP_FILE_SAVE_CORE:
|
||||
case MENU_ENUM_LABEL_SET_CORE_ASSOCIATION:
|
||||
case MENU_ENUM_LABEL_CORE_INFORMATION:
|
||||
return xmb->textures.list[XMB_TEXTURE_CORE];
|
||||
@ -2790,9 +2791,6 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
|
||||
case MENU_ENUM_LABEL_QUICK_MENU_STOP_STREAMING:
|
||||
case MENU_ENUM_LABEL_QUICK_MENU_STOP_RECORDING:
|
||||
case MENU_ENUM_LABEL_CHEAT_DELETE_ALL:
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CORE:
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME:
|
||||
case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CONTENT_DIR:
|
||||
case MENU_ENUM_LABEL_CORE_DELETE:
|
||||
case MENU_ENUM_LABEL_DELETE_PLAYLIST:
|
||||
case MENU_ENUM_LABEL_CORE_DELETE_BACKUP_LIST:
|
||||
@ -2800,6 +2798,9 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
|
||||
case MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN_REMOVE:
|
||||
case MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_REMOVE:
|
||||
case MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE:
|
||||
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:
|
||||
return xmb->textures.list[XMB_TEXTURE_CLOSE];
|
||||
case MENU_ENUM_LABEL_CORE_OPTIONS_RESET:
|
||||
return xmb->textures.list[XMB_TEXTURE_UNDO];
|
||||
|
@ -218,7 +218,8 @@ enum
|
||||
ACTION_OK_DL_CORE_RESTORE_BACKUP_LIST,
|
||||
ACTION_OK_DL_CORE_DELETE_BACKUP_LIST,
|
||||
ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST,
|
||||
ACTION_OK_DL_CORE_OPTIONS_LIST
|
||||
ACTION_OK_DL_CORE_OPTIONS_LIST,
|
||||
ACTION_OK_DL_REMAP_FILE_MANAGER_LIST
|
||||
};
|
||||
|
||||
/* Function callbacks */
|
||||
|
@ -1294,6 +1294,106 @@ end:
|
||||
return count;
|
||||
}
|
||||
|
||||
static unsigned menu_displaylist_parse_remap_file_manager_list(
|
||||
menu_displaylist_info_t *info, settings_t *settings)
|
||||
{
|
||||
unsigned count = 0;
|
||||
bool has_content = !string_is_empty(path_get(RARCH_PATH_CONTENT));
|
||||
bool core_remap_active = retroarch_ctl(RARCH_CTL_IS_REMAPS_CORE_ACTIVE, NULL);
|
||||
bool content_dir_remap_active = retroarch_ctl(RARCH_CTL_IS_REMAPS_CONTENT_DIR_ACTIVE, NULL);
|
||||
bool game_remap_active = retroarch_ctl(RARCH_CTL_IS_REMAPS_GAME_ACTIVE, NULL);
|
||||
|
||||
/* Sanity check - cannot handle remap files
|
||||
* unless a valid core is running */
|
||||
if (!retroarch_ctl(RARCH_CTL_CORE_IS_RUNNING, NULL) ||
|
||||
retroarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL))
|
||||
goto end;
|
||||
|
||||
/* Show currently 'active' remap file */
|
||||
if (menu_entries_append_enum(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_INFO),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_INFO),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_INFO,
|
||||
MENU_SETTINGS_CORE_INFO_NONE, 0, 0))
|
||||
count++;
|
||||
|
||||
/* Load remap file */
|
||||
if (menu_entries_append_enum(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_LOAD),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_LOAD,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_LOAD, 0, 0))
|
||||
count++;
|
||||
|
||||
/* Save remap files */
|
||||
if (has_content &&
|
||||
!game_remap_active &&
|
||||
menu_entries_append_enum(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_SAVE_GAME, 0, 0))
|
||||
count++;
|
||||
|
||||
if (has_content &&
|
||||
!game_remap_active &&
|
||||
!content_dir_remap_active &&
|
||||
menu_entries_append_enum(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CONTENT_DIR),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_SAVE_CONTENT_DIR, 0, 0))
|
||||
count++;
|
||||
|
||||
if (!game_remap_active &&
|
||||
!content_dir_remap_active &&
|
||||
!core_remap_active &&
|
||||
menu_entries_append_enum(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_SAVE_CORE, 0, 0))
|
||||
count++;
|
||||
|
||||
/* Remove remap files */
|
||||
if (has_content &&
|
||||
game_remap_active &&
|
||||
menu_entries_append_enum(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_GAME),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_REMOVE_GAME, 0, 0))
|
||||
count++;
|
||||
|
||||
if (has_content &&
|
||||
content_dir_remap_active &&
|
||||
menu_entries_append_enum(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CONTENT_DIR),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CONTENT_DIR),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CONTENT_DIR,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_REMOVE_CONTENT_DIR, 0, 0))
|
||||
count++;
|
||||
|
||||
if (core_remap_active &&
|
||||
menu_entries_append_enum(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CORE),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CORE),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CORE,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_REMOVE_CORE, 0, 0))
|
||||
count++;
|
||||
end:
|
||||
/* Fallback */
|
||||
if (count == 0)
|
||||
if (menu_entries_append_enum(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY),
|
||||
MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY,
|
||||
FILE_TYPE_NONE, 0, 0))
|
||||
count++;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static unsigned menu_displaylist_parse_supported_cores(menu_displaylist_info_t *info,
|
||||
settings_t *settings, const char *content_path,
|
||||
enum msg_hash_enums core_enum_label,
|
||||
@ -6574,56 +6674,12 @@ unsigned menu_displaylist_build_list(
|
||||
unsigned max_users = settings->uints.input_max_users;
|
||||
|
||||
#ifdef HAVE_CONFIGFILE
|
||||
bool has_content = !string_is_empty(path_get(RARCH_PATH_CONTENT));
|
||||
|
||||
if (menu_entries_append_enum(list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_LOAD),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_LOAD,
|
||||
MENU_SETTING_ACTION, 0, 0))
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_MANAGER_LIST),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_MANAGER_LIST),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_MANAGER_LIST,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_MANAGER_LIST, 0, 0))
|
||||
count++;
|
||||
if (menu_entries_append_enum(list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE,
|
||||
MENU_SETTING_ACTION, 0, 0))
|
||||
count++;
|
||||
if (has_content && menu_entries_append_enum(list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CONTENT_DIR),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_SAVE_CONTENT_DIR,
|
||||
MENU_SETTING_ACTION, 0, 0))
|
||||
count++;
|
||||
if (has_content && menu_entries_append_enum(list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME,
|
||||
MENU_SETTING_ACTION, 0, 0))
|
||||
count++;
|
||||
|
||||
if (retroarch_ctl(RARCH_CTL_IS_REMAPS_CORE_ACTIVE, NULL))
|
||||
if (menu_entries_append_enum(list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CORE),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CORE),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CORE,
|
||||
MENU_SETTING_ACTION, 0, 0))
|
||||
count++;
|
||||
|
||||
if (has_content && retroarch_ctl(RARCH_CTL_IS_REMAPS_GAME_ACTIVE, NULL))
|
||||
if (menu_entries_append_enum(list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_GAME),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME,
|
||||
MENU_SETTING_ACTION, 0, 0))
|
||||
count++;
|
||||
|
||||
if (has_content && retroarch_ctl(RARCH_CTL_IS_REMAPS_CONTENT_DIR_ACTIVE, NULL))
|
||||
if (menu_entries_append_enum(list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CONTENT_DIR),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CONTENT_DIR),
|
||||
MENU_ENUM_LABEL_REMAP_FILE_REMOVE_CONTENT_DIR,
|
||||
MENU_SETTING_ACTION, 0, 0))
|
||||
count++;
|
||||
#endif
|
||||
if (menu_entries_append_enum(list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_FIRE_SETTINGS),
|
||||
@ -12277,6 +12333,29 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
|
||||
info->need_push = true;
|
||||
}
|
||||
break;
|
||||
case DISPLAYLIST_REMAP_FILE_MANAGER:
|
||||
{
|
||||
/* The number of items in the remap file manager
|
||||
* list will vary depending upon which remap type
|
||||
* is currently active (if any).
|
||||
* To prevent the menu selection from going out
|
||||
* of bounds, we therefore have to check that the
|
||||
* current selection index is less than the current
|
||||
* number of menu entries - if not, we reset the
|
||||
* navigation pointer */
|
||||
size_t selection = menu_navigation_get_selection();
|
||||
|
||||
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
|
||||
count = menu_displaylist_parse_remap_file_manager_list(info, settings);
|
||||
|
||||
if (selection >= count)
|
||||
{
|
||||
info->need_refresh = true;
|
||||
info->need_navigation_clear = true;
|
||||
}
|
||||
info->need_push = true;
|
||||
}
|
||||
break;
|
||||
case DISPLAYLIST_ARCHIVE_ACTION:
|
||||
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
|
||||
#ifdef HAVE_COMPRESSION
|
||||
|
@ -128,6 +128,7 @@ enum menu_displaylist_ctl_state
|
||||
DISPLAYLIST_AUDIO_FILTERS,
|
||||
DISPLAYLIST_VIDEO_FILTERS,
|
||||
DISPLAYLIST_CHEAT_FILES,
|
||||
DISPLAYLIST_REMAP_FILE_MANAGER,
|
||||
DISPLAYLIST_REMAP_FILES,
|
||||
DISPLAYLIST_RECORD_CONFIG_FILES,
|
||||
DISPLAYLIST_STREAM_CONFIG_FILES,
|
||||
|
@ -129,6 +129,7 @@ enum menu_settings_type
|
||||
MENU_SETTING_ACTION_CORE_OPTIONS,
|
||||
MENU_SETTING_ACTION_CORE_OPTION_OVERRIDE_LIST,
|
||||
MENU_SETTING_ACTION_CORE_INPUT_REMAPPING_OPTIONS,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_MANAGER_LIST,
|
||||
MENU_SETTING_ACTION_CORE_CHEAT_OPTIONS,
|
||||
MENU_SETTING_ACTION_CORE_MANAGER_OPTIONS,
|
||||
#ifdef HAVE_MIST
|
||||
@ -275,6 +276,14 @@ enum menu_settings_type
|
||||
MENU_SETTING_ACTION_CORE_OPTIONS_RESET,
|
||||
MENU_SETTING_ACTION_CORE_OPTIONS_FLUSH,
|
||||
|
||||
MENU_SETTING_ACTION_REMAP_FILE_LOAD,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_SAVE_CORE,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_SAVE_CONTENT_DIR,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_SAVE_GAME,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_REMOVE_CORE,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_REMOVE_CONTENT_DIR,
|
||||
MENU_SETTING_ACTION_REMAP_FILE_REMOVE_GAME,
|
||||
|
||||
MENU_SETTING_ACTION_CONTENTLESS_CORE_RUN,
|
||||
|
||||
MENU_SETTINGS_LAST
|
||||
|
@ -1515,6 +1515,7 @@ enum msg_hash_enums
|
||||
#ifdef HAVE_LAKKA
|
||||
MENU_ENUM_LABEL_DEFERRED_EJECT_DISC,
|
||||
#endif
|
||||
MENU_ENUM_LABEL_DEFERRED_REMAP_FILE_MANAGER_LIST,
|
||||
MENU_ENUM_LABEL_DEFERRED_REMAPPINGS_PORT_LIST,
|
||||
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST,
|
||||
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_SPECIAL,
|
||||
@ -2438,7 +2439,6 @@ enum msg_hash_enums
|
||||
MENU_LABEL(VIDEO_SHADER_PRESET),
|
||||
MENU_LABEL(CHEAT_FILE_LOAD),
|
||||
MENU_LABEL(CHEAT_FILE_LOAD_APPEND),
|
||||
MENU_LABEL(REMAP_FILE_LOAD),
|
||||
|
||||
MENU_ENUM_LABEL_MESSAGE,
|
||||
MENU_ENUM_LABEL_INFO_SCREEN,
|
||||
@ -2588,12 +2588,16 @@ enum msg_hash_enums
|
||||
MENU_ENUM_LABEL_EXIT_EMULATOR,
|
||||
MENU_ENUM_LABEL_OSK_ENABLE,
|
||||
|
||||
MENU_LABEL(REMAP_FILE_MANAGER_LIST),
|
||||
MENU_LABEL(REMAP_FILE_INFO),
|
||||
MENU_LABEL(REMAP_FILE_LOAD),
|
||||
MENU_LABEL(REMAP_FILE_SAVE_CORE),
|
||||
MENU_LABEL(REMAP_FILE_SAVE_CONTENT_DIR),
|
||||
MENU_LABEL(REMAP_FILE_SAVE_GAME),
|
||||
MENU_LABEL(REMAP_FILE_REMOVE_CORE),
|
||||
MENU_LABEL(REMAP_FILE_REMOVE_CONTENT_DIR),
|
||||
MENU_LABEL(REMAP_FILE_REMOVE_GAME),
|
||||
|
||||
MENU_LABEL(RESTART_CONTENT),
|
||||
MENU_LABEL(RESUME),
|
||||
MENU_LABEL(RESUME_CONTENT),
|
||||
|
21
retroarch.c
21
retroarch.c
@ -1927,9 +1927,10 @@ bool command_event(enum event_command cmd, void *data)
|
||||
if ( runloop_st->remaps_core_active
|
||||
|| runloop_st->remaps_content_dir_active
|
||||
|| runloop_st->remaps_game_active
|
||||
|| !string_is_empty(runloop_st->name.remapfile)
|
||||
)
|
||||
{
|
||||
input_remapping_deinit();
|
||||
input_remapping_deinit(true);
|
||||
input_remapping_set_defaults(true);
|
||||
}
|
||||
else
|
||||
@ -5421,9 +5422,10 @@ bool retroarch_main_init(int argc, char *argv[])
|
||||
if ( runloop_st->remaps_core_active
|
||||
|| runloop_st->remaps_content_dir_active
|
||||
|| runloop_st->remaps_game_active
|
||||
|| !string_is_empty(runloop_st->name.remapfile)
|
||||
)
|
||||
{
|
||||
input_remapping_deinit();
|
||||
input_remapping_deinit(false);
|
||||
input_remapping_set_defaults(true);
|
||||
}
|
||||
else
|
||||
@ -5707,17 +5709,25 @@ bool retroarch_ctl(enum rarch_ctl_state state, void *data)
|
||||
case RARCH_CTL_IS_OVERRIDES_ACTIVE:
|
||||
return runloop_st->overrides_active;
|
||||
case RARCH_CTL_SET_REMAPS_CORE_ACTIVE:
|
||||
runloop_st->remaps_core_active = true;
|
||||
/* Only one type of remap can be active
|
||||
* at any one time */
|
||||
runloop_st->remaps_core_active = true;
|
||||
runloop_st->remaps_content_dir_active = false;
|
||||
runloop_st->remaps_game_active = false;
|
||||
break;
|
||||
case RARCH_CTL_IS_REMAPS_CORE_ACTIVE:
|
||||
return runloop_st->remaps_core_active;
|
||||
case RARCH_CTL_SET_REMAPS_GAME_ACTIVE:
|
||||
runloop_st->remaps_game_active = true;
|
||||
runloop_st->remaps_core_active = false;
|
||||
runloop_st->remaps_content_dir_active = false;
|
||||
runloop_st->remaps_game_active = true;
|
||||
break;
|
||||
case RARCH_CTL_IS_REMAPS_GAME_ACTIVE:
|
||||
return runloop_st->remaps_game_active;
|
||||
case RARCH_CTL_SET_REMAPS_CONTENT_DIR_ACTIVE:
|
||||
runloop_st->remaps_core_active = false;
|
||||
runloop_st->remaps_content_dir_active = true;
|
||||
runloop_st->remaps_game_active = false;
|
||||
break;
|
||||
case RARCH_CTL_IS_REMAPS_CONTENT_DIR_ACTIVE:
|
||||
return runloop_st->remaps_content_dir_active;
|
||||
@ -6053,9 +6063,10 @@ bool retroarch_main_quit(void)
|
||||
if ( runloop_st->remaps_core_active
|
||||
|| runloop_st->remaps_content_dir_active
|
||||
|| runloop_st->remaps_game_active
|
||||
|| !string_is_empty(runloop_st->name.remapfile)
|
||||
)
|
||||
{
|
||||
input_remapping_deinit();
|
||||
input_remapping_deinit(true);
|
||||
input_remapping_set_defaults(true);
|
||||
}
|
||||
else
|
||||
|
26
runloop.c
26
runloop.c
@ -1930,9 +1930,10 @@ bool runloop_environment_cb(unsigned cmd, void *data)
|
||||
if ( runloop_st->remaps_core_active
|
||||
|| runloop_st->remaps_content_dir_active
|
||||
|| runloop_st->remaps_game_active
|
||||
|| !string_is_empty(runloop_st->name.remapfile)
|
||||
)
|
||||
{
|
||||
input_remapping_deinit();
|
||||
input_remapping_deinit(true);
|
||||
input_remapping_set_defaults(true);
|
||||
}
|
||||
else
|
||||
@ -5022,6 +5023,18 @@ void runloop_event_deinit_core(void)
|
||||
runloop_st->fastmotion_override.pending = false;
|
||||
}
|
||||
|
||||
if ( runloop_st->remaps_core_active
|
||||
|| runloop_st->remaps_content_dir_active
|
||||
|| runloop_st->remaps_game_active
|
||||
|| !string_is_empty(runloop_st->name.remapfile)
|
||||
)
|
||||
{
|
||||
input_remapping_deinit(true);
|
||||
input_remapping_set_defaults(true);
|
||||
}
|
||||
else
|
||||
input_remapping_restore_global_config(true);
|
||||
|
||||
RARCH_LOG("[Core]: Unloading core symbols..\n");
|
||||
uninit_libretro_symbols(&runloop_st->current_core);
|
||||
runloop_st->current_core.symbols_inited = false;
|
||||
@ -5048,17 +5061,6 @@ void runloop_event_deinit_core(void)
|
||||
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
|
||||
runloop_st->runtime_shader_preset_path[0] = '\0';
|
||||
#endif
|
||||
|
||||
if ( runloop_st->remaps_core_active
|
||||
|| runloop_st->remaps_content_dir_active
|
||||
|| runloop_st->remaps_game_active
|
||||
)
|
||||
{
|
||||
input_remapping_deinit();
|
||||
input_remapping_set_defaults(true);
|
||||
}
|
||||
else
|
||||
input_remapping_restore_global_config(true);
|
||||
}
|
||||
|
||||
static void runloop_path_init_savefile_internal(void)
|
||||
|
Loading…
Reference in New Issue
Block a user