diff --git a/config.def.h b/config.def.h index 060fd76109..2c19a866d0 100644 --- a/config.def.h +++ b/config.def.h @@ -689,18 +689,18 @@ static const struct retro_keybind retro_keybinds_1[] = { #ifdef HW_RVL static const struct retro_keybind retro_keybinds_menu[] = { - { true, RETRO_DEVICE_ID_JOYPAD_B, NULL, 0, GX_GC_B | GX_CLASSIC_B | GX_WIIMOTE_B | GX_WIIMOTE_1, 0 }, - { true, RETRO_DEVICE_ID_JOYPAD_Y, NULL, 0, GX_GC_Y | GX_CLASSIC_Y, 0 }, - { true, RETRO_DEVICE_ID_JOYPAD_SELECT, NULL, 0, GX_GC_Z_TRIGGER | GX_CLASSIC_MINUS | GX_WIIMOTE_MINUS, 0 }, - { true, RETRO_DEVICE_ID_JOYPAD_START, NULL, 0, GX_GC_START | GX_CLASSIC_PLUS | GX_WIIMOTE_PLUS, 0 }, - { true, RETRO_DEVICE_ID_JOYPAD_UP, NULL, 0, GX_GC_UP | GX_CLASSIC_UP | GX_WIIMOTE_UP | GX_NUNCHUK_UP, 0 }, - { true, RETRO_DEVICE_ID_JOYPAD_DOWN, NULL, 0, GX_GC_DOWN | GX_CLASSIC_DOWN | GX_WIIMOTE_DOWN | GX_NUNCHUK_DOWN, 0 }, - { true, RETRO_DEVICE_ID_JOYPAD_LEFT, NULL, 0, GX_GC_LEFT | GX_CLASSIC_LEFT | GX_WIIMOTE_LEFT | GX_NUNCHUK_LEFT, 0 }, - { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, NULL, 0, GX_GC_RIGHT | GX_CLASSIC_RIGHT | GX_WIIMOTE_RIGHT | GX_NUNCHUK_RIGHT, 0 }, - { true, RETRO_DEVICE_ID_JOYPAD_A, NULL, 0, GX_GC_A | GX_CLASSIC_A | GX_WIIMOTE_A | GX_WIIMOTE_2, 0 }, - { true, RETRO_DEVICE_ID_JOYPAD_X, NULL, 0, GX_GC_X | GX_CLASSIC_X, 0 }, - { true, RETRO_DEVICE_ID_JOYPAD_L, NULL, 0, GX_GC_L_TRIGGER | GX_CLASSIC_L_TRIGGER, 0 }, - { true, RETRO_DEVICE_ID_JOYPAD_R, NULL, 0, GX_GC_R_TRIGGER | GX_CLASSIC_R_TRIGGER, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_B, NULL, 0, GX_MENU_B, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_Y, NULL, 0, GX_MENU_Y, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_SELECT, NULL, 0, GX_MENU_SELECT, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_START, NULL, 0, GX_MENU_START, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_UP, NULL, 0, GX_MENU_UP, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_DOWN, NULL, 0, GX_MENU_DOWN, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_LEFT, NULL, 0, GX_MENU_LEFT, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, NULL, 0, GX_MENU_RIGHT, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_A, NULL, 0, GX_MENU_A, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_X, NULL, 0, GX_MENU_X, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_L, NULL, 0, GX_MENU_L, 0 }, + { true, RETRO_DEVICE_ID_JOYPAD_R, NULL, 0, GX_MENU_R, 0 }, { true, RETRO_DEVICE_ID_JOYPAD_L2, NULL, 0, GX_CLASSIC_ZL_TRIGGER, 0 }, { true, RETRO_DEVICE_ID_JOYPAD_R2, NULL, 0, GX_CLASSIC_ZR_TRIGGER, 0 }, { true, RETRO_DEVICE_ID_JOYPAD_L3, RETRO_LBL_JOYPAD_L3, RETROK_UNKNOWN, RETRO_DEF_JOYPAD_L3, 0, AXIS_NONE }, @@ -745,7 +745,7 @@ static const struct retro_keybind retro_keybinds_menu[] = { { true, RARCH_DISK_EJECT_TOGGLE, RETRO_LBL_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_DISK_NEXT, RETRO_LBL_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_GRAB_MOUSE_TOGGLE, RETRO_LBL_GRAB_MOUSE_TOGGLE, RETROK_F11, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MENU_TOGGLE, NULL, 0, GX_WIIMOTE_HOME | GX_CLASSIC_HOME, 0 }, + { true, RARCH_MENU_TOGGLE, NULL, 0, GX_WIIMOTE_HOME, 0 }, }; #endif diff --git a/frontend/menu/menu_settings.c b/frontend/menu/menu_settings.c index 383185e912..4cf4eb0046 100644 --- a/frontend/menu/menu_settings.c +++ b/frontend/menu/menu_settings.c @@ -723,6 +723,9 @@ int menu_set_settings(void *data, unsigned setting, unsigned action) g_settings.input.device[port]++; // DEVICE_LAST can be 0, avoid modulo. + if (g_settings.input.device[port] >= DEVICE_LAST) + g_settings.input.device[port] -= DEVICE_LAST; + // needs to be checked twice, in case we go right past the end of the list if (g_settings.input.device[port] >= DEVICE_LAST) g_settings.input.device[port] -= DEVICE_LAST; @@ -856,7 +859,7 @@ int menu_set_settings(void *data, unsigned setting, unsigned action) case RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_PLUS: case RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_MINUS: case RGUI_SETTINGS_BIND_MENU_TOGGLE: - if (driver.input->set_keybinds) + if (driver.input->set_keybinds && !driver.input->get_joypad_driver) { unsigned keybind_action = KEYBINDS_ACTION_NONE; @@ -1871,24 +1874,8 @@ void menu_set_settings_label(char *type_str, size_t type_str_size, unsigned *w, case RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_PLUS: case RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_MINUS: case RGUI_SETTINGS_BIND_MENU_TOGGLE: - { - unsigned id = type - RGUI_SETTINGS_BIND_B; - struct platform_bind key_label; - strlcpy(key_label.desc, "Unknown", sizeof(key_label.desc)); - key_label.joykey = g_settings.input.binds[rgui->current_pad][id].joykey; - - if (driver.input->set_keybinds) - { - driver.input->set_keybinds(&key_label, 0, 0, 0, (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL)); - strlcpy(type_str, key_label.desc, type_str_size); - } - else - { - const struct retro_keybind *bind = &g_settings.input.binds[rgui->current_pad][type - RGUI_SETTINGS_BIND_BEGIN]; - input_get_bind_string(type_str, bind, type_str_size); - } - break; - } + input_get_bind_string(type_str, &g_settings.input.binds[rgui->current_pad][type - RGUI_SETTINGS_BIND_BEGIN], type_str_size); + break; case RGUI_SETTINGS_AUDIO_VOLUME_LEVEL: #ifdef RARCH_CONSOLE strlcpy(type_str, (g_extern.console.sound.volume_level) ? "Loud" : "Normal", type_str_size); diff --git a/gx/gx_input.c b/gx/gx_input.c index 16e608e366..45267ccf66 100644 --- a/gx/gx_input.c +++ b/gx/gx_input.c @@ -103,6 +103,35 @@ static bool g_menu; static bool g_quit; #endif +static bool gx_menu_input_state(uint64_t joykey, uint64_t state) +{ + switch (joykey) + { + case GX_MENU_A: + return state & ((1ULL << GX_GC_A) | (1ULL << GX_WIIMOTE_A) | (1ULL << GX_CLASSIC_A) | (1ULL << GX_WIIMOTE_2)); + case GX_MENU_B: + return state & ((1ULL << GX_GC_B) | (1ULL << GX_WIIMOTE_B) | (1ULL << GX_CLASSIC_B) | (1ULL << GX_WIIMOTE_1)); + case GX_MENU_X: + return state & ((1ULL << GX_GC_X) | (1ULL << GX_CLASSIC_X)); + case GX_MENU_Y: + return state & ((1ULL << GX_GC_Y) | (1ULL << GX_CLASSIC_Y)); + case GX_MENU_UP: + return state & ((1ULL << GX_GC_UP) | (1ULL << GX_WIIMOTE_UP) | (1ULL << GX_CLASSIC_UP) | (1ULL << GX_NUNCHUK_UP)); + case GX_MENU_DOWN: + return state & ((1ULL << GX_GC_DOWN) | (1ULL << GX_WIIMOTE_DOWN) | (1ULL << GX_CLASSIC_DOWN) | (1ULL << GX_NUNCHUK_DOWN)); + case GX_MENU_LEFT: + return state & ((1ULL << GX_GC_LEFT) | (1ULL << GX_WIIMOTE_LEFT) | (1ULL << GX_CLASSIC_LEFT) | (1ULL << GX_NUNCHUK_LEFT)); + case GX_MENU_RIGHT: + return state & ((1ULL << GX_GC_RIGHT) | (1ULL << GX_WIIMOTE_RIGHT) | (1ULL << GX_CLASSIC_RIGHT) | (1ULL << GX_NUNCHUK_RIGHT)); + case GX_MENU_L: + return state & ((1ULL << GX_GC_L_TRIGGER) | (1ULL << GX_CLASSIC_L_TRIGGER)); + case GX_MENU_R: + return state & ((1ULL << GX_GC_R_TRIGGER) | (1ULL << GX_CLASSIC_R_TRIGGER)); + default: + return false; + } +} + static int16_t gx_input_state(void *data, const struct retro_keybind **binds, unsigned port, unsigned device, unsigned index, unsigned id) @@ -115,7 +144,10 @@ static int16_t gx_input_state(void *data, const struct retro_keybind **binds, switch (device) { case RETRO_DEVICE_JOYPAD: - return (binds[port][id].joykey & gx->pad_state[port]) ? 1 : 0; + if (binds[port][id].joykey >= GX_MENU_FIRST && binds[port][id].joykey <= GX_MENU_LAST) + return gx_menu_input_state(binds[port][id].joykey, gx->pad_state[port]) ? 1 : 0; + else + return (1ULL << (binds[port][id].joykey) & gx->pad_state[port]) ? 1 : 0; case RETRO_DEVICE_ANALOG: return gx->analog_state[port][index][id]; default: @@ -315,18 +347,18 @@ static void gx_input_poll(void *data) { down = PAD_ButtonsHeld(port); - *state_cur |= (down & PAD_BUTTON_A) ? GX_GC_A : 0; - *state_cur |= (down & PAD_BUTTON_B) ? GX_GC_B : 0; - *state_cur |= (down & PAD_BUTTON_X) ? GX_GC_X : 0; - *state_cur |= (down & PAD_BUTTON_Y) ? GX_GC_Y : 0; - *state_cur |= (down & PAD_BUTTON_UP) ? GX_GC_UP : 0; - *state_cur |= (down & PAD_BUTTON_DOWN) ? GX_GC_DOWN : 0; - *state_cur |= (down & PAD_BUTTON_LEFT) ? GX_GC_LEFT : 0; - *state_cur |= (down & PAD_BUTTON_RIGHT) ? GX_GC_RIGHT : 0; - *state_cur |= (down & PAD_BUTTON_START) ? GX_GC_START : 0; - *state_cur |= (down & PAD_TRIGGER_Z) ? GX_GC_Z_TRIGGER : 0; - *state_cur |= ((down & PAD_TRIGGER_L) || PAD_TriggerL(port) > 127) ? GX_GC_L_TRIGGER : 0; - *state_cur |= ((down & PAD_TRIGGER_R) || PAD_TriggerR(port) > 127) ? GX_GC_R_TRIGGER : 0; + *state_cur |= (down & PAD_BUTTON_A) ? (1ULL << GX_GC_A) : 0; + *state_cur |= (down & PAD_BUTTON_B) ? (1ULL << GX_GC_B) : 0; + *state_cur |= (down & PAD_BUTTON_X) ? (1ULL << GX_GC_X) : 0; + *state_cur |= (down & PAD_BUTTON_Y) ? (1ULL << GX_GC_Y) : 0; + *state_cur |= (down & PAD_BUTTON_UP) ? (1ULL << GX_GC_UP) : 0; + *state_cur |= (down & PAD_BUTTON_DOWN) ? (1ULL << GX_GC_DOWN) : 0; + *state_cur |= (down & PAD_BUTTON_LEFT) ? (1ULL << GX_GC_LEFT) : 0; + *state_cur |= (down & PAD_BUTTON_RIGHT) ? (1ULL << GX_GC_RIGHT) : 0; + *state_cur |= (down & PAD_BUTTON_START) ? (1ULL << GX_GC_START) : 0; + *state_cur |= (down & PAD_TRIGGER_Z) ? (1ULL << GX_GC_Z_TRIGGER) : 0; + *state_cur |= ((down & PAD_TRIGGER_L) || PAD_TriggerL(port) > 127) ? (1ULL << GX_GC_L_TRIGGER) : 0; + *state_cur |= ((down & PAD_TRIGGER_R) || PAD_TriggerR(port) > 127) ? (1ULL << GX_GC_R_TRIGGER) : 0; int16_t ls_x = (int16_t)PAD_StickX(port) * 256; int16_t ls_y = (int16_t)PAD_StickY(port) * -256; @@ -338,8 +370,9 @@ static void gx_input_poll(void *data) gx->analog_state[port][RETRO_DEVICE_INDEX_ANALOG_RIGHT][RETRO_DEVICE_ID_ANALOG_X] = rs_x; gx->analog_state[port][RETRO_DEVICE_INDEX_ANALOG_RIGHT][RETRO_DEVICE_ID_ANALOG_Y] = rs_y; - if ((*state_cur & (GX_GC_START | GX_GC_Z_TRIGGER | GX_GC_L_TRIGGER | GX_GC_R_TRIGGER)) == (GX_GC_START | GX_GC_Z_TRIGGER | GX_GC_L_TRIGGER | GX_GC_R_TRIGGER)) - *state_cur |= GX_WIIMOTE_HOME; + const uint64_t menu_combo = (1ULL << GX_GC_START) | (1ULL << GX_GC_Z_TRIGGER) | (1ULL << GX_GC_L_TRIGGER) | (1ULL << GX_GC_R_TRIGGER); + if ((*state_cur & menu_combo) == menu_combo) + *state_cur |= (1ULL << GX_WIIMOTE_HOME); if (g_settings.input.autodetect_enable) { @@ -358,38 +391,38 @@ static void gx_input_poll(void *data) down = wpaddata->btns_h; - *state_cur |= (down & WPAD_BUTTON_A) ? GX_WIIMOTE_A : 0; - *state_cur |= (down & WPAD_BUTTON_B) ? GX_WIIMOTE_B : 0; - *state_cur |= (down & WPAD_BUTTON_1) ? GX_WIIMOTE_1 : 0; - *state_cur |= (down & WPAD_BUTTON_2) ? GX_WIIMOTE_2 : 0; - *state_cur |= (down & WPAD_BUTTON_PLUS) ? GX_WIIMOTE_PLUS : 0; - *state_cur |= (down & WPAD_BUTTON_MINUS) ? GX_WIIMOTE_MINUS : 0; - *state_cur |= (down & WPAD_BUTTON_HOME) ? GX_WIIMOTE_HOME : 0; + *state_cur |= (down & WPAD_BUTTON_A) ? (1ULL << GX_WIIMOTE_A) : 0; + *state_cur |= (down & WPAD_BUTTON_B) ? (1ULL << GX_WIIMOTE_B) : 0; + *state_cur |= (down & WPAD_BUTTON_1) ? (1ULL << GX_WIIMOTE_1) : 0; + *state_cur |= (down & WPAD_BUTTON_2) ? (1ULL << GX_WIIMOTE_2) : 0; + *state_cur |= (down & WPAD_BUTTON_PLUS) ? (1ULL << GX_WIIMOTE_PLUS) : 0; + *state_cur |= (down & WPAD_BUTTON_MINUS) ? (1ULL << GX_WIIMOTE_MINUS) : 0; + *state_cur |= (down & WPAD_BUTTON_HOME) ? (1ULL << GX_WIIMOTE_HOME) : 0; // rotated d-pad on Wiimote - *state_cur |= (down & WPAD_BUTTON_UP) ? GX_WIIMOTE_LEFT : 0; - *state_cur |= (down & WPAD_BUTTON_DOWN) ? GX_WIIMOTE_RIGHT : 0; - *state_cur |= (down & WPAD_BUTTON_LEFT) ? GX_WIIMOTE_DOWN : 0; - *state_cur |= (down & WPAD_BUTTON_RIGHT) ? GX_WIIMOTE_UP : 0; + *state_cur |= (down & WPAD_BUTTON_UP) ? (1ULL << GX_WIIMOTE_LEFT) : 0; + *state_cur |= (down & WPAD_BUTTON_DOWN) ? (1ULL << GX_WIIMOTE_RIGHT) : 0; + *state_cur |= (down & WPAD_BUTTON_LEFT) ? (1ULL << GX_WIIMOTE_DOWN) : 0; + *state_cur |= (down & WPAD_BUTTON_RIGHT) ? (1ULL << GX_WIIMOTE_UP) : 0; expansion_t *exp = &wpaddata->exp; if (ptype == WPAD_EXP_CLASSIC) { - *state_cur |= (down & WPAD_CLASSIC_BUTTON_A) ? GX_CLASSIC_A : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_B) ? GX_CLASSIC_B : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_X) ? GX_CLASSIC_X : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_Y) ? GX_CLASSIC_Y : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_UP) ? GX_CLASSIC_UP : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_DOWN) ? GX_CLASSIC_DOWN : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_LEFT) ? GX_CLASSIC_LEFT : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_RIGHT) ? GX_CLASSIC_RIGHT : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_PLUS) ? GX_CLASSIC_PLUS : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_MINUS) ? GX_CLASSIC_MINUS : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_HOME) ? GX_CLASSIC_HOME : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_FULL_L) ? GX_CLASSIC_L_TRIGGER : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_FULL_R) ? GX_CLASSIC_R_TRIGGER : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_ZL) ? GX_CLASSIC_ZL_TRIGGER : 0; - *state_cur |= (down & WPAD_CLASSIC_BUTTON_ZR) ? GX_CLASSIC_ZR_TRIGGER : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_A) ? (1ULL << GX_CLASSIC_A) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_B) ? (1ULL << GX_CLASSIC_B) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_X) ? (1ULL << GX_CLASSIC_X) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_Y) ? (1ULL << GX_CLASSIC_Y) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_UP) ? (1ULL << GX_CLASSIC_UP) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_DOWN) ? (1ULL << GX_CLASSIC_DOWN) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_LEFT) ? (1ULL << GX_CLASSIC_LEFT) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_RIGHT) ? (1ULL << GX_CLASSIC_RIGHT) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_PLUS) ? (1ULL << GX_CLASSIC_PLUS) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_MINUS) ? (1ULL << GX_CLASSIC_MINUS) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_HOME) ? (1ULL << GX_CLASSIC_HOME) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_FULL_L) ? (1ULL << GX_CLASSIC_L_TRIGGER) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_FULL_R) ? (1ULL << GX_CLASSIC_R_TRIGGER) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_ZL) ? (1ULL << GX_CLASSIC_ZL_TRIGGER) : 0; + *state_cur |= (down & WPAD_CLASSIC_BUTTON_ZR) ? (1ULL << GX_CLASSIC_ZR_TRIGGER) : 0; float ljs_mag = exp->classic.ljs.mag; float ljs_ang = exp->classic.ljs.ang; @@ -433,13 +466,13 @@ static void gx_input_poll(void *data) else if (ptype == WPAD_EXP_NUNCHUK) { // wiimote is held upright with nunchuk, do not change d-pad orientation - *state_cur |= (down & WPAD_BUTTON_UP) ? GX_WIIMOTE_UP : 0; - *state_cur |= (down & WPAD_BUTTON_DOWN) ? GX_WIIMOTE_DOWN : 0; - *state_cur |= (down & WPAD_BUTTON_LEFT) ? GX_WIIMOTE_LEFT : 0; - *state_cur |= (down & WPAD_BUTTON_RIGHT) ? GX_WIIMOTE_RIGHT : 0; + *state_cur |= (down & WPAD_BUTTON_UP) ? (1ULL << GX_WIIMOTE_UP) : 0; + *state_cur |= (down & WPAD_BUTTON_DOWN) ? (1ULL << GX_WIIMOTE_DOWN) : 0; + *state_cur |= (down & WPAD_BUTTON_LEFT) ? (1ULL << GX_WIIMOTE_LEFT) : 0; + *state_cur |= (down & WPAD_BUTTON_RIGHT) ? (1ULL << GX_WIIMOTE_RIGHT) : 0; - *state_cur |= (down & WPAD_NUNCHUK_BUTTON_Z) ? GX_NUNCHUK_Z : 0; - *state_cur |= (down & WPAD_NUNCHUK_BUTTON_C) ? GX_NUNCHUK_C : 0; + *state_cur |= (down & WPAD_NUNCHUK_BUTTON_Z) ? (1ULL << GX_NUNCHUK_Z) : 0; + *state_cur |= (down & WPAD_NUNCHUK_BUTTON_C) ? (1ULL << GX_NUNCHUK_C) : 0; float js_mag = exp->nunchuk.js.mag; float js_ang = exp->nunchuk.js.ang; @@ -484,13 +517,13 @@ static void gx_input_poll(void *data) if (g_menu) { - *state_p1 |= GX_WIIMOTE_HOME; + *state_p1 |= (1ULL << GX_WIIMOTE_HOME); g_menu = false; } - if (*state_p1 & (GX_WIIMOTE_HOME + if (*state_p1 & ((1ULL << GX_WIIMOTE_HOME) #ifdef HW_RVL - | GX_CLASSIC_HOME + | (1ULL << GX_CLASSIC_HOME) #endif )) *lifecycle_state |= (1ULL << RARCH_MENU_TOGGLE); @@ -511,6 +544,12 @@ static uint64_t gx_input_get_capabilities(void *data) return caps; } +extern const rarch_joypad_driver_t gx_joypad; + +static const rarch_joypad_driver_t *gx_input_get_joypad_driver(void *data) +{ + return &gx_joypad; +} const input_driver_t input_gx = { gx_input_init, @@ -522,4 +561,90 @@ const input_driver_t input_gx = { NULL, gx_input_get_capabilities, "gx", + + NULL, + NULL, + gx_input_get_joypad_driver, +}; + + +static bool gx_joypad_init(void) +{ + return true; +} + +static bool gx_joypad_button(unsigned port_num, uint16_t joykey) +{ + gx_input_t *gx = (gx_input_t*)driver.input_data; + return gx->pad_state[port_num] & (1ULL << joykey); +} + +static int16_t gx_joypad_axis(unsigned port_num, uint32_t joyaxis) +{ + gx_input_t *gx = (gx_input_t*)driver.input_data; + if (joyaxis == AXIS_NONE) + return 0; + + int val = 0; + + int axis = -1; + bool is_neg = false; + bool is_pos = false; + + if (AXIS_NEG_GET(joyaxis) <= 5) + { + axis = AXIS_NEG_GET(joyaxis); + is_neg = true; + } + else if (AXIS_POS_GET(joyaxis) <= 5) + { + axis = AXIS_POS_GET(joyaxis); + is_pos = true; + } + + switch (axis) + { + case 0: val = gx->analog_state[port_num][0][0]; break; + case 1: val = gx->analog_state[port_num][0][1]; break; + case 2: val = gx->analog_state[port_num][1][0]; break; + case 3: val = gx->analog_state[port_num][1][1]; break; + } + + if (is_neg && val > 0) + val = 0; + else if (is_pos && val < 0) + val = 0; + + return val; +} + +static void gx_joypad_poll(void) +{ +} + +static bool gx_joypad_query_pad(unsigned pad) +{ + gx_input_t *gx = (gx_input_t*)driver.input_data; + return pad < MAX_PLAYERS && gx->pad_state[pad]; +} + +static const char *gx_joypad_name(unsigned pad) +{ + return NULL; +} + +static void gx_joypad_destroy(void) +{ +} + +const rarch_joypad_driver_t gx_joypad = { + gx_joypad_init, + gx_joypad_query_pad, + gx_joypad_destroy, + gx_joypad_button, + gx_joypad_axis, + gx_joypad_poll, + NULL, + gx_joypad_name, + "gx", }; diff --git a/gx/gx_input.h b/gx/gx_input.h index ec1257e8ad..83f0d9ea4e 100644 --- a/gx/gx_input.h +++ b/gx/gx_input.h @@ -20,54 +20,71 @@ enum { - GX_GC_A = 1ULL << 0, - GX_GC_B = 1ULL << 1, - GX_GC_X = 1ULL << 2, - GX_GC_Y = 1ULL << 3, - GX_GC_START = 1ULL << 4, - GX_GC_Z_TRIGGER = 1ULL << 5, - GX_GC_L_TRIGGER = 1ULL << 6, - GX_GC_R_TRIGGER = 1ULL << 7, - GX_GC_UP = 1ULL << 8, - GX_GC_DOWN = 1ULL << 9, - GX_GC_LEFT = 1ULL << 10, - GX_GC_RIGHT = 1ULL << 11, + GX_GC_A = 0, + GX_GC_B = 1, + GX_GC_X = 2, + GX_GC_Y = 3, + GX_GC_START = 4, + GX_GC_Z_TRIGGER = 5, + GX_GC_L_TRIGGER = 6, + GX_GC_R_TRIGGER = 7, + GX_GC_UP = 8, + GX_GC_DOWN = 9, + GX_GC_LEFT = 10, + GX_GC_RIGHT = 11, #ifdef HW_RVL - GX_CLASSIC_A = 1ULL << 20, - GX_CLASSIC_B = 1ULL << 21, - GX_CLASSIC_X = 1ULL << 22, - GX_CLASSIC_Y = 1ULL << 23, - GX_CLASSIC_PLUS = 1ULL << 24, - GX_CLASSIC_MINUS = 1ULL << 25, - GX_CLASSIC_HOME = 1ULL << 26, - GX_CLASSIC_L_TRIGGER = 1ULL << 27, - GX_CLASSIC_R_TRIGGER = 1ULL << 28, - GX_CLASSIC_ZL_TRIGGER = 1ULL << 29, - GX_CLASSIC_ZR_TRIGGER = 1ULL << 30, - GX_CLASSIC_UP = 1ULL << 31, - GX_CLASSIC_DOWN = 1ULL << 32, - GX_CLASSIC_LEFT = 1ULL << 33, - GX_CLASSIC_RIGHT = 1ULL << 34, - GX_WIIMOTE_A = 1ULL << 43, - GX_WIIMOTE_B = 1ULL << 44, - GX_WIIMOTE_1 = 1ULL << 45, - GX_WIIMOTE_2 = 1ULL << 46, - GX_WIIMOTE_PLUS = 1ULL << 47, - GX_WIIMOTE_MINUS = 1ULL << 48, - //GX_WIIMOTE_HOME = 1ULL << 49, - GX_WIIMOTE_UP = 1ULL << 50, - GX_WIIMOTE_DOWN = 1ULL << 51, - GX_WIIMOTE_LEFT = 1ULL << 52, - GX_WIIMOTE_RIGHT = 1ULL << 53, - GX_NUNCHUK_Z = 1ULL << 54, - GX_NUNCHUK_C = 1ULL << 55, - GX_NUNCHUK_UP = 1ULL << 56, - GX_NUNCHUK_DOWN = 1ULL << 57, - GX_NUNCHUK_LEFT = 1ULL << 58, - GX_NUNCHUK_RIGHT = 1ULL << 59, + GX_CLASSIC_A = 20, + GX_CLASSIC_B = 21, + GX_CLASSIC_X = 22, + GX_CLASSIC_Y = 23, + GX_CLASSIC_PLUS = 24, + GX_CLASSIC_MINUS = 25, + GX_CLASSIC_HOME = 26, + GX_CLASSIC_L_TRIGGER = 27, + GX_CLASSIC_R_TRIGGER = 28, + GX_CLASSIC_ZL_TRIGGER = 29, + GX_CLASSIC_ZR_TRIGGER = 30, + GX_CLASSIC_UP = 31, + GX_CLASSIC_DOWN = 32, + GX_CLASSIC_LEFT = 33, + GX_CLASSIC_RIGHT = 34, + GX_WIIMOTE_A = 43, + GX_WIIMOTE_B = 44, + GX_WIIMOTE_1 = 45, + GX_WIIMOTE_2 = 46, + GX_WIIMOTE_PLUS = 47, + GX_WIIMOTE_MINUS = 48, + //GX_WIIMOTE_HOME = 49, + GX_WIIMOTE_UP = 50, + GX_WIIMOTE_DOWN = 51, + GX_WIIMOTE_LEFT = 52, + GX_WIIMOTE_RIGHT = 53, + GX_NUNCHUK_Z = 54, + GX_NUNCHUK_C = 55, + GX_NUNCHUK_UP = 56, + GX_NUNCHUK_DOWN = 57, + GX_NUNCHUK_LEFT = 58, + GX_NUNCHUK_RIGHT = 59, #endif - GX_WIIMOTE_HOME = 1ULL << 49, // needed on GameCube as "fake" menu button - GX_QUIT_KEY = 1ULL << 60, + GX_WIIMOTE_HOME = 49, // needed on GameCube as "fake" menu button + GX_QUIT_KEY = 60, + + // special binds for the menu + GX_MENU_A = 61, + GX_MENU_B = 62, + GX_MENU_X = 63, + GX_MENU_Y = 64, + GX_MENU_START = 65, + GX_MENU_SELECT = 66, + GX_MENU_UP = 67, + GX_MENU_DOWN = 68, + GX_MENU_LEFT = 69, + GX_MENU_RIGHT = 70, + GX_MENU_L = 71, + GX_MENU_R = 72, + + GX_MENU_FIRST = GX_MENU_A, + GX_MENU_LAST = GX_MENU_R }; enum gx_device_id diff --git a/input/input_common.c b/input/input_common.c index f72494fd57..246576b539 100644 --- a/input/input_common.c +++ b/input/input_common.c @@ -943,7 +943,15 @@ void input_get_bind_string(char *buf, const struct retro_keybind *bind, size_t s *buf = '\0'; if (bind->joykey != NO_BTN) { - if (GET_HAT_DIR(bind->joykey)) + if (driver.input->set_keybinds) + { + struct platform_bind key_label; + strlcpy(key_label.desc, "Unknown", sizeof(key_label.desc)); + key_label.joykey = bind->joykey; + driver.input->set_keybinds(&key_label, 0, 0, 0, (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL)); + snprintf(buf, size, "%s (btn) ", key_label.desc); + } + else if (GET_HAT_DIR(bind->joykey)) { const char *dir; switch (GET_HAT_DIR(bind->joykey)) @@ -976,6 +984,7 @@ void input_get_bind_string(char *buf, const struct retro_keybind *bind, size_t s snprintf(buf, size, "%c%u (axis) ", dir, axis); } +#ifndef RARCH_CONSOLE char key[64]; input_translate_rk_to_str(bind->key, key, sizeof(key)); if (!strcmp(key, "nul")) @@ -984,6 +993,7 @@ void input_get_bind_string(char *buf, const struct retro_keybind *bind, size_t s char keybuf[64]; snprintf(keybuf, sizeof(keybuf), "(Key: %s)", key); strlcat(buf, keybuf, size); +#endif } static enum retro_key find_sk_bind(const char *str)