mirror of
https://github.com/libretro/RetroArch
synced 2025-04-17 02:43:03 +00:00
Merge pull request #12534 from jdgleaver/input-port-remapping
Add support for mapping multiple controllers to a single input device
This commit is contained in:
commit
0a75b51b29
@ -2435,10 +2435,8 @@ void config_set_defaults(void *data)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
input_config_reset();
|
input_config_reset();
|
||||||
#ifdef HAVE_CONFIGFILE
|
|
||||||
input_remapping_deinit();
|
input_remapping_deinit();
|
||||||
input_remapping_set_defaults();
|
input_remapping_set_defaults(false);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Verify that binds are in proper order. */
|
/* Verify that binds are in proper order. */
|
||||||
for (i = 0; i < MAX_USERS; i++)
|
for (i = 0; i < MAX_USERS; i++)
|
||||||
@ -2461,7 +2459,7 @@ void config_set_defaults(void *data)
|
|||||||
|
|
||||||
for (i = 0; i < MAX_USERS; i++)
|
for (i = 0; i < MAX_USERS; i++)
|
||||||
{
|
{
|
||||||
settings->uints.input_joypad_map[i] = i;
|
settings->uints.input_joypad_index[i] = i;
|
||||||
#ifdef SWITCH /* Switch prefered default dpad mode */
|
#ifdef SWITCH /* Switch prefered default dpad mode */
|
||||||
settings->uints.input_analog_dpad_mode[i] = ANALOG_DPAD_LSTICK;
|
settings->uints.input_analog_dpad_mode[i] = ANALOG_DPAD_LSTICK;
|
||||||
#else
|
#else
|
||||||
@ -3196,7 +3194,7 @@ static bool config_load_file(global_t *global,
|
|||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "input_player%u_joypad_index", i + 1);
|
snprintf(buf, sizeof(buf), "input_player%u_joypad_index", i + 1);
|
||||||
CONFIG_GET_INT_BASE(conf, settings, uints.input_joypad_map[i], buf);
|
CONFIG_GET_INT_BASE(conf, settings, uints.input_joypad_index[i], buf);
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "input_player%u_analog_dpad_mode", i + 1);
|
snprintf(buf, sizeof(buf), "input_player%u_analog_dpad_mode", i + 1);
|
||||||
CONFIG_GET_INT_BASE(conf, settings, uints.input_analog_dpad_mode[i], buf);
|
CONFIG_GET_INT_BASE(conf, settings, uints.input_analog_dpad_mode[i], buf);
|
||||||
@ -3856,9 +3854,7 @@ bool config_load_remap(const char *directory_input_remapping,
|
|||||||
FILE_PATH_REMAP_EXTENSION,
|
FILE_PATH_REMAP_EXTENSION,
|
||||||
sizeof(game_path));
|
sizeof(game_path));
|
||||||
|
|
||||||
#ifdef HAVE_CONFIGFILE
|
input_remapping_set_defaults(false);
|
||||||
input_remapping_set_defaults();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If a game remap file exists, load it. */
|
/* If a game remap file exists, load it. */
|
||||||
if ((new_conf = config_file_new_from_path_to_string(game_path)))
|
if ((new_conf = config_file_new_from_path_to_string(game_path)))
|
||||||
@ -4229,7 +4225,7 @@ bool config_save_file(const char *path)
|
|||||||
snprintf(cfg, sizeof(cfg), "input_device_p%u", i + 1);
|
snprintf(cfg, sizeof(cfg), "input_device_p%u", i + 1);
|
||||||
config_set_int(conf, cfg, settings->uints.input_device[i]);
|
config_set_int(conf, cfg, settings->uints.input_device[i]);
|
||||||
snprintf(cfg, sizeof(cfg), "input_player%u_joypad_index", i + 1);
|
snprintf(cfg, sizeof(cfg), "input_player%u_joypad_index", i + 1);
|
||||||
config_set_int(conf, cfg, settings->uints.input_joypad_map[i]);
|
config_set_int(conf, cfg, settings->uints.input_joypad_index[i]);
|
||||||
snprintf(cfg, sizeof(cfg), "input_libretro_device_p%u", i + 1);
|
snprintf(cfg, sizeof(cfg), "input_libretro_device_p%u", i + 1);
|
||||||
config_set_int(conf, cfg, input_config_get_device(i));
|
config_set_int(conf, cfg, input_config_get_device(i));
|
||||||
snprintf(cfg, sizeof(cfg), "input_player%u_analog_dpad_mode", i + 1);
|
snprintf(cfg, sizeof(cfg), "input_player%u_analog_dpad_mode", i + 1);
|
||||||
@ -4492,11 +4488,11 @@ bool config_save_overrides(enum override_type type, void *data)
|
|||||||
config_set_int(conf, cfg, overrides->uints.input_device[i]);
|
config_set_int(conf, cfg, overrides->uints.input_device[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings->uints.input_joypad_map[i]
|
if (settings->uints.input_joypad_index[i]
|
||||||
!= overrides->uints.input_joypad_map[i])
|
!= overrides->uints.input_joypad_index[i])
|
||||||
{
|
{
|
||||||
snprintf(cfg, sizeof(cfg), "input_player%u_joypad_index", i + 1);
|
snprintf(cfg, sizeof(cfg), "input_player%u_joypad_index", i + 1);
|
||||||
config_set_int(conf, cfg, overrides->uints.input_joypad_map[i]);
|
config_set_int(conf, cfg, overrides->uints.input_joypad_index[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4609,7 +4605,7 @@ bool input_remapping_load_file(void *data, const char *path)
|
|||||||
if (!string_is_empty(global->name.remapfile))
|
if (!string_is_empty(global->name.remapfile))
|
||||||
{
|
{
|
||||||
input_remapping_deinit();
|
input_remapping_deinit();
|
||||||
input_remapping_set_defaults();
|
input_remapping_set_defaults(false);
|
||||||
}
|
}
|
||||||
global->name.remapfile = strdup(path);
|
global->name.remapfile = strdup(path);
|
||||||
|
|
||||||
@ -4617,9 +4613,6 @@ bool input_remapping_load_file(void *data, const char *path)
|
|||||||
{
|
{
|
||||||
char s1[32], s2[32], s3[32];
|
char s1[32], s2[32], s3[32];
|
||||||
|
|
||||||
global->old_analog_dpad_mode[i] = settings->uints.input_analog_dpad_mode[i];
|
|
||||||
global->old_libretro_device[i] = settings->uints.input_libretro_device[i];
|
|
||||||
|
|
||||||
s1[0] = '\0';
|
s1[0] = '\0';
|
||||||
s2[0] = '\0';
|
s2[0] = '\0';
|
||||||
s3[0] = '\0';
|
s3[0] = '\0';
|
||||||
@ -4705,8 +4698,18 @@ bool input_remapping_load_file(void *data, const char *path)
|
|||||||
|
|
||||||
snprintf(s1, sizeof(s1), "input_libretro_device_p%u", i + 1);
|
snprintf(s1, sizeof(s1), "input_libretro_device_p%u", i + 1);
|
||||||
CONFIG_GET_INT_BASE(conf, settings, uints.input_libretro_device[i], s1);
|
CONFIG_GET_INT_BASE(conf, settings, uints.input_libretro_device[i], s1);
|
||||||
|
|
||||||
|
snprintf(s1, sizeof(s1), "input_remap_port_p%u", i + 1);
|
||||||
|
CONFIG_GET_INT_BASE(conf, settings, uints.input_remap_ports[i], s1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input_remapping_update_port_map();
|
||||||
|
|
||||||
|
/* Whenever a remap file is loaded, subsequent
|
||||||
|
* changes to global remap-related parameters
|
||||||
|
* must be reset at the next core deinitialisation */
|
||||||
|
input_remapping_enable_global_config_restore();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4745,14 +4748,38 @@ bool input_remapping_save_file(const char *path)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < max_users; i++)
|
for (i = 0; i < MAX_USERS; i++)
|
||||||
{
|
{
|
||||||
char s1[32], s2[32], s3[32];
|
bool skip_port = true;
|
||||||
|
char s1[32];
|
||||||
|
char s2[32];
|
||||||
|
char s3[32];
|
||||||
|
|
||||||
s1[0] = '\0';
|
s1[0] = '\0';
|
||||||
s2[0] = '\0';
|
s2[0] = '\0';
|
||||||
s3[0] = '\0';
|
s3[0] = '\0';
|
||||||
|
|
||||||
|
/* We must include all mapped ports + all those
|
||||||
|
* with an index less than max_users */
|
||||||
|
if (i < max_users)
|
||||||
|
skip_port = false;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Check whether current port is mapped
|
||||||
|
* to an input device */
|
||||||
|
for (j = 0; j < max_users; j++)
|
||||||
|
{
|
||||||
|
if (i == settings->uints.input_remap_ports[j])
|
||||||
|
{
|
||||||
|
skip_port = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skip_port)
|
||||||
|
continue;
|
||||||
|
|
||||||
snprintf(s1, sizeof(s1), "input_player%u_btn", i + 1);
|
snprintf(s1, sizeof(s1), "input_player%u_btn", i + 1);
|
||||||
snprintf(s2, sizeof(s2), "input_player%u_key", i + 1);
|
snprintf(s2, sizeof(s2), "input_player%u_key", i + 1);
|
||||||
snprintf(s3, sizeof(s3), "input_player%u_stk", i + 1);
|
snprintf(s3, sizeof(s3), "input_player%u_stk", i + 1);
|
||||||
@ -4825,8 +4852,12 @@ bool input_remapping_save_file(const char *path)
|
|||||||
|
|
||||||
snprintf(s1, sizeof(s1), "input_libretro_device_p%u", i + 1);
|
snprintf(s1, sizeof(s1), "input_libretro_device_p%u", i + 1);
|
||||||
config_set_int(conf, s1, input_config_get_device(i));
|
config_set_int(conf, s1, input_config_get_device(i));
|
||||||
|
|
||||||
snprintf(s1, sizeof(s1), "input_player%u_analog_dpad_mode", i + 1);
|
snprintf(s1, sizeof(s1), "input_player%u_analog_dpad_mode", i + 1);
|
||||||
config_set_int(conf, s1, settings->uints.input_analog_dpad_mode[i]);
|
config_set_int(conf, s1, settings->uints.input_analog_dpad_mode[i]);
|
||||||
|
|
||||||
|
snprintf(s1, sizeof(s1), "input_remap_port_p%u", i + 1);
|
||||||
|
config_set_int(conf, s1, settings->uints.input_remap_ports[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = config_file_write(conf, remap_file, true);
|
ret = config_file_write(conf, remap_file, true);
|
||||||
|
@ -122,7 +122,7 @@ typedef struct settings
|
|||||||
unsigned placeholder;
|
unsigned placeholder;
|
||||||
|
|
||||||
unsigned input_split_joycon[MAX_USERS];
|
unsigned input_split_joycon[MAX_USERS];
|
||||||
unsigned input_joypad_map[MAX_USERS];
|
unsigned input_joypad_index[MAX_USERS];
|
||||||
unsigned input_device[MAX_USERS];
|
unsigned input_device[MAX_USERS];
|
||||||
unsigned input_mouse_index[MAX_USERS];
|
unsigned input_mouse_index[MAX_USERS];
|
||||||
/* Set by autoconfiguration in joypad_autoconfig_dir.
|
/* Set by autoconfiguration in joypad_autoconfig_dir.
|
||||||
@ -130,9 +130,10 @@ typedef struct settings
|
|||||||
unsigned input_libretro_device[MAX_USERS];
|
unsigned input_libretro_device[MAX_USERS];
|
||||||
unsigned input_analog_dpad_mode[MAX_USERS];
|
unsigned input_analog_dpad_mode[MAX_USERS];
|
||||||
|
|
||||||
unsigned input_keymapper_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END];
|
unsigned input_remap_ports[MAX_USERS];
|
||||||
|
|
||||||
unsigned input_remap_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END];
|
unsigned input_remap_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END];
|
||||||
|
unsigned input_keymapper_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END];
|
||||||
|
unsigned input_remap_port_map[MAX_USERS][MAX_USERS + 1];
|
||||||
|
|
||||||
unsigned led_map[MAX_LEDS];
|
unsigned led_map[MAX_LEDS];
|
||||||
|
|
||||||
|
@ -220,7 +220,7 @@ static void handle_hotplug(unsigned port, uint32_t ptype)
|
|||||||
static void check_port0_active(uint8_t pad_count)
|
static void check_port0_active(uint8_t pad_count)
|
||||||
{
|
{
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
int idx = settings->uints.input_joypad_map[0];
|
int idx = settings->uints.input_joypad_index[0];
|
||||||
|
|
||||||
if(pad_count < 2 && idx != 0)
|
if(pad_count < 2 && idx != 0)
|
||||||
{
|
{
|
||||||
@ -229,7 +229,7 @@ static void check_port0_active(uint8_t pad_count)
|
|||||||
#else
|
#else
|
||||||
pad_type[0] = WPAD_EXP_GAMECUBE;
|
pad_type[0] = WPAD_EXP_GAMECUBE;
|
||||||
#endif
|
#endif
|
||||||
settings->uints.input_joypad_map[0] = 0;
|
settings->uints.input_joypad_index[0] = 0;
|
||||||
|
|
||||||
input_autoconfigure_connect(
|
input_autoconfigure_connect(
|
||||||
gx_joypad_name(0),
|
gx_joypad_name(0),
|
||||||
|
@ -48,9 +48,33 @@ bool input_remapping_save_file(const char *path);
|
|||||||
bool input_remapping_remove_file(const char *path,
|
bool input_remapping_remove_file(const char *path,
|
||||||
const char *dir_input_remapping);
|
const char *dir_input_remapping);
|
||||||
|
|
||||||
void input_remapping_deinit(void);
|
/* Caches any global configuration settings that
|
||||||
|
* should not be overwritten by input remap
|
||||||
|
* changes made while content is running.
|
||||||
|
* Must be called on each core init. */
|
||||||
|
void input_remapping_cache_global_config(void);
|
||||||
|
/* Sets flags to enable the restoration of
|
||||||
|
* global configuration settings from the
|
||||||
|
* internal cache. Should be called independently
|
||||||
|
* from 'input_remapping_cache_global_config()'.
|
||||||
|
* Must be called:
|
||||||
|
* - Whenever content is loaded
|
||||||
|
* - Whenever a remap file is loaded */
|
||||||
|
void input_remapping_enable_global_config_restore(void);
|
||||||
|
/* Restores any cached global configuration settings
|
||||||
|
* *if* 'input_remapping_enable_global_config_restore()'
|
||||||
|
* has been called.
|
||||||
|
* Must be called on core deint.
|
||||||
|
* If 'clear_cache' is true, function becomes a NOOP
|
||||||
|
* until the next time input_remapping_cache_global_config()
|
||||||
|
* and input_remapping_enable_global_config_restore()
|
||||||
|
* are called. */
|
||||||
|
void input_remapping_restore_global_config(bool clear_cache);
|
||||||
|
|
||||||
void input_remapping_set_defaults(void);
|
void input_remapping_update_port_map(void);
|
||||||
|
|
||||||
|
void input_remapping_deinit(void);
|
||||||
|
void input_remapping_set_defaults(bool clear_cache);
|
||||||
|
|
||||||
RETRO_END_DECLS
|
RETRO_END_DECLS
|
||||||
|
|
||||||
|
@ -1490,6 +1490,22 @@ MSG_HASH(
|
|||||||
MENU_ENUM_LABEL_INPUT_LIBRETRO_DEVICE,
|
MENU_ENUM_LABEL_INPUT_LIBRETRO_DEVICE,
|
||||||
"input_libretro_device_p%u"
|
"input_libretro_device_p%u"
|
||||||
)
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE,
|
||||||
|
"input_player%u_analog_dpad_mode"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_INPUT_DEVICE_INDEX,
|
||||||
|
"input_device_p%u"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_INPUT_MOUSE_INDEX,
|
||||||
|
"input_player%u_mouse_index"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_INPUT_REMAP_PORT,
|
||||||
|
"input_remap_port_p%u"
|
||||||
|
)
|
||||||
MSG_HASH(
|
MSG_HASH(
|
||||||
MENU_ENUM_LABEL_INPUT_MAX_USERS,
|
MENU_ENUM_LABEL_INPUT_MAX_USERS,
|
||||||
"input_max_users"
|
"input_max_users"
|
||||||
@ -1534,10 +1550,6 @@ MSG_HASH(
|
|||||||
MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE,
|
MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE,
|
||||||
"input_overlay_auto_scale"
|
"input_overlay_auto_scale"
|
||||||
)
|
)
|
||||||
MSG_HASH(
|
|
||||||
MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE,
|
|
||||||
"input_player%u_analog_dpad_mode"
|
|
||||||
)
|
|
||||||
MSG_HASH(
|
MSG_HASH(
|
||||||
MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR,
|
MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR,
|
||||||
"input_poll_type_behavior"
|
"input_poll_type_behavior"
|
||||||
|
@ -2668,6 +2668,14 @@ MSG_HASH(
|
|||||||
MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX,
|
MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX,
|
||||||
"Device Index"
|
"Device Index"
|
||||||
)
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_VALUE_INPUT_REMAP_PORT,
|
||||||
|
"Mapped Port"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_SUBLABEL_INPUT_REMAP_PORT,
|
||||||
|
"Specifies which 'core' port (typically player number) will receive input from frontend controller port %u."
|
||||||
|
)
|
||||||
MSG_HASH(
|
MSG_HASH(
|
||||||
MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL,
|
MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL,
|
||||||
"Set All Controls"
|
"Set All Controls"
|
||||||
|
@ -709,20 +709,20 @@ static void menu_action_setting_disp_set_label_input_desc(
|
|||||||
char *s2, size_t len2)
|
char *s2, size_t len2)
|
||||||
{
|
{
|
||||||
unsigned remap_idx;
|
unsigned remap_idx;
|
||||||
settings_t *settings = config_get_ptr();
|
unsigned mapped_port;
|
||||||
const char* descriptor = NULL;
|
settings_t *settings = config_get_ptr();
|
||||||
unsigned user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8);
|
const char* descriptor = NULL;
|
||||||
unsigned btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx;
|
unsigned user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8);
|
||||||
|
unsigned btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx;
|
||||||
|
|
||||||
if (!settings)
|
if (!settings)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
remap_idx =
|
mapped_port = settings->uints.input_remap_ports[user_idx];
|
||||||
settings->uints.input_remap_ids[user_idx][btn_idx];
|
remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx];
|
||||||
|
|
||||||
if (remap_idx != RARCH_UNMAPPED)
|
if (remap_idx != RARCH_UNMAPPED)
|
||||||
descriptor =
|
descriptor = runloop_get_system_info()->input_desc_btn[mapped_port][remap_idx];
|
||||||
runloop_get_system_info()->input_desc_btn[user_idx][remap_idx];
|
|
||||||
|
|
||||||
s[0] = '-';
|
s[0] = '-';
|
||||||
s[1] = '-';
|
s[1] = '-';
|
||||||
@ -754,7 +754,7 @@ static void menu_action_setting_disp_set_label_input_desc_kbd(
|
|||||||
char desc[PATH_MAX_LENGTH];
|
char desc[PATH_MAX_LENGTH];
|
||||||
unsigned key_id, btn_idx;
|
unsigned key_id, btn_idx;
|
||||||
unsigned remap_id;
|
unsigned remap_id;
|
||||||
unsigned user_idx = 0;
|
unsigned user_idx;
|
||||||
|
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
|
|
||||||
@ -763,8 +763,7 @@ static void menu_action_setting_disp_set_label_input_desc_kbd(
|
|||||||
|
|
||||||
user_idx = (type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) / RARCH_ANALOG_BIND_LIST_END;
|
user_idx = (type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) / RARCH_ANALOG_BIND_LIST_END;
|
||||||
btn_idx = (type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) - RARCH_ANALOG_BIND_LIST_END * user_idx;
|
btn_idx = (type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) - RARCH_ANALOG_BIND_LIST_END * user_idx;
|
||||||
remap_id =
|
remap_id = settings->uints.input_keymapper_ids[user_idx][btn_idx];
|
||||||
settings->uints.input_keymapper_ids[user_idx][btn_idx];
|
|
||||||
|
|
||||||
for (key_id = 0; key_id < RARCH_MAX_KEYS - 1; key_id++)
|
for (key_id = 0; key_id < RARCH_MAX_KEYS - 1; key_id++)
|
||||||
{
|
{
|
||||||
|
@ -136,13 +136,18 @@ static int action_left_input_desc(unsigned type, const char *label,
|
|||||||
{
|
{
|
||||||
rarch_system_info_t *system = runloop_get_system_info();
|
rarch_system_info_t *system = runloop_get_system_info();
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
unsigned btn_idx, user_idx, remap_idx, bind_idx;
|
unsigned btn_idx;
|
||||||
|
unsigned user_idx;
|
||||||
|
unsigned remap_idx;
|
||||||
|
unsigned bind_idx;
|
||||||
|
unsigned mapped_port;
|
||||||
|
|
||||||
if (!settings || !system)
|
if (!settings || !system)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8);
|
user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8);
|
||||||
btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx;
|
btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx;
|
||||||
|
mapped_port = settings->uints.input_remap_ports[user_idx];
|
||||||
|
|
||||||
if (settings->uints.input_remap_ids[user_idx][btn_idx] == RARCH_UNMAPPED)
|
if (settings->uints.input_remap_ids[user_idx][btn_idx] == RARCH_UNMAPPED)
|
||||||
settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_CUSTOM_BIND_LIST_END - 1;
|
settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_CUSTOM_BIND_LIST_END - 1;
|
||||||
@ -176,7 +181,7 @@ static int action_left_input_desc(unsigned type, const char *label,
|
|||||||
also skip all the axes until analog remapping is implemented */
|
also skip all the axes until analog remapping is implemented */
|
||||||
if (remap_idx != RARCH_UNMAPPED)
|
if (remap_idx != RARCH_UNMAPPED)
|
||||||
{
|
{
|
||||||
if ((string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END) /*||
|
if ((string_is_empty(system->input_desc_btn[mapped_port][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END) /*||
|
||||||
(remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx < RARCH_CUSTOM_BIND_LIST_END)*/)
|
(remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx < RARCH_CUSTOM_BIND_LIST_END)*/)
|
||||||
action_left_input_desc(type, label, wraparound);
|
action_left_input_desc(type, label, wraparound);
|
||||||
}
|
}
|
||||||
|
@ -3411,32 +3411,30 @@ static int generic_action_ok_remap_file_operation(const char *path,
|
|||||||
{
|
{
|
||||||
if (input_remapping_remove_file(file, path_dir_input_remapping))
|
if (input_remapping_remove_file(file, path_dir_input_remapping))
|
||||||
{
|
{
|
||||||
#ifdef HAVE_CONFIGFILE
|
|
||||||
switch (action_type)
|
switch (action_type)
|
||||||
{
|
{
|
||||||
case ACTION_OK_REMAP_FILE_REMOVE_CORE:
|
case ACTION_OK_REMAP_FILE_REMOVE_CORE:
|
||||||
if (rarch_ctl(RARCH_CTL_IS_REMAPS_CORE_ACTIVE, NULL))
|
if (rarch_ctl(RARCH_CTL_IS_REMAPS_CORE_ACTIVE, NULL))
|
||||||
{
|
{
|
||||||
input_remapping_deinit();
|
input_remapping_deinit();
|
||||||
input_remapping_set_defaults();
|
input_remapping_set_defaults(false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ACTION_OK_REMAP_FILE_REMOVE_GAME:
|
case ACTION_OK_REMAP_FILE_REMOVE_GAME:
|
||||||
if (rarch_ctl(RARCH_CTL_IS_REMAPS_GAME_ACTIVE, NULL))
|
if (rarch_ctl(RARCH_CTL_IS_REMAPS_GAME_ACTIVE, NULL))
|
||||||
{
|
{
|
||||||
input_remapping_deinit();
|
input_remapping_deinit();
|
||||||
input_remapping_set_defaults();
|
input_remapping_set_defaults(false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ACTION_OK_REMAP_FILE_REMOVE_CONTENT_DIR:
|
case ACTION_OK_REMAP_FILE_REMOVE_CONTENT_DIR:
|
||||||
if (rarch_ctl(RARCH_CTL_IS_REMAPS_CONTENT_DIR_ACTIVE, NULL))
|
if (rarch_ctl(RARCH_CTL_IS_REMAPS_CONTENT_DIR_ACTIVE, NULL))
|
||||||
{
|
{
|
||||||
input_remapping_deinit();
|
input_remapping_deinit();
|
||||||
input_remapping_set_defaults();
|
input_remapping_set_defaults(false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
runloop_msg_queue_push(
|
runloop_msg_queue_push(
|
||||||
msg_hash_to_str(MSG_REMAP_FILE_REMOVED_SUCCESSFULLY),
|
msg_hash_to_str(MSG_REMAP_FILE_REMOVED_SUCCESSFULLY),
|
||||||
@ -6520,7 +6518,7 @@ static int action_ok_push_dropdown_item_input_device_index(const char *path,
|
|||||||
if (!setting)
|
if (!setting)
|
||||||
return menu_cbs_exit();
|
return menu_cbs_exit();
|
||||||
|
|
||||||
settings->uints.input_joypad_map[setting->index_offset] = (unsigned)entry_idx;
|
settings->uints.input_joypad_index[setting->index_offset] = (unsigned)entry_idx;
|
||||||
|
|
||||||
return action_cancel_pop_default(NULL, NULL, 0, 0);
|
return action_cancel_pop_default(NULL, NULL, 0, 0);
|
||||||
}
|
}
|
||||||
|
@ -177,13 +177,18 @@ static int action_right_input_desc(unsigned type, const char *label,
|
|||||||
{
|
{
|
||||||
rarch_system_info_t *system = runloop_get_system_info();
|
rarch_system_info_t *system = runloop_get_system_info();
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
unsigned btn_idx, user_idx, remap_idx, bind_idx;
|
unsigned btn_idx;
|
||||||
|
unsigned user_idx;
|
||||||
|
unsigned remap_idx;
|
||||||
|
unsigned bind_idx;
|
||||||
|
unsigned mapped_port;
|
||||||
|
|
||||||
if (!settings || !system)
|
if (!settings || !system)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8);
|
user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8);
|
||||||
btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx;
|
btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx;
|
||||||
|
mapped_port = settings->uints.input_remap_ports[user_idx];
|
||||||
|
|
||||||
remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx];
|
remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx];
|
||||||
for (bind_idx = 0; bind_idx < RARCH_ANALOG_BIND_LIST_END; bind_idx++)
|
for (bind_idx = 0; bind_idx < RARCH_ANALOG_BIND_LIST_END; bind_idx++)
|
||||||
@ -221,7 +226,7 @@ static int action_right_input_desc(unsigned type, const char *label,
|
|||||||
also skip all the axes until analog remapping is implemented */
|
also skip all the axes until analog remapping is implemented */
|
||||||
if (remap_idx != RARCH_UNMAPPED)
|
if (remap_idx != RARCH_UNMAPPED)
|
||||||
{
|
{
|
||||||
if ((string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END))
|
if ((string_is_empty(system->input_desc_btn[mapped_port][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END))
|
||||||
action_right_input_desc(type, label, wraparound);
|
action_right_input_desc(type, label, wraparound);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,8 +168,8 @@ static int action_scan_input_desc(const char *path,
|
|||||||
{
|
{
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
inp_desc_user = atoi(label);
|
inp_desc_user = atoi(label);
|
||||||
/* Skip 'Device Type' and 'Analog to Digital Type' */
|
/* Skip 'Device Type', 'Analog to Digital Type' and 'Mapped Port' */
|
||||||
key = (unsigned)(idx - 2);
|
key = (unsigned)(idx - 3);
|
||||||
/* Select the reorderer bind */
|
/* Select the reorderer bind */
|
||||||
key =
|
key =
|
||||||
(key < RARCH_ANALOG_BIND_LIST_END) ? input_config_bind_order[key] : key;
|
(key < RARCH_ANALOG_BIND_LIST_END) ? input_config_bind_order[key] : key;
|
||||||
|
@ -80,10 +80,8 @@ static int action_start_remap_file_load(
|
|||||||
const char *path, const char *label,
|
const char *path, const char *label,
|
||||||
unsigned type, size_t idx, size_t entry_idx)
|
unsigned type, size_t idx, size_t entry_idx)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_CONFIGFILE
|
|
||||||
input_remapping_deinit();
|
input_remapping_deinit();
|
||||||
input_remapping_set_defaults();
|
input_remapping_set_defaults(false);
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,20 +191,24 @@ static int action_start_input_desc(
|
|||||||
rarch_system_info_t *system = runloop_get_system_info();
|
rarch_system_info_t *system = runloop_get_system_info();
|
||||||
unsigned user_idx;
|
unsigned user_idx;
|
||||||
unsigned btn_idx;
|
unsigned btn_idx;
|
||||||
|
unsigned mapped_port;
|
||||||
|
|
||||||
(void)label;
|
(void)label;
|
||||||
|
|
||||||
if (!settings || !system)
|
if (!settings || !system)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8);
|
user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8);
|
||||||
btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx;
|
btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx;
|
||||||
|
mapped_port = settings->uints.input_remap_ports[user_idx];
|
||||||
|
|
||||||
if ((user_idx >= MAX_USERS) || (btn_idx >= RARCH_CUSTOM_BIND_LIST_END))
|
if ((user_idx >= MAX_USERS) ||
|
||||||
|
(mapped_port >= MAX_USERS) ||
|
||||||
|
(btn_idx >= RARCH_CUSTOM_BIND_LIST_END))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Check whether core has defined this input */
|
/* Check whether core has defined this input */
|
||||||
if (!string_is_empty(system->input_desc_btn[user_idx][btn_idx]))
|
if (!string_is_empty(system->input_desc_btn[mapped_port][btn_idx]))
|
||||||
{
|
{
|
||||||
const struct retro_keybind *keyptr = &input_config_binds[user_idx][btn_idx];
|
const struct retro_keybind *keyptr = &input_config_binds[user_idx][btn_idx];
|
||||||
settings->uints.input_remap_ids[user_idx][btn_idx] = keyptr->id;
|
settings->uints.input_remap_ids[user_idx][btn_idx] = keyptr->id;
|
||||||
|
@ -1199,20 +1199,69 @@ static int action_bind_sublabel_remap_sublabel(
|
|||||||
const char *label, const char *path,
|
const char *label, const char *path,
|
||||||
char *s, size_t len)
|
char *s, size_t len)
|
||||||
{
|
{
|
||||||
unsigned offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN)
|
settings_t *settings = config_get_ptr();
|
||||||
/ (RARCH_FIRST_CUSTOM_BIND + 8);
|
unsigned port = (type - MENU_SETTINGS_INPUT_DESC_BEGIN)
|
||||||
|
/ (RARCH_FIRST_CUSTOM_BIND + 8);
|
||||||
|
|
||||||
|
if (!settings || (port >= MAX_USERS))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Device name is set per-port
|
||||||
|
* If the user changes the device index for
|
||||||
|
* a port, then we are effectively changing
|
||||||
|
* the port to which the corresponding
|
||||||
|
* controller is connected... */
|
||||||
|
port = settings->uints.input_joypad_index[port];
|
||||||
|
|
||||||
snprintf(s, len, "%s #%d: %s",
|
snprintf(s, len, "%s #%d: %s",
|
||||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PORT),
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PORT),
|
||||||
offset + 1,
|
port + 1,
|
||||||
input_config_get_device_display_name(offset) ?
|
input_config_get_device_display_name(port) ?
|
||||||
input_config_get_device_display_name(offset) :
|
input_config_get_device_display_name(port) :
|
||||||
(input_config_get_device_name(offset) ?
|
(input_config_get_device_name(port) ?
|
||||||
input_config_get_device_name(offset) :
|
input_config_get_device_name(port) :
|
||||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)));
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int action_bind_sublabel_input_remap_port(
|
||||||
|
file_list_t *list,
|
||||||
|
unsigned type, unsigned i,
|
||||||
|
const char *label, const char *path,
|
||||||
|
char *s, size_t len)
|
||||||
|
{
|
||||||
|
unsigned display_port = 0;
|
||||||
|
menu_entry_t entry;
|
||||||
|
|
||||||
|
MENU_ENTRY_INIT(entry);
|
||||||
|
entry.path_enabled = false;
|
||||||
|
entry.label_enabled = true;
|
||||||
|
entry.rich_label_enabled = false;
|
||||||
|
entry.value_enabled = false;
|
||||||
|
entry.sublabel_enabled = false;
|
||||||
|
menu_entry_get(&entry, 0, i, NULL, false);
|
||||||
|
|
||||||
|
/* We need the actual frontend port index.
|
||||||
|
* This is difficult to obtain here - the only
|
||||||
|
* way to get it is to parse the entry label
|
||||||
|
* (input_remap_port_p<port_index+1>) */
|
||||||
|
if (string_is_empty(entry.label) ||
|
||||||
|
(sscanf(entry.label,
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_INPUT_REMAP_PORT),
|
||||||
|
&display_port) != 1) ||
|
||||||
|
(display_port >= MAX_USERS + 1))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
snprintf(s, len,
|
||||||
|
msg_hash_to_str(MENU_ENUM_SUBLABEL_INPUT_REMAP_PORT),
|
||||||
|
display_port);
|
||||||
|
|
||||||
|
/* We can safely cache the sublabel here, since
|
||||||
|
* frontend port index cannot change while the
|
||||||
|
* current menu is displayed */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_CHEATS
|
#ifdef HAVE_CHEATS
|
||||||
static int action_bind_sublabel_cheat_desc(
|
static int action_bind_sublabel_cheat_desc(
|
||||||
file_list_t *list,
|
file_list_t *list,
|
||||||
@ -1630,6 +1679,13 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Mapped input ports require special handling */
|
||||||
|
if (type == MENU_SETTINGS_INPUT_INPUT_REMAP_PORT)
|
||||||
|
{
|
||||||
|
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_remap_port);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Hotkey binds require special handling */
|
/* Hotkey binds require special handling */
|
||||||
if ((cbs->enum_idx >= MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN) &&
|
if ((cbs->enum_idx >= MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN) &&
|
||||||
(cbs->enum_idx <= MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_END))
|
(cbs->enum_idx <= MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_END))
|
||||||
|
@ -328,6 +328,11 @@ static int action_get_title_dropdown_item(
|
|||||||
(enum_idx <= MENU_ENUM_LABEL_INPUT_MOUSE_INDEX_LAST))
|
(enum_idx <= MENU_ENUM_LABEL_INPUT_MOUSE_INDEX_LAST))
|
||||||
enum_idx = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX;
|
enum_idx = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX;
|
||||||
|
|
||||||
|
/* Mapped Port (virtual -> 'physical' port mapping) */
|
||||||
|
if ((enum_idx >= MENU_ENUM_LABEL_INPUT_REMAP_PORT) &&
|
||||||
|
(enum_idx <= MENU_ENUM_LABEL_INPUT_REMAP_PORT_LAST))
|
||||||
|
enum_idx = MENU_ENUM_LABEL_VALUE_INPUT_REMAP_PORT;
|
||||||
|
|
||||||
{
|
{
|
||||||
const char *title = msg_hash_to_str(enum_idx);
|
const char *title = msg_hash_to_str(enum_idx);
|
||||||
|
|
||||||
|
@ -453,6 +453,7 @@ uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone,
|
|||||||
case MENU_SETTING_ACTION:
|
case MENU_SETTING_ACTION:
|
||||||
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SETTING];
|
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SETTING];
|
||||||
case MENU_SETTINGS_INPUT_LIBRETRO_DEVICE:
|
case MENU_SETTINGS_INPUT_LIBRETRO_DEVICE:
|
||||||
|
case MENU_SETTINGS_INPUT_INPUT_REMAP_PORT:
|
||||||
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SETTING];
|
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SETTING];
|
||||||
case MENU_SETTINGS_INPUT_ANALOG_DPAD_MODE:
|
case MENU_SETTINGS_INPUT_ANALOG_DPAD_MODE:
|
||||||
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_ADC];
|
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_ADC];
|
||||||
|
@ -2961,6 +2961,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
|
|||||||
return xmb->textures.list[XMB_TEXTURE_ROOM_RELAY];
|
return xmb->textures.list[XMB_TEXTURE_ROOM_RELAY];
|
||||||
#endif
|
#endif
|
||||||
case MENU_SETTINGS_INPUT_LIBRETRO_DEVICE:
|
case MENU_SETTINGS_INPUT_LIBRETRO_DEVICE:
|
||||||
|
case MENU_SETTINGS_INPUT_INPUT_REMAP_PORT:
|
||||||
return xmb->textures.list[XMB_TEXTURE_SETTING];
|
return xmb->textures.list[XMB_TEXTURE_SETTING];
|
||||||
case MENU_SETTINGS_INPUT_ANALOG_DPAD_MODE:
|
case MENU_SETTINGS_INPUT_ANALOG_DPAD_MODE:
|
||||||
return xmb->textures.list[XMB_TEXTURE_INPUT_ADC];
|
return xmb->textures.list[XMB_TEXTURE_INPUT_ADC];
|
||||||
|
@ -1354,7 +1354,7 @@ static unsigned menu_displaylist_parse_system_info(file_list_t *list)
|
|||||||
MENU_SETTINGS_CORE_INFO_NONE, 0, 0))
|
MENU_SETTINGS_CORE_INFO_NONE, 0, 0))
|
||||||
count++;
|
count++;
|
||||||
snprintf(tmp, sizeof(tmp), " Device config name: %s",
|
snprintf(tmp, sizeof(tmp), " Device config name: %s",
|
||||||
input_config_get_device_display_name(controller) ?
|
input_config_get_device_config_name(controller) ?
|
||||||
input_config_get_device_config_name(controller) :
|
input_config_get_device_config_name(controller) :
|
||||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE));
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE));
|
||||||
if (menu_entries_append_enum(list, tmp, "",
|
if (menu_entries_append_enum(list, tmp, "",
|
||||||
@ -4415,7 +4415,7 @@ static int menu_displaylist_parse_input_device_index_list(
|
|||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
port = setting->index_offset;
|
port = setting->index_offset;
|
||||||
map = settings->uints.input_joypad_map[port];
|
map = settings->uints.input_joypad_index[port];
|
||||||
|
|
||||||
if (port >= MAX_USERS)
|
if (port >= MAX_USERS)
|
||||||
goto end;
|
goto end;
|
||||||
@ -4511,6 +4511,7 @@ static int menu_displaylist_parse_input_description_list(
|
|||||||
unsigned user_idx;
|
unsigned user_idx;
|
||||||
unsigned btn_idx;
|
unsigned btn_idx;
|
||||||
unsigned current_remap_idx;
|
unsigned current_remap_idx;
|
||||||
|
unsigned mapped_port;
|
||||||
size_t i, j;
|
size_t i, j;
|
||||||
char entry_label[21];
|
char entry_label[21];
|
||||||
|
|
||||||
@ -4520,10 +4521,16 @@ static int menu_displaylist_parse_input_description_list(
|
|||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* Determine user/button indices */
|
/* Determine user/button indices */
|
||||||
user_idx = (info->type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8);
|
user_idx = (info->type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8);
|
||||||
btn_idx = (info->type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx;
|
btn_idx = (info->type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx;
|
||||||
|
|
||||||
if ((user_idx >= MAX_USERS) || (btn_idx >= RARCH_CUSTOM_BIND_LIST_END))
|
if ((user_idx >= MAX_USERS) ||
|
||||||
|
(btn_idx >= RARCH_CUSTOM_BIND_LIST_END))
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
mapped_port = settings->uints.input_remap_ports[user_idx];
|
||||||
|
|
||||||
|
if (mapped_port >= MAX_USERS)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* Get current mapping for selected button */
|
/* Get current mapping for selected button */
|
||||||
@ -4548,7 +4555,7 @@ static int menu_displaylist_parse_input_description_list(
|
|||||||
const char *input_desc_btn;
|
const char *input_desc_btn;
|
||||||
|
|
||||||
i = (j < RARCH_ANALOG_BIND_LIST_END) ? input_config_bind_order[j] : j;
|
i = (j < RARCH_ANALOG_BIND_LIST_END) ? input_config_bind_order[j] : j;
|
||||||
input_desc_btn = system->input_desc_btn[user_idx][i];
|
input_desc_btn = system->input_desc_btn[mapped_port][i];
|
||||||
|
|
||||||
/* Check whether an input is defined for
|
/* Check whether an input is defined for
|
||||||
* this button */
|
* this button */
|
||||||
@ -4651,10 +4658,11 @@ static int menu_displaylist_parse_input_description_kbd_list(
|
|||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* Determine user/button indices */
|
/* Determine user/button indices */
|
||||||
user_idx = (info->type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) / RARCH_ANALOG_BIND_LIST_END;
|
user_idx = (info->type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) / RARCH_ANALOG_BIND_LIST_END;
|
||||||
btn_idx = (info->type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) - RARCH_ANALOG_BIND_LIST_END * user_idx;
|
btn_idx = (info->type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) - RARCH_ANALOG_BIND_LIST_END * user_idx;
|
||||||
|
|
||||||
if ((user_idx >= MAX_USERS) || (btn_idx >= RARCH_CUSTOM_BIND_LIST_END))
|
if ((user_idx >= MAX_USERS) ||
|
||||||
|
(btn_idx >= RARCH_CUSTOM_BIND_LIST_END))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* Get current mapping for selected button */
|
/* Get current mapping for selected button */
|
||||||
@ -9577,22 +9585,27 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
|
|||||||
const char *menu_driver = menu_driver_ident();
|
const char *menu_driver = menu_driver_ident();
|
||||||
bool is_rgui = string_is_equal(menu_driver, "rgui");
|
bool is_rgui = string_is_equal(menu_driver, "rgui");
|
||||||
file_list_t *list = info->list;
|
file_list_t *list = info->list;
|
||||||
unsigned p = atoi(info->path);
|
unsigned port = string_to_unsigned(info->path);
|
||||||
|
unsigned mapped_port = settings->uints.input_remap_ports[port];
|
||||||
size_t selection = menu_navigation_get_selection();
|
size_t selection = menu_navigation_get_selection();
|
||||||
|
|
||||||
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
|
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
|
||||||
|
|
||||||
{
|
{
|
||||||
char key_type[PATH_MAX_LENGTH];
|
char key_type[64];
|
||||||
char key_analog[PATH_MAX_LENGTH];
|
char key_analog[64];
|
||||||
unsigned val = p + 1;
|
char key_port[64];
|
||||||
|
|
||||||
key_type[0] = key_analog[0] = '\0';
|
key_type[0] = '\0';
|
||||||
|
key_analog[0] = '\0';
|
||||||
|
key_port[0] = '\0';
|
||||||
|
|
||||||
snprintf(key_type, sizeof(key_type),
|
snprintf(key_type, sizeof(key_type),
|
||||||
msg_hash_to_str(MENU_ENUM_LABEL_INPUT_LIBRETRO_DEVICE), val);
|
msg_hash_to_str(MENU_ENUM_LABEL_INPUT_LIBRETRO_DEVICE), mapped_port + 1);
|
||||||
snprintf(key_analog, sizeof(key_analog),
|
snprintf(key_analog, sizeof(key_analog),
|
||||||
msg_hash_to_str(MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE), val);
|
msg_hash_to_str(MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE), port + 1);
|
||||||
|
snprintf(key_port, sizeof(key_port),
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_INPUT_REMAP_PORT), port + 1);
|
||||||
|
|
||||||
if (MENU_DISPLAYLIST_PARSE_SETTINGS(list,
|
if (MENU_DISPLAYLIST_PARSE_SETTINGS(list,
|
||||||
key_type, PARSE_ONLY_UINT, true, MENU_SETTINGS_INPUT_LIBRETRO_DEVICE) == 0)
|
key_type, PARSE_ONLY_UINT, true, MENU_SETTINGS_INPUT_LIBRETRO_DEVICE) == 0)
|
||||||
@ -9600,12 +9613,15 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
|
|||||||
if (MENU_DISPLAYLIST_PARSE_SETTINGS(list,
|
if (MENU_DISPLAYLIST_PARSE_SETTINGS(list,
|
||||||
key_analog, PARSE_ONLY_UINT, true, MENU_SETTINGS_INPUT_ANALOG_DPAD_MODE) == 0)
|
key_analog, PARSE_ONLY_UINT, true, MENU_SETTINGS_INPUT_ANALOG_DPAD_MODE) == 0)
|
||||||
count++;
|
count++;
|
||||||
|
if (MENU_DISPLAYLIST_PARSE_SETTINGS(list,
|
||||||
|
key_port, PARSE_ONLY_UINT, true, MENU_SETTINGS_INPUT_INPUT_REMAP_PORT) == 0)
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
unsigned retro_id, j;
|
unsigned retro_id, j;
|
||||||
unsigned device = settings->uints.input_libretro_device[p];
|
unsigned device = settings->uints.input_libretro_device[mapped_port];
|
||||||
device &= RETRO_DEVICE_MASK;
|
device &= RETRO_DEVICE_MASK;
|
||||||
|
|
||||||
if (device == RETRO_DEVICE_JOYPAD || device == RETRO_DEVICE_ANALOG)
|
if (device == RETRO_DEVICE_JOYPAD || device == RETRO_DEVICE_ANALOG)
|
||||||
{
|
{
|
||||||
@ -9621,10 +9637,10 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
|
|||||||
? input_config_bind_order[j]
|
? input_config_bind_order[j]
|
||||||
: j;
|
: j;
|
||||||
keybind =
|
keybind =
|
||||||
&input_config_binds[p][retro_id];
|
&input_config_binds[port][retro_id];
|
||||||
auto_bind =
|
auto_bind =
|
||||||
(const struct retro_keybind*)
|
(const struct retro_keybind*)
|
||||||
input_config_get_bind_auto(p, retro_id);
|
input_config_get_bind_auto(port, retro_id);
|
||||||
|
|
||||||
input_config_get_bind_string(descriptor,
|
input_config_get_bind_string(descriptor,
|
||||||
keybind, auto_bind, sizeof(descriptor));
|
keybind, auto_bind, sizeof(descriptor));
|
||||||
@ -9632,7 +9648,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
|
|||||||
if (!strstr(descriptor, "Auto"))
|
if (!strstr(descriptor, "Auto"))
|
||||||
{
|
{
|
||||||
const struct retro_keybind *keyptr =
|
const struct retro_keybind *keyptr =
|
||||||
&input_config_binds[p][retro_id];
|
&input_config_binds[port][retro_id];
|
||||||
|
|
||||||
snprintf(desc_label, sizeof(desc_label),
|
snprintf(desc_label, sizeof(desc_label),
|
||||||
"%s %s", msg_hash_to_str(keyptr->enum_idx), descriptor);
|
"%s %s", msg_hash_to_str(keyptr->enum_idx), descriptor);
|
||||||
@ -9646,14 +9662,15 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
|
|||||||
&& !settings->bools.menu_show_sublabels)
|
&& !settings->bools.menu_show_sublabels)
|
||||||
{
|
{
|
||||||
snprintf(desc_label, sizeof(desc_label),
|
snprintf(desc_label, sizeof(desc_label),
|
||||||
"%s [%s %u]", descriptor, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PORT), p + 1);
|
"%s [%s %u]", descriptor, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PORT), port + 1);
|
||||||
strlcpy(descriptor, desc_label, sizeof(descriptor));
|
strlcpy(descriptor, desc_label, sizeof(descriptor));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Note: 'physical' port is passed as label */
|
||||||
if (menu_entries_append_enum(list, descriptor, info->path,
|
if (menu_entries_append_enum(list, descriptor, info->path,
|
||||||
MSG_UNKNOWN,
|
MSG_UNKNOWN,
|
||||||
MENU_SETTINGS_INPUT_DESC_BEGIN +
|
MENU_SETTINGS_INPUT_DESC_BEGIN +
|
||||||
(p * (RARCH_FIRST_CUSTOM_BIND + 8)) + retro_id, 0, 0))
|
(port * (RARCH_FIRST_CUSTOM_BIND + 8)) + retro_id, 0, 0))
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -9671,10 +9688,10 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
|
|||||||
? input_config_bind_order[j]
|
? input_config_bind_order[j]
|
||||||
: j;
|
: j;
|
||||||
keybind =
|
keybind =
|
||||||
&input_config_binds[p][retro_id];
|
&input_config_binds[port][retro_id];
|
||||||
auto_bind =
|
auto_bind =
|
||||||
(const struct retro_keybind*)
|
(const struct retro_keybind*)
|
||||||
input_config_get_bind_auto(p, retro_id);
|
input_config_get_bind_auto(port, retro_id);
|
||||||
|
|
||||||
input_config_get_bind_string(descriptor,
|
input_config_get_bind_string(descriptor,
|
||||||
keybind, auto_bind, sizeof(descriptor));
|
keybind, auto_bind, sizeof(descriptor));
|
||||||
@ -9682,7 +9699,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
|
|||||||
if (!strstr(descriptor, "Auto"))
|
if (!strstr(descriptor, "Auto"))
|
||||||
{
|
{
|
||||||
const struct retro_keybind *keyptr =
|
const struct retro_keybind *keyptr =
|
||||||
&input_config_binds[p][retro_id];
|
&input_config_binds[port][retro_id];
|
||||||
|
|
||||||
snprintf(desc_label, sizeof(desc_label),
|
snprintf(desc_label, sizeof(desc_label),
|
||||||
"%s %s", msg_hash_to_str(keyptr->enum_idx), descriptor);
|
"%s %s", msg_hash_to_str(keyptr->enum_idx), descriptor);
|
||||||
@ -9697,14 +9714,15 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
|
|||||||
{
|
{
|
||||||
snprintf(desc_label, sizeof(desc_label),
|
snprintf(desc_label, sizeof(desc_label),
|
||||||
"%s [%s %u]", descriptor,
|
"%s [%s %u]", descriptor,
|
||||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PORT), p + 1);
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PORT), port + 1);
|
||||||
strlcpy(descriptor, desc_label, sizeof(descriptor));
|
strlcpy(descriptor, desc_label, sizeof(descriptor));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Note: 'physical' port is passed as label */
|
||||||
if (menu_entries_append_enum(list, descriptor, info->path,
|
if (menu_entries_append_enum(list, descriptor, info->path,
|
||||||
MSG_UNKNOWN,
|
MSG_UNKNOWN,
|
||||||
MENU_SETTINGS_INPUT_DESC_KBD_BEGIN +
|
MENU_SETTINGS_INPUT_DESC_KBD_BEGIN +
|
||||||
(p * RARCH_ANALOG_BIND_LIST_END) + retro_id, 0, 0))
|
(port * RARCH_ANALOG_BIND_LIST_END) + retro_id, 0, 0))
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -188,6 +188,7 @@ enum menu_settings_type
|
|||||||
|
|
||||||
MENU_SETTINGS_INPUT_LIBRETRO_DEVICE,
|
MENU_SETTINGS_INPUT_LIBRETRO_DEVICE,
|
||||||
MENU_SETTINGS_INPUT_ANALOG_DPAD_MODE,
|
MENU_SETTINGS_INPUT_ANALOG_DPAD_MODE,
|
||||||
|
MENU_SETTINGS_INPUT_INPUT_REMAP_PORT,
|
||||||
MENU_SETTINGS_INPUT_BEGIN,
|
MENU_SETTINGS_INPUT_BEGIN,
|
||||||
MENU_SETTINGS_INPUT_END = MENU_SETTINGS_INPUT_BEGIN + RARCH_CUSTOM_BIND_LIST_END + 6,
|
MENU_SETTINGS_INPUT_END = MENU_SETTINGS_INPUT_BEGIN + RARCH_CUSTOM_BIND_LIST_END + 6,
|
||||||
MENU_SETTINGS_INPUT_DESC_BEGIN,
|
MENU_SETTINGS_INPUT_DESC_BEGIN,
|
||||||
|
@ -96,6 +96,7 @@
|
|||||||
#include "../verbosity.h"
|
#include "../verbosity.h"
|
||||||
#include "../playlist.h"
|
#include "../playlist.h"
|
||||||
#include "../manual_content_scan.h"
|
#include "../manual_content_scan.h"
|
||||||
|
#include "../input/input_remapping.h"
|
||||||
|
|
||||||
#include "../tasks/tasks_internal.h"
|
#include "../tasks/tasks_internal.h"
|
||||||
|
|
||||||
@ -5386,6 +5387,37 @@ static int setting_action_left_libretro_device_type(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int setting_action_left_input_remap_port(
|
||||||
|
rarch_setting_t *setting, size_t idx, bool wraparound)
|
||||||
|
{
|
||||||
|
bool refresh = false;
|
||||||
|
unsigned port = 0;
|
||||||
|
settings_t *settings = config_get_ptr();
|
||||||
|
|
||||||
|
if (!setting)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
port = setting->index_offset;
|
||||||
|
|
||||||
|
if (settings->uints.input_remap_ports[port] > 0)
|
||||||
|
settings->uints.input_remap_ports[port]--;
|
||||||
|
else
|
||||||
|
settings->uints.input_remap_ports[port] = MAX_USERS - 1;
|
||||||
|
|
||||||
|
/* Must be called whenever settings->uints.input_remap_ports
|
||||||
|
* is modified */
|
||||||
|
input_remapping_update_port_map();
|
||||||
|
|
||||||
|
/* Changing mapped port may leave a core port unused;
|
||||||
|
* reinitialise controllers to ensure that any such
|
||||||
|
* ports are set to 'RETRO_DEVICE_NONE' */
|
||||||
|
command_event(CMD_EVENT_CONTROLLER_INIT, NULL);
|
||||||
|
|
||||||
|
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
|
||||||
|
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int setting_uint_action_left_crt_switch_resolution_super(
|
static int setting_uint_action_left_crt_switch_resolution_super(
|
||||||
rarch_setting_t *setting, size_t idx, bool wraparound)
|
rarch_setting_t *setting, size_t idx, bool wraparound)
|
||||||
{
|
{
|
||||||
@ -5427,7 +5459,7 @@ static int setting_action_left_bind_device(
|
|||||||
|
|
||||||
index_offset = setting->index_offset;
|
index_offset = setting->index_offset;
|
||||||
|
|
||||||
p = &settings->uints.input_joypad_map[index_offset];
|
p = &settings->uints.input_joypad_index[index_offset];
|
||||||
|
|
||||||
if ((*p) >= max_devices)
|
if ((*p) >= max_devices)
|
||||||
*p = max_devices - 1;
|
*p = max_devices - 1;
|
||||||
@ -6242,6 +6274,14 @@ static void setting_get_string_representation_uint_analog_dpad_mode(
|
|||||||
strlcpy(s, modes[*setting->value.target.unsigned_integer % ANALOG_DPAD_LAST], len);
|
strlcpy(s, modes[*setting->value.target.unsigned_integer % ANALOG_DPAD_LAST], len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setting_get_string_representation_uint_input_remap_port(
|
||||||
|
rarch_setting_t *setting,
|
||||||
|
char *s, size_t len)
|
||||||
|
{
|
||||||
|
if (setting)
|
||||||
|
snprintf(s, len, "%u", *setting->value.target.unsigned_integer + 1);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
static void setting_get_string_representation_uint_autosave_interval(
|
static void setting_get_string_representation_uint_autosave_interval(
|
||||||
rarch_setting_t *setting,
|
rarch_setting_t *setting,
|
||||||
@ -6860,7 +6900,7 @@ static int setting_action_start_bind_device(rarch_setting_t *setting)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
configuration_set_uint(settings,
|
configuration_set_uint(settings,
|
||||||
settings->uints.input_joypad_map[setting->index_offset], setting->index_offset);
|
settings->uints.input_joypad_index[setting->index_offset], setting->index_offset);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6962,6 +7002,32 @@ static int setting_action_start_libretro_device_type(rarch_setting_t *setting)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int setting_action_start_input_remap_port(rarch_setting_t *setting)
|
||||||
|
{
|
||||||
|
bool refresh = false;
|
||||||
|
settings_t *settings = config_get_ptr();
|
||||||
|
unsigned port;
|
||||||
|
|
||||||
|
if (!setting)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
port = setting->index_offset;
|
||||||
|
settings->uints.input_remap_ports[port] = port;
|
||||||
|
|
||||||
|
/* Must be called whenever settings->uints.input_remap_ports
|
||||||
|
* is modified */
|
||||||
|
input_remapping_update_port_map();
|
||||||
|
|
||||||
|
/* Changing mapped port may leave a core port unused;
|
||||||
|
* reinitialise controllers to ensure that any such
|
||||||
|
* ports are set to 'RETRO_DEVICE_NONE' */
|
||||||
|
command_event(CMD_EVENT_CONTROLLER_INIT, NULL);
|
||||||
|
|
||||||
|
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
|
||||||
|
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int setting_action_start_video_refresh_rate_auto(
|
static int setting_action_start_video_refresh_rate_auto(
|
||||||
rarch_setting_t *setting)
|
rarch_setting_t *setting)
|
||||||
{
|
{
|
||||||
@ -7045,6 +7111,37 @@ static int setting_action_right_libretro_device_type(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int setting_action_right_input_remap_port(
|
||||||
|
rarch_setting_t *setting, size_t idx, bool wraparound)
|
||||||
|
{
|
||||||
|
bool refresh = false;
|
||||||
|
unsigned port = 0;
|
||||||
|
settings_t *settings = config_get_ptr();
|
||||||
|
|
||||||
|
if (!setting)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
port = setting->index_offset;
|
||||||
|
|
||||||
|
if (settings->uints.input_remap_ports[port] < MAX_USERS - 1)
|
||||||
|
settings->uints.input_remap_ports[port]++;
|
||||||
|
else
|
||||||
|
settings->uints.input_remap_ports[port] = 0;
|
||||||
|
|
||||||
|
/* Must be called whenever settings->uints.input_remap_ports
|
||||||
|
* is modified */
|
||||||
|
input_remapping_update_port_map();
|
||||||
|
|
||||||
|
/* Changing mapped port may leave a core port unused;
|
||||||
|
* reinitialise controllers to ensure that any such
|
||||||
|
* ports are set to 'RETRO_DEVICE_NONE' */
|
||||||
|
command_event(CMD_EVENT_CONTROLLER_INIT, NULL);
|
||||||
|
|
||||||
|
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
|
||||||
|
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int setting_action_right_bind_device(
|
static int setting_action_right_bind_device(
|
||||||
rarch_setting_t *setting, size_t idx, bool wraparound)
|
rarch_setting_t *setting, size_t idx, bool wraparound)
|
||||||
{
|
{
|
||||||
@ -7058,7 +7155,7 @@ static int setting_action_right_bind_device(
|
|||||||
|
|
||||||
index_offset = setting->index_offset;
|
index_offset = setting->index_offset;
|
||||||
|
|
||||||
p = &settings->uints.input_joypad_map[index_offset];
|
p = &settings->uints.input_joypad_index[index_offset];
|
||||||
|
|
||||||
if (*p < max_devices)
|
if (*p < max_devices)
|
||||||
(*p)++;
|
(*p)++;
|
||||||
@ -7142,7 +7239,7 @@ static void get_string_representation_bind_device(rarch_setting_t *setting, char
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
index_offset = setting->index_offset;
|
index_offset = setting->index_offset;
|
||||||
map = settings->uints.input_joypad_map[index_offset];
|
map = settings->uints.input_joypad_index[index_offset];
|
||||||
|
|
||||||
if (map < max_devices)
|
if (map < max_devices)
|
||||||
{
|
{
|
||||||
@ -7213,7 +7310,7 @@ static void general_read_handler(rarch_setting_t *setting)
|
|||||||
case MENU_ENUM_LABEL_INPUT_PLAYER3_JOYPAD_INDEX:
|
case MENU_ENUM_LABEL_INPUT_PLAYER3_JOYPAD_INDEX:
|
||||||
case MENU_ENUM_LABEL_INPUT_PLAYER4_JOYPAD_INDEX:
|
case MENU_ENUM_LABEL_INPUT_PLAYER4_JOYPAD_INDEX:
|
||||||
case MENU_ENUM_LABEL_INPUT_PLAYER5_JOYPAD_INDEX:
|
case MENU_ENUM_LABEL_INPUT_PLAYER5_JOYPAD_INDEX:
|
||||||
*setting->value.target.integer = settings->uints.input_joypad_map[setting->enum_idx - MENU_ENUM_LABEL_INPUT_PLAYER1_JOYPAD_INDEX];
|
*setting->value.target.integer = settings->uints.input_joypad_index[setting->enum_idx - MENU_ENUM_LABEL_INPUT_PLAYER1_JOYPAD_INDEX];
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -7474,7 +7571,7 @@ static void general_write_handler(rarch_setting_t *setting)
|
|||||||
{
|
{
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
settings->modified = true;
|
settings->modified = true;
|
||||||
settings->uints.input_joypad_map[setting->enum_idx - MENU_ENUM_LABEL_INPUT_PLAYER1_JOYPAD_INDEX] = *setting->value.target.integer;
|
settings->uints.input_joypad_index[setting->enum_idx - MENU_ENUM_LABEL_INPUT_PLAYER1_JOYPAD_INDEX] = *setting->value.target.integer;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MENU_ENUM_LABEL_LOG_TO_FILE:
|
case MENU_ENUM_LABEL_LOG_TO_FILE:
|
||||||
@ -7865,6 +7962,24 @@ static void general_write_handler(rarch_setting_t *setting)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
/* Special cases */
|
||||||
|
|
||||||
|
/* > Mapped Port (virtual -> 'physical' port mapping)
|
||||||
|
* Occupies a range of enum indices, so cannot
|
||||||
|
* simply switch on the value */
|
||||||
|
if ((setting->enum_idx >= MENU_ENUM_LABEL_INPUT_REMAP_PORT) &&
|
||||||
|
(setting->enum_idx <= MENU_ENUM_LABEL_INPUT_REMAP_PORT_LAST))
|
||||||
|
{
|
||||||
|
/* Must be called whenever settings->uints.input_remap_ports
|
||||||
|
* is modified */
|
||||||
|
input_remapping_update_port_map();
|
||||||
|
|
||||||
|
/* Changing mapped port may leave a core port unused;
|
||||||
|
* reinitialise controllers to ensure that any such
|
||||||
|
* ports are set to 'RETRO_DEVICE_NONE' */
|
||||||
|
command_event(CMD_EVENT_CONTROLLER_INIT, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8398,6 +8513,72 @@ static bool setting_append_list_input_player_options(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool setting_append_list_input_remap_port_options(
|
||||||
|
rarch_setting_t **list,
|
||||||
|
rarch_setting_info_t *list_info,
|
||||||
|
const char *parent_group)
|
||||||
|
{
|
||||||
|
settings_t *settings = config_get_ptr();
|
||||||
|
rarch_setting_group_info_t group_info;
|
||||||
|
rarch_setting_group_info_t subgroup_info;
|
||||||
|
static char key_port[MAX_USERS][64];
|
||||||
|
static char label_port[MAX_USERS][64];
|
||||||
|
unsigned user;
|
||||||
|
|
||||||
|
group_info.name = NULL;
|
||||||
|
subgroup_info.name = NULL;
|
||||||
|
|
||||||
|
START_GROUP(list, list_info, &group_info,
|
||||||
|
"Mapped Ports", parent_group);
|
||||||
|
|
||||||
|
parent_group = msg_hash_to_str(MENU_ENUM_LABEL_SETTINGS);
|
||||||
|
|
||||||
|
START_SUB_GROUP(list, list_info, "State", &group_info,
|
||||||
|
&subgroup_info, parent_group);
|
||||||
|
|
||||||
|
for (user = 0; user < MAX_USERS; user++)
|
||||||
|
{
|
||||||
|
key_port[user][0] = '\0';
|
||||||
|
label_port[user][0] = '\0';
|
||||||
|
|
||||||
|
snprintf(key_port[user], sizeof(key_port[user]),
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_INPUT_REMAP_PORT),
|
||||||
|
user + 1);
|
||||||
|
|
||||||
|
snprintf(label_port[user], sizeof(label_port[user]), "%s",
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_REMAP_PORT));
|
||||||
|
|
||||||
|
CONFIG_UINT_ALT(
|
||||||
|
list, list_info,
|
||||||
|
&settings->uints.input_remap_ports[user],
|
||||||
|
key_port[user],
|
||||||
|
label_port[user],
|
||||||
|
user,
|
||||||
|
&group_info,
|
||||||
|
&subgroup_info,
|
||||||
|
parent_group,
|
||||||
|
general_write_handler,
|
||||||
|
general_read_handler);
|
||||||
|
(*list)[list_info->index - 1].index = user + 1;
|
||||||
|
(*list)[list_info->index - 1].index_offset = user;
|
||||||
|
(*list)[list_info->index - 1].action_left = &setting_action_left_input_remap_port;
|
||||||
|
(*list)[list_info->index - 1].action_right = &setting_action_right_input_remap_port;
|
||||||
|
(*list)[list_info->index - 1].action_select = &setting_action_right_input_remap_port;
|
||||||
|
(*list)[list_info->index - 1].action_start = &setting_action_start_input_remap_port;
|
||||||
|
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
|
||||||
|
(*list)[list_info->index - 1].get_string_representation =
|
||||||
|
&setting_get_string_representation_uint_input_remap_port;
|
||||||
|
menu_settings_list_current_add_range(list, list_info, 0, MAX_USERS-1, 1.0, true, true);
|
||||||
|
MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info,
|
||||||
|
(enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_REMAP_PORT + user));
|
||||||
|
}
|
||||||
|
|
||||||
|
END_SUB_GROUP(list, list_info, parent_group);
|
||||||
|
END_GROUP(list, list_info, parent_group);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* config_get_audio_resampler_driver_options:
|
* config_get_audio_resampler_driver_options:
|
||||||
*
|
*
|
||||||
@ -9244,6 +9425,8 @@ static bool setting_append_list(
|
|||||||
for (user = 0; user < MAX_USERS; user++)
|
for (user = 0; user < MAX_USERS; user++)
|
||||||
setting_append_list_input_player_options(list, list_info, parent_group, user);
|
setting_append_list_input_player_options(list, list_info, parent_group, user);
|
||||||
|
|
||||||
|
setting_append_list_input_remap_port_options(list, list_info, parent_group);
|
||||||
|
|
||||||
END_SUB_GROUP(list, list_info, parent_group);
|
END_SUB_GROUP(list, list_info, parent_group);
|
||||||
END_GROUP(list, list_info, parent_group);
|
END_GROUP(list, list_info, parent_group);
|
||||||
break;
|
break;
|
||||||
|
@ -742,6 +742,9 @@ enum msg_hash_enums
|
|||||||
MENU_ENUM_LABEL_INPUT_DEVICE_INDEX_LAST = MENU_ENUM_LABEL_INPUT_DEVICE_INDEX + MAX_USERS,
|
MENU_ENUM_LABEL_INPUT_DEVICE_INDEX_LAST = MENU_ENUM_LABEL_INPUT_DEVICE_INDEX + MAX_USERS,
|
||||||
MENU_ENUM_LABEL_INPUT_MOUSE_INDEX,
|
MENU_ENUM_LABEL_INPUT_MOUSE_INDEX,
|
||||||
MENU_ENUM_LABEL_INPUT_MOUSE_INDEX_LAST = MENU_ENUM_LABEL_INPUT_MOUSE_INDEX + MAX_USERS,
|
MENU_ENUM_LABEL_INPUT_MOUSE_INDEX_LAST = MENU_ENUM_LABEL_INPUT_MOUSE_INDEX + MAX_USERS,
|
||||||
|
MENU_ENUM_LABEL_INPUT_REMAP_PORT,
|
||||||
|
MENU_ENUM_LABEL_INPUT_REMAP_PORT_LAST = MENU_ENUM_LABEL_INPUT_REMAP_PORT + MAX_USERS,
|
||||||
|
|
||||||
MENU_ENUM_LABEL_INPUT_SETTINGS_BEGIN,
|
MENU_ENUM_LABEL_INPUT_SETTINGS_BEGIN,
|
||||||
|
|
||||||
MENU_LABEL(INPUT_HOTKEY_BINDS),
|
MENU_LABEL(INPUT_HOTKEY_BINDS),
|
||||||
@ -889,6 +892,8 @@ enum msg_hash_enums
|
|||||||
MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL,
|
MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL,
|
||||||
MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG,
|
MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG,
|
||||||
MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX,
|
MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX,
|
||||||
|
MENU_ENUM_LABEL_VALUE_INPUT_REMAP_PORT,
|
||||||
|
MENU_ENUM_SUBLABEL_INPUT_REMAP_PORT,
|
||||||
|
|
||||||
MENU_ENUM_SUBLABEL_INPUT_META_FAST_FORWARD_KEY,
|
MENU_ENUM_SUBLABEL_INPUT_META_FAST_FORWARD_KEY,
|
||||||
MENU_ENUM_SUBLABEL_INPUT_META_FAST_FORWARD_HOLD_KEY,
|
MENU_ENUM_SUBLABEL_INPUT_META_FAST_FORWARD_HOLD_KEY,
|
||||||
|
559
retroarch.c
559
retroarch.c
@ -1372,7 +1372,7 @@ bool menu_input_key_bind_set_mode(
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
index_offset = setting->index_offset;
|
index_offset = setting->index_offset;
|
||||||
binds->port = settings->uints.input_joypad_map[index_offset];
|
binds->port = settings->uints.input_joypad_index[index_offset];
|
||||||
|
|
||||||
menu_input_key_bind_poll_bind_get_rested_axes(
|
menu_input_key_bind_poll_bind_get_rested_axes(
|
||||||
p_rarch->joypad,
|
p_rarch->joypad,
|
||||||
@ -1382,7 +1382,7 @@ bool menu_input_key_bind_set_mode(
|
|||||||
NULL,
|
NULL,
|
||||||
#endif
|
#endif
|
||||||
binds);
|
binds);
|
||||||
menu_input_key_bind_poll_bind_state(p_rarch, settings->uints.input_joypad_map[binds->port],
|
menu_input_key_bind_poll_bind_state(p_rarch, settings->uints.input_joypad_index[binds->port],
|
||||||
binds, false);
|
binds, false);
|
||||||
|
|
||||||
current_usec = cpu_features_get_time_usec();
|
current_usec = cpu_features_get_time_usec();
|
||||||
@ -1495,7 +1495,7 @@ static bool menu_input_key_bind_iterate(
|
|||||||
p_rarch->keyboard_mapping_blocked = false;
|
p_rarch->keyboard_mapping_blocked = false;
|
||||||
|
|
||||||
menu_input_key_bind_poll_bind_state(p_rarch,
|
menu_input_key_bind_poll_bind_state(p_rarch,
|
||||||
settings->uints.input_joypad_map[new_binds.port],
|
settings->uints.input_joypad_index[new_binds.port],
|
||||||
&new_binds, timed_out);
|
&new_binds, timed_out);
|
||||||
|
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
@ -12139,20 +12139,39 @@ static void command_event_set_mixer_volume(
|
|||||||
* Initialize libretro controllers.
|
* Initialize libretro controllers.
|
||||||
**/
|
**/
|
||||||
static void command_event_init_controllers(rarch_system_info_t *info,
|
static void command_event_init_controllers(rarch_system_info_t *info,
|
||||||
unsigned num_active_users)
|
settings_t *settings, unsigned num_active_users)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned num_core_ports = info->ports.size;
|
||||||
unsigned ports_size = info->ports.size;
|
unsigned port;
|
||||||
|
|
||||||
for (i = 0; i < ports_size; i++)
|
for (port = 0; port < num_core_ports; port++)
|
||||||
{
|
{
|
||||||
|
unsigned device = RETRO_DEVICE_NONE;
|
||||||
|
const struct retro_controller_description *desc = NULL;
|
||||||
retro_ctx_controller_info_t pad;
|
retro_ctx_controller_info_t pad;
|
||||||
unsigned device = (i < num_active_users)
|
unsigned i;
|
||||||
? input_config_get_device(i)
|
|
||||||
: RETRO_DEVICE_NONE;
|
/* Check whether current core port is mapped
|
||||||
const struct retro_controller_description *desc =
|
* to an input device
|
||||||
libretro_find_controller_description(
|
* > If is not, leave 'device' set to
|
||||||
&info->ports.data[i], device);
|
* 'RETRO_DEVICE_NONE'
|
||||||
|
* > For example: if input ports 0 and 1 are
|
||||||
|
* mapped to core port 0, core port 1 will
|
||||||
|
* be unmapped and should be disabled */
|
||||||
|
for (i = 0; i < num_active_users; i++)
|
||||||
|
{
|
||||||
|
if (i >= MAX_USERS)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (port == settings->uints.input_remap_ports[i])
|
||||||
|
{
|
||||||
|
device = input_config_get_device(port);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
desc = libretro_find_controller_description(
|
||||||
|
&info->ports.data[port], device);
|
||||||
|
|
||||||
if (desc && !desc->desc)
|
if (desc && !desc->desc)
|
||||||
{
|
{
|
||||||
@ -12171,7 +12190,7 @@ static void command_event_init_controllers(rarch_system_info_t *info,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pad.device = device;
|
pad.device = device;
|
||||||
pad.port = i;
|
pad.port = port;
|
||||||
core_set_controller_port_device(&pad);
|
core_set_controller_port_device(&pad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -12183,46 +12202,6 @@ static void command_event_disable_overrides(struct rarch_state *p_rarch)
|
|||||||
config_unload_override();
|
config_unload_override();
|
||||||
runloop_state.overrides_active = false;
|
runloop_state.overrides_active = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void input_remapping_set_defaults(void)
|
|
||||||
{
|
|
||||||
unsigned i, j;
|
|
||||||
struct rarch_state *p_rarch = &rarch_st;
|
|
||||||
settings_t *settings = p_rarch->configuration_settings;
|
|
||||||
global_t *global = &p_rarch->g_extern;
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_USERS; i++)
|
|
||||||
{
|
|
||||||
for (j = 0; j < RARCH_FIRST_CUSTOM_BIND; j++)
|
|
||||||
{
|
|
||||||
const struct retro_keybind *keybind = &input_config_binds[i][j];
|
|
||||||
if (keybind)
|
|
||||||
configuration_set_uint(settings,
|
|
||||||
settings->uints.input_remap_ids[i][j], keybind->id);
|
|
||||||
configuration_set_uint(settings,
|
|
||||||
settings->uints.input_keymapper_ids[i][j], RETROK_UNKNOWN);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = RARCH_FIRST_CUSTOM_BIND; j < (RARCH_FIRST_CUSTOM_BIND + 8); j++)
|
|
||||||
configuration_set_uint(settings,
|
|
||||||
settings->uints.input_remap_ids[i][j], j);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (global)
|
|
||||||
{
|
|
||||||
for (i = 0; i < MAX_USERS; i++)
|
|
||||||
{
|
|
||||||
if (global->old_analog_dpad_mode[i])
|
|
||||||
configuration_set_uint(settings,
|
|
||||||
settings->uints.input_analog_dpad_mode[i],
|
|
||||||
global->old_analog_dpad_mode[i]);
|
|
||||||
if (global->old_libretro_device[i])
|
|
||||||
configuration_set_uint(settings,
|
|
||||||
settings->uints.input_libretro_device[i],
|
|
||||||
global->old_libretro_device[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void command_event_deinit_core(
|
static void command_event_deinit_core(
|
||||||
@ -12254,16 +12233,16 @@ static void command_event_deinit_core(
|
|||||||
p_rarch->runtime_shader_preset[0] = '\0';
|
p_rarch->runtime_shader_preset[0] = '\0';
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_CONFIGFILE
|
|
||||||
if ( runloop_state.remaps_core_active
|
if ( runloop_state.remaps_core_active
|
||||||
|| runloop_state.remaps_content_dir_active
|
|| runloop_state.remaps_content_dir_active
|
||||||
|| runloop_state.remaps_game_active
|
|| runloop_state.remaps_game_active
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
input_remapping_deinit();
|
input_remapping_deinit();
|
||||||
input_remapping_set_defaults();
|
input_remapping_set_defaults(true);
|
||||||
}
|
}
|
||||||
#endif
|
else
|
||||||
|
input_remapping_restore_global_config(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_CHEATS
|
#ifdef HAVE_CHEATS
|
||||||
@ -12770,6 +12749,15 @@ static bool command_event_init_core(
|
|||||||
|
|
||||||
p_rarch->current_core.retro_set_environment(rarch_environment_cb);
|
p_rarch->current_core.retro_set_environment(rarch_environment_cb);
|
||||||
|
|
||||||
|
/* Load any input remap files
|
||||||
|
* > Note that we always cache the current global
|
||||||
|
* input settings when initialising a core
|
||||||
|
* (regardless of whether remap files are loaded)
|
||||||
|
* so settings can be restored when the core is
|
||||||
|
* unloaded - i.e. core remapping options modified
|
||||||
|
* at runtime should not 'bleed through' into the
|
||||||
|
* master config file */
|
||||||
|
input_remapping_cache_global_config();
|
||||||
#ifdef HAVE_CONFIGFILE
|
#ifdef HAVE_CONFIGFILE
|
||||||
if (auto_remaps_enable)
|
if (auto_remaps_enable)
|
||||||
config_load_remap(dir_input_remapping, &runloop_state.system);
|
config_load_remap(dir_input_remapping, &runloop_state.system);
|
||||||
@ -13202,18 +13190,167 @@ static bool command_event_resize_windowed_scale(struct rarch_state *p_rarch)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void input_remapping_cache_global_config(void)
|
||||||
|
{
|
||||||
|
struct rarch_state *p_rarch = &rarch_st;
|
||||||
|
settings_t *settings = p_rarch->configuration_settings;
|
||||||
|
global_t *global = &p_rarch->g_extern;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_USERS; i++)
|
||||||
|
{
|
||||||
|
global->old_analog_dpad_mode[i] = settings->uints.input_analog_dpad_mode[i];
|
||||||
|
global->old_libretro_device[i] = settings->uints.input_libretro_device[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
global->old_analog_dpad_mode_set = true;
|
||||||
|
global->old_libretro_device_set = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void input_remapping_enable_global_config_restore(void)
|
||||||
|
{
|
||||||
|
struct rarch_state *p_rarch = &rarch_st;
|
||||||
|
global_t *global = &p_rarch->g_extern;
|
||||||
|
global->remapping_cache_active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void input_remapping_restore_global_config(bool clear_cache)
|
||||||
|
{
|
||||||
|
struct rarch_state *p_rarch = &rarch_st;
|
||||||
|
settings_t *settings = p_rarch->configuration_settings;
|
||||||
|
global_t *global = &p_rarch->g_extern;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
if (!global->remapping_cache_active)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_USERS; i++)
|
||||||
|
{
|
||||||
|
if (global->old_analog_dpad_mode_set &&
|
||||||
|
(settings->uints.input_analog_dpad_mode[i] !=
|
||||||
|
global->old_analog_dpad_mode[i]))
|
||||||
|
configuration_set_uint(settings,
|
||||||
|
settings->uints.input_analog_dpad_mode[i],
|
||||||
|
global->old_analog_dpad_mode[i]);
|
||||||
|
|
||||||
|
if (global->old_libretro_device_set &&
|
||||||
|
(settings->uints.input_libretro_device[i] !=
|
||||||
|
global->old_libretro_device[i]))
|
||||||
|
configuration_set_uint(settings,
|
||||||
|
settings->uints.input_libretro_device[i],
|
||||||
|
global->old_libretro_device[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
if (clear_cache)
|
||||||
|
{
|
||||||
|
global->old_analog_dpad_mode_set = false;
|
||||||
|
global->old_libretro_device_set = false;
|
||||||
|
global->remapping_cache_active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void input_remapping_update_port_map(void)
|
||||||
|
{
|
||||||
|
unsigned i, j;
|
||||||
|
struct rarch_state *p_rarch = &rarch_st;
|
||||||
|
settings_t *settings = p_rarch->configuration_settings;
|
||||||
|
unsigned port_map_index[MAX_USERS] = {0};
|
||||||
|
|
||||||
|
/* First pass: 'reset' port map */
|
||||||
|
for (i = 0; i < MAX_USERS; i++)
|
||||||
|
for (j = 0; j < (MAX_USERS + 1); j++)
|
||||||
|
settings->uints.input_remap_port_map[i][j] = MAX_USERS;
|
||||||
|
|
||||||
|
/* Second pass: assign port indices from
|
||||||
|
* 'input_remap_ports' */
|
||||||
|
for (i = 0; i < MAX_USERS; i++)
|
||||||
|
{
|
||||||
|
unsigned remap_port = settings->uints.input_remap_ports[i];
|
||||||
|
|
||||||
|
if (remap_port < MAX_USERS)
|
||||||
|
{
|
||||||
|
/* 'input_remap_port_map' provides a list of
|
||||||
|
* 'physical' ports for each 'virtual' port
|
||||||
|
* sampled in input_state().
|
||||||
|
* (Note: in the following explanation, port
|
||||||
|
* index starts from 0, rather than the frontend
|
||||||
|
* display convention of 1)
|
||||||
|
* For example - the following remap configuration
|
||||||
|
* will map input devices 0+1 to port 0, and input
|
||||||
|
* device 2 to port 1
|
||||||
|
* > input_remap_ports[0] = 0;
|
||||||
|
* input_remap_ports[1] = 0;
|
||||||
|
* input_remap_ports[2] = 1;
|
||||||
|
* This gives a port map of:
|
||||||
|
* > input_remap_port_map[0] = { 0, 1, MAX_USERS, ... };
|
||||||
|
* input_remap_port_map[1] = { 2, MAX_USERS, ... }
|
||||||
|
* input_remap_port_map[2] = { MAX_USERS, ... }
|
||||||
|
* ...
|
||||||
|
* A port map value of MAX_USERS indicates the end
|
||||||
|
* of the 'physical' port list */
|
||||||
|
settings->uints.input_remap_port_map[remap_port]
|
||||||
|
[port_map_index[remap_port]] = i;
|
||||||
|
port_map_index[remap_port]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void input_remapping_deinit(void)
|
void input_remapping_deinit(void)
|
||||||
{
|
{
|
||||||
struct rarch_state *p_rarch = &rarch_st;
|
struct rarch_state *p_rarch = &rarch_st;
|
||||||
global_t *global = &p_rarch->g_extern;
|
global_t *global = &p_rarch->g_extern;
|
||||||
if (!string_is_empty(global->name.remapfile))
|
if (global->name.remapfile)
|
||||||
free(global->name.remapfile);
|
free(global->name.remapfile);
|
||||||
global->name.remapfile = NULL;
|
global->name.remapfile = NULL;
|
||||||
runloop_state.remaps_core_active = false;
|
runloop_state.remaps_core_active = false;
|
||||||
runloop_state.remaps_content_dir_active = false;
|
runloop_state.remaps_content_dir_active = false;
|
||||||
runloop_state.remaps_game_active = false;
|
runloop_state.remaps_game_active = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void input_remapping_set_defaults(bool clear_cache)
|
||||||
|
{
|
||||||
|
unsigned i, j;
|
||||||
|
struct rarch_state *p_rarch = &rarch_st;
|
||||||
|
settings_t *settings = p_rarch->configuration_settings;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_USERS; i++)
|
||||||
|
{
|
||||||
|
/* Button/keyboard remaps */
|
||||||
|
for (j = 0; j < RARCH_FIRST_CUSTOM_BIND; j++)
|
||||||
|
{
|
||||||
|
const struct retro_keybind *keybind = &input_config_binds[i][j];
|
||||||
|
|
||||||
|
configuration_set_uint(settings,
|
||||||
|
settings->uints.input_remap_ids[i][j],
|
||||||
|
keybind ? keybind->id : RARCH_UNMAPPED);
|
||||||
|
|
||||||
|
configuration_set_uint(settings,
|
||||||
|
settings->uints.input_keymapper_ids[i][j], RETROK_UNKNOWN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Analog stick remaps */
|
||||||
|
for (j = RARCH_FIRST_CUSTOM_BIND; j < (RARCH_FIRST_CUSTOM_BIND + 8); j++)
|
||||||
|
configuration_set_uint(settings,
|
||||||
|
settings->uints.input_remap_ids[i][j], j);
|
||||||
|
|
||||||
|
/* Controller port remaps */
|
||||||
|
configuration_set_uint(settings,
|
||||||
|
settings->uints.input_remap_ports[i], i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Need to call 'input_remapping_update_port_map()'
|
||||||
|
* whenever 'settings->uints.input_remap_ports'
|
||||||
|
* is modified */
|
||||||
|
input_remapping_update_port_map();
|
||||||
|
|
||||||
|
/* Restore 'global' settings that were cached on
|
||||||
|
* the last core init
|
||||||
|
* > Prevents remap changes from 'bleeding through'
|
||||||
|
* into the main config file */
|
||||||
|
input_remapping_restore_global_config(clear_cache);
|
||||||
|
}
|
||||||
|
|
||||||
static bool input_driver_grab_mouse(struct rarch_state *p_rarch)
|
static bool input_driver_grab_mouse(struct rarch_state *p_rarch)
|
||||||
{
|
{
|
||||||
if (!p_rarch->current_input || !p_rarch->current_input->grab_mouse)
|
if (!p_rarch->current_input || !p_rarch->current_input->grab_mouse)
|
||||||
@ -13810,16 +13947,16 @@ bool command_event(enum event_command cmd, void *data)
|
|||||||
|
|
||||||
video_driver_restore_cached(p_rarch, settings);
|
video_driver_restore_cached(p_rarch, settings);
|
||||||
|
|
||||||
#ifdef HAVE_CONFIGFILE
|
|
||||||
if ( runloop_state.remaps_core_active
|
if ( runloop_state.remaps_core_active
|
||||||
|| runloop_state.remaps_content_dir_active
|
|| runloop_state.remaps_content_dir_active
|
||||||
|| runloop_state.remaps_game_active
|
|| runloop_state.remaps_game_active
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
input_remapping_deinit();
|
input_remapping_deinit();
|
||||||
input_remapping_set_defaults();
|
input_remapping_set_defaults(true);
|
||||||
}
|
}
|
||||||
#endif
|
else
|
||||||
|
input_remapping_restore_global_config(true);
|
||||||
|
|
||||||
if (is_inited)
|
if (is_inited)
|
||||||
{
|
{
|
||||||
@ -15120,9 +15257,8 @@ bool command_event(enum event_command cmd, void *data)
|
|||||||
{
|
{
|
||||||
rarch_system_info_t *info = &runloop_state.system;
|
rarch_system_info_t *info = &runloop_state.system;
|
||||||
if (info)
|
if (info)
|
||||||
command_event_init_controllers(info,
|
command_event_init_controllers(info, settings,
|
||||||
p_rarch->input_driver_max_users
|
p_rarch->input_driver_max_users);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CMD_EVENT_NONE:
|
case CMD_EVENT_NONE:
|
||||||
@ -17542,9 +17678,11 @@ static bool rarch_environment_cb(unsigned cmd, void *data)
|
|||||||
p_rarch->input_driver_max_users;
|
p_rarch->input_driver_max_users;
|
||||||
for (p = 0; p < input_driver_max_users; p++)
|
for (p = 0; p < input_driver_max_users; p++)
|
||||||
{
|
{
|
||||||
|
unsigned mapped_port = settings->uints.input_remap_ports[p];
|
||||||
|
|
||||||
for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND; retro_id++)
|
for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND; retro_id++)
|
||||||
{
|
{
|
||||||
const char *description = system->input_desc_btn[p][retro_id];
|
const char *description = system->input_desc_btn[mapped_port][retro_id];
|
||||||
|
|
||||||
if (!description)
|
if (!description)
|
||||||
continue;
|
continue;
|
||||||
@ -22313,7 +22451,7 @@ bool input_driver_set_rumble_state(unsigned port,
|
|||||||
const input_device_driver_t *sec_joypad = NULL;
|
const input_device_driver_t *sec_joypad = NULL;
|
||||||
#endif
|
#endif
|
||||||
bool rumble_state = false;
|
bool rumble_state = false;
|
||||||
unsigned joy_idx = settings->uints.input_joypad_map[port];
|
unsigned joy_idx = settings->uints.input_joypad_index[port];
|
||||||
|
|
||||||
if (joy_idx >= MAX_USERS)
|
if (joy_idx >= MAX_USERS)
|
||||||
return false;
|
return false;
|
||||||
@ -22455,8 +22593,9 @@ static void input_driver_poll(void)
|
|||||||
for (i = 0; i < max_users; i++)
|
for (i = 0; i < max_users; i++)
|
||||||
{
|
{
|
||||||
joypad_info[i].axis_threshold = p_rarch->input_driver_axis_threshold;
|
joypad_info[i].axis_threshold = p_rarch->input_driver_axis_threshold;
|
||||||
joypad_info[i].joy_idx = settings->uints.input_joypad_map[i];
|
joypad_info[i].joy_idx = settings->uints.input_joypad_index[i];
|
||||||
joypad_info[i].auto_binds = input_autoconf_binds[joypad_info[i].joy_idx];
|
joypad_info[i].auto_binds = input_autoconf_binds[joypad_info[i].joy_idx];
|
||||||
|
|
||||||
p_rarch->input_driver_turbo_btns.frame_enable[i] = p_rarch->libretro_input_binds[i][RARCH_TURBO_ENABLE].valid ?
|
p_rarch->input_driver_turbo_btns.frame_enable[i] = p_rarch->libretro_input_binds[i][RARCH_TURBO_ENABLE].valid ?
|
||||||
input_state_wrap(
|
input_state_wrap(
|
||||||
p_rarch->current_input,
|
p_rarch->current_input,
|
||||||
@ -22500,13 +22639,11 @@ static void input_driver_poll(void)
|
|||||||
for (i = 0; i < max_users; i++)
|
for (i = 0; i < max_users; i++)
|
||||||
{
|
{
|
||||||
input_bits_t current_inputs;
|
input_bits_t current_inputs;
|
||||||
unsigned device
|
unsigned mapped_port = settings->uints.input_remap_ports[i];
|
||||||
= settings->uints.input_libretro_device[i]
|
unsigned device = settings->uints.input_libretro_device[mapped_port]
|
||||||
& RETRO_DEVICE_MASK;
|
& RETRO_DEVICE_MASK;
|
||||||
input_bits_t *p_new_state
|
input_bits_t *p_new_state = (input_bits_t*)¤t_inputs;
|
||||||
= (input_bits_t*)¤t_inputs;
|
unsigned input_analog_dpad_mode = settings->uints.input_analog_dpad_mode[i];
|
||||||
unsigned input_analog_dpad_mode =
|
|
||||||
settings->uints.input_analog_dpad_mode[i];
|
|
||||||
|
|
||||||
switch (device)
|
switch (device)
|
||||||
{
|
{
|
||||||
@ -22591,8 +22728,8 @@ static void input_driver_poll(void)
|
|||||||
for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++)
|
for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++)
|
||||||
{
|
{
|
||||||
unsigned current_button_value;
|
unsigned current_button_value;
|
||||||
unsigned remap_key =
|
unsigned remap_key =
|
||||||
settings->uints.input_keymapper_ids[i][j];
|
settings->uints.input_keymapper_ids[i][j];
|
||||||
|
|
||||||
if (remap_key == RETROK_UNKNOWN)
|
if (remap_key == RETROK_UNKNOWN)
|
||||||
continue;
|
continue;
|
||||||
@ -22665,9 +22802,9 @@ static void input_driver_poll(void)
|
|||||||
{
|
{
|
||||||
bool remap_valid;
|
bool remap_valid;
|
||||||
unsigned remap_button =
|
unsigned remap_button =
|
||||||
settings->uints.input_remap_ids[i][j];
|
settings->uints.input_remap_ids[i][j];
|
||||||
unsigned current_button_value =
|
unsigned current_button_value =
|
||||||
BIT256_GET_PTR(p_new_state, j);
|
BIT256_GET_PTR(p_new_state, j);
|
||||||
|
|
||||||
#ifdef HAVE_OVERLAY
|
#ifdef HAVE_OVERLAY
|
||||||
if (poll_overlay && i == 0)
|
if (poll_overlay && i == 0)
|
||||||
@ -22721,8 +22858,7 @@ static void input_driver_poll(void)
|
|||||||
{
|
{
|
||||||
unsigned k = (unsigned)j + RARCH_FIRST_CUSTOM_BIND;
|
unsigned k = (unsigned)j + RARCH_FIRST_CUSTOM_BIND;
|
||||||
int16_t current_axis_value = p_new_state->analogs[j];
|
int16_t current_axis_value = p_new_state->analogs[j];
|
||||||
unsigned remap_axis =
|
unsigned remap_axis = settings->uints.input_remap_ids[i][k];
|
||||||
settings->uints.input_remap_ids[i][k];
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(abs(current_axis_value) > 0 &&
|
(abs(current_axis_value) > 0 &&
|
||||||
@ -22831,7 +22967,7 @@ static int16_t input_state_device(
|
|||||||
unsigned idx, unsigned id,
|
unsigned idx, unsigned id,
|
||||||
bool button_mask)
|
bool button_mask)
|
||||||
{
|
{
|
||||||
int16_t res = 0;
|
int16_t res = 0;
|
||||||
|
|
||||||
switch (device)
|
switch (device)
|
||||||
{
|
{
|
||||||
@ -23070,11 +23206,9 @@ static int16_t input_state_device(
|
|||||||
unsigned offset = RARCH_FIRST_CUSTOM_BIND +
|
unsigned offset = RARCH_FIRST_CUSTOM_BIND +
|
||||||
(idx * 4) + (id * 2);
|
(idx * 4) + (id * 2);
|
||||||
|
|
||||||
if (settings->uints.input_remap_ids
|
if (settings->uints.input_remap_ids[port][offset] != offset)
|
||||||
[port][offset] != offset)
|
|
||||||
reset_state = true;
|
reset_state = true;
|
||||||
else if (settings->uints.input_remap_ids
|
else if (settings->uints.input_remap_ids[port][offset+1] != (offset+1))
|
||||||
[port][offset+1] != (offset+1))
|
|
||||||
reset_state = true;
|
reset_state = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23156,26 +23290,31 @@ static int16_t input_state(unsigned port, unsigned device,
|
|||||||
unsigned idx, unsigned id)
|
unsigned idx, unsigned id)
|
||||||
{
|
{
|
||||||
rarch_joypad_info_t joypad_info;
|
rarch_joypad_info_t joypad_info;
|
||||||
struct rarch_state *p_rarch = &rarch_st;
|
unsigned mapped_port;
|
||||||
settings_t *settings = p_rarch->configuration_settings;
|
struct rarch_state *p_rarch = &rarch_st;
|
||||||
float input_analog_deadzone = settings->floats.input_analog_deadzone;
|
settings_t *settings = p_rarch->configuration_settings;
|
||||||
float input_analog_sensitivity = settings->floats.input_analog_sensitivity;
|
float input_analog_deadzone = settings->floats.input_analog_deadzone;
|
||||||
unsigned input_analog_dpad_mode = settings->uints.input_analog_dpad_mode[port];
|
float input_analog_sensitivity = settings->floats.input_analog_sensitivity;
|
||||||
int16_t result = 0;
|
unsigned *input_remap_port_map = settings->uints.input_remap_port_map[port];
|
||||||
int16_t ret = 0;
|
const input_device_driver_t *joypad = p_rarch->joypad;
|
||||||
#ifdef HAVE_MFI
|
#ifdef HAVE_MFI
|
||||||
const input_device_driver_t
|
const input_device_driver_t *sec_joypad = p_rarch->sec_joypad;
|
||||||
*sec_joypad = p_rarch->sec_joypad;
|
|
||||||
#else
|
#else
|
||||||
const input_device_driver_t
|
const input_device_driver_t *sec_joypad = NULL;
|
||||||
*sec_joypad = NULL;
|
|
||||||
#endif
|
#endif
|
||||||
|
bool input_blocked = (p_rarch->input_driver_flushing_input > 0) ||
|
||||||
|
p_rarch->input_driver_block_libretro_input;
|
||||||
|
bool bitmask_enabled = false;
|
||||||
|
unsigned max_users = p_rarch->input_driver_max_users;
|
||||||
|
int16_t result = 0;
|
||||||
|
|
||||||
joypad_info.axis_threshold = p_rarch->input_driver_axis_threshold;
|
device &= RETRO_DEVICE_MASK;
|
||||||
joypad_info.joy_idx = settings->uints.input_joypad_map[port];
|
bitmask_enabled = (device == RETRO_DEVICE_JOYPAD) &&
|
||||||
joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx];
|
(id == RETRO_DEVICE_ID_JOYPAD_MASK);
|
||||||
|
joypad_info.axis_threshold = p_rarch->input_driver_axis_threshold;
|
||||||
|
|
||||||
#ifdef HAVE_BSV_MOVIE
|
#ifdef HAVE_BSV_MOVIE
|
||||||
|
/* Load input from BSV record, if enabled */
|
||||||
if (BSV_MOVIE_IS_PLAYBACK_ON())
|
if (BSV_MOVIE_IS_PLAYBACK_ON())
|
||||||
{
|
{
|
||||||
int16_t bsv_result;
|
int16_t bsv_result;
|
||||||
@ -23191,97 +23330,138 @@ static int16_t input_state(unsigned port, unsigned device,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
device &= RETRO_DEVICE_MASK;
|
/* Loop over all 'physical' ports mapped to specified
|
||||||
ret = input_state_wrap(
|
* 'virtual' port index */
|
||||||
p_rarch->current_input,
|
while ((mapped_port = *(input_remap_port_map++)) < MAX_USERS)
|
||||||
p_rarch->current_input_data,
|
|
||||||
p_rarch->joypad,
|
|
||||||
sec_joypad,
|
|
||||||
&joypad_info,
|
|
||||||
p_rarch->libretro_input_binds,
|
|
||||||
p_rarch->keyboard_mapping_blocked,
|
|
||||||
port, device, idx, id);
|
|
||||||
|
|
||||||
if ( (device == RETRO_DEVICE_ANALOG) &&
|
|
||||||
(ret == 0))
|
|
||||||
{
|
{
|
||||||
const input_device_driver_t *joypad = p_rarch->joypad;
|
int16_t ret = 0;
|
||||||
#ifdef HAVE_MFI
|
int16_t port_result = 0;
|
||||||
const input_device_driver_t *sec_joypad = p_rarch->sec_joypad;
|
unsigned input_analog_dpad_mode = settings->uints.input_analog_dpad_mode[mapped_port];
|
||||||
#else
|
|
||||||
const input_device_driver_t *sec_joypad = NULL;
|
joypad_info.joy_idx = settings->uints.input_joypad_index[mapped_port];
|
||||||
#endif
|
joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx];
|
||||||
if (p_rarch->libretro_input_binds[port])
|
|
||||||
|
/* Skip disabled input devices */
|
||||||
|
if (mapped_port >= max_users)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* TODO/FIXME: This code is gibberish - a mess of nested
|
||||||
|
* refactors that make no sense whatsoever. The entire
|
||||||
|
* thing needs to be rewritten from scratch... */
|
||||||
|
|
||||||
|
ret = input_state_wrap(
|
||||||
|
p_rarch->current_input,
|
||||||
|
p_rarch->current_input_data,
|
||||||
|
joypad,
|
||||||
|
sec_joypad,
|
||||||
|
&joypad_info,
|
||||||
|
p_rarch->libretro_input_binds,
|
||||||
|
p_rarch->keyboard_mapping_blocked,
|
||||||
|
mapped_port, device, idx, id);
|
||||||
|
|
||||||
|
if ((device == RETRO_DEVICE_ANALOG) &&
|
||||||
|
(ret == 0))
|
||||||
{
|
{
|
||||||
if (idx == RETRO_DEVICE_INDEX_ANALOG_BUTTON)
|
if (p_rarch->libretro_input_binds[mapped_port])
|
||||||
{
|
{
|
||||||
if (id < RARCH_FIRST_CUSTOM_BIND)
|
if (idx == RETRO_DEVICE_INDEX_ANALOG_BUTTON)
|
||||||
{
|
{
|
||||||
bool valid_bind =
|
if (id < RARCH_FIRST_CUSTOM_BIND)
|
||||||
p_rarch->libretro_input_binds[port][id].valid;
|
|
||||||
if (valid_bind)
|
|
||||||
{
|
{
|
||||||
if (sec_joypad)
|
bool valid_bind = p_rarch->libretro_input_binds[mapped_port][id].valid;
|
||||||
ret =
|
|
||||||
input_joypad_analog_button(
|
if (valid_bind)
|
||||||
|
{
|
||||||
|
if (sec_joypad)
|
||||||
|
ret = input_joypad_analog_button(
|
||||||
input_analog_deadzone,
|
input_analog_deadzone,
|
||||||
input_analog_sensitivity,
|
input_analog_sensitivity,
|
||||||
sec_joypad, &joypad_info,
|
sec_joypad, &joypad_info,
|
||||||
id,
|
id,
|
||||||
&p_rarch->libretro_input_binds[port][id]);
|
&p_rarch->libretro_input_binds[mapped_port][id]);
|
||||||
if (joypad && (ret == 0))
|
|
||||||
ret = input_joypad_analog_button(
|
if (joypad && (ret == 0))
|
||||||
input_analog_deadzone,
|
ret = input_joypad_analog_button(
|
||||||
input_analog_sensitivity,
|
input_analog_deadzone,
|
||||||
joypad, &joypad_info,
|
input_analog_sensitivity,
|
||||||
id,
|
joypad, &joypad_info,
|
||||||
&p_rarch->libretro_input_binds[port][id]);
|
id,
|
||||||
|
&p_rarch->libretro_input_binds[mapped_port][id]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (sec_joypad)
|
||||||
|
ret = input_joypad_analog_axis(
|
||||||
|
input_analog_dpad_mode,
|
||||||
|
input_analog_deadzone,
|
||||||
|
input_analog_sensitivity,
|
||||||
|
sec_joypad,
|
||||||
|
&joypad_info,
|
||||||
|
idx,
|
||||||
|
id,
|
||||||
|
p_rarch->libretro_input_binds[mapped_port]);
|
||||||
|
|
||||||
|
if (joypad && (ret == 0))
|
||||||
|
ret = input_joypad_analog_axis(
|
||||||
|
input_analog_dpad_mode,
|
||||||
|
input_analog_deadzone,
|
||||||
|
input_analog_sensitivity,
|
||||||
|
joypad,
|
||||||
|
&joypad_info,
|
||||||
|
idx,
|
||||||
|
id,
|
||||||
|
p_rarch->libretro_input_binds[mapped_port]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!input_blocked)
|
||||||
|
{
|
||||||
|
input_mapper_t *handle = &p_rarch->input_driver_mapper;
|
||||||
|
|
||||||
|
if (bitmask_enabled)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
for (i = 0; i < RARCH_FIRST_CUSTOM_BIND; i++)
|
||||||
|
if (input_state_device(p_rarch, settings, handle,
|
||||||
|
ret, mapped_port, device, idx, i, true))
|
||||||
|
port_result |= (1 << i);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
port_result = input_state_device(p_rarch, settings, handle,
|
||||||
|
ret, mapped_port, device, idx, id, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Digital values are represented by a bitmap;
|
||||||
|
* we can just perform the logical OR of
|
||||||
|
* successive samples.
|
||||||
|
* Analog values are an integer corresponding
|
||||||
|
* to the extent of the analog motion; these
|
||||||
|
* cannot be OR'd together, we must instead
|
||||||
|
* keep the value with the largest magnitude */
|
||||||
|
if (device == RETRO_DEVICE_ANALOG)
|
||||||
|
{
|
||||||
|
if (result == 0)
|
||||||
|
result = port_result;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (sec_joypad)
|
int16_t port_result_abs = (port_result >= 0) ?
|
||||||
ret = input_joypad_analog_axis(
|
port_result : -port_result;
|
||||||
input_analog_dpad_mode,
|
int16_t result_abs = (result >= 0) ?
|
||||||
input_analog_deadzone,
|
result : -result;
|
||||||
input_analog_sensitivity,
|
|
||||||
sec_joypad,
|
result = (port_result_abs > result_abs) ?
|
||||||
&joypad_info,
|
port_result : result;
|
||||||
idx,
|
|
||||||
id,
|
|
||||||
p_rarch->libretro_input_binds[port]);
|
|
||||||
if (joypad && (ret == 0))
|
|
||||||
ret = input_joypad_analog_axis(
|
|
||||||
input_analog_dpad_mode,
|
|
||||||
input_analog_deadzone,
|
|
||||||
input_analog_sensitivity,
|
|
||||||
joypad,
|
|
||||||
&joypad_info,
|
|
||||||
idx,
|
|
||||||
id,
|
|
||||||
p_rarch->libretro_input_binds[port]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if ( (p_rarch->input_driver_flushing_input == 0)
|
|
||||||
&& !p_rarch->input_driver_block_libretro_input)
|
|
||||||
{
|
|
||||||
input_mapper_t *handle = &p_rarch->input_driver_mapper;
|
|
||||||
if ( (device == RETRO_DEVICE_JOYPAD) &&
|
|
||||||
(id == RETRO_DEVICE_ID_JOYPAD_MASK))
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
for (i = 0; i < RARCH_FIRST_CUSTOM_BIND; i++)
|
|
||||||
if (input_state_device(p_rarch, settings, handle, ret, port, device, idx, i, true))
|
|
||||||
result |= (1 << i);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
result = input_state_device(p_rarch, settings, handle, ret, port, device, idx, id, false);
|
result |= port_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_BSV_MOVIE
|
#ifdef HAVE_BSV_MOVIE
|
||||||
|
/* Save input to BSV record, if enabled */
|
||||||
if (BSV_MOVIE_IS_PLAYBACK_OFF())
|
if (BSV_MOVIE_IS_PLAYBACK_OFF())
|
||||||
{
|
{
|
||||||
result = swap_if_big16(result);
|
result = swap_if_big16(result);
|
||||||
@ -27013,7 +27193,7 @@ const struct retro_keybind *input_config_get_bind_auto(
|
|||||||
{
|
{
|
||||||
struct rarch_state *p_rarch = &rarch_st;
|
struct rarch_state *p_rarch = &rarch_st;
|
||||||
settings_t *settings = p_rarch->configuration_settings;
|
settings_t *settings = p_rarch->configuration_settings;
|
||||||
unsigned joy_idx = settings->uints.input_joypad_map[port];
|
unsigned joy_idx = settings->uints.input_joypad_index[port];
|
||||||
|
|
||||||
if (joy_idx < MAX_USERS)
|
if (joy_idx < MAX_USERS)
|
||||||
return &input_autoconf_binds[joy_idx][id];
|
return &input_autoconf_binds[joy_idx][id];
|
||||||
@ -37086,16 +37266,16 @@ bool retroarch_main_quit(void)
|
|||||||
p_rarch->runtime_shader_preset[0] = '\0';
|
p_rarch->runtime_shader_preset[0] = '\0';
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_CONFIGFILE
|
|
||||||
if ( runloop_state.remaps_core_active
|
if ( runloop_state.remaps_core_active
|
||||||
|| runloop_state.remaps_content_dir_active
|
|| runloop_state.remaps_content_dir_active
|
||||||
|| runloop_state.remaps_game_active
|
|| runloop_state.remaps_game_active
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
input_remapping_deinit();
|
input_remapping_deinit();
|
||||||
input_remapping_set_defaults();
|
input_remapping_set_defaults(true);
|
||||||
}
|
}
|
||||||
#endif
|
else
|
||||||
|
input_remapping_restore_global_config(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
runloop_state.shutdown_initiated = true;
|
runloop_state.shutdown_initiated = true;
|
||||||
@ -37437,7 +37617,7 @@ static enum runloop_state runloop_check_state(
|
|||||||
*sec_joypad = NULL;
|
*sec_joypad = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
joypad_info.joy_idx = settings->uints.input_joypad_map[port];
|
joypad_info.joy_idx = settings->uints.input_joypad_index[port];
|
||||||
joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx];
|
joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx];
|
||||||
joypad_info.axis_threshold = p_rarch->input_driver_axis_threshold;
|
joypad_info.axis_threshold = p_rarch->input_driver_axis_threshold;
|
||||||
|
|
||||||
@ -38693,13 +38873,15 @@ int runloop_iterate(void)
|
|||||||
/* Update binds for analog dpad modes. */
|
/* Update binds for analog dpad modes. */
|
||||||
for (i = 0; i < max_users; i++)
|
for (i = 0; i < max_users; i++)
|
||||||
{
|
{
|
||||||
enum analog_dpad_mode dpad_mode = (enum analog_dpad_mode)settings->uints.input_analog_dpad_mode[i];
|
enum analog_dpad_mode dpad_mode = (enum analog_dpad_mode)
|
||||||
|
settings->uints.input_analog_dpad_mode[i];
|
||||||
|
|
||||||
if (dpad_mode != ANALOG_DPAD_NONE)
|
if (dpad_mode != ANALOG_DPAD_NONE)
|
||||||
{
|
{
|
||||||
unsigned k;
|
unsigned k;
|
||||||
struct retro_keybind *general_binds = input_config_binds[i];
|
unsigned joy_idx = settings->uints.input_joypad_index[i];
|
||||||
struct retro_keybind *auto_binds = input_autoconf_binds[i];
|
struct retro_keybind *general_binds = input_config_binds[joy_idx];
|
||||||
|
struct retro_keybind *auto_binds = input_autoconf_binds[joy_idx];
|
||||||
unsigned x_plus = RARCH_ANALOG_RIGHT_X_PLUS;
|
unsigned x_plus = RARCH_ANALOG_RIGHT_X_PLUS;
|
||||||
unsigned y_plus = RARCH_ANALOG_RIGHT_Y_PLUS;
|
unsigned y_plus = RARCH_ANALOG_RIGHT_Y_PLUS;
|
||||||
unsigned x_minus = RARCH_ANALOG_RIGHT_X_MINUS;
|
unsigned x_minus = RARCH_ANALOG_RIGHT_X_MINUS;
|
||||||
@ -38786,15 +38968,17 @@ int runloop_iterate(void)
|
|||||||
|
|
||||||
for (i = 0; i < max_users; i++)
|
for (i = 0; i < max_users; i++)
|
||||||
{
|
{
|
||||||
unsigned j;
|
enum analog_dpad_mode dpad_mode = (enum analog_dpad_mode)
|
||||||
enum analog_dpad_mode dpad_mode = (enum analog_dpad_mode)settings->uints.input_analog_dpad_mode[i];
|
settings->uints.input_analog_dpad_mode[i];
|
||||||
|
|
||||||
/* Restores analog D-pad binds temporarily overridden. */
|
/* Restores analog D-pad binds temporarily overridden. */
|
||||||
|
|
||||||
if (dpad_mode != ANALOG_DPAD_NONE)
|
if (dpad_mode != ANALOG_DPAD_NONE)
|
||||||
{
|
{
|
||||||
struct retro_keybind *general_binds = input_config_binds[i];
|
unsigned j;
|
||||||
struct retro_keybind *auto_binds = input_autoconf_binds[i];
|
unsigned joy_idx = settings->uints.input_joypad_index[i];
|
||||||
|
struct retro_keybind *general_binds = input_config_binds[joy_idx];
|
||||||
|
struct retro_keybind *auto_binds = input_autoconf_binds[joy_idx];
|
||||||
|
|
||||||
for (j = RETRO_DEVICE_ID_JOYPAD_UP; j <= RETRO_DEVICE_ID_JOYPAD_RIGHT; j++)
|
for (j = RETRO_DEVICE_ID_JOYPAD_UP; j <= RETRO_DEVICE_ID_JOYPAD_RIGHT; j++)
|
||||||
{
|
{
|
||||||
@ -39289,6 +39473,13 @@ bool core_load_game(retro_ctx_load_content_info_t *load_info)
|
|||||||
|
|
||||||
p_rarch->current_core.game_loaded = game_loaded;
|
p_rarch->current_core.game_loaded = game_loaded;
|
||||||
|
|
||||||
|
/* If 'game_loaded' is true at this point, then
|
||||||
|
* core is actually running; register that any
|
||||||
|
* changes to global remap-related parameters
|
||||||
|
* should be reset once core is deinitialised */
|
||||||
|
if (game_loaded)
|
||||||
|
input_remapping_enable_global_config_restore();
|
||||||
|
|
||||||
return game_loaded;
|
return game_loaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,6 +287,9 @@ typedef struct global
|
|||||||
} console;
|
} console;
|
||||||
unsigned old_analog_dpad_mode[MAX_USERS];
|
unsigned old_analog_dpad_mode[MAX_USERS];
|
||||||
unsigned old_libretro_device[MAX_USERS];
|
unsigned old_libretro_device[MAX_USERS];
|
||||||
|
bool old_analog_dpad_mode_set;
|
||||||
|
bool old_libretro_device_set;
|
||||||
|
bool remapping_cache_active;
|
||||||
/* Settings and/or global states specific to menus */
|
/* Settings and/or global states specific to menus */
|
||||||
#ifdef HAVE_MENU
|
#ifdef HAVE_MENU
|
||||||
enum menu_action menu_prev_action;
|
enum menu_action menu_prev_action;
|
||||||
|
@ -1702,10 +1702,10 @@ struct runloop
|
|||||||
bool autosave;
|
bool autosave;
|
||||||
#ifdef HAVE_CONFIGFILE
|
#ifdef HAVE_CONFIGFILE
|
||||||
bool overrides_active;
|
bool overrides_active;
|
||||||
|
#endif
|
||||||
bool remaps_core_active;
|
bool remaps_core_active;
|
||||||
bool remaps_game_active;
|
bool remaps_game_active;
|
||||||
bool remaps_content_dir_active;
|
bool remaps_content_dir_active;
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SCREENSHOTS
|
#ifdef HAVE_SCREENSHOTS
|
||||||
bool max_frames_screenshot;
|
bool max_frames_screenshot;
|
||||||
char max_frames_screenshot_path[PATH_MAX_LENGTH];
|
char max_frames_screenshot_path[PATH_MAX_LENGTH];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user