diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index acd7db6327..2e2c1d00bd 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -322,7 +322,8 @@ static bool dinput_mouse_button_pressed( return false; } -static int16_t dinput_pressed_analog(struct dinput_input *di, +static int16_t dinput_pressed_analog( + struct dinput_input *di, const struct retro_keybind *binds, unsigned idx, unsigned id) { @@ -350,7 +351,7 @@ static int16_t dinput_pressed_analog(struct dinput_input *di, if (di->state[sym] & 0x80) ret = 0x7fff; } - if (id_minus_key < RETROK_LAST) + if (id_minus_valid && id_minus_key < RETROK_LAST) { unsigned sym = rarch_keysym_lut[(enum retro_key)id_minus_key]; if (di->state[sym] & 0x80) diff --git a/input/drivers/linuxraw_input.c b/input/drivers/linuxraw_input.c index 3cc1b1d8f8..ad123badf9 100644 --- a/input/drivers/linuxraw_input.c +++ b/input/drivers/linuxraw_input.c @@ -75,33 +75,38 @@ static void *linuxraw_input_init(const char *joypad_driver) static int16_t linuxraw_analog_pressed(linuxraw_input_t *linuxraw, const struct retro_keybind *binds, unsigned idx, unsigned id) { - const struct retro_keybind *bind_minus, *bind_plus; - int16_t pressed_minus = 0, pressed_plus = 0; - unsigned id_minus = 0; - unsigned id_plus = 0; + int id_minus_key = 0; + int id_plus_key = 0; + unsigned id_minus = 0; + unsigned id_plus = 0; + int16_t ret = 0; + bool id_plus_valid = false; + bool id_minus_valid = false; input_conv_analog_id_to_bind_id(idx, id, id_minus, id_plus); - bind_minus = &binds[id_minus]; - bind_plus = &binds[id_plus]; + id_minus_valid = binds[id_minus].valid; + id_plus_valid = binds[id_plus].valid; + id_minus_key = binds[id_minus].key; + id_plus_key = binds[id_plus].key; - if (!bind_minus->valid || !bind_plus->valid) + if (!id_minus_valid || !id_plus_valid) return 0; - if (bind_minus->key < RETROK_LAST) + if (id_plus_valid && id_plus_key < RETROK_LAST) { - unsigned sym = rarch_keysym_lut[(enum retro_key)bind_minus->key]; + unsigned sym = rarch_keysym_lut[(enum retro_key)id_plus_key]; if (linuxraw->state[sym] & 0x80) - pressed_minus = -0x7fff; + ret = 0x7fff; } - if (bind_plus->key < RETROK_LAST) + if (id_minus_valid && id_minus_key < RETROK_LAST) { - unsigned sym = rarch_keysym_lut[(enum retro_key)bind_minus->key]; + unsigned sym = rarch_keysym_lut[(enum retro_key)id_minus_key]; if (linuxraw->state[sym] & 0x80) - pressed_plus = 0x7fff; + ret += -0x7fff; } - return pressed_plus + pressed_minus; + return ret; } static int16_t linuxraw_input_state( diff --git a/input/drivers/rwebinput_input.c b/input/drivers/rwebinput_input.c index b146a2c472..deb62429b3 100644 --- a/input/drivers/rwebinput_input.c +++ b/input/drivers/rwebinput_input.c @@ -503,26 +503,38 @@ static int16_t rwebinput_analog_pressed( const struct retro_keybind *binds, unsigned idx, unsigned id) { - int16_t pressed_minus = 0, pressed_plus = 0; - unsigned id_minus = 0; - unsigned id_plus = 0; + int id_minus_key = 0; + int id_plus_key = 0; + unsigned id_minus = 0; + unsigned id_plus = 0; + int16_t ret = 0; + bool id_plus_valid = false; + bool id_minus_valid = false; input_conv_analog_id_to_bind_id(idx, id, id_minus, id_plus); - if (id < RARCH_BIND_LIST_END) + id_minus_valid = binds[id_minus].valid; + id_plus_valid = binds[id_plus].valid; + id_minus_key = binds[id_minus].key; + id_plus_key = binds[id_plus].key; + + if (!id_minus_valid || !id_plus_valid) + return 0; + + if (id_plus_valid && id_plus_key < RETROK_LAST) { - if (binds[id].valid) - { - if (rwebinput_is_pressed(rwebinput, - joypad, joypad_info, binds, idx, id_minus)) - pressed_minus = -0x7fff; - if (rwebinput_is_pressed(rwebinput, - joypad, joypad_info, binds, idx, id_plus)) - pressed_plus = 0x7fff; - } + if (rwebinput_is_pressed(rwebinput, + joypad, joypad_info, binds, idx, id_plus)) + ret = 0x7fff; + } + if (id_minus_valid && id_minus_key < RETROK_LAST) + { + if (rwebinput_is_pressed(rwebinput, + joypad, joypad_info, binds, idx, id_minus)) + ret += -0x7fff; } - return pressed_plus + pressed_minus; + return ret; } static int16_t rwebinput_input_state( diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index dc5a7f9654..798c7b4a7e 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -79,22 +79,43 @@ static bool sdl_key_pressed(int key) return keymap[sym]; } -static int16_t sdl_analog_pressed(sdl_input_t *sdl, +static int16_t sdl_analog_pressed( + sdl_input_t *sdl, const struct retro_keybind *binds, unsigned idx, unsigned id) { - int16_t pressed_minus = 0, pressed_plus = 0; - unsigned id_minus = 0; - unsigned id_plus = 0; + int id_minus_key = 0; + int id_plus_key = 0; + unsigned id_minus = 0; + unsigned id_plus = 0; + int16_t ret = 0; + bool id_plus_valid = false; + bool id_minus_valid = false; input_conv_analog_id_to_bind_id(idx, id, id_minus, id_plus); - if ((binds[id_minus].key < RETROK_LAST) && sdl_key_pressed(binds[id_minus].key)) - pressed_minus = -0x7fff; - if ((binds[id_plus].key < RETROK_LAST) && sdl_key_pressed(binds[id_plus].key)) - pressed_plus = 0x7fff; + id_minus_valid = binds[id_minus].valid; + id_plus_valid = binds[id_plus].valid; + id_minus_key = binds[id_minus].key; + id_plus_key = binds[id_plus].key; - return pressed_plus + pressed_minus; + if (!id_minus_valid || !id_plus_valid) + return 0; + + if (id_plus_valid && id_plus_key < RETROK_LAST) + { + unsigned sym = rarch_keysym_lut[(enum retro_key)id_plus_key]; + if (sdl_key_pressed(sym)) + ret = 0x7fff; + } + if (id_minus_valid && id_minus_key < RETROK_LAST) + { + unsigned sym = rarch_keysym_lut[(enum retro_key)id_minus_key]; + if (sdl_key_pressed(sym)) + ret += -0x7fff; + } + + return ret; } static int16_t sdl_mouse_device_state(sdl_input_t *sdl, unsigned id) diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 8f9638ea2d..f64f99e86f 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -932,27 +932,43 @@ static bool udev_mouse_button_pressed( return false; } -static int16_t udev_analog_pressed(udev_input_t *udev, +static int16_t udev_analog_pressed( + udev_input_t *udev, const struct retro_keybind *binds, unsigned idx, unsigned id) { + int id_minus_key = 0; + int id_plus_key = 0; unsigned id_minus = 0; unsigned id_plus = 0; - int16_t pressed_minus = 0; - int16_t pressed_plus = 0; + int16_t ret = 0; + bool id_plus_valid = false; + bool id_minus_valid = false; input_conv_analog_id_to_bind_id(idx, id, id_minus, id_plus); - if ( binds[id_minus].valid - && BIT_GET(udev->state, - rarch_keysym_lut[binds[id_minus].key])) - pressed_minus = -0x7fff; - if ( binds[id_plus].valid - && BIT_GET(udev->state, - rarch_keysym_lut[binds[id_plus].key])) - pressed_plus = 0x7fff; + id_minus_valid = binds[id_minus].valid; + id_plus_valid = binds[id_plus].valid; + id_minus_key = binds[id_minus].key; + id_plus_key = binds[id_plus].key; - return pressed_plus + pressed_minus; + if (!id_minus_valid || !id_plus_valid) + return 0; + + if (id_plus_valid && id_plus_key < RETROK_LAST) + { + unsigned sym = rarch_keysym_lut[(enum retro_key)id_plus_key]; + if BIT_GET(udev->state, sym) + ret = 0x7fff; + } + if (id_minus_valid && id_minus_key < RETROK_LAST) + { + unsigned sym = rarch_keysym_lut[(enum retro_key)id_minus_key]; + if (BIT_GET(udev->state, sym)) + ret += -0x7fff; + } + + return ret; } static int16_t udev_pointer_state(udev_input_t *udev, diff --git a/input/drivers/uwp_input.c b/input/drivers/uwp_input.c index 824e79289d..adc58e3a71 100644 --- a/input/drivers/uwp_input.c +++ b/input/drivers/uwp_input.c @@ -89,27 +89,36 @@ static int16_t uwp_pressed_analog(uwp_input_t *uwp, const struct retro_keybind *binds, unsigned port, unsigned idx, unsigned id) { - const struct retro_keybind *bind_minus, *bind_plus; - int16_t pressed_minus = 0, pressed_plus = 0; - unsigned id_minus = 0, id_plus = 0; + int id_minus_key = 0; + int id_plus_key = 0; + unsigned id_minus = 0; + unsigned id_plus = 0; + int16_t ret = 0; + bool id_plus_valid = false; + bool id_minus_valid = false; - /* First, process the keyboard bindings */ input_conv_analog_id_to_bind_id(idx, id, id_minus, id_plus); - bind_minus = &binds[id_minus]; - bind_plus = &binds[id_plus]; + id_minus_valid = binds[id_minus].valid; + id_plus_valid = binds[id_plus].valid; + id_minus_key = binds[id_minus].key; + id_plus_key = binds[id_plus].key; - if (!bind_minus->valid || !bind_plus->valid) + if (!id_minus_valid || !id_plus_valid) return 0; - if ((bind_minus->key < RETROK_LAST) - && uwp_keyboard_pressed(bind_minus->key)) - pressed_minus = -0x7fff; - if ((bind_plus->key < RETROK_LAST) - && uwp_keyboard_pressed(bind_plus->key)) - pressed_plus = 0x7fff; + if (id_plus_valid && id_plus_key < RETROK_LAST) + { + if (uwp_keyboard_pressed(bind_plus_key)) + ret = 0x7fff; + } + if (id_minus_valid && id_minus_key < RETROK_LAST) + { + if (uwp_keyboard_pressed(bind_minus_key)) + ret += -0x7fff; + } - return pressed_plus + pressed_minus; + return ret; } static int16_t uwp_input_state( diff --git a/input/drivers/wayland_input.c b/input/drivers/wayland_input.c index 399dd51ace..b1cf29b4d3 100644 --- a/input/drivers/wayland_input.c +++ b/input/drivers/wayland_input.c @@ -154,31 +154,41 @@ static void input_wl_poll(void *data) input_wl_touch_pool(wl); } -static int16_t input_wl_analog_pressed(input_ctx_wayland_data_t *wl, +static int16_t input_wl_analog_pressed( + input_ctx_wayland_data_t *wl, const struct retro_keybind *binds, unsigned idx, unsigned id) { + int id_minus_key = 0; + int id_plus_key = 0; unsigned id_minus = 0; unsigned id_plus = 0; - int16_t pressed_minus = 0; - int16_t pressed_plus = 0; + int16_t ret = 0; + bool id_plus_valid = false; + bool id_minus_valid = false; input_conv_analog_id_to_bind_id(idx, id, id_minus, id_plus); - if (binds - && binds[id_minus].valid - && (id_minus < RARCH_BIND_LIST_END) - && BIT_GET(wl->key_state, rarch_keysym_lut[binds[id_minus].key]) - ) - pressed_minus = -0x7fff; - if (binds - && binds[id_plus].valid - && (id_plus < RARCH_BIND_LIST_END) - && BIT_GET(wl->key_state, rarch_keysym_lut[binds[id_plus].key]) - ) - pressed_plus = 0x7fff; + id_minus_valid = binds[id_minus].valid; + id_plus_valid = binds[id_plus].valid; + id_minus_key = binds[id_minus].key; + id_plus_key = binds[id_plus].key; - return pressed_plus + pressed_minus; + if (!id_minus_valid || !id_plus_valid) + return 0; + + if (id_plus_valid && id_plus_key < RETROK_LAST) + { + if (BIT_GET(wl->key_state, rarch_keysym_lut[(enum retro_key)id_plus_key])) + ret = 0x7fff; + } + if (id_minus_valid && id_minus_key < RETROK_LAST) + { + if (BIT_GET(wl->key_state, rarch_keysym_lut[(enum retro_key)id_minus_key])) + ret += -0x7fff; + } + + return ret; } static bool input_wl_state_kb(input_ctx_wayland_data_t *wl,