Add rarch_joypad_info_t

This commit is contained in:
twinaphex 2017-01-10 03:44:53 +01:00
parent 4c611e42c6
commit 6376f2af68
18 changed files with 157 additions and 47 deletions

View File

@ -1315,17 +1315,23 @@ static int16_t input_wl_state(void *data, const struct retro_keybind **binds,
unsigned port, unsigned device, unsigned idx, unsigned id)
{
int16_t ret;
rarch_joypad_info_t joypad_info;
settings_t *settings = config_get_ptr();
gfx_ctx_wayland_data_t *wl = (gfx_ctx_wayland_data_t*)data;
if (!wl)
return 0;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port] && binds[port][id].valid)
return input_wl_is_pressed(wl, binds[port], id) ||
input_joypad_pressed(wl->joypad, port, binds[port], id);
input_joypad_pressed(wl->joypad, joypad_info, port, binds[port], id);
break;
case RETRO_DEVICE_ANALOG:
ret = input_wl_analog_pressed(wl, binds[port], idx, id);

View File

@ -1016,6 +1016,7 @@ static void android_input_poll_memcpy(void *data)
static bool android_input_key_pressed(void *data, int key)
{
rarch_joypad_info_t joypad_info;
android_input_t *android = (android_input_t*)data;
settings_t *settings = config_get_ptr();
@ -1023,8 +1024,12 @@ static bool android_input_key_pressed(void *data, int key)
&& android_keyboard_port_input_pressed(settings->input.binds[0],key))
return true;
joypad_info.joy_idx = 0;
joypad_info.auto_binds = settings->input.autoconf_binds[0];
joypad_info.axis_threshold = settings->input.axis_threshold;
if (settings->input.binds[0][key].valid &&
input_joypad_pressed(android->joypad,
input_joypad_pressed(android->joypad, joypad_info,
0, settings->input.binds[0], key))
return true;
@ -1105,15 +1110,21 @@ static int16_t android_input_state(void *data,
const struct retro_keybind **binds, unsigned port, unsigned device,
unsigned idx, unsigned id)
{
settings_t *settings = config_get_ptr();
android_input_t *android = (android_input_t*)data;
rarch_joypad_info_t joypad_info;
settings_t *settings = config_get_ptr();
android_input_t *android = (android_input_t*)data;
android_input_data_t *android_data = (android_input_data_t*)&android->copy;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port] && binds[port][id].valid)
return input_joypad_pressed(android->joypad, port, binds[port], id) ||
return input_joypad_pressed(android->joypad, joypad_info,
port, binds[port], id) ||
android_keyboard_port_input_pressed(binds[port],id);
break;
case RETRO_DEVICE_ANALOG:

View File

@ -274,21 +274,27 @@ static int16_t cocoa_input_state(void *data,
const struct retro_keybind **binds, unsigned port,
unsigned device, unsigned idx, unsigned id)
{
rarch_joypad_info_t joypad_info;
int16_t ret = 0;
cocoa_input_data_t *apple = (cocoa_input_data_t*)data;
settings_t *settings = config_get_ptr();
if (!apple || !apple->joypad)
return 0;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port] && binds[port][id].valid)
{
return apple_input_is_pressed(port, binds[port], id) ||
input_joypad_pressed(apple->joypad, port, binds[port], id)
input_joypad_pressed(apple->joypad, joypad_info, port, binds[port], id)
#ifdef HAVE_MFI
|| input_joypad_pressed(apple->sec_joypad, port, binds[port], id)
|| input_joypad_pressed(apple->sec_joypad, joypad_info, port, binds[port], id)
#endif
;
}

View File

@ -49,16 +49,22 @@ static int16_t ctr_input_state(void *data, const struct retro_keybind **binds,
unsigned port, unsigned device,
unsigned idx, unsigned id)
{
rarch_joypad_info_t joypad_info;
ctr_input_t *ctr = (ctr_input_t*)data;
settings_t *settings = config_get_ptr();
if (port > 0)
return 0;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port] && binds[port][id].valid)
return input_joypad_pressed(ctr->joypad, port, binds[port], id);
return input_joypad_pressed(ctr->joypad, joypad_info, port, binds[port], id);
break;
case RETRO_DEVICE_ANALOG:
if (binds[port])

View File

@ -279,13 +279,20 @@ static bool dinput_is_pressed(struct dinput_input *di,
const struct retro_keybind *binds,
unsigned port, unsigned id)
{
rarch_joypad_info_t joypad_info;
const struct retro_keybind *bind = &binds[id];
settings_t *settings = config_get_ptr();
if (id >= RARCH_BIND_LIST_END)
return false;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
if (!di->blocked && dinput_keyboard_pressed(di, bind->key))
return true;
if (binds && binds[id].valid && input_joypad_pressed(di->joypad, port, binds, id))
if (binds && binds[id].valid && input_joypad_pressed(di->joypad, joypad_info, port, binds, id))
return true;
return false;

View File

@ -44,15 +44,22 @@ static int16_t gx_input_state(void *data, const struct retro_keybind **binds,
unsigned port, unsigned device,
unsigned idx, unsigned id)
{
gx_input_t *gx = (gx_input_t*)data;
rarch_joypad_info_t joypad_info;
gx_input_t *gx = (gx_input_t*)data;
settings_t *settings = config_get_ptr();
if (port >= MAX_PADS || !gx)
return 0;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port] && binds[port][id].valid)
return input_joypad_pressed(gx->joypad, port, binds[port], id);
return input_joypad_pressed(gx->joypad, joypad_info, port, binds[port], id);
break;
case RETRO_DEVICE_ANALOG:
if (binds[port])

View File

@ -116,15 +116,21 @@ static int16_t linuxraw_input_state(void *data,
const struct retro_keybind **binds, unsigned port,
unsigned device, unsigned idx, unsigned id)
{
rarch_joypad_info_t joypad_info;
int16_t ret = 0;
linuxraw_input_t *linuxraw = (linuxraw_input_t*)data;
settings_t *settings = config_get_ptr();
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port] && binds[port][id].valid)
return linuxraw_is_pressed(linuxraw, binds[port], id) ||
input_joypad_pressed(linuxraw->joypad, port, binds[port], id);
input_joypad_pressed(linuxraw->joypad, joypad_info, port, binds[port], id);
break;
case RETRO_DEVICE_ANALOG:
if (binds[port])

View File

@ -104,16 +104,22 @@ static int16_t ps3_input_state(void *data,
unsigned port, unsigned device,
unsigned idx, unsigned id)
{
ps3_input_t *ps3 = (ps3_input_t*)data;
rarch_joypad_info_t joypad_info;
ps3_input_t *ps3 = (ps3_input_t*)data;
settings_t *settings = config_get_ptr();
if (!ps3)
return 0;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port] && binds[port][id].valid)
return input_joypad_pressed(ps3->joypad, port, binds[port], id);
return input_joypad_pressed(ps3->joypad, joypad_info, port, binds[port], id);
break;
case RETRO_DEVICE_ANALOG:
if (binds[port])

View File

@ -64,18 +64,24 @@ static int16_t psp_input_state(void *data, const struct retro_keybind **binds,
unsigned port, unsigned device,
unsigned idx, unsigned id)
{
psp_input_t *psp = (psp_input_t*)data;
rarch_joypad_info_t joypad_info;
psp_input_t *psp = (psp_input_t*)data;
settings_t *settings = config_get_ptr();
#if !defined(SN_TARGET_PSP2) && !defined(VITA)
if (port > 0)
return 0;
#endif
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port] && binds[port][id].valid)
return input_joypad_pressed(psp->joypad, port, binds[port], id);
return input_joypad_pressed(psp->joypad, joypad_info, port, binds[port], id);
break;
case RETRO_DEVICE_ANALOG:
if (binds[port])

View File

@ -723,16 +723,23 @@ static bool qnx_is_pressed(qnx_input_t *qnx,
const struct retro_keybind *binds,
unsigned port, unsigned id)
{
const struct retro_keybind *bind = &binds[id];
if (id >= RARCH_BIND_LIST_END)
return false;
rarch_joypad_info_t joypad_info;
settings_t *settings = config_get_ptr();
const struct retro_keybind *bind = &binds[id];
if (!qnx->blocked && qnx_keyboard_pressed(qnx, bind->key))
return true;
if (binds && binds[id].valid && input_joypad_pressed(qnx->joypad, port, binds, id))
return true;
if (id >= RARCH_BIND_LIST_END)
return false;
return false;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
if (!qnx->blocked && qnx_keyboard_pressed(qnx, bind->key))
return true;
if (binds && binds[id].valid && input_joypad_pressed(qnx->joypad, joypad_info, port, binds, id))
return true;
return false;
}
static int16_t qnx_pointer_input_state(qnx_input_t *qnx,

View File

@ -111,18 +111,25 @@ static bool sdl_input_meta_key_pressed(void *data, int key)
}
static int16_t sdl_joypad_device_state(sdl_input_t *sdl, const struct retro_keybind **binds_,
unsigned port_num, unsigned id, enum input_device_type *device)
unsigned port, unsigned id, enum input_device_type *device)
{
if (id < RARCH_BIND_LIST_END)
{
const struct retro_keybind *binds = binds_[port_num];
if (binds && binds[id].valid && sdl_is_pressed(sdl, port_num, binds, id))
rarch_joypad_info_t joypad_info;
settings_t *settings = config_get_ptr();
const struct retro_keybind *binds = binds_[port];
if (binds && binds[id].valid && sdl_is_pressed(sdl, port, binds, id))
{
*device = INPUT_DEVICE_TYPE_KEYBOARD;
return 1;
}
if (binds && binds[id].valid && input_joypad_pressed(sdl->joypad, 0, binds, id))
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
if (binds && binds[id].valid && input_joypad_pressed(sdl->joypad, joypad_info, 0, binds, id))
{
*device = INPUT_DEVICE_TYPE_JOYPAD;
return 1;

View File

@ -496,17 +496,23 @@ static int16_t udev_input_state(void *data, const struct retro_keybind **binds,
unsigned port, unsigned device, unsigned idx, unsigned id)
{
int16_t ret;
udev_input_t *udev = (udev_input_t*)data;
rarch_joypad_info_t joypad_info;
settings_t *settings = config_get_ptr();
udev_input_t *udev = (udev_input_t*)data;
if (!udev)
return 0;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port] && binds[port][id].valid)
return udev_input_is_pressed(binds[port], id) ||
input_joypad_pressed(udev->joypad, port, binds[port], id);
input_joypad_pressed(udev->joypad, joypad_info, port, binds[port], id);
break;
case RETRO_DEVICE_ANALOG:
ret = udev_analog_pressed(binds[port], idx, id);

View File

@ -51,16 +51,22 @@ static int16_t wiiu_input_state(void *data, const struct retro_keybind **binds,
unsigned port, unsigned device,
unsigned idx, unsigned id)
{
wiiu_input_t *wiiu = (wiiu_input_t*)data;
rarch_joypad_info_t joypad_info;
settings_t *settings = config_get_ptr();
wiiu_input_t *wiiu = (wiiu_input_t*)data;
if(!wiiu || (port > 0) || !binds || !binds[port])
return 0;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port][id].valid)
return input_joypad_pressed(wiiu->joypad, port, binds[port], id);
return input_joypad_pressed(wiiu->joypad, joypad_info, port, binds[port], id);
break;
case RETRO_DEVICE_ANALOG:
if (binds[port])

View File

@ -223,15 +223,21 @@ static int16_t x_input_state(void *data,
const struct retro_keybind **binds, unsigned port,
unsigned device, unsigned idx, unsigned id)
{
int16_t ret = 0;
x11_input_t *x11 = (x11_input_t*)data;
rarch_joypad_info_t joypad_info;
int16_t ret = 0;
settings_t *settings = config_get_ptr();
x11_input_t *x11 = (x11_input_t*)data;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port] && binds[port][id].valid)
return x_is_pressed(x11, binds[port], id) ||
input_joypad_pressed(x11->joypad, port, binds[port], id);
input_joypad_pressed(x11->joypad, joypad_info, port, binds[port], id);
break;
case RETRO_DEVICE_KEYBOARD:
return x_key_pressed(x11, id);

View File

@ -51,16 +51,22 @@ static int16_t xdk_input_state(void *data, const struct retro_keybind **binds,
unsigned port, unsigned device,
unsigned index, unsigned id)
{
xdk_input_t *xdk = (xdk_input_t*)data;
rarch_joypad_info_t joypad_info;
xdk_input_t *xdk = (xdk_input_t*)data;
settings_t *settings = config_get_ptr();
if (port >= MAX_PADS)
return 0;
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
switch (device)
{
case RETRO_DEVICE_JOYPAD:
if (binds[port] && binds[port][id].valid)
return input_joypad_pressed(xdk->joypad, port, binds[port], id);
return input_joypad_pressed(xdk->joypad, joypad_info, port, binds[port], id);
break;
case RETRO_DEVICE_ANALOG:
if (binds[port])

View File

@ -511,14 +511,19 @@ static INLINE bool input_menu_keys_pressed_internal(unsigned i)
for (port = 0; port < port_max; port++)
{
rarch_joypad_info_t joypad_info;
const input_device_driver_t *first = current_input->get_joypad_driver
? current_input->get_joypad_driver(current_input_data) : NULL;
const input_device_driver_t *sec = current_input->get_sec_joypad_driver
? current_input->get_sec_joypad_driver(current_input_data) : NULL;
if (sec && input_joypad_pressed(sec, port, settings->input.binds[0], i))
joypad_info.joy_idx = port;
joypad_info.auto_binds = settings->input.autoconf_binds[port];
joypad_info.axis_threshold = settings->input.axis_threshold;
if (sec && input_joypad_pressed(sec, joypad_info, port, settings->input.binds[0], i))
return true;
if (first && input_joypad_pressed(first, port, settings->input.binds[0], i))
if (first && input_joypad_pressed(first, joypad_info, port, settings->input.binds[0], i))
return true;
}
}

View File

@ -238,25 +238,23 @@ bool input_joypad_set_rumble(const input_device_driver_t *drv,
**/
bool input_joypad_pressed(
const input_device_driver_t *drv,
rarch_joypad_info_t joypad_info,
unsigned port,
const void *binds_data,
unsigned key)
{
settings_t *settings = config_get_ptr();
unsigned joy_idx = settings->input.joypad_map[port];
const struct retro_keybind *binds = (const struct retro_keybind*)binds_data;
/* Auto-binds are per joypad, not per user. */
const struct retro_keybind *auto_binds = settings->input.autoconf_binds[joy_idx];
uint64_t joykey = (binds[key].joykey != NO_BTN)
? binds[key].joykey : auto_binds[key].joykey;
? binds[key].joykey : joypad_info.auto_binds[key].joykey;
if ((uint16_t)joykey == NO_BTN || !drv->button(joy_idx, (uint16_t)joykey))
if ((uint16_t)joykey == NO_BTN || !drv->button(joypad_info.joy_idx, (uint16_t)joykey))
{
uint32_t joyaxis = (binds[key].joyaxis != AXIS_NONE)
? binds[key].joyaxis : auto_binds[key].joyaxis;
int16_t axis = drv->axis(joy_idx, joyaxis);
? binds[key].joyaxis : joypad_info.auto_binds[key].joyaxis;
int16_t axis = drv->axis(joypad_info.joy_idx, joyaxis);
float scaled_axis = (float)abs(axis) / 0x8000;
return scaled_axis > settings->input.axis_threshold;
return scaled_axis > joypad_info.axis_threshold;
}
return true;

View File

@ -27,6 +27,13 @@ RETRO_BEGIN_DECLS
typedef struct rarch_joypad_driver input_device_driver_t;
typedef struct rarch_joypad_info
{
unsigned joy_idx;
const struct retro_keybind *auto_binds;
float axis_threshold;
} rarch_joypad_info_t;
struct rarch_joypad_driver
{
bool (*init)(void *data);
@ -124,6 +131,7 @@ void input_conv_analog_id_to_bind_id(unsigned idx, unsigned ident,
* false (0).
**/
bool input_joypad_pressed(const input_device_driver_t *driver,
rarch_joypad_info_t joypad_info,
unsigned port, const void *binds, unsigned key);
/**