From 6376f2af6873a8d067f3b33b4344185fb93cc3ba Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 10 Jan 2017 03:44:53 +0100 Subject: [PATCH] Add rarch_joypad_info_t --- gfx/drivers_context/wayland_ctx.c | 8 +++++++- input/drivers/android_input.c | 19 +++++++++++++++---- input/drivers/cocoa_input.c | 10 ++++++++-- input/drivers/ctr_input.c | 8 +++++++- input/drivers/dinput.c | 9 ++++++++- input/drivers/gx_input.c | 11 +++++++++-- input/drivers/linuxraw_input.c | 8 +++++++- input/drivers/ps3_input.c | 10 ++++++++-- input/drivers/psp_input.c | 10 ++++++++-- input/drivers/qnx_input.c | 23 +++++++++++++++-------- input/drivers/sdl_input.c | 15 +++++++++++---- input/drivers/udev_input.c | 10 ++++++++-- input/drivers/wiiu_input.c | 10 ++++++++-- input/drivers/x11_input.c | 12 +++++++++--- input/drivers/xdk_xinput_input.c | 10 ++++++++-- input/input_driver.c | 9 +++++++-- input/input_joypad_driver.c | 14 ++++++-------- input/input_joypad_driver.h | 8 ++++++++ 18 files changed, 157 insertions(+), 47 deletions(-) diff --git a/gfx/drivers_context/wayland_ctx.c b/gfx/drivers_context/wayland_ctx.c index cea36b8685..0009e52f7c 100644 --- a/gfx/drivers_context/wayland_ctx.c +++ b/gfx/drivers_context/wayland_ctx.c @@ -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); diff --git a/input/drivers/android_input.c b/input/drivers/android_input.c index 483c58b887..7ce87e4f89 100644 --- a/input/drivers/android_input.c +++ b/input/drivers/android_input.c @@ -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: diff --git a/input/drivers/cocoa_input.c b/input/drivers/cocoa_input.c index e0ba987bf2..9a1678df15 100644 --- a/input/drivers/cocoa_input.c +++ b/input/drivers/cocoa_input.c @@ -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 ; } diff --git a/input/drivers/ctr_input.c b/input/drivers/ctr_input.c index 9db21b0b16..6790f91589 100644 --- a/input/drivers/ctr_input.c +++ b/input/drivers/ctr_input.c @@ -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]) diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index ee5d905b75..26b615b365 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -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; diff --git a/input/drivers/gx_input.c b/input/drivers/gx_input.c index e8b2b0e4eb..9dd511d465 100644 --- a/input/drivers/gx_input.c +++ b/input/drivers/gx_input.c @@ -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]) diff --git a/input/drivers/linuxraw_input.c b/input/drivers/linuxraw_input.c index 53b729e5e1..d1da7efc47 100644 --- a/input/drivers/linuxraw_input.c +++ b/input/drivers/linuxraw_input.c @@ -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]) diff --git a/input/drivers/ps3_input.c b/input/drivers/ps3_input.c index 4f29dbda09..72cfd6d080 100644 --- a/input/drivers/ps3_input.c +++ b/input/drivers/ps3_input.c @@ -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]) diff --git a/input/drivers/psp_input.c b/input/drivers/psp_input.c index 541cd6ab34..4d5a563f70 100644 --- a/input/drivers/psp_input.c +++ b/input/drivers/psp_input.c @@ -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]) diff --git a/input/drivers/qnx_input.c b/input/drivers/qnx_input.c index 43f3de1655..a881b395ca 100644 --- a/input/drivers/qnx_input.c +++ b/input/drivers/qnx_input.c @@ -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, diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 07e00677b3..d7c09181f8 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -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; diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index b48b00d01a..b86ae5a02b 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -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); diff --git a/input/drivers/wiiu_input.c b/input/drivers/wiiu_input.c index db4c42d4fd..c37f3218a8 100644 --- a/input/drivers/wiiu_input.c +++ b/input/drivers/wiiu_input.c @@ -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]) diff --git a/input/drivers/x11_input.c b/input/drivers/x11_input.c index ccba630585..3f71c1cc7b 100644 --- a/input/drivers/x11_input.c +++ b/input/drivers/x11_input.c @@ -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); diff --git a/input/drivers/xdk_xinput_input.c b/input/drivers/xdk_xinput_input.c index 9a808f4883..dfa7eefa2d 100644 --- a/input/drivers/xdk_xinput_input.c +++ b/input/drivers/xdk_xinput_input.c @@ -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]) diff --git a/input/input_driver.c b/input/input_driver.c index 4913bbc7ff..10723539e1 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -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; } } diff --git a/input/input_joypad_driver.c b/input/input_joypad_driver.c index 216859e50c..1746f07e13 100644 --- a/input/input_joypad_driver.c +++ b/input/input_joypad_driver.c @@ -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; diff --git a/input/input_joypad_driver.h b/input/input_joypad_driver.h index d06e90d5c9..8e01610ccd 100644 --- a/input/input_joypad_driver.h +++ b/input/input_joypad_driver.h @@ -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); /**