/* RetroArch - A frontend for libretro.
* Copyright (C) 2011-2015 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see .
*/
#include
#include "../menu.h"
#include "../menu_cbs.h"
#include "../menu_display.h"
#include "../menu_setting.h"
#include "../menu_entry.h"
#include "../menu_shader.h"
#include "../menu_navigation.h"
#include "../menu_hash.h"
#include "../../general.h"
#include "../../retroarch.h"
#include "../../runloop_data.h"
#include "../../input/input_remapping.h"
#include "../../system.h"
/* FIXME - Global variables, refactor */
char detect_content_path[PATH_MAX_LENGTH];
unsigned rdb_entry_start_game_selection_ptr;
size_t hack_shader_pass = 0;
#ifdef HAVE_NETWORKING
char core_updater_path[PATH_MAX_LENGTH];
#endif
static int menu_action_setting_set_current_string_path(
rarch_setting_t *setting, const char *dir, const char *path)
{
char s[PATH_MAX_LENGTH] = {0};
fill_pathname_join(s, dir, path, sizeof(s));
setting_set_with_string_representation(setting, s);
return menu_setting_generic(setting, false);
}
static int rarch_defer_core_wrapper(menu_displaylist_info_t *info,
size_t idx, size_t entry_idx, const char *path, uint32_t hash_label,
bool is_carchive)
{
const char *menu_path = NULL;
const char *menu_label = NULL;
int ret = 0;
menu_handle_t *menu = menu_driver_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
settings_t *settings = config_get_ptr();
global_t *global = global_get_ptr();
if (!menu)
return -1;
menu_list_get_last_stack(menu_list,
&menu_path, &menu_label, NULL, NULL);
ret = rarch_defer_core(global->core_info,
menu_path, path, menu_label, menu->deferred_path,
sizeof(menu->deferred_path));
if (!is_carchive)
fill_pathname_join(detect_content_path, menu_path, path,
sizeof(detect_content_path));
switch (ret)
{
case -1:
switch (hash_label)
{
case MENU_LABEL_COLLECTION:
info->list = menu_list->menu_stack;
info->type = 0;
info->directory_ptr = idx;
rdb_entry_start_game_selection_ptr = idx;
strlcpy(info->path, settings->libretro_directory, sizeof(info->path));
strlcpy(info->label,
menu_hash_to_str(MENU_LABEL_DEFERRED_CORE_LIST_SET), sizeof(info->label));
ret = menu_displaylist_push_list(info, DISPLAYLIST_GENERIC);
break;
default:
event_command(EVENT_CMD_LOAD_CORE);
menu_common_load_content(false, CORE_TYPE_PLAIN);
ret = -1;
break;
}
break;
case 0:
info->list = menu_list->menu_stack;
info->type = 0;
info->directory_ptr = idx;
strlcpy(info->path, settings->libretro_directory, sizeof(info->path));
switch (hash_label)
{
case MENU_LABEL_COLLECTION:
rdb_entry_start_game_selection_ptr = idx;
strlcpy(info->label,
menu_hash_to_str(MENU_LABEL_DEFERRED_CORE_LIST_SET), sizeof(info->label));
break;
default:
strlcpy(info->label,
menu_hash_to_str(MENU_LABEL_DEFERRED_CORE_LIST), sizeof(info->label));
break;
}
ret = menu_displaylist_push_list(info, DISPLAYLIST_GENERIC);
break;
}
return ret;
}
static int action_ok_file_load_with_detect_core_carchive(
const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
uint32_t hash_label = menu_hash_calculate(label);
fill_pathname_join_delim(detect_content_path, detect_content_path, path,
'#', sizeof(detect_content_path));
return rarch_defer_core_wrapper(&info, idx, entry_idx, path, hash_label, true);
}
static int action_ok_file_load_with_detect_core(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
uint32_t hash_label = menu_hash_calculate(label);
return rarch_defer_core_wrapper(&info, idx, entry_idx, path, hash_label, false);
}
static int action_ok_file_load_detect_core(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
settings_t *settings = config_get_ptr();
global_t *global = global_get_ptr();
strlcpy(global->fullpath, detect_content_path, sizeof(global->fullpath));
strlcpy(settings->libretro, path, sizeof(settings->libretro));
event_command(EVENT_CMD_LOAD_CORE);
menu_common_load_content(false, CORE_TYPE_PLAIN);
return -1;
}
static int action_ok_playlist_entry(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
uint32_t core_name_hash, core_path_hash;
const char *entry_path = NULL;
const char *entry_label = NULL;
const char *core_path = NULL;
const char *core_name = NULL;
size_t selection_ptr = 0;
content_playlist_t *playlist = g_defaults.history;
menu_handle_t *menu = menu_driver_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
uint32_t hash_label = menu_hash_calculate(label);
if (!menu)
return -1;
switch (hash_label)
{
case MENU_LABEL_COLLECTION:
case MENU_LABEL_RDB_ENTRY_START_CONTENT:
if (!menu->playlist)
{
menu->playlist = content_playlist_init(menu->db_playlist_file, 1000);
if (!menu->playlist)
return -1;
}
playlist = menu->playlist;
break;
}
selection_ptr = entry_idx;
switch (hash_label)
{
case MENU_LABEL_RDB_ENTRY_START_CONTENT:
selection_ptr = rdb_entry_start_game_selection_ptr;
break;
}
content_playlist_get_index(playlist, selection_ptr,
&entry_path, &entry_label, &core_path, &core_name, NULL, NULL);
#if 0
RARCH_LOG("path: %s, label: %s, core path: %s, core name: %s, idx: %d\n", entry_path, entry_label,
core_path, core_name, selection_ptr);
#endif
core_path_hash = core_path ? menu_hash_calculate(core_path) : 0;
core_name_hash = core_name ? menu_hash_calculate(core_name) : 0;
if (
(core_path_hash == MENU_VALUE_DETECT) &&
(core_name_hash == MENU_VALUE_DETECT)
)
return action_ok_file_load_with_detect_core(entry_path, label, type, selection_ptr, entry_idx);
rarch_playlist_load_content(playlist, selection_ptr);
switch (hash_label)
{
case MENU_LABEL_COLLECTION:
case MENU_LABEL_RDB_ENTRY_START_CONTENT:
menu_list_pop_stack(menu_list);
break;
default:
menu_list_flush_stack(menu_list, NULL, MENU_SETTINGS);
break;
}
menu_common_push_content_settings();
return -1;
}
static int action_ok_cheat_apply_changes(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
global_t *global = global_get_ptr();
cheat_manager_t *cheat = global->cheat;
if (!cheat)
return -1;
cheat_manager_apply_cheats(cheat);
return 0;
}
static int action_ok_shader_pass_load(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
const char *menu_path = NULL;
menu_handle_t *menu = menu_driver_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu || !menu_list)
return -1;
(void)menu_path;
(void)menu_list;
#ifdef HAVE_SHADER_MANAGER
menu_list_get_last_stack(menu_list, &menu_path, NULL,
NULL, NULL);
fill_pathname_join(menu->shader->pass[hack_shader_pass].source.path,
menu_path, path,
sizeof(menu->shader->pass[hack_shader_pass].source.path));
/* This will reset any changed parameters. */
video_shader_resolve_parameters(NULL, menu->shader);
menu_list_flush_stack(menu_list,
menu_hash_to_str(MENU_LABEL_SHADER_OPTIONS), 0);
return 0;
#else
return -1;
#endif
}
#ifdef HAVE_SHADER_MANAGER
extern size_t hack_shader_pass;
#endif
static int action_ok_shader_pass(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_handle_t *menu = menu_driver_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
settings_t *settings = config_get_ptr();
hack_shader_pass = type - MENU_SETTINGS_SHADER_PASS_0;
if (!menu || !menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, settings->video.shader_dir, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_shader_parameters(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_handle_t *menu = menu_driver_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu || !menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = MENU_SETTING_ACTION;
info.directory_ptr = idx;
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_push_generic_list(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_handle_t *menu = menu_driver_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu || !menu_list)
return -1;
if (path)
strlcpy(menu->deferred_path, path,
sizeof(menu->deferred_path));
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_push_default(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, label, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_shader_preset(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_handle_t *menu = menu_driver_get_ptr();
settings_t *settings = config_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu)
return -1;
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, settings->video.shader_dir, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_push_content_list(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
settings_t *settings = config_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = MENU_FILE_DIRECTORY;
info.directory_ptr = idx;
strlcpy(info.path, settings->menu_content_directory, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_disk_image_append_list(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
settings_t *settings = config_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, settings->menu_content_directory, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_configurations_list(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
settings_t *settings = config_get_ptr();
const char *dir = settings->menu_config_directory;
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
if (dir)
strlcpy(info.path, dir, sizeof(info.path));
else
strlcpy(info.path, label, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_cheat_file(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
settings_t *settings = config_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, settings->cheat_database, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_audio_dsp_plugin(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
settings_t *settings = config_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = 0;
info.directory_ptr = idx;
strlcpy(info.path, settings->audio.filter_dir, sizeof(info.path));
strlcpy(info.label,
menu_hash_to_str(MENU_LABEL_AUDIO_DSP_PLUGIN), sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_core_updater_list(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
char url_path[PATH_MAX_LENGTH] = {0};
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
settings_t *settings = config_get_ptr();
if (!menu_list)
return -1;
(void)url_path;
menu_entries_set_nonblocking_refresh();
if (settings->network.buildbot_url[0] == '\0')
return -1;
#ifdef HAVE_NETWORKING
event_command(EVENT_CMD_NETWORK_INIT);
fill_pathname_join(url_path, settings->network.buildbot_url,
".index", sizeof(url_path));
rarch_main_data_msg_queue_push(DATA_TYPE_HTTP, url_path, "cb_core_updater_list", 0, 1,
true);
#endif
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, path, sizeof(info.path));
strlcpy(info.label,
menu_hash_to_str(MENU_LABEL_DEFERRED_CORE_UPDATER_LIST), sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_remap_file(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
settings_t *settings = config_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, settings->input_remapping_directory, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_record_configfile(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
global_t *global = global_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, global->record.config_dir, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_playlist_collection(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, path, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_content_collection_list(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
settings_t *settings = config_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, settings->playlist_directory, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_core_list(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
settings_t *settings = config_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, settings->libretro_directory, sizeof(info.path));
strlcpy(info.label, label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_record_configfile_load(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
const char *menu_path = NULL;
global_t *global = global_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!global || !menu_list)
return -1;
menu_list_get_last_stack(menu_list, &menu_path, NULL,
NULL, NULL);
fill_pathname_join(global->record.config, menu_path, path, sizeof(global->record.config));
menu_list_flush_stack(menu_list, menu_hash_to_str(MENU_LABEL_VALUE_RECORDING_SETTINGS), 0);
return 0;
}
static int action_ok_remap_file_load(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
const char *menu_path = NULL;
char remap_path[PATH_MAX_LENGTH] = {0};
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
(void)remap_path;
(void)menu_path;
menu_list_get_last_stack(menu_list, &menu_path, NULL,
NULL, NULL);
fill_pathname_join(remap_path, menu_path, path, sizeof(remap_path));
input_remapping_load_file(remap_path);
menu_list_flush_stack(menu_list,
menu_hash_to_str(MENU_LABEL_CORE_INPUT_REMAPPING_OPTIONS), 0);
return 0;
}
static int action_ok_cheat_file_load(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
const char *menu_path = NULL;
char cheat_path[PATH_MAX_LENGTH] = {0};
menu_list_t *menu_list = menu_list_get_ptr();
global_t *global = global_get_ptr();
(void)cheat_path;
(void)menu_path;
menu_list_get_last_stack(menu_list, &menu_path, NULL,
NULL, NULL);
fill_pathname_join(cheat_path, menu_path, path, sizeof(cheat_path));
if (global->cheat)
cheat_manager_free(global->cheat);
global->cheat = cheat_manager_load(cheat_path);
if (!global->cheat)
return -1;
menu_list_flush_stack(menu_list,
menu_hash_to_str(MENU_LABEL_CORE_CHEAT_OPTIONS), 0);
return 0;
}
static int action_ok_menu_wallpaper_load(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
char wallpaper_path[PATH_MAX_LENGTH] = {0};
const char *menu_label = NULL;
const char *menu_path = NULL;
rarch_setting_t *setting = NULL;
menu_list_t *menu_list = menu_list_get_ptr();
settings_t *settings = config_get_ptr();
if (!menu_list)
return -1;
menu_list_get_last_stack(menu_list, &menu_path, &menu_label,
NULL, NULL);
setting = menu_setting_find(menu_label);
if (!setting)
return -1;
fill_pathname_join(wallpaper_path, menu_path, path, sizeof(wallpaper_path));
if (path_file_exists(wallpaper_path))
{
strlcpy(settings->menu.wallpaper, wallpaper_path, sizeof(settings->menu.wallpaper));
rarch_main_data_msg_queue_push(DATA_TYPE_IMAGE, wallpaper_path, "cb_menu_wallpaper", 0, 1,
true);
}
menu_list_pop_stack_by_needle(menu_list, setting->name);
return 0;
}
static int action_ok_shader_preset_load(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
const char *menu_path = NULL;
char shader_path[PATH_MAX_LENGTH] = {0};
menu_handle_t *menu = menu_driver_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu || !menu_list)
return -1;
(void)shader_path;
(void)menu_path;
(void)menu_list;
#ifdef HAVE_SHADER_MANAGER
menu_list_get_last_stack(menu_list, &menu_path, NULL,
NULL, NULL);
fill_pathname_join(shader_path, menu_path, path, sizeof(shader_path));
menu_shader_manager_set_preset(menu->shader,
video_shader_parse_type(shader_path, RARCH_SHADER_NONE),
shader_path);
menu_list_flush_stack(menu_list,
menu_hash_to_str(MENU_LABEL_SHADER_OPTIONS), 0);
return 0;
#else
return -1;
#endif
}
static int action_ok_cheat(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_input_key_start_line("Input Cheat",
label, type, idx, menu_input_st_cheat_callback);
return 0;
}
static int action_ok_shader_preset_save_as(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_input_key_start_line("Preset Filename",
label, type, idx, menu_input_st_string_callback);
return 0;
}
static int action_ok_cheat_file_save_as(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_input_key_start_line("Cheat Filename",
label, type, idx, menu_input_st_string_callback);
return 0;
}
static int action_ok_remap_file_save_as(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_input_key_start_line("Remapping Filename",
label, type, idx, menu_input_st_string_callback);
return 0;
}
static int action_ok_remap_file_save_core(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
char directory[PATH_MAX_LENGTH] = {0};
char file[PATH_MAX_LENGTH] = {0};
settings_t *settings = config_get_ptr();
rarch_system_info_t *info = rarch_system_info_get_ptr();
const char *core_name = info ? info->info.library_name : NULL;
fill_pathname_join(directory,settings->input_remapping_directory,core_name,PATH_MAX_LENGTH);
fill_pathname_join(file,core_name,core_name,PATH_MAX_LENGTH);
if(!path_file_exists(directory))
path_mkdir(directory);
if(input_remapping_save_file(file))
rarch_main_msg_queue_push("Remap file saved successfully", 1, 100, true);
else
rarch_main_msg_queue_push("Error saving remap file", 1, 100, true);
return 0;
}
static int action_ok_remap_file_save_game(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
char directory[PATH_MAX_LENGTH] = {0};
char file[PATH_MAX_LENGTH] = {0};
global_t *global = global_get_ptr();
settings_t *settings = config_get_ptr();
rarch_system_info_t *info = rarch_system_info_get_ptr();
const char *core_name = info ? info->info.library_name : NULL;
const char *game_name = global ? path_basename(global->basename) : NULL;
fill_pathname_join(directory,settings->input_remapping_directory,core_name,PATH_MAX_LENGTH);
fill_pathname_join(file,core_name,game_name,PATH_MAX_LENGTH);
if(!path_file_exists(directory))
path_mkdir(directory);
if(input_remapping_save_file(file))
rarch_main_msg_queue_push("Remap file saved successfully", 1, 100, true);
else
rarch_main_msg_queue_push("Error saving remap file", 1, 100, true);
return 0;
}
static int action_ok_path_use_directory(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return menu_entry_pathdir_set_value(0, NULL);
}
static int action_ok_core_deferred_set(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
char core_display_name[PATH_MAX_LENGTH] = {0};
menu_handle_t *menu = menu_driver_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu || !menu_list)
return -1;
rarch_assert(menu->playlist != NULL);
core_info_get_name(path, core_display_name, sizeof(core_display_name));
idx = rdb_entry_start_game_selection_ptr;
content_playlist_update(menu->playlist, idx,
menu->playlist->entries[idx].path, menu->playlist->entries[idx].label,
path , core_display_name,
menu->playlist->entries[idx].crc32,
menu->playlist->entries[idx].db_name);
content_playlist_write_file(menu->playlist);
menu_list_pop_stack(menu_list);
return -1;
}
static int action_ok_core_load_deferred(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_handle_t *menu = menu_driver_get_ptr();
settings_t *settings = config_get_ptr();
global_t *global = global_get_ptr();
if (!menu)
return -1;
if (path)
strlcpy(settings->libretro, path, sizeof(settings->libretro));
strlcpy(global->fullpath, menu->deferred_path,
sizeof(global->fullpath));
menu_common_load_content(false, CORE_TYPE_PLAIN);
return -1;
}
static int action_ok_database_manager_list_deferred(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return 0;
}
static int action_ok_rdb_entry(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
char tmp[PATH_MAX_LENGTH] = {0};
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
fill_pathname_join_delim(tmp, menu_hash_to_str(MENU_LABEL_DEFERRED_RDB_ENTRY_DETAIL),
path, '|', sizeof(tmp));
info.list = menu_list->menu_stack;
info.type = 0;
info.directory_ptr = idx;
strlcpy(info.path, label, sizeof(info.path));
strlcpy(info.label, tmp, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_cursor_manager_list_deferred(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return 0;
}
static int action_ok_core_load(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
const char *menu_path = NULL;
menu_handle_t *menu = menu_driver_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
settings_t *settings = config_get_ptr();
global_t *global = global_get_ptr();
if (!menu || !menu_list)
return -1;
(void)global;
menu_list_get_last_stack(menu_list,
&menu_path, NULL, NULL, NULL);
fill_pathname_join(settings->libretro, menu_path, path,
sizeof(settings->libretro));
event_command(EVENT_CMD_LOAD_CORE);
menu_list_pop_stack(menu_list);
#if defined(HAVE_DYNAMIC)
/* No content needed for this core, load core immediately. */
if (menu->load_no_content && settings->core.set_supports_no_game_enable)
{
*global->fullpath = '\0';
menu_common_load_content(false, CORE_TYPE_PLAIN);
return -1;
}
return 0;
/* Core selection on non-console just updates directory listing.
* Will take effect on new content load. */
#elif defined(RARCH_CONSOLE)
event_command(EVENT_CMD_RESTART_RETROARCH);
return -1;
#endif
}
static int action_ok_core_download(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return 0;
}
static int action_ok_compressed_archive_push(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.directory_ptr = idx;
strlcpy(info.path, path, sizeof(info.path));
strlcpy(info.label,
menu_hash_to_str(MENU_LABEL_LOAD_OPEN_ZIP), sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_INFO);
}
static int action_ok_directory_push(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
const char *menu_path = NULL;
const char *menu_label = NULL;
char cat_path[PATH_MAX_LENGTH] = {0};
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list || !path)
return -1;
menu_list_get_last_stack(menu_list,
&menu_path, &menu_label, NULL, NULL);
fill_pathname_join(cat_path, menu_path, path, sizeof(cat_path));
info.list = menu_list->menu_stack;
info.type = type;
info.directory_ptr = idx;
strlcpy(info.path, cat_path, sizeof(info.path));
strlcpy(info.label, menu_label, sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_database_manager_list(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
char rdb_path[PATH_MAX_LENGTH] = {0};
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
settings_t *settings = config_get_ptr();
if (!menu_list || !path || !label)
return -1;
fill_pathname_join(rdb_path, settings->content_database,
path, sizeof(rdb_path));
info.list = menu_list->menu_stack;
info.type = 0;
info.directory_ptr = idx;
strlcpy(info.path, rdb_path, sizeof(info.path));
strlcpy(info.label,
menu_hash_to_str(MENU_LABEL_DEFERRED_DATABASE_MANAGER_LIST),
sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_cursor_manager_list(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
char cursor_path[PATH_MAX_LENGTH] = {0};
menu_displaylist_info_t info = {0};
settings_t *settings = config_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
fill_pathname_join(cursor_path, settings->cursor_directory,
path, sizeof(cursor_path));
info.list = menu_list->menu_stack;
info.type = 0;
info.directory_ptr = idx;
strlcpy(info.path, cursor_path, sizeof(info.path));
strlcpy(info.label,
menu_hash_to_str(MENU_LABEL_DEFERRED_CURSOR_MANAGER_LIST),
sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
}
static int action_ok_config_load(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
const char *menu_path = NULL;
char config[PATH_MAX_LENGTH] = {0};
menu_navigation_t *nav = menu_navigation_get_ptr();
menu_handle_t *menu = menu_driver_get_ptr();
menu_display_t *disp = menu_display_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu || !menu_list)
return -1;
menu_list_get_last_stack(menu_list, &menu_path, NULL, NULL, NULL);
fill_pathname_join(config, menu_path, path, sizeof(config));
menu_list_flush_stack(menu_list, NULL, MENU_SETTINGS);
disp->msg_force = true;
if (rarch_replace_config(config))
{
menu_navigation_clear(nav, false);
return -1;
}
return 0;
}
static int action_ok_disk_image_append(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
char image[PATH_MAX_LENGTH] = {0};
const char *menu_path = NULL;
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
menu_list_get_last_stack(menu_list, &menu_path, NULL, NULL, NULL);
fill_pathname_join(image, menu_path, path, sizeof(image));
event_disk_control_append_image(image);
event_command(EVENT_CMD_RESUME);
menu_list_flush_stack(menu_list, NULL, MENU_SETTINGS);
return -1;
}
#ifdef HAVE_FFMPEG
static int action_ok_file_load_ffmpeg(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
const char *menu_path = NULL;
global_t *global = global_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
menu_list_get_last(menu_list->menu_stack,
&menu_path, NULL, NULL, NULL);
fill_pathname_join(global->fullpath, menu_path, path,
sizeof(global->fullpath));
menu_common_load_content(true, CORE_TYPE_FFMPEG);
return 0;
}
#endif
static int action_ok_file_load_imageviewer(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
const char *menu_path = NULL;
global_t *global = global_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
menu_list_get_last(menu_list->menu_stack,
&menu_path, NULL, NULL, NULL);
fill_pathname_join(global->fullpath, menu_path, path,
sizeof(global->fullpath));
menu_common_load_content(true, CORE_TYPE_IMAGEVIEWER);
return 0;
}
static int action_ok_file_load(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
const char *menu_label = NULL;
const char *menu_path = NULL;
rarch_setting_t *setting = NULL;
global_t *global = global_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
menu_list_get_last(menu_list->menu_stack,
&menu_path, &menu_label, NULL, NULL);
setting = menu_setting_find(menu_label);
if (setting && setting->type == ST_PATH)
{
menu_action_setting_set_current_string_path(setting, menu_path, path);
menu_list_pop_stack_by_needle(menu_list, setting->name);
}
else
{
if (type == MENU_FILE_IN_CARCHIVE)
fill_pathname_join_delim(global->fullpath, menu_path, path,
'#',sizeof(global->fullpath));
else
fill_pathname_join(global->fullpath, menu_path, path,
sizeof(global->fullpath));
menu_common_load_content(true, CORE_TYPE_PLAIN);
return -1;
}
return 0;
}
static int action_ok_set_path(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
const char *menu_path = NULL;
const char *menu_label = NULL;
rarch_setting_t *setting = NULL;
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
menu_list_get_last_stack(menu_list,
&menu_path, &menu_label, NULL, NULL);
RARCH_LOG("menu_label: %s\n", menu_label);
setting = menu_setting_find(menu_label);
if (!setting)
return -1;
menu_action_setting_set_current_string_path(setting, menu_path, path);
RARCH_LOG("setting name: %s\n", setting->name);
menu_list_pop_stack_by_needle(menu_list, setting->name);
return 0;
}
static int action_ok_custom_viewport(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
int ret = 0;
video_viewport_t *custom = video_viewport_get_custom();
settings_t *settings = config_get_ptr();
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
info.type = MENU_SETTINGS_CUSTOM_VIEWPORT;
info.directory_ptr = idx;
strlcpy(info.label, menu_hash_to_str(MENU_LABEL_CUSTOM_VIEWPORT_1), sizeof(info.label));
ret = menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
video_driver_viewport_info(custom);
aspectratio_lut[ASPECT_RATIO_CUSTOM].value =
(float)custom->width / custom->height;
settings->video.aspect_ratio_idx = ASPECT_RATIO_CUSTOM;
event_command(EVENT_CMD_VIDEO_SET_ASPECT_RATIO);
return ret;
}
static int generic_action_ok_command(enum event_command cmd)
{
if (!event_command(cmd))
return -1;
return 0;
}
static int action_ok_load_state(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
if (generic_action_ok_command(EVENT_CMD_LOAD_STATE) == -1)
return -1;
return generic_action_ok_command(EVENT_CMD_RESUME);
}
static int action_ok_save_state(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
if (generic_action_ok_command(EVENT_CMD_SAVE_STATE) == -1)
return -1;
return generic_action_ok_command(EVENT_CMD_RESUME);
}
#ifdef HAVE_NETWORKING
static int action_ok_download_generic(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx,
const char *type_msg)
{
char s[PATH_MAX_LENGTH] = {0};
char s2[PATH_MAX_LENGTH] = {0};
settings_t *settings = config_get_ptr();
fill_pathname_join(s, settings->network.buildbot_assets_url,
"frontend", sizeof(s));
if (!strcmp(type_msg, "cb_update_assets"))
path = "assets.zip";
else if (!strcmp(type_msg, "cb_update_autoconfig_profiles"))
path = "autoconf.zip";
else if (!strcmp(type_msg, "cb_update_cheats"))
path = "cheats.zip";
else if (!strcmp(type_msg, "cb_update_overlays"))
path = "overlays.zip";
else if (!strcmp(type_msg, "cb_update_databases"))
path = "database-rdb.zip";
else if (!strcmp(type_msg, "cb_update_shaders_glsl"))
path = "shaders_glsl.zip";
else if (!strcmp(type_msg, "cb_update_shaders_cg"))
path = "shaders_cg.zip";
else
strlcpy(s, settings->network.buildbot_url, sizeof(s));
fill_pathname_join(s, s, path, sizeof(s));
strlcpy(core_updater_path, path, sizeof(core_updater_path));
snprintf(s2, sizeof(s2),
"%s %s.",
menu_hash_to_str(MENU_LABEL_VALUE_STARTING_DOWNLOAD),
path);
rarch_main_msg_queue_push(s2, 1, 90, true);
rarch_main_data_msg_queue_push(DATA_TYPE_HTTP, s,
type_msg, 0, 1, true);
return 0;
}
#endif
static int action_ok_core_updater_download(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
#ifdef HAVE_NETWORKING
action_ok_download_generic(path, label, type, idx, entry_idx,
"cb_core_updater_download");
#endif
return 0;
}
static int action_ok_update_assets(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
#ifdef HAVE_NETWORKING
action_ok_download_generic(path, label, type, idx, entry_idx,
"cb_update_assets");
#endif
return 0;
}
static int action_ok_update_overlays(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
#ifdef HAVE_NETWORKING
action_ok_download_generic(path, label, type, idx, entry_idx,
"cb_update_overlays");
#endif
return 0;
}
static int action_ok_update_shaders_cg(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
#ifdef HAVE_NETWORKING
action_ok_download_generic(path, label, type, idx, entry_idx,
"cb_update_shaders_cg");
#endif
return 0;
}
static int action_ok_update_shaders_glsl(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
#ifdef HAVE_NETWORKING
action_ok_download_generic(path, label, type, idx, entry_idx,
"cb_update_shaders_glsl");
#endif
return 0;
}
static int action_ok_update_databases(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
#ifdef HAVE_NETWORKING
action_ok_download_generic(path, label, type, idx, entry_idx,
"cb_update_databases");
#endif
return 0;
}
static int action_ok_update_cheats(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
#ifdef HAVE_NETWORKING
action_ok_download_generic(path, label, type, idx, entry_idx,
"cb_update_cheats");
#endif
return 0;
}
static int action_ok_update_autoconfig_profiles(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
#ifdef HAVE_NETWORKING
action_ok_download_generic(path, label, type, idx, entry_idx,
"cb_update_autoconfig_profiles");
#endif
return 0;
}
static int action_ok_disk_cycle_tray_status(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return generic_action_ok_command(EVENT_CMD_DISK_EJECT_TOGGLE);
}
static int action_ok_close_content(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
int ret = generic_action_ok_command(EVENT_CMD_UNLOAD_CORE);
return ret;
}
static int action_ok_quit(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return generic_action_ok_command(EVENT_CMD_QUIT);
}
static int action_ok_save_new_config(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return generic_action_ok_command(EVENT_CMD_MENU_SAVE_CONFIG);
}
static int action_ok_resume_content(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return generic_action_ok_command(EVENT_CMD_RESUME);
}
static int action_ok_restart_content(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return generic_action_ok_command(EVENT_CMD_RESET);
}
static int action_ok_screenshot(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return generic_action_ok_command(EVENT_CMD_TAKE_SCREENSHOT);
}
static int action_ok_file_load_or_resume(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_handle_t *menu = menu_driver_get_ptr();
global_t *global = global_get_ptr();
if (!menu)
return -1;
if (!strcmp(menu->deferred_path, global->fullpath))
return generic_action_ok_command(EVENT_CMD_RESUME);
else
{
strlcpy(global->fullpath,
menu->deferred_path, sizeof(global->fullpath));
event_command(EVENT_CMD_LOAD_CORE);
rarch_main_set_state(RARCH_ACTION_STATE_LOAD_CONTENT);
return -1;
}
}
static int action_ok_shader_apply_changes(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return generic_action_ok_command(EVENT_CMD_SHADERS_APPLY_CHANGES);
}
static int action_ok_lookup_setting(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
return menu_setting_set(type, label, MENU_ACTION_OK, false);
}
static int action_ok_rdb_entry_submenu(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
int ret;
union string_list_elem_attr attr;
char new_label[PATH_MAX_LENGTH] = {0};
menu_displaylist_info_t info = {0};
char *rdb = NULL;
int len = 0;
struct string_list *str_list = NULL;
struct string_list *str_list2 = NULL;
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list || !label)
return -1;
str_list = string_split(label, "|");
if (!str_list)
return -1;
str_list2 = string_list_new();
if (!str_list2)
{
string_list_free(str_list);
return -1;
}
/* element 0 : label
* element 1 : value
* element 2 : database path
*/
attr.i = 0;
len += strlen(str_list->elems[1].data) + 1;
string_list_append(str_list2, str_list->elems[1].data, attr);
len += strlen(str_list->elems[2].data) + 1;
string_list_append(str_list2, str_list->elems[2].data, attr);
rdb = (char*)calloc(len, sizeof(char));
if (!rdb)
{
string_list_free(str_list);
string_list_free(str_list2);
return -1;
}
string_list_join_concat(rdb, len, str_list2, "|");
fill_pathname_join_delim(new_label,
menu_hash_to_str(MENU_LABEL_DEFERRED_CURSOR_MANAGER_LIST),
str_list->elems[0].data, '_',
sizeof(new_label));
info.list = menu_list->menu_stack;
info.type = 0;
info.directory_ptr = idx;
strlcpy(info.path, rdb, sizeof(info.path));
strlcpy(info.label, new_label, sizeof(info.label));
ret = menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC);
string_list_free(str_list);
string_list_free(str_list2);
return ret;
}
static int action_ok_help(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
menu_displaylist_info_t info = {0};
menu_list_t *menu_list = menu_list_get_ptr();
if (!menu_list)
return -1;
info.list = menu_list->menu_stack;
strlcpy(info.label,
menu_hash_to_str(MENU_LABEL_HELP),
sizeof(info.label));
return menu_displaylist_push_list(&info, DISPLAYLIST_HELP);
}
static int action_ok_video_resolution(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
unsigned width = 0, height = 0;
global_t *global = global_get_ptr();
(void)global;
(void)width;
(void)height;
#ifdef __CELLOS_LV2__
if (global->console.screen.resolutions.list[
global->console.screen.resolutions.current.idx] ==
CELL_VIDEO_OUT_RESOLUTION_576)
{
if (global->console.screen.pal_enable)
global->console.screen.pal60_enable = true;
}
else
{
global->console.screen.pal_enable = false;
global->console.screen.pal60_enable = false;
}
event_command(EVENT_CMD_REINIT);
#else
if (video_driver_get_video_output_size(&width, &height))
video_driver_set_video_mode(width, height, true);
#endif
return 0;
}
static int is_rdb_entry(uint32_t label_hash)
{
switch (label_hash)
{
case MENU_LABEL_RDB_ENTRY_PUBLISHER:
case MENU_LABEL_RDB_ENTRY_DEVELOPER:
case MENU_LABEL_RDB_ENTRY_ORIGIN:
case MENU_LABEL_RDB_ENTRY_FRANCHISE:
case MENU_LABEL_RDB_ENTRY_ENHANCEMENT_HW:
case MENU_LABEL_RDB_ENTRY_ESRB_RATING:
case MENU_LABEL_RDB_ENTRY_BBFC_RATING:
case MENU_LABEL_RDB_ENTRY_ELSPA_RATING:
case MENU_LABEL_RDB_ENTRY_PEGI_RATING:
case MENU_LABEL_RDB_ENTRY_CERO_RATING:
case MENU_LABEL_RDB_ENTRY_EDGE_MAGAZINE_RATING:
case MENU_LABEL_RDB_ENTRY_EDGE_MAGAZINE_ISSUE:
case MENU_LABEL_RDB_ENTRY_FAMITSU_MAGAZINE_RATING:
case MENU_LABEL_RDB_ENTRY_RELEASE_MONTH:
case MENU_LABEL_RDB_ENTRY_RELEASE_YEAR:
case MENU_LABEL_RDB_ENTRY_MAX_USERS:
break;
default:
return -1;
}
return 0;
}
static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs,
const char *label, uint32_t hash, const char *elem0)
{
rarch_setting_t *setting = menu_setting_find(label);
uint32_t elem0_hash = menu_hash_calculate(elem0);
if (elem0[0] != '\0' && (is_rdb_entry(elem0_hash) == 0))
{
cbs->action_ok = action_ok_rdb_entry_submenu;
return 0;
}
if (setting && setting->browser_selection_type == ST_DIR)
{
cbs->action_ok = action_ok_push_generic_list;
return 0;
}
switch (hash)
{
case MENU_LABEL_CUSTOM_BIND_ALL:
cbs->action_ok = action_ok_lookup_setting;
break;
case MENU_LABEL_SAVESTATE:
cbs->action_ok = action_ok_save_state;
break;
case MENU_LABEL_LOADSTATE:
cbs->action_ok = action_ok_load_state;
break;
case MENU_LABEL_RESUME_CONTENT:
cbs->action_ok = action_ok_resume_content;
break;
case MENU_LABEL_RESTART_CONTENT:
cbs->action_ok = action_ok_restart_content;
break;
case MENU_LABEL_TAKE_SCREENSHOT:
cbs->action_ok = action_ok_screenshot;
break;
case MENU_LABEL_FILE_LOAD_OR_RESUME:
cbs->action_ok = action_ok_file_load_or_resume;
break;
case MENU_LABEL_QUIT_RETROARCH:
cbs->action_ok = action_ok_quit;
break;
case MENU_LABEL_CLOSE_CONTENT:
cbs->action_ok = action_ok_close_content;
break;
case MENU_LABEL_SAVE_NEW_CONFIG:
cbs->action_ok = action_ok_save_new_config;
break;
case MENU_LABEL_HELP:
cbs->action_ok = action_ok_help;
break;
case MENU_LABEL_VIDEO_SHADER_PASS:
cbs->action_ok = action_ok_shader_pass;
break;
case MENU_LABEL_VIDEO_SHADER_PRESET:
cbs->action_ok = action_ok_shader_preset;
break;
case MENU_LABEL_CHEAT_FILE_LOAD:
cbs->action_ok = action_ok_cheat_file;
break;
case MENU_LABEL_AUDIO_DSP_PLUGIN:
cbs->action_ok = action_ok_audio_dsp_plugin;
break;
case MENU_LABEL_REMAP_FILE_LOAD:
cbs->action_ok = action_ok_remap_file;
break;
case MENU_LABEL_RECORD_CONFIG:
cbs->action_ok = action_ok_record_configfile;
break;
case MENU_LABEL_VALUE_CORE_UPDATER_LIST:
cbs->action_ok = action_ok_core_updater_list;
break;
case MENU_LABEL_VIDEO_SHADER_PARAMETERS:
case MENU_LABEL_VIDEO_SHADER_PRESET_PARAMETERS:
cbs->action_ok = action_ok_shader_parameters;
break;
case MENU_LABEL_SHADER_OPTIONS:
case MENU_VALUE_INPUT_SETTINGS:
case MENU_LABEL_CORE_OPTIONS:
case MENU_LABEL_CORE_CHEAT_OPTIONS:
case MENU_LABEL_CORE_INPUT_REMAPPING_OPTIONS:
case MENU_LABEL_CORE_INFORMATION:
case MENU_LABEL_SYSTEM_INFORMATION:
case MENU_LABEL_DISK_OPTIONS:
case MENU_LABEL_SETTINGS:
case MENU_LABEL_FRONTEND_COUNTERS:
case MENU_LABEL_CORE_COUNTERS:
case MENU_LABEL_MANAGEMENT:
case MENU_LABEL_ONLINE_UPDATER:
case MENU_LABEL_LOAD_CONTENT_LIST:
case MENU_LABEL_INFORMATION_LIST:
case MENU_LABEL_CONTENT_SETTINGS:
cbs->action_ok = action_ok_push_default;
break;
case MENU_LABEL_LOAD_CONTENT:
case MENU_LABEL_DETECT_CORE_LIST:
cbs->action_ok = action_ok_push_content_list;
break;
case MENU_LABEL_DETECT_CORE_LIST_OK:
cbs->action_ok = action_ok_file_load_detect_core;
break;
case MENU_LABEL_LOAD_CONTENT_HISTORY:
case MENU_LABEL_CURSOR_MANAGER_LIST:
case MENU_LABEL_DATABASE_MANAGER_LIST:
cbs->action_ok = action_ok_push_generic_list;
break;
case MENU_LABEL_SHADER_APPLY_CHANGES:
cbs->action_ok = action_ok_shader_apply_changes;
break;
case MENU_LABEL_CHEAT_APPLY_CHANGES:
cbs->action_ok = action_ok_cheat_apply_changes;
break;
case MENU_LABEL_VIDEO_SHADER_PRESET_SAVE_AS:
cbs->action_ok = action_ok_shader_preset_save_as;
break;
case MENU_LABEL_CHEAT_FILE_SAVE_AS:
cbs->action_ok = action_ok_cheat_file_save_as;
break;
case MENU_LABEL_REMAP_FILE_SAVE_AS:
cbs->action_ok = action_ok_remap_file_save_as;
break;
case MENU_LABEL_REMAP_FILE_SAVE_CORE:
cbs->action_ok = action_ok_remap_file_save_core;
break;
case MENU_LABEL_REMAP_FILE_SAVE_GAME:
cbs->action_ok = action_ok_remap_file_save_game;
break;
case MENU_LABEL_CONTENT_COLLECTION_LIST:
cbs->action_ok = action_ok_content_collection_list;
break;
case MENU_LABEL_CORE_LIST:
cbs->action_ok = action_ok_core_list;
break;
case MENU_LABEL_DISK_IMAGE_APPEND:
cbs->action_ok = action_ok_disk_image_append_list;
break;
case MENU_LABEL_CONFIGURATIONS:
cbs->action_ok = action_ok_configurations_list;
break;
case MENU_LABEL_CUSTOM_RATIO:
cbs->action_ok = action_ok_custom_viewport;
break;
case MENU_LABEL_SCREEN_RESOLUTION:
cbs->action_ok = action_ok_video_resolution;
break;
case MENU_LABEL_UPDATE_ASSETS:
cbs->action_ok = action_ok_update_assets;
break;
case MENU_LABEL_UPDATE_OVERLAYS:
cbs->action_ok = action_ok_update_overlays;
break;
case MENU_LABEL_UPDATE_DATABASES:
cbs->action_ok = action_ok_update_databases;
break;
case MENU_LABEL_UPDATE_GLSL_SHADERS:
cbs->action_ok = action_ok_update_shaders_glsl;
break;
case MENU_LABEL_UPDATE_CG_SHADERS:
cbs->action_ok = action_ok_update_shaders_cg;
break;
case MENU_LABEL_UPDATE_CHEATS:
cbs->action_ok = action_ok_update_cheats;
break;
case MENU_LABEL_UPDATE_AUTOCONFIG_PROFILES:
cbs->action_ok = action_ok_update_autoconfig_profiles;
break;
default:
return -1;
}
return 0;
}
static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs,
uint32_t label_hash, uint32_t menu_label_hash, unsigned type)
{
if (type == MENU_SETTINGS_CUSTOM_BIND_KEYBOARD ||
type == MENU_SETTINGS_CUSTOM_BIND)
cbs->action_ok = action_ok_lookup_setting;
else if (type >= MENU_SETTINGS_SHADER_PARAMETER_0
&& type <= MENU_SETTINGS_SHADER_PARAMETER_LAST)
cbs->action_ok = NULL;
else if (type >= MENU_SETTINGS_SHADER_PRESET_PARAMETER_0
&& type <= MENU_SETTINGS_SHADER_PRESET_PARAMETER_LAST)
cbs->action_ok = NULL;
else if (type >= MENU_SETTINGS_CHEAT_BEGIN
&& type <= MENU_SETTINGS_CHEAT_END)
cbs->action_ok = action_ok_cheat;
else
{
switch (type)
{
case MENU_SETTING_ACTION_CORE_DISK_OPTIONS:
cbs->action_ok = action_ok_push_default;
break;
case MENU_FILE_PLAYLIST_ENTRY:
cbs->action_ok = action_ok_playlist_entry;
break;
case MENU_FILE_PLAYLIST_COLLECTION:
cbs->action_ok = action_ok_playlist_collection;
break;
case MENU_FILE_CONTENTLIST_ENTRY:
cbs->action_ok = action_ok_push_generic_list;
break;
case MENU_FILE_CHEAT:
cbs->action_ok = action_ok_cheat_file_load;
break;
case MENU_FILE_RECORD_CONFIG:
cbs->action_ok = action_ok_record_configfile_load;
break;
case MENU_FILE_REMAP:
cbs->action_ok = action_ok_remap_file_load;
break;
case MENU_FILE_SHADER_PRESET:
cbs->action_ok = action_ok_shader_preset_load;
break;
case MENU_FILE_SHADER:
cbs->action_ok = action_ok_shader_pass_load;
break;
case MENU_FILE_IMAGE:
cbs->action_ok = action_ok_menu_wallpaper_load;
break;
case MENU_FILE_USE_DIRECTORY:
cbs->action_ok = action_ok_path_use_directory;
break;
case MENU_FILE_CONFIG:
cbs->action_ok = action_ok_config_load;
break;
case MENU_FILE_DIRECTORY:
cbs->action_ok = action_ok_directory_push;
break;
case MENU_FILE_CARCHIVE:
cbs->action_ok = action_ok_compressed_archive_push;
break;
case MENU_FILE_CORE:
switch (menu_label_hash)
{
case MENU_LABEL_DEFERRED_CORE_LIST:
cbs->action_ok = action_ok_core_load_deferred;
break;
case MENU_LABEL_DEFERRED_CORE_LIST_SET:
cbs->action_ok = action_ok_core_deferred_set;
break;
case MENU_LABEL_CORE_LIST:
cbs->action_ok = action_ok_core_load;
break;
case MENU_LABEL_CORE_UPDATER_LIST:
cbs->action_ok = action_ok_core_download;
break;
}
break;
case MENU_FILE_DOWNLOAD_CORE:
cbs->action_ok = action_ok_core_updater_download;
break;
case MENU_FILE_DOWNLOAD_CORE_INFO:
break;
case MENU_FILE_RDB:
switch (menu_label_hash)
{
case MENU_LABEL_DEFERRED_DATABASE_MANAGER_LIST:
cbs->action_ok = action_ok_database_manager_list_deferred;
break;
case MENU_LABEL_DATABASE_MANAGER_LIST:
case MENU_VALUE_HORIZONTAL_MENU:
cbs->action_ok = action_ok_database_manager_list;
break;
}
break;
case MENU_FILE_RDB_ENTRY:
cbs->action_ok = action_ok_rdb_entry;
break;
case MENU_FILE_CURSOR:
switch (menu_label_hash)
{
case MENU_LABEL_DEFERRED_DATABASE_MANAGER_LIST:
cbs->action_ok = action_ok_cursor_manager_list_deferred;
break;
case MENU_LABEL_CURSOR_MANAGER_LIST:
cbs->action_ok = action_ok_cursor_manager_list;
break;
}
break;
case MENU_FILE_FONT:
case MENU_FILE_OVERLAY:
case MENU_FILE_AUDIOFILTER:
case MENU_FILE_VIDEOFILTER:
cbs->action_ok = action_ok_set_path;
break;
#ifdef HAVE_COMPRESSION
case MENU_FILE_IN_CARCHIVE:
#endif
case MENU_FILE_PLAIN:
switch (menu_label_hash)
{
case MENU_LABEL_DETECT_CORE_LIST:
#ifdef HAVE_COMPRESSION
if (type == MENU_FILE_IN_CARCHIVE)
cbs->action_ok = action_ok_file_load_with_detect_core_carchive;
else
#endif
cbs->action_ok = action_ok_file_load_with_detect_core;
break;
case MENU_LABEL_DISK_IMAGE_APPEND:
cbs->action_ok = action_ok_disk_image_append;
break;
default:
cbs->action_ok = action_ok_file_load;
break;
}
break;
case MENU_FILE_MOVIE:
case MENU_FILE_MUSIC:
#ifdef HAVE_FFMPEG
cbs->action_ok = action_ok_file_load_ffmpeg;
#endif
break;
case MENU_FILE_IMAGEVIEWER:
cbs->action_ok = action_ok_file_load_imageviewer;
break;
case MENU_SETTINGS:
case MENU_SETTING_GROUP:
case MENU_SETTING_SUBGROUP:
cbs->action_ok = action_ok_push_default;
break;
case MENU_SETTINGS_CORE_DISK_OPTIONS_DISK_CYCLE_TRAY_STATUS:
cbs->action_ok = action_ok_disk_cycle_tray_status;
break;
default:
return -1;
}
}
return 0;
}
int menu_cbs_init_bind_ok(menu_file_list_cbs_t *cbs,
const char *path, const char *label, unsigned type, size_t idx,
const char *elem0, const char *elem1, const char *menu_label,
uint32_t label_hash, uint32_t menu_label_hash)
{
if (!cbs)
return -1;
cbs->action_ok = action_ok_lookup_setting;
if (menu_cbs_init_bind_ok_compare_label(cbs, label, label_hash, elem0) == 0)
return 0;
if (menu_cbs_init_bind_ok_compare_type(cbs, label_hash, menu_label_hash, type) == 0)
return 0;
return -1;
}