here’s lines 201-222 of gx_input.c:
static int16_t gx_input_state(void *data, const struct retro_keybind **binds,
unsigned port, unsigned device,
unsigned index, unsigned id)
{
gx_input_t *gx = (gx_input_t*)data;
if (port >= MAX_PADS)
return 0;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port][id].joykey >= CONSOLE_MENU_FIRST && binds[port][id].joykey <= CONSOLE_MENU_LAST)
return gx_menu_input_state(binds[port][id].joykey, gx->pad_state[port]) ? 1 : 0;
else
return input_joypad_pressed(&gx_joypad, port, binds[port], id);;
case RETRO_DEVICE_ANALOG:
return input_joypad_analog(&gx_joypad, port, index, id, binds[port]);
default:
return 0;
}
}
it looks like input_joypad_pressed and input_joypad_analog wind back to input_common.c:
bool input_joypad_pressed(const rarch_joypad_driver_t *driver,
unsigned port, const struct retro_keybind *binds, unsigned key)
{
if (!driver)
return false;
int joy_index = g_settings.input.joypad_map[port];
if (joy_index < 0 || joy_index >= MAX_PLAYERS)
return false;
// Auto-binds are per joypad, not per player.
const struct retro_keybind *auto_binds = g_settings.input.autoconf_binds[joy_index];
if (!binds[key].valid)
return false;
uint64_t joykey = binds[key].joykey;
if (joykey == NO_BTN)
joykey = auto_binds[key].joykey;
if (driver->button(joy_index, (uint16_t)joykey))
return true;
uint32_t joyaxis = binds[key].joyaxis;
if (joyaxis == AXIS_NONE)
joyaxis = auto_binds[key].joyaxis;
int16_t axis = driver->axis(joy_index, joyaxis);
float scaled_axis = (float)abs(axis) / 0x8000;
return scaled_axis > g_settings.input.axis_threshold;
}
int16_t input_joypad_analog(const rarch_joypad_driver_t *driver,
unsigned port, unsigned index, unsigned id, const struct retro_keybind *binds)
{
if (!driver)
return 0;
int joy_index = g_settings.input.joypad_map[port];
if (joy_index < 0 || joy_index >= MAX_PLAYERS)
return 0;
// Auto-binds are per joypad, not per player.
const struct retro_keybind *auto_binds = g_settings.input.autoconf_binds[joy_index];
unsigned id_minus = 0;
unsigned id_plus = 0;
input_conv_analog_id_to_bind_id(index, id, &id_minus, &id_plus);
const struct retro_keybind *bind_minus = &binds[id_minus];
const struct retro_keybind *bind_plus = &binds[id_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[id_minus].joyaxis;
if (axis_plus == AXIS_NONE)
axis_plus = auto_binds[id_plus].joyaxis;
int16_t pressed_minus = abs(driver->axis(joy_index, axis_minus));
int16_t pressed_plus = abs(driver->axis(joy_index, 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[id_minus].joykey;
if (key_plus == NO_BTN)
key_plus = auto_binds[id_plus].joykey;
int16_t digital_left = driver->button(joy_index, (uint16_t)key_minus) ? -0x7fff : 0;
int16_t digital_right = driver->button(joy_index, (uint16_t)key_plus) ? 0x7fff : 0;
return digital_right + digital_left;
}
Is there some sort of clear state callback in the button press event that isn’t firing?