mirror of
https://github.com/libretro/RetroArch
synced 2025-03-25 16:44:01 +00:00
Initial implementation of remap binds feature
This commit is contained in:
parent
12c7147f8f
commit
6fb51eb360
@ -361,8 +361,8 @@ struct settings
|
|||||||
char joypad_driver[32];
|
char joypad_driver[32];
|
||||||
char keyboard_layout[64];
|
char keyboard_layout[64];
|
||||||
|
|
||||||
|
unsigned remap_ids[MAX_USERS][RARCH_BIND_LIST_END];
|
||||||
struct retro_keybind binds[MAX_USERS][RARCH_BIND_LIST_END];
|
struct retro_keybind binds[MAX_USERS][RARCH_BIND_LIST_END];
|
||||||
struct retro_keybind remap_binds[MAX_USERS][RARCH_BIND_LIST_END];
|
|
||||||
struct retro_keybind autoconf_binds[MAX_USERS][RARCH_BIND_LIST_END];
|
struct retro_keybind autoconf_binds[MAX_USERS][RARCH_BIND_LIST_END];
|
||||||
|
|
||||||
unsigned max_users;
|
unsigned max_users;
|
||||||
@ -374,6 +374,7 @@ struct settings
|
|||||||
unsigned libretro_device[MAX_USERS];
|
unsigned libretro_device[MAX_USERS];
|
||||||
unsigned analog_dpad_mode[MAX_USERS];
|
unsigned analog_dpad_mode[MAX_USERS];
|
||||||
|
|
||||||
|
bool remap_binds_enable;
|
||||||
float axis_threshold;
|
float axis_threshold;
|
||||||
unsigned joypad_map[MAX_USERS];
|
unsigned joypad_map[MAX_USERS];
|
||||||
unsigned device[MAX_USERS];
|
unsigned device[MAX_USERS];
|
||||||
|
@ -266,23 +266,13 @@ static bool input_apply_turbo(unsigned port, unsigned id, bool res)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int16_t input_state(unsigned port, unsigned device,
|
static int16_t input_state(unsigned port, unsigned device,
|
||||||
unsigned idx, unsigned id)
|
unsigned idx, unsigned id)
|
||||||
{
|
{
|
||||||
int16_t res = 0;
|
int16_t res = 0;
|
||||||
|
|
||||||
device &= RETRO_DEVICE_MASK;
|
static const struct retro_keybind *libretro_input_binds[MAX_USERS] = {
|
||||||
|
|
||||||
if (g_extern.bsv.movie && g_extern.bsv.movie_playback)
|
|
||||||
{
|
|
||||||
int16_t ret;
|
|
||||||
if (bsv_movie_get_input(g_extern.bsv.movie, &ret))
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
g_extern.bsv.movie_end = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct retro_keybind *binds[MAX_USERS] = {
|
|
||||||
g_settings.input.binds[0],
|
g_settings.input.binds[0],
|
||||||
g_settings.input.binds[1],
|
g_settings.input.binds[1],
|
||||||
g_settings.input.binds[2],
|
g_settings.input.binds[2],
|
||||||
@ -301,10 +291,26 @@ static int16_t input_state(unsigned port, unsigned device,
|
|||||||
g_settings.input.binds[15],
|
g_settings.input.binds[15],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
device &= RETRO_DEVICE_MASK;
|
||||||
|
|
||||||
|
if (g_extern.bsv.movie && g_extern.bsv.movie_playback)
|
||||||
|
{
|
||||||
|
int16_t ret;
|
||||||
|
if (bsv_movie_get_input(g_extern.bsv.movie, &ret))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
g_extern.bsv.movie_end = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_settings.input.remap_binds_enable)
|
||||||
|
{
|
||||||
|
id = g_settings.input.remap_ids[port][id];
|
||||||
|
}
|
||||||
|
|
||||||
if (!driver.block_libretro_input)
|
if (!driver.block_libretro_input)
|
||||||
{
|
{
|
||||||
if (((id < RARCH_FIRST_META_KEY) || (device == RETRO_DEVICE_KEYBOARD)))
|
if (((id < RARCH_FIRST_META_KEY) || (device == RETRO_DEVICE_KEYBOARD)))
|
||||||
res = driver.input->input_state(driver.input_data, binds, port,
|
res = driver.input->input_state(driver.input_data, libretro_input_binds, port,
|
||||||
device, idx, id);
|
device, idx, id);
|
||||||
|
|
||||||
#ifdef HAVE_OVERLAY
|
#ifdef HAVE_OVERLAY
|
||||||
|
@ -150,7 +150,7 @@ typedef enum
|
|||||||
MENU_SETTINGS_CHEAT_BEGIN,
|
MENU_SETTINGS_CHEAT_BEGIN,
|
||||||
MENU_SETTINGS_CHEAT_END = MENU_SETTINGS_CHEAT_BEGIN + (MAX_CHEAT_COUNTERS - 1),
|
MENU_SETTINGS_CHEAT_END = MENU_SETTINGS_CHEAT_BEGIN + (MAX_CHEAT_COUNTERS - 1),
|
||||||
MENU_SETTINGS_INPUT_DESC_BEGIN,
|
MENU_SETTINGS_INPUT_DESC_BEGIN,
|
||||||
MENU_SETTINGS_INPUT_DESC_END = MENU_SETTINGS_INPUT_DESC_BEGIN + (RARCH_MENU_TOGGLE),
|
MENU_SETTINGS_INPUT_DESC_END = MENU_SETTINGS_INPUT_DESC_BEGIN + (MAX_USERS * RARCH_CUSTOM_BIND_LIST_END),
|
||||||
} menu_settings_t;
|
} menu_settings_t;
|
||||||
|
|
||||||
void *menu_init(const void *data);
|
void *menu_init(const void *data);
|
||||||
|
@ -845,12 +845,14 @@ static int action_start_performance_counters_core(unsigned type, const char *lab
|
|||||||
static int action_start_input_desc(unsigned type, const char *label,
|
static int action_start_input_desc(unsigned type, const char *label,
|
||||||
unsigned action)
|
unsigned action)
|
||||||
{
|
{
|
||||||
unsigned offset = type - MENU_SETTINGS_INPUT_DESC_BEGIN;
|
unsigned inp_desc_index_offset = type - MENU_SETTINGS_INPUT_DESC_BEGIN;
|
||||||
|
unsigned inp_desc_user = inp_desc_index_offset / RARCH_FIRST_CUSTOM_BIND;
|
||||||
|
unsigned inp_desc_button_index_offset = inp_desc_index_offset - (inp_desc_user * RARCH_FIRST_CUSTOM_BIND);
|
||||||
|
|
||||||
(void)label;
|
(void)label;
|
||||||
(void)action;
|
(void)action;
|
||||||
|
|
||||||
RARCH_LOG("label is: %s, offset is: %u\n", label, offset);
|
g_settings.input.remap_ids[inp_desc_user][inp_desc_button_index_offset] = g_settings.input.binds[inp_desc_user][inp_desc_button_index_offset].id;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -982,6 +984,28 @@ static int action_toggle_cheat(unsigned type, const char *label,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int action_toggle_input_desc(unsigned type, const char *label,
|
||||||
|
unsigned action)
|
||||||
|
{
|
||||||
|
unsigned inp_desc_index_offset = type - MENU_SETTINGS_INPUT_DESC_BEGIN;
|
||||||
|
unsigned inp_desc_user = inp_desc_index_offset / RARCH_FIRST_CUSTOM_BIND;
|
||||||
|
unsigned inp_desc_button_index_offset = inp_desc_index_offset - (inp_desc_user * RARCH_FIRST_CUSTOM_BIND);
|
||||||
|
|
||||||
|
switch (action)
|
||||||
|
{
|
||||||
|
case MENU_ACTION_LEFT:
|
||||||
|
if (g_settings.input.remap_ids[inp_desc_user][inp_desc_button_index_offset] > 0)
|
||||||
|
g_settings.input.remap_ids[inp_desc_user][inp_desc_button_index_offset]--;
|
||||||
|
break;
|
||||||
|
case MENU_ACTION_RIGHT:
|
||||||
|
if (g_settings.input.remap_ids[inp_desc_user][inp_desc_button_index_offset] < RARCH_FIRST_CUSTOM_BIND)
|
||||||
|
g_settings.input.remap_ids[inp_desc_user][inp_desc_button_index_offset]++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SHADER_MANAGER
|
#ifdef HAVE_SHADER_MANAGER
|
||||||
extern size_t hack_shader_pass;
|
extern size_t hack_shader_pass;
|
||||||
#endif
|
#endif
|
||||||
@ -2030,13 +2054,14 @@ static int deferred_push_core_input_remapping_options(void *data, void *userdata
|
|||||||
for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND; retro_id++)
|
for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND; retro_id++)
|
||||||
{
|
{
|
||||||
char desc_label[64];
|
char desc_label[64];
|
||||||
|
unsigned user = p + 1;
|
||||||
const char *description = g_extern.system.input_desc_btn[p][retro_id];
|
const char *description = g_extern.system.input_desc_btn[p][retro_id];
|
||||||
|
|
||||||
if (!description)
|
if (!description)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
snprintf(desc_label, sizeof(desc_label), "User %u %s : ", p + 1, description);
|
snprintf(desc_label, sizeof(desc_label), "User %u %s : ", user, description);
|
||||||
menu_list_push(list, desc_label, "", MENU_SETTINGS_INPUT_DESC_BEGIN + retro_id, p);
|
menu_list_push(list, desc_label, "", MENU_SETTINGS_INPUT_DESC_BEGIN + (p * RARCH_FIRST_CUSTOM_BIND) + retro_id, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2646,6 +2671,9 @@ static void menu_entries_cbs_init_bind_toggle(menu_file_list_cbs_t *cbs,
|
|||||||
else if (type >= MENU_SETTINGS_CHEAT_BEGIN
|
else if (type >= MENU_SETTINGS_CHEAT_BEGIN
|
||||||
&& type <= MENU_SETTINGS_CHEAT_END)
|
&& type <= MENU_SETTINGS_CHEAT_END)
|
||||||
cbs->action_toggle = action_toggle_cheat;
|
cbs->action_toggle = action_toggle_cheat;
|
||||||
|
else if (type >= MENU_SETTINGS_INPUT_DESC_BEGIN
|
||||||
|
&& type <= MENU_SETTINGS_INPUT_DESC_END)
|
||||||
|
cbs->action_toggle = action_toggle_input_desc;
|
||||||
else if (
|
else if (
|
||||||
!strcmp(label, "core_list") ||
|
!strcmp(label, "core_list") ||
|
||||||
!strcmp(label, "core_manager_list") ||
|
!strcmp(label, "core_manager_list") ||
|
||||||
|
@ -291,6 +291,9 @@
|
|||||||
# Enable or disable the current overlay.
|
# Enable or disable the current overlay.
|
||||||
# input_overlay_enable = true
|
# input_overlay_enable = true
|
||||||
|
|
||||||
|
# If enabled, overrides the input binds with the remapped binds set for the current core.
|
||||||
|
# input_remap_binds_enable = true
|
||||||
|
|
||||||
# Path to input overlay
|
# Path to input overlay
|
||||||
# input_overlay =
|
# input_overlay =
|
||||||
|
|
||||||
|
16
settings.c
16
settings.c
@ -445,20 +445,22 @@ static void config_set_defaults(void)
|
|||||||
g_settings.input.autoconfig_descriptor_label_show = true;
|
g_settings.input.autoconfig_descriptor_label_show = true;
|
||||||
g_settings.input.input_descriptor_label_show = input_descriptor_label_show;
|
g_settings.input.input_descriptor_label_show = input_descriptor_label_show;
|
||||||
g_settings.input.input_descriptor_hide_unbound = input_descriptor_hide_unbound;
|
g_settings.input.input_descriptor_hide_unbound = input_descriptor_hide_unbound;
|
||||||
|
g_settings.input.remap_binds_enable = true;
|
||||||
g_settings.input.max_users = MAX_USERS;
|
g_settings.input.max_users = MAX_USERS;
|
||||||
|
|
||||||
rarch_assert(sizeof(g_settings.input.binds[0]) >= sizeof(retro_keybinds_1));
|
rarch_assert(sizeof(g_settings.input.binds[0]) >= sizeof(retro_keybinds_1));
|
||||||
rarch_assert(sizeof(g_settings.input.binds[1]) >= sizeof(retro_keybinds_rest));
|
rarch_assert(sizeof(g_settings.input.binds[1]) >= sizeof(retro_keybinds_rest));
|
||||||
|
|
||||||
memcpy(g_settings.input.binds[0], retro_keybinds_1, sizeof(retro_keybinds_1));
|
memcpy(g_settings.input.binds[0], retro_keybinds_1, sizeof(retro_keybinds_1));
|
||||||
memcpy(g_settings.input.remap_binds[0], retro_keybinds_1, sizeof(retro_keybinds_1));
|
|
||||||
|
|
||||||
for (i = 1; i < MAX_USERS; i++)
|
for (i = 1; i < MAX_USERS; i++)
|
||||||
{
|
|
||||||
memcpy(g_settings.input.binds[i], retro_keybinds_rest,
|
memcpy(g_settings.input.binds[i], retro_keybinds_rest,
|
||||||
sizeof(retro_keybinds_rest));
|
sizeof(retro_keybinds_rest));
|
||||||
memcpy(g_settings.input.remap_binds[i], retro_keybinds_rest,
|
|
||||||
sizeof(retro_keybinds_rest));
|
for (i = 0; i < MAX_USERS; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < RARCH_BIND_LIST_END; j++)
|
||||||
|
g_settings.input.remap_ids[i][j] = g_settings.input.binds[i][j].id;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < MAX_USERS; i++)
|
for (i = 0; i < MAX_USERS; i++)
|
||||||
@ -478,8 +480,6 @@ static void config_set_defaults(void)
|
|||||||
{
|
{
|
||||||
if (g_settings.input.binds[i][j].valid)
|
if (g_settings.input.binds[i][j].valid)
|
||||||
rarch_assert(j == g_settings.input.binds[i][j].id);
|
rarch_assert(j == g_settings.input.binds[i][j].id);
|
||||||
if (g_settings.input.remap_binds[i][j].valid)
|
|
||||||
rarch_assert(j == g_settings.input.remap_binds[i][j].id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_settings.input.axis_threshold = axis_threshold;
|
g_settings.input.axis_threshold = axis_threshold;
|
||||||
@ -1014,6 +1014,8 @@ static bool config_load_file(const char *path, bool set_defaults)
|
|||||||
if (!strcmp(g_settings.audio.filter_dir, "default"))
|
if (!strcmp(g_settings.audio.filter_dir, "default"))
|
||||||
*g_settings.audio.filter_dir = '\0';
|
*g_settings.audio.filter_dir = '\0';
|
||||||
|
|
||||||
|
CONFIG_GET_BOOL(input.remap_binds_enable,
|
||||||
|
"input_remap_binds_enable");
|
||||||
CONFIG_GET_FLOAT(input.axis_threshold, "input_axis_threshold");
|
CONFIG_GET_FLOAT(input.axis_threshold, "input_axis_threshold");
|
||||||
CONFIG_GET_BOOL(input.netplay_client_swap_input,
|
CONFIG_GET_BOOL(input.netplay_client_swap_input,
|
||||||
"netplay_client_swap_input");
|
"netplay_client_swap_input");
|
||||||
@ -1587,6 +1589,8 @@ bool config_save_file(const char *path)
|
|||||||
config_set_int(conf, "input_max_users", g_settings.input.max_users);
|
config_set_int(conf, "input_max_users", g_settings.input.max_users);
|
||||||
config_set_float(conf, "input_axis_threshold",
|
config_set_float(conf, "input_axis_threshold",
|
||||||
g_settings.input.axis_threshold);
|
g_settings.input.axis_threshold);
|
||||||
|
config_set_bool(conf, "input_remap_binds_enable",
|
||||||
|
g_settings.input.remap_binds_enable);
|
||||||
config_set_bool(conf, "netplay_client_swap_input",
|
config_set_bool(conf, "netplay_client_swap_input",
|
||||||
g_settings.input.netplay_client_swap_input);
|
g_settings.input.netplay_client_swap_input);
|
||||||
config_set_bool(conf, "input_descriptor_label_show",
|
config_set_bool(conf, "input_descriptor_label_show",
|
||||||
|
@ -2404,6 +2404,7 @@ void setting_data_get_label(char *type_str,
|
|||||||
&& type <= MENU_SETTINGS_CHEAT_END)
|
&& type <= MENU_SETTINGS_CHEAT_END)
|
||||||
{
|
{
|
||||||
unsigned cheat_index = type - MENU_SETTINGS_CHEAT_BEGIN;
|
unsigned cheat_index = type - MENU_SETTINGS_CHEAT_BEGIN;
|
||||||
|
|
||||||
if (cheat_index < g_extern.cheat->buf_size)
|
if (cheat_index < g_extern.cheat->buf_size)
|
||||||
snprintf(type_str, type_str_size, "%s : (%s)",
|
snprintf(type_str, type_str_size, "%s : (%s)",
|
||||||
(g_extern.cheat->cheats[cheat_index].code != NULL)
|
(g_extern.cheat->cheats[cheat_index].code != NULL)
|
||||||
@ -2411,6 +2412,17 @@ void setting_data_get_label(char *type_str,
|
|||||||
g_extern.cheat->cheats[cheat_index].state ? "ON" : "OFF"
|
g_extern.cheat->cheats[cheat_index].state ? "ON" : "OFF"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
else if (type >= MENU_SETTINGS_INPUT_DESC_BEGIN
|
||||||
|
&& type <= MENU_SETTINGS_INPUT_DESC_END)
|
||||||
|
{
|
||||||
|
unsigned inp_desc_index_offset = type - MENU_SETTINGS_INPUT_DESC_BEGIN;
|
||||||
|
unsigned inp_desc_user = inp_desc_index_offset / RARCH_FIRST_CUSTOM_BIND;
|
||||||
|
unsigned inp_desc_button_index_offset = inp_desc_index_offset - (inp_desc_user * RARCH_FIRST_CUSTOM_BIND);
|
||||||
|
|
||||||
|
//snprintf(type_str, type_str_size, "user %u, index offset %u", type, inp_desc_user, inp_desc_button_index_offset);
|
||||||
|
unsigned remap_id = g_settings.input.remap_ids[inp_desc_user][inp_desc_button_index_offset];
|
||||||
|
snprintf(type_str, type_str_size, "%s", g_settings.input.binds[inp_desc_user][remap_id].desc);
|
||||||
|
}
|
||||||
else if (type >= MENU_SETTINGS_PERF_COUNTERS_BEGIN
|
else if (type >= MENU_SETTINGS_PERF_COUNTERS_BEGIN
|
||||||
&& type <= MENU_SETTINGS_PERF_COUNTERS_END)
|
&& type <= MENU_SETTINGS_PERF_COUNTERS_END)
|
||||||
menu_common_setting_set_label_perf(type_str, type_str_size, w, type,
|
menu_common_setting_set_label_perf(type_str, type_str_size, w, type,
|
||||||
@ -4303,6 +4315,18 @@ static bool setting_data_append_list_input_options(
|
|||||||
general_read_handler);
|
general_read_handler);
|
||||||
settings_list_current_add_range(list, list_info, 1, MAX_USERS, 1, true, true);
|
settings_list_current_add_range(list, list_info, 1, MAX_USERS, 1, true, true);
|
||||||
|
|
||||||
|
CONFIG_BOOL(
|
||||||
|
g_settings.input.remap_binds_enable,
|
||||||
|
"input_remap_binds_enable",
|
||||||
|
"Remap Binds Enable",
|
||||||
|
true,
|
||||||
|
"OFF",
|
||||||
|
"ON",
|
||||||
|
group_info.name,
|
||||||
|
subgroup_info.name,
|
||||||
|
general_write_handler,
|
||||||
|
general_read_handler);
|
||||||
|
|
||||||
CONFIG_BOOL(
|
CONFIG_BOOL(
|
||||||
g_settings.input.autodetect_enable,
|
g_settings.input.autodetect_enable,
|
||||||
"input_autodetect_enable",
|
"input_autodetect_enable",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user