diff --git a/retroarch.c b/retroarch.c index 3574c1a252..0893172b38 100644 --- a/retroarch.c +++ b/retroarch.c @@ -21750,8 +21750,6 @@ static void input_driver_poll(void) const input_device_driver_t *joypad_driver = p_rarch->joypad; - memset(handle->keys, 0, sizeof(handle->keys)); - for (i = 0; i < max_users; i++) { input_bits_t current_inputs; @@ -21833,13 +21831,10 @@ static void input_driver_poll(void) for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) { unsigned current_button_value; - unsigned remap_button = + unsigned remap_key = settings->uints.input_keymapper_ids[i][j]; - bool remap_valid = - remap_button != RETROK_UNKNOWN && - !MAPPER_GET_KEY(handle, remap_button); - if (!remap_valid) + if (remap_key == RETROK_UNKNOWN) continue; current_button_value = @@ -21857,21 +21852,28 @@ static void input_driver_poll(void) BIT256_GET(ol_state->buttons, j); } #endif + /* Press */ if ((current_button_value == 1) - && (j != remap_button)) + && !MAPPER_GET_KEY(handle, remap_key)) { - MAPPER_SET_KEY (handle, - remap_button); + handle->key_button[remap_key] = j; + MAPPER_SET_KEY(handle, remap_key); input_keyboard_event(true, - remap_button, + remap_key, 0, 0, RETRO_DEVICE_KEYBOARD); - continue; } + /* Release */ + else if ((current_button_value == 0) + && MAPPER_GET_KEY(handle, remap_key)) + { + if (handle->key_button[remap_key] != j) + continue; - /* Release keyboard event*/ - input_keyboard_event(false, - remap_button, - 0, 0, RETRO_DEVICE_KEYBOARD); + MAPPER_UNSET_KEY(handle, remap_key); + input_keyboard_event(false, + remap_key, + 0, 0, RETRO_DEVICE_KEYBOARD); + } } break; diff --git a/retroarch_data.h b/retroarch_data.h index d6bd295788..a29aa0d98c 100644 --- a/retroarch_data.h +++ b/retroarch_data.h @@ -274,6 +274,7 @@ #define MAPPER_GET_KEY(state, key) (((state)->keys[(key) / 32] >> ((key) % 32)) & 1) #define MAPPER_SET_KEY(state, key) (state)->keys[(key) / 32] |= 1 << ((key) % 32) +#define MAPPER_UNSET_KEY(state, key) (state)->keys[(key) / 32] &= ~(1 << ((key) % 32)) #ifdef HAVE_MENU @@ -1645,8 +1646,10 @@ typedef struct input_mapper { /* Left X, Left Y, Right X, Right Y */ int16_t analog_value[MAX_USERS][8]; - /* the whole keyboard state */ + /* The whole keyboard state */ uint32_t keys[RETROK_LAST / 32 + 1]; + /* RetroPad button state of remapped keyboard keys */ + unsigned key_button[RETROK_LAST]; /* This is a bitmask of (1 << key_bind_id). */ input_bits_t buttons[MAX_USERS]; } input_mapper_t;