/** * input_joypad_analog: * @drv : Input device driver handle. * @port : User number. * @idx : Analog key index. * E.g.: * - RETRO_DEVICE_INDEX_ANALOG_LEFT * - RETRO_DEVICE_INDEX_ANALOG_RIGHT * @ident : Analog key identifier. * E.g.: * - RETRO_DEVICE_ID_ANALOG_X * - RETRO_DEVICE_ID_ANALOG_Y * @binds : Binds of user. * * Gets analog value of analog key identifiers @idx and @ident * from user with number @port with provided keybinds (@binds). * * Returns: analog value on success, otherwise 0. **/ int16_t input_joypad_analog(const input_device_driver_t *drv, unsigned port, unsigned idx, unsigned ident, const void *binds_data) { uint32_t axis_minus, axis_plus; uint64_t key_minus, key_plus; int16_t pressed_minus, pressed_plus, res; unsigned ident_minus = 0, ident_plus = 0; int16_t digital_left = 0, digital_right = 0; const struct retro_keybind *auto_binds = NULL; const struct retro_keybind *bind_minus = NULL; const struct retro_keybind *bind_plus = NULL; const struct retro_keybind *binds = (const struct retro_keybind*) binds_data; settings_t *settings = config_get_ptr(); unsigned joy_idx = settings->input.joypad_map[port]; if (!drv) return 0; if (joy_idx >= MAX_USERS) return 0; /* Auto-binds are per joypad, not per user. */ auto_binds = settings->input.autoconf_binds[joy_idx]; input_conv_analog_id_to_bind_id(idx, ident, &ident_minus, &ident_plus); bind_minus = &binds[ident_minus]; bind_plus = &binds[ident_plus]; if (!bind_minus->valid || !bind_plus->valid) return 0; axis_minus = bind_minus->joyaxis; axis_plus = bind_plus->joyaxis; if (axis_minus == AXIS_NONE) axis_minus = auto_binds[ident_minus].joyaxis; if (axis_plus == AXIS_NONE) axis_plus = auto_binds[ident_plus].joyaxis; pressed_minus = abs(drv->axis(joy_idx, axis_minus)); pressed_plus = abs(drv->axis(joy_idx, axis_plus)); res = pressed_plus - pressed_minus; if (res != 0) return res; key_minus = bind_minus->joykey; key_plus = bind_plus->joykey; if (key_minus == NO_BTN) key_minus = auto_binds[ident_minus].joykey; if (key_plus == NO_BTN) key_plus = auto_binds[ident_plus].joykey; if (drv->button(joy_idx, (uint16_t)key_minus)) digital_left = -0x7fff; if (drv->button(joy_idx, (uint16_t)key_plus)) digital_right = 0x7fff; return digital_right + digital_left; }
static int16_t input_wl_analog_pressed(input_ctx_wayland_data_t *wl, const struct retro_keybind *binds, unsigned idx, unsigned id) { unsigned id_minus = 0; unsigned id_plus = 0; int16_t pressed_minus = 0; int16_t pressed_plus = 0; 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; return pressed_plus + pressed_minus; }
static int16_t x_pressed_analog(x11_input_t *x11, const struct retro_keybind *binds, unsigned index, unsigned id) { unsigned id_minus = 0; unsigned id_plus = 0; input_conv_analog_id_to_bind_id(index, id, &id_minus, &id_plus); int16_t pressed_minus = x_is_pressed(x11, binds, id_minus) ? -0x7fff : 0; int16_t pressed_plus = x_is_pressed(x11, binds, id_plus) ? 0x7fff : 0; return pressed_plus + pressed_minus; }
static int16_t sdl_analog_pressed(sdl_input_t *sdl, const struct retro_keybind *binds, unsigned index, unsigned id) { unsigned id_minus = 0; unsigned id_plus = 0; input_conv_analog_id_to_bind_id(index, id, &id_minus, &id_plus); int16_t pressed_minus = sdl_key_pressed(binds[id_minus].key) ? -0x7fff : 0; int16_t pressed_plus = sdl_key_pressed(binds[id_plus].key) ? 0x7fff : 0; return pressed_plus + pressed_minus; }
static int16_t rwebinput_analog_pressed(rwebinput_input_t *rwebinput, const struct retro_keybind *binds, unsigned idx, unsigned id) { unsigned id_minus = 0; unsigned id_plus = 0; input_conv_analog_id_to_bind_id(idx, id, &id_minus, &id_plus); int16_t pressed_minus = rwebinput_is_pressed(rwebinput, binds, id_minus) ? -0x7fff : 0; int16_t pressed_plus = rwebinput_is_pressed(rwebinput, binds, id_plus) ? 0x7fff : 0; return pressed_plus + pressed_minus; }
int16_t input_joypad_analog(const rarch_joypad_driver_t *drv, unsigned port, unsigned idx, unsigned ident, const struct retro_keybind *binds) { if (!drv) return 0; unsigned int joy_idx = g_settings.input.joypad_map[port]; if (joy_idx >= MAX_PLAYERS) return 0; /* Auto-binds are per joypad, not per player. */ const struct retro_keybind *auto_binds = g_settings.input.autoconf_binds[joy_idx]; unsigned ident_minus = 0; unsigned ident_plus = 0; input_conv_analog_id_to_bind_id(idx, ident, &ident_minus, &ident_plus); const struct retro_keybind *bind_minus = &binds[ident_minus]; const struct retro_keybind *bind_plus = &binds[ident_plus]; if (!bind_minus->valid || !bind_plus->valid) return 0; uint32_t axis_minus = bind_minus->joyaxis; uint32_t axis_plus = bind_plus->joyaxis; if (axis_minus == AXIS_NONE) axis_minus = auto_binds[ident_minus].joyaxis; if (axis_plus == AXIS_NONE) axis_plus = auto_binds[ident_plus].joyaxis; int16_t pressed_minus = abs(drv->axis(joy_idx, axis_minus)); int16_t pressed_plus = abs(drv->axis(joy_idx, axis_plus)); int16_t res = pressed_plus - pressed_minus; if (res != 0) return res; uint64_t key_minus = bind_minus->joykey; uint64_t key_plus = bind_plus->joykey; if (key_minus == NO_BTN) key_minus = auto_binds[ident_minus].joykey; if (key_plus == NO_BTN) key_plus = auto_binds[ident_plus].joykey; int16_t digital_left = drv->button(joy_idx, (uint16_t)key_minus) ? -0x7fff : 0; int16_t digital_right = drv->button(joy_idx, (uint16_t)key_plus) ? 0x7fff : 0; return digital_right + digital_left; }
static int16_t udev_analog_pressed(const struct retro_keybind *binds, unsigned idx, unsigned id) { unsigned id_minus = 0; unsigned id_plus = 0; int16_t pressed_minus = 0, pressed_plus = 0; input_conv_analog_id_to_bind_id(idx, id, &id_minus, &id_plus); if (udev_input_is_pressed(binds, id_minus)) pressed_minus = -0x7fff; if (udev_input_is_pressed(binds, id_plus)) pressed_plus = 0x7fff; return pressed_plus + pressed_minus; }
static int16_t linuxraw_analog_pressed(linuxraw_input_t *linuxraw, 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; input_conv_analog_id_to_bind_id(idx, id, &id_minus, &id_plus); if (linuxraw_is_pressed(linuxraw, binds, id_minus)) pressed_minus = -0x7fff; if (linuxraw_is_pressed(linuxraw, binds, id_plus)) pressed_plus = 0x7fff; return pressed_plus + pressed_minus; }
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; 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; return pressed_plus + pressed_minus; }
static int16_t udev_analog_pressed(const struct retro_keybind *binds, unsigned idx, unsigned id) { unsigned id_minus = 0; unsigned id_plus = 0; int16_t pressed_minus = 0; int16_t pressed_plus = 0; input_conv_analog_id_to_bind_id(idx, id, &id_minus, &id_plus); if (binds && binds[id_minus].valid && BIT_GET(udev_key_state, input_keymaps_translate_rk_to_keysym(binds[id_minus].key))) pressed_minus = -0x7fff; if (binds && binds[id_plus].valid && BIT_GET(udev_key_state, input_keymaps_translate_rk_to_keysym(binds[id_plus].key))) pressed_plus = 0x7fff; return pressed_plus + pressed_minus; }
static int16_t dinput_pressed_analog(struct dinput_input *di, 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, id_plus = 0; input_conv_analog_id_to_bind_id(idx, id, &id_minus, &id_plus); bind_minus = &binds[id_minus]; bind_plus = &binds[id_plus]; if (!bind_minus->valid || !bind_plus->valid) return 0; if (dinput_keyboard_pressed(di, bind_minus->key)) pressed_minus = -0x7fff; if (dinput_keyboard_pressed(di, bind_plus->key)) pressed_plus = 0x7fff; return pressed_plus + pressed_minus; }