diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index 0f5e0435aa..3e3069f252 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -644,10 +644,10 @@ static int16_t dinput_input_state(void *data, if (binds[port]) { int16_t ret = dinput_pressed_analog(di, binds[port], idx, id); - if (!ret) - ret = input_joypad_analog(di->joypad, joypad_info, - port, idx, id, binds[port]); - return ret; + if (ret) + return ret; + return input_joypad_analog(di->joypad, joypad_info, + port, idx, id, binds[port]); } break; diff --git a/input/input_driver.h b/input/input_driver.h index 5ced262273..a5084fe21d 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -348,6 +348,11 @@ int16_t input_joypad_analog(const input_device_driver_t *driver, unsigned port, unsigned idx, unsigned ident, const struct retro_keybind *binds); +int16_t input_joypad_analog_button(const input_device_driver_t *drv, + rarch_joypad_info_t *joypad_info, + unsigned port, unsigned idx, unsigned ident, + const struct retro_keybind *binds); + /** * input_joypad_set_rumble: * @drv : Input device driver handle. diff --git a/retroarch.c b/retroarch.c index 915e14700a..35e5b2de3b 100644 --- a/retroarch.c +++ b/retroarch.c @@ -21761,10 +21761,13 @@ static void input_driver_poll(void) { if (ret & (1 << k)) { - int16_t val = input_joypad_analog( + bool check = (k < RARCH_FIRST_CUSTOM_BIND) + && p_rarch->libretro_input_binds[i]->valid; + int16_t val = (check) + ? input_joypad_analog_button( joypad_driver, &joypad_info[i], (unsigned)i, RETRO_DEVICE_INDEX_ANALOG_BUTTON, k, - p_rarch->libretro_input_binds[i]); + p_rarch->libretro_input_binds[i]) : 0; BIT256_SET_PTR(p_new_state, k); @@ -24356,6 +24359,46 @@ bool input_joypad_set_rumble(const input_device_driver_t *drv, return drv->set_rumble(joy_idx, effect, strength); } +int16_t input_joypad_analog_button(const input_device_driver_t *drv, + rarch_joypad_info_t *joypad_info, + unsigned port, unsigned idx, unsigned ident, + const struct retro_keybind *binds) +{ + int16_t res = 0; + struct rarch_state *p_rarch = &rarch_st; + settings_t *settings = p_rarch->configuration_settings; + float input_analog_deadzone = settings->floats.input_analog_deadzone; + const struct retro_keybind *bind = &binds[ ident ]; + uint32_t axis = (bind->joyaxis == AXIS_NONE) + ? joypad_info->auto_binds[ident].joyaxis + : bind->joyaxis; + + /* Analog button. */ + if (drv->axis) + { + float normal_mag = 0.0f; + if (input_analog_deadzone) + normal_mag = fabs((1.0f / 0x7fff) * drv->axis( + joypad_info->joy_idx, axis)); + res = abs(input_joypad_axis(p_rarch, drv, + joypad_info->joy_idx, axis, normal_mag)); + } + + /* If the result is zero, it's got a digital button + * attached to it instead */ + if (res == 0) + { + uint16_t key = (bind->joykey == NO_BTN) + ? joypad_info->auto_binds[ident].joykey + : bind->joykey; + + if (drv->button(joypad_info->joy_idx, key)) + res = 0x7fff; + } + + return res; +} + /** * input_joypad_analog: * @drv : Input device driver handle.