diff --git a/input/input_driver.c b/input/input_driver.c index 14ed1c17a9..e3032c405c 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -634,7 +634,8 @@ void input_poll(void) int16_t input_state(unsigned port, unsigned device, unsigned idx, unsigned id) { - int16_t res = 0; + int16_t res = 0; + bool clear = false; device &= RETRO_DEVICE_MASK; @@ -657,8 +658,11 @@ int16_t input_state(unsigned port, unsigned device, switch (device) { case RETRO_DEVICE_JOYPAD: - if (id < RARCH_FIRST_CUSTOM_BIND) - id = settings->uints.input_remap_ids[port][id]; + if (id != settings->uints.input_remap_ids[port][id]) + { + clear = true; + } + break; case RETRO_DEVICE_ANALOG: if (idx < 2 && id < 2) @@ -676,11 +680,9 @@ int16_t input_state(unsigned port, unsigned device, if (((id < RARCH_FIRST_META_KEY) || (device == RETRO_DEVICE_KEYBOARD))) { bool bind_valid = libretro_input_binds[port] && libretro_input_binds[port][id].valid; - + rarch_joypad_info_t joypad_info; if (bind_valid || device == RETRO_DEVICE_KEYBOARD) { - rarch_joypad_info_t joypad_info; - joypad_info.axis_threshold = input_driver_axis_threshold; joypad_info.joy_idx = settings->uints.input_joypad_map[port]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; @@ -690,6 +692,12 @@ int16_t input_state(unsigned port, unsigned device, } } +#ifdef HAVE_KEYMAPPER + if (input_driver_mapper) + input_mapper_state(input_driver_mapper, + &res, port, device, idx, id, clear); +#endif + #ifdef HAVE_OVERLAY if (overlay_ptr) input_state_overlay(overlay_ptr, &res, port, device, idx, id); @@ -700,12 +708,6 @@ int16_t input_state(unsigned port, unsigned device, input_remote_state(&res, port, device, idx, id); #endif -#ifdef HAVE_KEYMAPPER - if (input_driver_mapper) - input_mapper_state(input_driver_mapper, - &res, port, device, idx, id); -#endif - /* Don't allow turbo for D-pad. */ if (device == RETRO_DEVICE_JOYPAD && (id < RETRO_DEVICE_ID_JOYPAD_UP || id > RETRO_DEVICE_ID_JOYPAD_RIGHT)) diff --git a/input/input_mapper.c b/input/input_mapper.c index 42e4762040..b21d09ac22 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -81,6 +81,13 @@ void input_mapper_free(input_mapper_t *handle) free (handle); } +bool flag = false; + +bool input_mapper_button_pressed(input_mapper_t *handle, int id) +{ + return (handle->buttons >> id) & 1U; +} + void input_mapper_poll(input_mapper_t *handle) { int i, j; @@ -93,9 +100,6 @@ void input_mapper_poll(input_mapper_t *handle) device &= RETRO_DEVICE_MASK; - /* for now we only handle keyboard inputs */ - if (device != RETRO_DEVICE_KEYBOARD) - return; #ifdef HAVE_MENU if (menu_is_alive) return; @@ -103,31 +107,56 @@ void input_mapper_poll(input_mapper_t *handle) memset(handle->keys, 0, sizeof(handle->keys)); i = 0; - for (i = 0; i < MAX_USERS; i++) + if (device == RETRO_DEVICE_KEYBOARD) { - for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) + for (i = 0; i < MAX_USERS; i++) { - if (j < RETROK_LAST) + for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) { - if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && - settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) + if (j < RETROK_LAST) { - MAPPER_SET_KEY (handle, - settings->uints.input_keymapper_ids[i][j]); - input_keyboard_event(true, - settings->uints.input_keymapper_ids[i][j], - 0, 0, RETRO_DEVICE_KEYBOARD); - key_event[j] = true; - } - else - { - if (key_event[j] == false && + if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) { - input_keyboard_event(false, + MAPPER_SET_KEY (handle, + settings->uints.input_keymapper_ids[i][j]); + input_keyboard_event(true, settings->uints.input_keymapper_ids[i][j], 0, 0, RETRO_DEVICE_KEYBOARD); + key_event[j] = true; } + else + { + if (key_event[j] == false && + settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) + { + input_keyboard_event(false, + settings->uints.input_keymapper_ids[i][j], + 0, 0, RETRO_DEVICE_KEYBOARD); + } + } + } + } + } + } + if (device == RETRO_DEVICE_JOYPAD) + { + for (i = 0; i < MAX_USERS; i++) + { + for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) + { + if(input_state(i, RETRO_DEVICE_JOYPAD, i, j)) + { + if (j != settings->uints.input_remap_ids[i][j]) + { + RARCH_LOG("remapped button pressed: old:%d new: %d\n", j, settings->uints.input_remap_ids[i][j]); + handle->buttons |= 1 << settings->uints.input_remap_ids[i][j]; + } + } + if(!input_state(i, RETRO_DEVICE_JOYPAD, i, j)) + { + if (j != settings->uints.input_remap_ids[i][j]) + handle->buttons &= ~(1 << settings->uints.input_remap_ids[i][j]); } } } @@ -140,24 +169,23 @@ void input_mapper_state( unsigned port, unsigned device, unsigned idx, - unsigned id) + unsigned id, + bool clear) { if (!handle) return; switch (device) { + case RETRO_DEVICE_JOYPAD: + /* we should get the new buttons here via input_remapper_button_pressed but it doesn't work because the old state is still there + so both actions trigger */ + if (input_mapper_button_pressed(handle, id)) + *ret = 1; + break; case RETRO_DEVICE_KEYBOARD: if (id < RETROK_LAST) { - /* - RARCH_LOG("State: UDLR %u %u %u %u\n", - MAPPER_GET_KEY(handle, RETROK_UP), - MAPPER_GET_KEY(handle, RETROK_DOWN), - MAPPER_GET_KEY(handle, RETROK_LEFT), - MAPPER_GET_KEY(handle, RETROK_RIGHT) - );*/ - if (MAPPER_GET_KEY(handle, id)) *ret |= 1; } @@ -165,4 +193,5 @@ void input_mapper_state( default: break; } + return; } diff --git a/input/input_mapper.h b/input/input_mapper.h index c50519acd8..fd40cba04d 100644 --- a/input/input_mapper.h +++ b/input/input_mapper.h @@ -37,7 +37,7 @@ void input_mapper_free(input_mapper_t *handle); void input_mapper_poll(input_mapper_t *handle); -bool input_mapper_key_pressed(int key); +bool input_mapper_key_pressed(input_mapper_t *handle, int key); void input_mapper_state( input_mapper_t *handle, @@ -45,7 +45,8 @@ void input_mapper_state( unsigned port, unsigned device, unsigned idx, - unsigned id); + unsigned id, + bool clear); RETRO_END_DECLS diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index cbfac887e2..ed1b625075 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -552,56 +552,29 @@ static void menu_action_setting_disp_set_label_input_desc( const struct retro_keybind *auto_bind = NULL; const struct retro_keybind *keybind = NULL; settings_t *settings = config_get_ptr(); - unsigned inp_desc_index_offset = - type - MENU_SETTINGS_INPUT_DESC_BEGIN; - unsigned inp_desc_user = inp_desc_index_offset / - (RARCH_FIRST_CUSTOM_BIND + 8); - unsigned inp_desc_button_index_offset = inp_desc_index_offset - - (inp_desc_user * (RARCH_FIRST_CUSTOM_BIND + 8)); - unsigned remap_id = 0; + + unsigned key_id, id, offset; + unsigned remap_id = 0; + + if (!settings) + return 0; + + offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + + id = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * offset; + + remap_id = + settings->uints.input_remap_ids[offset][id]; system = runloop_get_system_info(); if (!system) return; - descriptor = system->input_desc_btn[inp_desc_user][inp_desc_button_index_offset]; + descriptor = system->input_desc_btn[offset][remap_id]; - if (inp_desc_button_index_offset < RARCH_FIRST_CUSTOM_BIND + 8) - strlcpy(s, descriptor ? descriptor : "---", len); - else - { - switch (remap_id) - { - case 0: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS); - break; - case 1: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS); - break; - case 2: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS); - break; - case 3: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS); - break; - case 4: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS); - break; - case 5: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS); - break; - case 6: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS); - break; - case 7: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS); - break; - } - - if (!string_is_empty(descriptor)) - strlcpy(s, descriptor, len); - } + if (!string_is_empty(descriptor)) + strlcpy(s, descriptor, len); *w = 19; strlcpy(s2, path, len2); diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 7619614734..f27952c779 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -90,19 +90,24 @@ static int action_left_cheat(unsigned type, const char *label, wraparound); } +/* fix-me: incomplete, lacks error checking */ static int action_left_input_desc(unsigned type, const char *label, - bool wraparound) + bool wraparound) { - unsigned inp_desc_index_offset = type - - MENU_SETTINGS_INPUT_DESC_BEGIN; - unsigned inp_desc_user = inp_desc_index_offset / - (RARCH_FIRST_CUSTOM_BIND + 4); - unsigned inp_desc_button_index_offset = inp_desc_index_offset - - (inp_desc_user * (RARCH_FIRST_CUSTOM_BIND + 4)); - settings_t *settings = config_get_ptr(); - if (settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset] > 0) - settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset]--; + unsigned key_id, id, offset; + unsigned remap_id = 0; + settings_t *settings = config_get_ptr(); + + if (!settings) + return 0; + + offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + + id = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * offset; + + if (settings->uints.input_remap_ids[offset][id] > 0) + settings->uints.input_remap_ids[offset][id]--; return 0; } diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index bf6838fb50..9dd8e1fd40 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -107,7 +107,6 @@ int action_right_input_desc_kbd(unsigned type, const char *label, { unsigned key_id, id, offset; unsigned remap_id; - char desc[PATH_MAX_LENGTH]; settings_t *settings = config_get_ptr(); if (!settings) @@ -129,6 +128,8 @@ int action_right_input_desc_kbd(unsigned type, const char *label, break; } + RARCH_LOG("o:%u t:%u i:%u r:%u\n", offset, type, id, remap_id); + if (key_id < RARCH_MAX_KEYS + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) key_id++; else @@ -140,26 +141,28 @@ int action_right_input_desc_kbd(unsigned type, const char *label, } #endif +/* fix-me: incomplete, lacks error checking */ int action_right_input_desc(unsigned type, const char *label, bool wraparound) { -unsigned inp_desc_index_offset = type - MENU_SETTINGS_INPUT_DESC_BEGIN; -unsigned inp_desc_user = inp_desc_index_offset / (RARCH_FIRST_CUSTOM_BIND + 4); -unsigned inp_desc_button_index_offset = inp_desc_index_offset - (inp_desc_user * (RARCH_FIRST_CUSTOM_BIND + 4)); -settings_t *settings = config_get_ptr(); -if (inp_desc_button_index_offset < RARCH_FIRST_CUSTOM_BIND) -{ - if (settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset] < RARCH_FIRST_CUSTOM_BIND - 1) - settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset]++; -} -else -{ - if (settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset] < 4 - 1) - settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset]++; -} + unsigned key_id, id, offset; + unsigned remap_id = 0; + settings_t *settings = config_get_ptr(); -return 0; + if (!settings) + return 0; + + offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + + id = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * offset; + + if (settings->uints.input_remap_ids[offset][id] < RARCH_FIRST_CUSTOM_BIND) + settings->uints.input_remap_ids[offset][id]++; + + RARCH_LOG("o:%u t:%u i:%u r:%u\n", offset, type, id, remap_id); + + return 0; } static int action_right_scroll(unsigned type, const char *label, diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 81403b20a6..3facf11794 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -426,7 +426,7 @@ static int action_bind_sublabel_subsystem_add( return 0; } -static int action_bind_sublabel_remap_sublabel( +static int action_bind_sublabel_remap_kbd_sublabel( file_list_t *list, unsigned type, unsigned i, const char *label, const char *path, @@ -451,6 +451,30 @@ static int action_bind_sublabel_remap_sublabel( return 0; } + +static int action_bind_sublabel_remap_sublabel( + file_list_t *list, + unsigned type, unsigned i, + const char *label, const char *path, + char *s, size_t len) +{ + char desc[PATH_MAX_LENGTH]; + unsigned offset; + settings_t *settings = config_get_ptr(); + + if (!settings) + return 0; + + offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + + snprintf(s, len, "User #%d: %s", offset + 1, + input_config_get_device_display_name(offset) ? + input_config_get_device_display_name(offset) : + (input_config_get_device_name(offset) ? + input_config_get_device_name(offset) : "N/A")); + return 0; +} + #ifdef HAVE_NETWORKING static int action_bind_sublabel_netplay_room( file_list_t *list, @@ -513,10 +537,16 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, if (type >= MENU_SETTINGS_INPUT_DESC_KBD_BEGIN && type <= MENU_SETTINGS_INPUT_DESC_KBD_END) { - BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_sublabel); + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_kbd_sublabel); } #endif + if (type >= MENU_SETTINGS_INPUT_DESC_BEGIN + && type <= MENU_SETTINGS_INPUT_DESC_END) + { + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_sublabel); + } + if (cbs->enum_idx != MSG_UNKNOWN) { switch (cbs->enum_idx) diff --git a/menu/menu_driver.h b/menu/menu_driver.h index ebc589b306..94195c73d9 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -206,9 +206,9 @@ enum menu_settings_type MENU_SETTINGS_CHEAT_BEGIN, MENU_SETTINGS_CHEAT_END = MENU_SETTINGS_CHEAT_BEGIN + (MAX_CHEAT_COUNTERS - 1), MENU_SETTINGS_INPUT_DESC_BEGIN, - MENU_SETTINGS_INPUT_DESC_END = MENU_SETTINGS_INPUT_DESC_BEGIN + (MAX_USERS * (RARCH_FIRST_CUSTOM_BIND + 4)), + MENU_SETTINGS_INPUT_DESC_END = MENU_SETTINGS_INPUT_DESC_BEGIN + ((RARCH_FIRST_CUSTOM_BIND + 8) * MAX_USERS), MENU_SETTINGS_INPUT_DESC_KBD_BEGIN, - MENU_SETTINGS_INPUT_DESC_KBD_END = (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + RARCH_MAX_KEYS) * MAX_USERS, + MENU_SETTINGS_INPUT_DESC_KBD_END = MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + (RARCH_MAX_KEYS * MAX_USERS), MENU_SETTINGS_SUBSYSTEM_LOAD,