diff --git a/configuration.c b/configuration.c index 507c49c16e..f05fe3713b 100644 --- a/configuration.c +++ b/configuration.c @@ -259,6 +259,100 @@ enum midi_driver_enum MIDI_NULL }; +#define DECLARE_BIND(base, bind, desc) { #base, desc, 0, bind, true } +#define DECLARE_META_BIND(level, base, bind, desc) { #base, desc, level, bind, true } + +const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = { + DECLARE_BIND(b, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B), + DECLARE_BIND(y, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y), + DECLARE_BIND(select, RETRO_DEVICE_ID_JOYPAD_SELECT,MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT), + DECLARE_BIND(start, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START), + DECLARE_BIND(up, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP), + DECLARE_BIND(down, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN), + DECLARE_BIND(left, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT), + DECLARE_BIND(right, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT), + DECLARE_BIND(a, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A), + DECLARE_BIND(x, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X), + DECLARE_BIND(l, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L), + DECLARE_BIND(r, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R), + DECLARE_BIND(l2, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2), + DECLARE_BIND(r2, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2), + DECLARE_BIND(l3, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3), + DECLARE_BIND(r3, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3), + DECLARE_BIND(l_x_plus, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS), + DECLARE_BIND(l_x_minus, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS), + DECLARE_BIND(l_y_plus, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS), + DECLARE_BIND(l_y_minus, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS), + DECLARE_BIND(r_x_plus, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS), + DECLARE_BIND(r_x_minus, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS), + DECLARE_BIND(r_y_plus, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS), + DECLARE_BIND(r_y_minus, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS), + + DECLARE_BIND(gun_trigger, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER ), + DECLARE_BIND(gun_offscreen_shot, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD ), + DECLARE_BIND(gun_aux_a, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A ), + DECLARE_BIND(gun_aux_b, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B ), + DECLARE_BIND(gun_aux_c, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C ), + DECLARE_BIND(gun_start, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START ), + DECLARE_BIND(gun_select, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT ), + DECLARE_BIND(gun_dpad_up, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP ), + DECLARE_BIND(gun_dpad_down, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN ), + DECLARE_BIND(gun_dpad_left, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT ), + DECLARE_BIND(gun_dpad_right, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT ), + + DECLARE_BIND(turbo, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE), + + DECLARE_META_BIND(1, toggle_fast_forward, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY), + DECLARE_META_BIND(2, hold_fast_forward, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY), + DECLARE_META_BIND(1, toggle_slowmotion, RARCH_SLOWMOTION_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY), + DECLARE_META_BIND(2, hold_slowmotion, RARCH_SLOWMOTION_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_HOLD_KEY), + DECLARE_META_BIND(1, load_state, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY), + DECLARE_META_BIND(1, save_state, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY), + DECLARE_META_BIND(2, toggle_fullscreen, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY), + DECLARE_META_BIND(2, close_content, RARCH_CLOSE_CONTENT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_CLOSE_CONTENT_KEY), +#ifdef HAVE_LAKKA + DECLARE_META_BIND(2, exit_emulator, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_RESTART_KEY), +#else + DECLARE_META_BIND(2, exit_emulator, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY), +#endif + DECLARE_META_BIND(2, state_slot_increase, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS), + DECLARE_META_BIND(2, state_slot_decrease, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS), + DECLARE_META_BIND(1, rewind, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND), + DECLARE_META_BIND(2, movie_record_toggle, RARCH_BSV_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE), + DECLARE_META_BIND(2, pause_toggle, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE), + DECLARE_META_BIND(2, frame_advance, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE), + DECLARE_META_BIND(2, reset, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET), + DECLARE_META_BIND(2, shader_next, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT), + DECLARE_META_BIND(2, shader_prev, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV), + DECLARE_META_BIND(2, cheat_index_plus, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS), + DECLARE_META_BIND(2, cheat_index_minus, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS), + DECLARE_META_BIND(2, cheat_toggle, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE), + DECLARE_META_BIND(2, screenshot, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT), + DECLARE_META_BIND(2, audio_mute, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE), + DECLARE_META_BIND(2, osk_toggle, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK), + DECLARE_META_BIND(2, fps_toggle, RARCH_FPS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_FPS_TOGGLE), + DECLARE_META_BIND(2, send_debug_info, RARCH_SEND_DEBUG_INFO, MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO), + DECLARE_META_BIND(2, netplay_host_toggle, RARCH_NETPLAY_HOST_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_HOST_TOGGLE), + DECLARE_META_BIND(2, netplay_game_watch, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH), + DECLARE_META_BIND(2, enable_hotkey, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY), + DECLARE_META_BIND(2, volume_up, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP), + DECLARE_META_BIND(2, volume_down, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN), + DECLARE_META_BIND(2, overlay_next, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT), + DECLARE_META_BIND(2, disk_eject_toggle, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE), + DECLARE_META_BIND(2, disk_next, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT), + DECLARE_META_BIND(2, disk_prev, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV), + DECLARE_META_BIND(2, grab_mouse_toggle, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE), + DECLARE_META_BIND(2, game_focus_toggle, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE), + DECLARE_META_BIND(2, desktop_menu_toggle, RARCH_UI_COMPANION_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE), +#ifdef HAVE_MENU + DECLARE_META_BIND(1, menu_toggle, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE), +#endif + DECLARE_META_BIND(2, recording_toggle, RARCH_RECORDING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE), + DECLARE_META_BIND(2, streaming_toggle, RARCH_STREAMING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE), + DECLARE_META_BIND(2, runahead_toggle, RARCH_RUNAHEAD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_RUNAHEAD_TOGGLE), + DECLARE_META_BIND(2, ai_service, RARCH_AI_SERVICE, MENU_ENUM_LABEL_VALUE_INPUT_META_AI_SERVICE), +}; + #if defined(HAVE_METAL) /* iOS supports both the OpenGL and Metal video drivers; default to OpenGL since Metal support is preliminary */ #if defined(HAVE_COCOATOUCH) && defined(HAVE_OPENGL) @@ -4007,6 +4101,245 @@ static void video_driver_save_settings(global_t *global, config_file_t *conf) global->console.screen.flicker_filter_index); } +static void save_keybind_hat(config_file_t *conf, const char *key, + const struct retro_keybind *bind) +{ + char config[16]; + unsigned hat = (unsigned)GET_HAT(bind->joykey); + const char *dir = NULL; + + config[0] = '\0'; + + switch (GET_HAT_DIR(bind->joykey)) + { + case HAT_UP_MASK: + dir = "up"; + break; + + case HAT_DOWN_MASK: + dir = "down"; + break; + + case HAT_LEFT_MASK: + dir = "left"; + break; + + case HAT_RIGHT_MASK: + dir = "right"; + break; + + default: + break; + } + + snprintf(config, sizeof(config), "h%u%s", hat, dir); + config_set_string(conf, key, config); +} + +static void save_keybind_joykey(config_file_t *conf, + const char *prefix, + const char *base, + const struct retro_keybind *bind, bool save_empty) +{ + char key[64]; + + key[0] = '\0'; + + fill_pathname_join_delim_concat(key, prefix, + base, '_', "_btn", sizeof(key)); + + if (bind->joykey == NO_BTN) + { + if (save_empty) + config_set_string(conf, key, "nul"); + } + else if (GET_HAT_DIR(bind->joykey)) + save_keybind_hat(conf, key, bind); + else + config_set_uint64(conf, key, bind->joykey); +} + +static void save_keybind_axis(config_file_t *conf, + const char *prefix, + const char *base, + const struct retro_keybind *bind, bool save_empty) +{ + char key[64]; + unsigned axis = 0; + char dir = '\0'; + + key[0] = '\0'; + + fill_pathname_join_delim_concat(key, + prefix, base, '_', + "_axis", + sizeof(key)); + + if (bind->joyaxis == AXIS_NONE) + { + if (save_empty) + config_set_string(conf, key, "nul"); + } + else if (AXIS_NEG_GET(bind->joyaxis) != AXIS_DIR_NONE) + { + dir = '-'; + axis = AXIS_NEG_GET(bind->joyaxis); + } + else if (AXIS_POS_GET(bind->joyaxis) != AXIS_DIR_NONE) + { + dir = '+'; + axis = AXIS_POS_GET(bind->joyaxis); + } + + if (dir) + { + char config[16]; + + config[0] = '\0'; + + snprintf(config, sizeof(config), "%c%u", dir, axis); + config_set_string(conf, key, config); + } +} + +static void save_keybind_mbutton(config_file_t *conf, + const char *prefix, + const char *base, + const struct retro_keybind *bind, bool save_empty) +{ + char key[64]; + + key[0] = '\0'; + + fill_pathname_join_delim_concat(key, prefix, + base, '_', "_mbtn", sizeof(key)); + + switch (bind->mbutton) + { + case RETRO_DEVICE_ID_MOUSE_LEFT: + config_set_uint64(conf, key, 1); + break; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + config_set_uint64(conf, key, 2); + break; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + config_set_uint64(conf, key, 3); + break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + config_set_uint64(conf, key, 4); + break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + config_set_uint64(conf, key, 5); + break; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + config_set_string(conf, key, "wu"); + break; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + config_set_string(conf, key, "wd"); + break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + config_set_string(conf, key, "whu"); + break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + config_set_string(conf, key, "whd"); + break; + default: + if (save_empty) + config_set_string(conf, key, "nul"); + break; + } +} + + + +/** + * input_config_save_keybind: + * @conf : pointer to config file object + * @prefix : prefix name of keybind + * @base : base name of keybind + * @bind : pointer to key binding object + * @kb : save keyboard binds + * + * Save a key binding to the config file. + */ +static void input_config_save_keybind(config_file_t *conf, + const char *prefix, + const char *base, + const struct retro_keybind *bind, + bool save_empty) +{ + save_keybind_joykey (conf, prefix, base, bind, save_empty); + save_keybind_axis (conf, prefix, base, bind, save_empty); + save_keybind_mbutton(conf, prefix, base, bind, save_empty); +} + +const char *input_config_get_prefix(unsigned user, bool meta) +{ + static const char *bind_user_prefix[MAX_USERS] = { + "input_player1", + "input_player2", + "input_player3", + "input_player4", + "input_player5", + "input_player6", + "input_player7", + "input_player8", + "input_player9", + "input_player10", + "input_player11", + "input_player12", + "input_player13", + "input_player14", + "input_player15", + "input_player16", + }; + if (meta) + { + if (user == 0) + return "input"; + /* Don't bother with meta bind for anyone else than first user. */ + return NULL; + } + return bind_user_prefix[user]; +} + +/** + * input_config_save_keybinds_user: + * @conf : pointer to config file object + * @user : user number + * + * Save the current keybinds of a user (@user) to the config file (@conf). + */ +static void input_config_save_keybinds_user(config_file_t *conf, unsigned user) +{ + unsigned i = 0; + + for (i = 0; input_config_bind_map_get_valid(i); i++) + { + char key[64]; + char btn[64]; + const struct input_bind_map *keybind = + (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(i); + bool meta = keybind ? keybind->meta : false; + const char *prefix = input_config_get_prefix(user, meta); + const struct retro_keybind *bind = &input_config_binds[user][i]; + const char *base = NULL; + + if (!prefix || !bind->valid || !keybind) + continue; + + base = keybind->base; + key[0] = btn[0] = '\0'; + + fill_pathname_join_delim(key, prefix, base, '_', sizeof(key)); + + input_keymaps_translate_rk_to_str(bind->key, btn, sizeof(btn)); + config_set_string(conf, key, btn); + + input_config_save_keybind(conf, prefix, base, bind, true); + } +} + /** * config_save_autoconf_profile: * @device_name : Input device name @@ -5029,3 +5362,317 @@ end: config_file_free(config); } #endif + +bool input_config_bind_map_get_valid(unsigned bind_index) +{ + const struct input_bind_map *keybind = + (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(bind_index); + if (!keybind) + return false; + return keybind->valid; +} + +unsigned input_config_bind_map_get_meta(unsigned bind_index) +{ + const struct input_bind_map *keybind = + (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(bind_index); + if (!keybind) + return 0; + return keybind->meta; +} + +const char *input_config_bind_map_get_base(unsigned bind_index) +{ + const struct input_bind_map *keybind = + (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(bind_index); + if (!keybind) + return NULL; + return keybind->base; +} + +const char *input_config_bind_map_get_desc(unsigned bind_index) +{ + const struct input_bind_map *keybind = + (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(bind_index); + if (!keybind) + return NULL; + return msg_hash_to_str(keybind->desc); +} + +uint8_t input_config_bind_map_get_retro_key(unsigned bind_index) +{ + const struct input_bind_map *keybind = + (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(bind_index); + if (!keybind) + return 0; + return keybind->retro_key; +} + +void input_config_reset_autoconfig_binds(unsigned port) +{ + unsigned i; + + if (port >= MAX_USERS) + return; + + for (i = 0; i < RARCH_BIND_LIST_END; i++) + { + input_autoconf_binds[port][i].joykey = NO_BTN; + input_autoconf_binds[port][i].joyaxis = AXIS_NONE; + + if (input_autoconf_binds[port][i].joykey_label) + { + free(input_autoconf_binds[port][i].joykey_label); + input_autoconf_binds[port][i].joykey_label = NULL; + } + + if (input_autoconf_binds[port][i].joyaxis_label) + { + free(input_autoconf_binds[port][i].joyaxis_label); + input_autoconf_binds[port][i].joyaxis_label = NULL; + } + } +} + +void input_config_set_autoconfig_binds(unsigned port, void *data) +{ + unsigned i; + config_file_t *config = (config_file_t*)data; + struct retro_keybind *binds = NULL; + + if ((port >= MAX_USERS) || !config) + return; + + binds = input_autoconf_binds[port]; + + for (i = 0; i < RARCH_BIND_LIST_END; i++) + { + const struct input_bind_map *keybind = + (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(i); + if (keybind) + { + char str[256]; + const char *base = keybind->base; + str[0] = '\0'; + + fill_pathname_join_delim(str, "input", base, '_', sizeof(str)); + + input_config_parse_joy_button(str, config, "input", base, &binds[i]); + input_config_parse_joy_axis (str, config, "input", base, &binds[i]); + } + } +} + +void input_config_parse_mouse_button( + char *s, + void *conf_data, const char *prefix, + const char *btn, void *bind_data) +{ + int val; + char tmp[64]; + char key[64]; + config_file_t *conf = (config_file_t*)conf_data; + struct retro_keybind *bind = (struct retro_keybind*)bind_data; + + tmp[0] = key[0] = '\0'; + + fill_pathname_join_delim(key, s, "mbtn", '_', sizeof(key)); + + if (config_get_array(conf, key, tmp, sizeof(tmp))) + { + bind->mbutton = NO_BTN; + + if (tmp[0]=='w') + { + switch (tmp[1]) + { + case 'u': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELUP; + break; + case 'd': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELDOWN; + break; + case 'h': + switch (tmp[2]) + { + case 'u': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP; + break; + case 'd': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN; + break; + } + break; + } + } + else + { + val = atoi(tmp); + switch (val) + { + case 1: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_LEFT; + break; + case 2: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_RIGHT; + break; + case 3: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_MIDDLE; + break; + case 4: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_4; + break; + case 5: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_5; + break; + } + } + } +} + +void input_config_parse_joy_axis( + char *s, + void *conf_data, const char *prefix, + const char *axis, void *bind_data) +{ + char tmp[64]; + char key[64]; + char key_label[64]; + config_file_t *conf = (config_file_t*)conf_data; + struct retro_keybind *bind = (struct retro_keybind*)bind_data; + struct config_entry_list *tmp_a = NULL; + + tmp[0] = key[0] = key_label[0] = '\0'; + + fill_pathname_join_delim(key, s, + "axis", '_', sizeof(key)); + fill_pathname_join_delim(key_label, s, + "axis_label", '_', sizeof(key_label)); + + if (config_get_array(conf, key, tmp, sizeof(tmp))) + { + if ( tmp[0] == 'n' + && tmp[1] == 'u' + && tmp[2] == 'l' + && tmp[3] == '\0' + ) + bind->joyaxis = AXIS_NONE; + else if (strlen(tmp) >= 2 && (*tmp == '+' || *tmp == '-')) + { + int i_axis = (int)strtol(tmp + 1, NULL, 0); + if (*tmp == '+') + bind->joyaxis = AXIS_POS(i_axis); + else + bind->joyaxis = AXIS_NEG(i_axis); + } + + /* Ensure that D-pad emulation doesn't screw this over. */ + bind->orig_joyaxis = bind->joyaxis; + } + + tmp_a = config_get_entry(conf, key_label); + + if (tmp_a && (!string_is_empty(tmp_a->value))) + { + if (bind->joyaxis_label && + !string_is_empty(bind->joyaxis_label)) + free(bind->joyaxis_label); + bind->joyaxis_label = strdup(tmp_a->value); + } +} + +static uint16_t input_config_parse_hat(const char *dir) +{ + if ( dir[0] == 'u' + && dir[1] == 'p' + && dir[2] == '\0' + ) + return HAT_UP_MASK; + else if ( + dir[0] == 'd' + && dir[1] == 'o' + && dir[2] == 'w' + && dir[3] == 'n' + && dir[4] == '\0' + ) + return HAT_DOWN_MASK; + else if ( + dir[0] == 'l' + && dir[1] == 'e' + && dir[2] == 'f' + && dir[3] == 't' + && dir[4] == '\0' + ) + return HAT_LEFT_MASK; + else if ( + dir[0] == 'r' + && dir[1] == 'i' + && dir[2] == 'g' + && dir[3] == 'h' + && dir[4] == 't' + && dir[5] == '\0' + ) + return HAT_RIGHT_MASK; + + return 0; +} + + +void input_config_parse_joy_button( + char *s, + void *data, const char *prefix, + const char *btn, void *bind_data) +{ + char tmp[64]; + char key[64]; + char key_label[64]; + config_file_t *conf = (config_file_t*)data; + struct retro_keybind *bind = (struct retro_keybind*)bind_data; + struct config_entry_list *tmp_a = NULL; + + tmp[0] = key[0] = key_label[0] = '\0'; + + fill_pathname_join_delim(key, s, + "btn", '_', sizeof(key)); + fill_pathname_join_delim(key_label, s, + "btn_label", '_', sizeof(key_label)); + + if (config_get_array(conf, key, tmp, sizeof(tmp))) + { + btn = tmp; + if ( btn[0] == 'n' + && btn[1] == 'u' + && btn[2] == 'l' + && btn[3] == '\0' + ) + bind->joykey = NO_BTN; + else + { + if (*btn == 'h') + { + const char *str = btn + 1; + /* Parse hat? */ + if (str && ISDIGIT((int)*str)) + { + char *dir = NULL; + uint16_t hat = strtoul(str, &dir, 0); + uint16_t hat_dir = dir ? input_config_parse_hat(dir) : 0; + if (hat_dir) + bind->joykey = HAT_MAP(hat, hat_dir); + } + } + else + bind->joykey = strtoull(tmp, NULL, 0); + } + } + + tmp_a = config_get_entry(conf, key_label); + + if (tmp_a && !string_is_empty(tmp_a->value)) + { + if (!string_is_empty(bind->joykey_label)) + free(bind->joykey_label); + + bind->joykey_label = strdup(tmp_a->value); + } +} diff --git a/configuration.h b/configuration.h index f0da0b5047..9f267e93dc 100644 --- a/configuration.h +++ b/configuration.h @@ -28,6 +28,7 @@ #include "gfx/video_defines.h" #include "input/input_defines.h" #include "led/led_defines.h" +#include "msg_hash.h" #ifdef HAVE_LAKKA #include "lakka.h" @@ -63,6 +64,8 @@ strlcpy(var, newvar, sizeof(var)); \ } +#define INPUT_CONFIG_BIND_MAP_GET(i) ((const struct input_bind_map*)&input_config_bind_map[(i)]) + enum crt_switch_type { CRT_SWITCH_NONE = 0, @@ -82,6 +85,25 @@ enum override_type RETRO_BEGIN_DECLS +/* Input config. */ +struct input_bind_map +{ + const char *base; + + enum msg_hash_enums desc; + + /* Meta binds get input as prefix, not input_playerN". + * 0 = libretro related. + * 1 = Common hotkey. + * 2 = Uncommon/obscure hotkey. + */ + uint8_t meta; + + uint8_t retro_key; + + bool valid; +}; + typedef struct settings { struct @@ -1049,6 +1071,27 @@ const char *config_get_all_timezones(void); void config_set_timezone(char *timezone); #endif +bool input_config_bind_map_get_valid(unsigned bind_index); + +void input_config_parse_joy_button( + char *s, + void *data, const char *prefix, + const char *btn, void *bind_data); + +void input_config_parse_joy_axis( + char *s, + void *conf_data, const char *prefix, + const char *axis, void *bind_data); + +void input_config_parse_mouse_button( + char *s, + void *conf_data, const char *prefix, + const char *btn, void *bind_data); + +const char *input_config_get_prefix(unsigned user, bool meta); + +extern const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL]; + RETRO_END_DECLS #endif diff --git a/input/input_driver.h b/input/input_driver.h index 90e898bd5e..f401a733a3 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -650,29 +650,8 @@ size_t input_config_get_device_name_size(unsigned port); /*****************************************************************************/ -/** - * Save the current keybinds on a port to the config file. - * - * @param conf pointer to config file object - * @param user user number (ie port - TODO: change to port nomenclature) - */ -void input_config_save_keybinds_user(void *data, unsigned user); - const struct retro_keybind *input_config_get_bind_auto(unsigned port, unsigned id); -/** - * Save a key binding to the config file. - * - * @param conf pointer to config file object - * @param prefix prefix name of keybind - * @param base base name of keybind - * @param bind pointer to key binding object - * @param kb save keyboard binds - */ -void input_config_save_keybind(void *data, const char *prefix, - const char *base, const struct retro_keybind *bind, - bool save_empty); - void input_config_reset_autoconfig_binds(unsigned port); void input_config_reset(void); diff --git a/retroarch.c b/retroarch.c index c62cb62929..9fef17bf7a 100644 --- a/retroarch.c +++ b/retroarch.c @@ -25762,81 +25762,6 @@ void input_keyboard_event(bool down, unsigned code, } } -static bool input_config_bind_map_get_valid(unsigned bind_index) -{ - const struct input_bind_map *keybind = - (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(bind_index); - if (!keybind) - return false; - return keybind->valid; -} - -unsigned input_config_bind_map_get_meta(unsigned bind_index) -{ - const struct input_bind_map *keybind = - (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(bind_index); - if (!keybind) - return 0; - return keybind->meta; -} - -const char *input_config_bind_map_get_base(unsigned bind_index) -{ - const struct input_bind_map *keybind = - (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(bind_index); - if (!keybind) - return NULL; - return keybind->base; -} - -const char *input_config_bind_map_get_desc(unsigned bind_index) -{ - const struct input_bind_map *keybind = - (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(bind_index); - if (!keybind) - return NULL; - return msg_hash_to_str(keybind->desc); -} - -uint8_t input_config_bind_map_get_retro_key(unsigned bind_index) -{ - const struct input_bind_map *keybind = - (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(bind_index); - if (!keybind) - return 0; - return keybind->retro_key; -} - -static const char *input_config_get_prefix(unsigned user, bool meta) -{ - static const char *bind_user_prefix[MAX_USERS] = { - "input_player1", - "input_player2", - "input_player3", - "input_player4", - "input_player5", - "input_player6", - "input_player7", - "input_player8", - "input_player9", - "input_player10", - "input_player11", - "input_player12", - "input_player13", - "input_player14", - "input_player15", - "input_player16", - }; - if (meta) - { - if (user == 0) - return "input"; - /* Don't bother with meta bind for anyone else than first user. */ - return NULL; - } - return bind_user_prefix[user]; -} - /** * input_config_translate_str_to_rk: * @str : String to translate to key ID. @@ -25880,213 +25805,6 @@ unsigned input_config_translate_str_to_bind_id(const char *str) return RARCH_BIND_LIST_END; } -static uint16_t input_config_parse_hat(const char *dir) -{ - if ( dir[0] == 'u' - && dir[1] == 'p' - && dir[2] == '\0' - ) - return HAT_UP_MASK; - else if ( - dir[0] == 'd' - && dir[1] == 'o' - && dir[2] == 'w' - && dir[3] == 'n' - && dir[4] == '\0' - ) - return HAT_DOWN_MASK; - else if ( - dir[0] == 'l' - && dir[1] == 'e' - && dir[2] == 'f' - && dir[3] == 't' - && dir[4] == '\0' - ) - return HAT_LEFT_MASK; - else if ( - dir[0] == 'r' - && dir[1] == 'i' - && dir[2] == 'g' - && dir[3] == 'h' - && dir[4] == 't' - && dir[5] == '\0' - ) - return HAT_RIGHT_MASK; - - return 0; -} - -static void input_config_parse_joy_button( - char *s, - config_file_t *conf, const char *prefix, - const char *btn, struct retro_keybind *bind) -{ - char tmp[64]; - char key[64]; - char key_label[64]; - struct config_entry_list *tmp_a = NULL; - - tmp[0] = key[0] = key_label[0] = '\0'; - - fill_pathname_join_delim(key, s, - "btn", '_', sizeof(key)); - fill_pathname_join_delim(key_label, s, - "btn_label", '_', sizeof(key_label)); - - if (config_get_array(conf, key, tmp, sizeof(tmp))) - { - btn = tmp; - if ( btn[0] == 'n' - && btn[1] == 'u' - && btn[2] == 'l' - && btn[3] == '\0' - ) - bind->joykey = NO_BTN; - else - { - if (*btn == 'h') - { - const char *str = btn + 1; - /* Parse hat? */ - if (str && ISDIGIT((int)*str)) - { - char *dir = NULL; - uint16_t hat = strtoul(str, &dir, 0); - uint16_t hat_dir = dir ? input_config_parse_hat(dir) : 0; - if (hat_dir) - bind->joykey = HAT_MAP(hat, hat_dir); - } - } - else - bind->joykey = strtoull(tmp, NULL, 0); - } - } - - tmp_a = config_get_entry(conf, key_label); - - if (tmp_a && !string_is_empty(tmp_a->value)) - { - if (!string_is_empty(bind->joykey_label)) - free(bind->joykey_label); - - bind->joykey_label = strdup(tmp_a->value); - } -} - -static void input_config_parse_joy_axis( - char *s, - config_file_t *conf, const char *prefix, - const char *axis, struct retro_keybind *bind) -{ - char tmp[64]; - char key[64]; - char key_label[64]; - struct config_entry_list *tmp_a = NULL; - - tmp[0] = key[0] = key_label[0] = '\0'; - - fill_pathname_join_delim(key, s, - "axis", '_', sizeof(key)); - fill_pathname_join_delim(key_label, s, - "axis_label", '_', sizeof(key_label)); - - if (config_get_array(conf, key, tmp, sizeof(tmp))) - { - if ( tmp[0] == 'n' - && tmp[1] == 'u' - && tmp[2] == 'l' - && tmp[3] == '\0' - ) - bind->joyaxis = AXIS_NONE; - else if (strlen(tmp) >= 2 && (*tmp == '+' || *tmp == '-')) - { - int i_axis = (int)strtol(tmp + 1, NULL, 0); - if (*tmp == '+') - bind->joyaxis = AXIS_POS(i_axis); - else - bind->joyaxis = AXIS_NEG(i_axis); - } - - /* Ensure that D-pad emulation doesn't screw this over. */ - bind->orig_joyaxis = bind->joyaxis; - } - - tmp_a = config_get_entry(conf, key_label); - - if (tmp_a && (!string_is_empty(tmp_a->value))) - { - if (bind->joyaxis_label && - !string_is_empty(bind->joyaxis_label)) - free(bind->joyaxis_label); - bind->joyaxis_label = strdup(tmp_a->value); - } -} - -static void input_config_parse_mouse_button( - char *s, - config_file_t *conf, const char *prefix, - const char *btn, struct retro_keybind *bind) -{ - int val; - char tmp[64]; - char key[64]; - - tmp[0] = key[0] = '\0'; - - fill_pathname_join_delim(key, s, "mbtn", '_', sizeof(key)); - - if (config_get_array(conf, key, tmp, sizeof(tmp))) - { - bind->mbutton = NO_BTN; - - if (tmp[0]=='w') - { - switch (tmp[1]) - { - case 'u': - bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELUP; - break; - case 'd': - bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELDOWN; - break; - case 'h': - switch (tmp[2]) - { - case 'u': - bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP; - break; - case 'd': - bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN; - break; - } - break; - } - } - else - { - val = atoi(tmp); - switch (val) - { - case 1: - bind->mbutton = RETRO_DEVICE_ID_MOUSE_LEFT; - break; - case 2: - bind->mbutton = RETRO_DEVICE_ID_MOUSE_RIGHT; - break; - case 3: - bind->mbutton = RETRO_DEVICE_ID_MOUSE_MIDDLE; - break; - case 4: - bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_4; - break; - case 5: - bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_5; - break; - } - } - } -} - static void input_config_get_bind_string_joykey( bool input_descriptor_label_show, char *buf, const char *prefix, @@ -26596,32 +26314,6 @@ const struct retro_keybind *input_config_get_bind_auto( return NULL; } -void input_config_reset_autoconfig_binds(unsigned port) -{ - unsigned i; - - if (port >= MAX_USERS) - return; - - for (i = 0; i < RARCH_BIND_LIST_END; i++) - { - input_autoconf_binds[port][i].joykey = NO_BTN; - input_autoconf_binds[port][i].joyaxis = AXIS_NONE; - - if (input_autoconf_binds[port][i].joykey_label) - { - free(input_autoconf_binds[port][i].joykey_label); - input_autoconf_binds[port][i].joykey_label = NULL; - } - - if (input_autoconf_binds[port][i].joyaxis_label) - { - free(input_autoconf_binds[port][i].joyaxis_label); - input_autoconf_binds[port][i].joyaxis_label = NULL; - } - } -} - void input_config_reset(void) { unsigned i; @@ -26715,243 +26407,6 @@ void config_read_keybinds_conf(void *data) } } -void input_config_set_autoconfig_binds(unsigned port, void *data) -{ - unsigned i; - config_file_t *config = (config_file_t*)data; - struct retro_keybind *binds = NULL; - - if ((port >= MAX_USERS) || !config) - return; - - binds = input_autoconf_binds[port]; - - for (i = 0; i < RARCH_BIND_LIST_END; i++) - { - const struct input_bind_map *keybind = - (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(i); - if (keybind) - { - char str[256]; - const char *base = keybind->base; - str[0] = '\0'; - - fill_pathname_join_delim(str, "input", base, '_', sizeof(str)); - - input_config_parse_joy_button(str, config, "input", base, &binds[i]); - input_config_parse_joy_axis (str, config, "input", base, &binds[i]); - } - } -} - -/** - * input_config_save_keybinds_user: - * @conf : pointer to config file object - * @user : user number - * - * Save the current keybinds of a user (@user) to the config file (@conf). - */ -void input_config_save_keybinds_user(void *data, unsigned user) -{ - unsigned i = 0; - config_file_t *conf = (config_file_t*)data; - - for (i = 0; input_config_bind_map_get_valid(i); i++) - { - char key[64]; - char btn[64]; - const struct input_bind_map *keybind = - (const struct input_bind_map*)INPUT_CONFIG_BIND_MAP_GET(i); - bool meta = keybind ? keybind->meta : false; - const char *prefix = input_config_get_prefix(user, meta); - const struct retro_keybind *bind = &input_config_binds[user][i]; - const char *base = NULL; - - if (!prefix || !bind->valid || !keybind) - continue; - - base = keybind->base; - key[0] = btn[0] = '\0'; - - fill_pathname_join_delim(key, prefix, base, '_', sizeof(key)); - - input_keymaps_translate_rk_to_str(bind->key, btn, sizeof(btn)); - config_set_string(conf, key, btn); - - input_config_save_keybind(conf, prefix, base, bind, true); - } -} - -static void save_keybind_hat(config_file_t *conf, const char *key, - const struct retro_keybind *bind) -{ - char config[16]; - unsigned hat = (unsigned)GET_HAT(bind->joykey); - const char *dir = NULL; - - config[0] = '\0'; - - switch (GET_HAT_DIR(bind->joykey)) - { - case HAT_UP_MASK: - dir = "up"; - break; - - case HAT_DOWN_MASK: - dir = "down"; - break; - - case HAT_LEFT_MASK: - dir = "left"; - break; - - case HAT_RIGHT_MASK: - dir = "right"; - break; - - default: - break; - } - - snprintf(config, sizeof(config), "h%u%s", hat, dir); - config_set_string(conf, key, config); -} - -static void save_keybind_joykey(config_file_t *conf, - const char *prefix, - const char *base, - const struct retro_keybind *bind, bool save_empty) -{ - char key[64]; - - key[0] = '\0'; - - fill_pathname_join_delim_concat(key, prefix, - base, '_', "_btn", sizeof(key)); - - if (bind->joykey == NO_BTN) - { - if (save_empty) - config_set_string(conf, key, "nul"); - } - else if (GET_HAT_DIR(bind->joykey)) - save_keybind_hat(conf, key, bind); - else - config_set_uint64(conf, key, bind->joykey); -} - -static void save_keybind_axis(config_file_t *conf, - const char *prefix, - const char *base, - const struct retro_keybind *bind, bool save_empty) -{ - char key[64]; - unsigned axis = 0; - char dir = '\0'; - - key[0] = '\0'; - - fill_pathname_join_delim_concat(key, - prefix, base, '_', - "_axis", - sizeof(key)); - - if (bind->joyaxis == AXIS_NONE) - { - if (save_empty) - config_set_string(conf, key, "nul"); - } - else if (AXIS_NEG_GET(bind->joyaxis) != AXIS_DIR_NONE) - { - dir = '-'; - axis = AXIS_NEG_GET(bind->joyaxis); - } - else if (AXIS_POS_GET(bind->joyaxis) != AXIS_DIR_NONE) - { - dir = '+'; - axis = AXIS_POS_GET(bind->joyaxis); - } - - if (dir) - { - char config[16]; - - config[0] = '\0'; - - snprintf(config, sizeof(config), "%c%u", dir, axis); - config_set_string(conf, key, config); - } -} - -static void save_keybind_mbutton(config_file_t *conf, - const char *prefix, - const char *base, - const struct retro_keybind *bind, bool save_empty) -{ - char key[64]; - - key[0] = '\0'; - - fill_pathname_join_delim_concat(key, prefix, - base, '_', "_mbtn", sizeof(key)); - - switch (bind->mbutton) - { - case RETRO_DEVICE_ID_MOUSE_LEFT: - config_set_uint64(conf, key, 1); - break; - case RETRO_DEVICE_ID_MOUSE_RIGHT: - config_set_uint64(conf, key, 2); - break; - case RETRO_DEVICE_ID_MOUSE_MIDDLE: - config_set_uint64(conf, key, 3); - break; - case RETRO_DEVICE_ID_MOUSE_BUTTON_4: - config_set_uint64(conf, key, 4); - break; - case RETRO_DEVICE_ID_MOUSE_BUTTON_5: - config_set_uint64(conf, key, 5); - break; - case RETRO_DEVICE_ID_MOUSE_WHEELUP: - config_set_string(conf, key, "wu"); - break; - case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: - config_set_string(conf, key, "wd"); - break; - case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: - config_set_string(conf, key, "whu"); - break; - case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: - config_set_string(conf, key, "whd"); - break; - default: - if (save_empty) - config_set_string(conf, key, "nul"); - break; - } -} - -/** - * input_config_save_keybind: - * @conf : pointer to config file object - * @prefix : prefix name of keybind - * @base : base name of keybind - * @bind : pointer to key binding object - * @kb : save keyboard binds - * - * Save a key binding to the config file. - */ -void input_config_save_keybind(void *data, const char *prefix, - const char *base, const struct retro_keybind *bind, - bool save_empty) -{ - config_file_t *conf = (config_file_t*)data; - - save_keybind_joykey (conf, prefix, base, bind, save_empty); - save_keybind_axis (conf, prefix, base, bind, save_empty); - save_keybind_mbutton(conf, prefix, base, bind, save_empty); -} - /* MIDI */ static midi_driver_t *midi_driver_find_driver(const char *ident) diff --git a/retroarch_data.h b/retroarch_data.h index a2987fb45c..728032145d 100644 --- a/retroarch_data.h +++ b/retroarch_data.h @@ -104,9 +104,6 @@ #define MAX_VISIBILITY 32 #endif -#define DECLARE_BIND(base, bind, desc) { #base, desc, 0, bind, true } -#define DECLARE_META_BIND(level, base, bind, desc) { #base, desc, level, bind, true } - #ifdef HAVE_THREADS #define VIDEO_DRIVER_IS_THREADED_INTERNAL() ((!video_driver_is_hw_context() && p_rarch->video_driver_threaded) ? true : false) #else @@ -188,8 +185,6 @@ /* Depends on ASCII character values */ #define ISPRINT(c) (((int)(c) >= ' ' && (int)(c) <= '~') ? 1 : 0) -#define INPUT_CONFIG_BIND_MAP_GET(i) ((const struct input_bind_map*)&input_config_bind_map[(i)]) - #define VIDEO_HAS_FOCUS(p_rarch) (p_rarch->current_video->focus ? (p_rarch->current_video->focus(p_rarch->video_driver_data)) : true) #if HAVE_DYNAMIC @@ -1211,24 +1206,6 @@ struct input_overlay }; #endif -/* Input config. */ -struct input_bind_map -{ - const char *base; - - enum msg_hash_enums desc; - - /* Meta binds get input as prefix, not input_playerN". - * 0 = libretro related. - * 1 = Common hotkey. - * 2 = Uncommon/obscure hotkey. - */ - uint8_t meta; - - uint8_t retro_key; - - bool valid; -}; typedef struct turbo_buttons turbo_buttons_t; @@ -2158,97 +2135,6 @@ static gfx_api_gpu_map gpu_map[] = { { NULL, GFX_CTX_DIRECT3D12_API } }; -static const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = { - DECLARE_BIND(b, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B), - DECLARE_BIND(y, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y), - DECLARE_BIND(select, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT), - DECLARE_BIND(start, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START), - DECLARE_BIND(up, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP), - DECLARE_BIND(down, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN), - DECLARE_BIND(left, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT), - DECLARE_BIND(right, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT), - DECLARE_BIND(a, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A), - DECLARE_BIND(x, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X), - DECLARE_BIND(l, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L), - DECLARE_BIND(r, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R), - DECLARE_BIND(l2, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2), - DECLARE_BIND(r2, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2), - DECLARE_BIND(l3, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3), - DECLARE_BIND(r3, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3), - DECLARE_BIND(l_x_plus, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS), - DECLARE_BIND(l_x_minus, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS), - DECLARE_BIND(l_y_plus, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS), - DECLARE_BIND(l_y_minus, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS), - DECLARE_BIND(r_x_plus, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS), - DECLARE_BIND(r_x_minus, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS), - DECLARE_BIND(r_y_plus, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS), - DECLARE_BIND(r_y_minus, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS), - - DECLARE_BIND( gun_trigger, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER ), - DECLARE_BIND( gun_offscreen_shot,RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD ), - DECLARE_BIND( gun_aux_a, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A ), - DECLARE_BIND( gun_aux_b, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B ), - DECLARE_BIND( gun_aux_c, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C ), - DECLARE_BIND( gun_start, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START ), - DECLARE_BIND( gun_select, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT ), - DECLARE_BIND( gun_dpad_up, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP ), - DECLARE_BIND( gun_dpad_down, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN ), - DECLARE_BIND( gun_dpad_left, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT ), - DECLARE_BIND( gun_dpad_right, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT ), - - DECLARE_BIND( turbo, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE), - - DECLARE_META_BIND(1, toggle_fast_forward, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY), - DECLARE_META_BIND(2, hold_fast_forward, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY), - DECLARE_META_BIND(1, toggle_slowmotion, RARCH_SLOWMOTION_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY), - DECLARE_META_BIND(2, hold_slowmotion, RARCH_SLOWMOTION_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_HOLD_KEY), - DECLARE_META_BIND(1, load_state, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY), - DECLARE_META_BIND(1, save_state, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY), - DECLARE_META_BIND(2, toggle_fullscreen, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY), - DECLARE_META_BIND(2, close_content, RARCH_CLOSE_CONTENT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_CLOSE_CONTENT_KEY), -#ifdef HAVE_LAKKA - DECLARE_META_BIND(2, exit_emulator, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_RESTART_KEY), -#else - DECLARE_META_BIND(2, exit_emulator, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY), -#endif - DECLARE_META_BIND(2, state_slot_increase, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS), - DECLARE_META_BIND(2, state_slot_decrease, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS), - DECLARE_META_BIND(1, rewind, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND), - DECLARE_META_BIND(2, movie_record_toggle, RARCH_BSV_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE), - DECLARE_META_BIND(2, pause_toggle, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE), - DECLARE_META_BIND(2, frame_advance, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE), - DECLARE_META_BIND(2, reset, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET), - DECLARE_META_BIND(2, shader_next, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT), - DECLARE_META_BIND(2, shader_prev, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV), - DECLARE_META_BIND(2, cheat_index_plus, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS), - DECLARE_META_BIND(2, cheat_index_minus, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS), - DECLARE_META_BIND(2, cheat_toggle, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE), - DECLARE_META_BIND(2, screenshot, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT), - DECLARE_META_BIND(2, audio_mute, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE), - DECLARE_META_BIND(2, osk_toggle, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK), - DECLARE_META_BIND(2, fps_toggle, RARCH_FPS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_FPS_TOGGLE), - DECLARE_META_BIND(2, send_debug_info, RARCH_SEND_DEBUG_INFO, MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO), - DECLARE_META_BIND(2, netplay_host_toggle, RARCH_NETPLAY_HOST_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_HOST_TOGGLE), - DECLARE_META_BIND(2, netplay_game_watch, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH), - DECLARE_META_BIND(2, enable_hotkey, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY), - DECLARE_META_BIND(2, volume_up, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP), - DECLARE_META_BIND(2, volume_down, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN), - DECLARE_META_BIND(2, overlay_next, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT), - DECLARE_META_BIND(2, disk_eject_toggle, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE), - DECLARE_META_BIND(2, disk_next, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT), - DECLARE_META_BIND(2, disk_prev, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV), - DECLARE_META_BIND(2, grab_mouse_toggle, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE), - DECLARE_META_BIND(2, game_focus_toggle, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE), - DECLARE_META_BIND(2, desktop_menu_toggle, RARCH_UI_COMPANION_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE), -#ifdef HAVE_MENU - DECLARE_META_BIND(1, menu_toggle, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE), -#endif - DECLARE_META_BIND(2, recording_toggle, RARCH_RECORDING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE), - DECLARE_META_BIND(2, streaming_toggle, RARCH_STREAMING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE), - DECLARE_META_BIND(2, runahead_toggle, RARCH_RUNAHEAD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_RUNAHEAD_TOGGLE), - DECLARE_META_BIND(2, ai_service, RARCH_AI_SERVICE, MENU_ENUM_LABEL_VALUE_INPUT_META_AI_SERVICE), -}; - /* TODO/FIXME - turn these into static global variable */ #ifdef HAVE_DISCORD bool discord_is_inited = false;