diff --git a/input/drivers/switch_input.c b/input/drivers/switch_input.c index 699bbf6e15..1a60958041 100644 --- a/input/drivers/switch_input.c +++ b/input/drivers/switch_input.c @@ -14,9 +14,11 @@ #define MULTITOUCH_LIMIT 4 /* supports up to this many fingers at once */ #define TOUCH_AXIS_MAX 0x7fff /* abstraction of pointer coords */ +#define SWITCH_NUM_SCANCODES 114 #endif #include "../input_driver.h" +#include "../input_keymaps.h" #define MAX_PADS 10 @@ -38,6 +40,7 @@ typedef struct switch_input bool touch_state[MULTITOUCH_LIMIT]; uint32_t touch_x[MULTITOUCH_LIMIT]; uint32_t touch_y[MULTITOUCH_LIMIT]; + bool keyboard_state[SWITCH_NUM_SCANCODES]; #endif } switch_input_t; @@ -50,8 +53,12 @@ static void switch_input_poll(void *data) #ifdef HAVE_LIBNX uint32_t touch_count = hidTouchCount(); + int i = 0; + int keySym = 0; + unsigned keyCode = 0; + uint16_t mod = 0; - for (int i = 0; i < MULTITOUCH_LIMIT; i++) + for (i = 0; i < MULTITOUCH_LIMIT; i++) { sw->touch_state[i] = touch_count > i; @@ -64,6 +71,31 @@ static void switch_input_poll(void *data) sw->touch_y[i] = touch_position.py; } } + + mod = 0; + if (hidKeyboardHeld(KBD_LEFTALT) || hidKeyboardHeld(KBD_RIGHTALT)) + mod |= RETROKMOD_ALT; + if (hidKeyboardHeld(KBD_LEFTCTRL) || hidKeyboardHeld(KBD_RIGHTCTRL)) + mod |= RETROKMOD_CTRL; + if (hidKeyboardHeld(KBD_LEFTSHIFT) || hidKeyboardHeld(KBD_RIGHTSHIFT)) + mod |= RETROKMOD_SHIFT; + + for (i = 0; i < SWITCH_NUM_SCANCODES; i++) + { + keySym = rarch_key_map_switch[i].sym; + keyCode = input_keymaps_translate_keysym_to_rk(keySym); + + if (hidKeyboardHeld(keySym) && !(sw->keyboard_state[i])) + { + sw->keyboard_state[i] = true; + input_keyboard_event(true, keyCode, keyCode, mod, RETRO_DEVICE_KEYBOARD); + } + else if (!hidKeyboardHeld(keySym) && sw->keyboard_state[i]) + { + sw->keyboard_state[i] = false; + input_keyboard_event(false, keyCode, keyCode, mod, RETRO_DEVICE_KEYBOARD); + } + } #endif } @@ -120,6 +152,9 @@ static int16_t switch_input_state(void *data, joypad_info, port, idx, id, binds[port]); break; #ifdef HAVE_LIBNX + case RETRO_DEVICE_KEYBOARD: + return ((id < RETROK_LAST) && sw->keyboard_state[rarch_keysym_lut[(enum retro_key)id]]); + break; case RETRO_DEVICE_POINTER: case RARCH_DEVICE_POINTER_SCREEN: return switch_pointer_device_state(sw, id, idx); @@ -162,6 +197,12 @@ static void* switch_input_init(const char *joypad_driver) */ calc_touch_scaling(sw, 1280, 720, TOUCH_AXIS_MAX); + + input_keymaps_init_keyboard_lut(rarch_key_map_switch); + int i; + for (i = 0; i < SWITCH_NUM_SCANCODES; i++) { + sw->keyboard_state[i] = false; + } #endif return sw; @@ -174,7 +215,7 @@ static uint64_t switch_input_get_capabilities(void *data) uint64_t caps = (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_ANALOG); #ifdef HAVE_LIBNX - caps |= (1 << RETRO_DEVICE_POINTER); + caps |= (1 << RETRO_DEVICE_POINTER) | (1 << RETRO_DEVICE_KEYBOARD); #endif return caps; diff --git a/input/input_keymaps.c b/input/input_keymaps.c index 0d28f24cbe..a92bf60256 100644 --- a/input/input_keymaps.c +++ b/input/input_keymaps.c @@ -292,6 +292,125 @@ const struct input_key_map input_config_key_map[] = { { NULL, RETROK_UNKNOWN }, }; +#ifdef HAVE_LIBNX +const struct rarch_key_map rarch_key_map_switch[] = { + { KBD_A, RETROK_a }, + { KBD_B, RETROK_b }, + { KBD_C, RETROK_c }, + { KBD_D, RETROK_d }, + { KBD_E, RETROK_e }, + { KBD_F, RETROK_f }, + { KBD_G, RETROK_g }, + { KBD_H, RETROK_h }, + { KBD_I, RETROK_i }, + { KBD_J, RETROK_j }, + { KBD_K, RETROK_k }, + { KBD_L, RETROK_l }, + { KBD_M, RETROK_m }, + { KBD_N, RETROK_n }, + { KBD_O, RETROK_o }, + { KBD_P, RETROK_p }, + { KBD_Q, RETROK_q }, + { KBD_R, RETROK_r }, + { KBD_S, RETROK_s }, + { KBD_T, RETROK_t }, + { KBD_U, RETROK_u }, + { KBD_V, RETROK_v }, + { KBD_W, RETROK_w }, + { KBD_X, RETROK_x }, + { KBD_Y, RETROK_y }, + { KBD_Z, RETROK_z }, + { KBD_BACKSPACE, RETROK_BACKSPACE }, + { KBD_TAB, RETROK_TAB }, + { KBD_ENTER, RETROK_RETURN }, + { KBD_PAUSE, RETROK_PAUSE }, + { KBD_ESC, RETROK_ESCAPE }, + { KBD_SPACE, RETROK_SPACE }, + { KBD_HASHTILDE, RETROK_HASH }, + { KBD_APOSTROPHE, RETROK_QUOTE }, + { KBD_KPLEFTPAREN, RETROK_LEFTPAREN }, + { KBD_KPRIGHTPAREN, RETROK_RIGHTPAREN }, + { KBD_COMMA, RETROK_COMMA }, + { KBD_MINUS, RETROK_MINUS }, + { KBD_DOT, RETROK_PERIOD }, + { KBD_SLASH, RETROK_SLASH }, + { KBD_0, RETROK_0 }, + { KBD_1, RETROK_1 }, + { KBD_2, RETROK_2 }, + { KBD_3, RETROK_3 }, + { KBD_4, RETROK_4 }, + { KBD_5, RETROK_5 }, + { KBD_6, RETROK_6 }, + { KBD_7, RETROK_7 }, + { KBD_8, RETROK_8 }, + { KBD_9, RETROK_9 }, + { KBD_SEMICOLON, RETROK_SEMICOLON }, + { KBD_EQUAL, RETROK_EQUALS }, + { KBD_LEFTBRACE, RETROK_LEFTBRACKET }, + { KBD_BACKSLASH, RETROK_BACKSLASH }, + { KBD_RIGHTBRACE, RETROK_RIGHTBRACKET }, + { KBD_DELETE, RETROK_DELETE }, + { KBD_KP0, RETROK_KP0 }, + { KBD_KP1, RETROK_KP1 }, + { KBD_KP2, RETROK_KP2 }, + { KBD_KP3, RETROK_KP3 }, + { KBD_KP4, RETROK_KP4 }, + { KBD_KP5, RETROK_KP5 }, + { KBD_KP6, RETROK_KP6 }, + { KBD_KP7, RETROK_KP7 }, + { KBD_KP8, RETROK_KP8 }, + { KBD_KP9, RETROK_KP9 }, + { KBD_KPDOT, RETROK_KP_PERIOD }, + { KBD_KPSLASH, RETROK_KP_DIVIDE }, + { KBD_KPASTERISK, RETROK_KP_MULTIPLY }, + { KBD_KPMINUS, RETROK_KP_MINUS }, + { KBD_KPPLUS, RETROK_KP_PLUS }, + { KBD_KPENTER, RETROK_KP_ENTER }, + { KBD_KPEQUAL, RETROK_KP_EQUALS }, + { KBD_UP, RETROK_UP }, + { KBD_DOWN, RETROK_DOWN }, + { KBD_RIGHT, RETROK_RIGHT }, + { KBD_LEFT, RETROK_LEFT }, + { KBD_INSERT, RETROK_INSERT }, + { KBD_HOME, RETROK_HOME }, + { KBD_END, RETROK_END }, + { KBD_PAGEUP, RETROK_PAGEUP }, + { KBD_PAGEDOWN, RETROK_PAGEDOWN }, + { KBD_F1, RETROK_F1 }, + { KBD_F2, RETROK_F2 }, + { KBD_F3, RETROK_F3 }, + { KBD_F4, RETROK_F4 }, + { KBD_F5, RETROK_F5 }, + { KBD_F6, RETROK_F6 }, + { KBD_F7, RETROK_F7 }, + { KBD_F8, RETROK_F8 }, + { KBD_F9, RETROK_F9 }, + { KBD_F10, RETROK_F10 }, + { KBD_F11, RETROK_F11 }, + { KBD_F12, RETROK_F12 }, + { KBD_F13, RETROK_F13 }, + { KBD_F14, RETROK_F14 }, + { KBD_F15, RETROK_F15 }, + { KBD_NUMLOCK, RETROK_NUMLOCK }, + { KBD_CAPSLOCK, RETROK_CAPSLOCK }, + { KBD_SCROLLLOCK, RETROK_SCROLLOCK }, + { KBD_RIGHTSHIFT, RETROK_RSHIFT }, + { KBD_LEFTSHIFT, RETROK_LSHIFT }, + { KBD_RIGHTCTRL, RETROK_RCTRL }, + { KBD_LEFTCTRL, RETROK_LCTRL }, + { KBD_RIGHTALT, RETROK_RALT }, + { KBD_LEFTALT, RETROK_LALT }, + { KBD_LEFTMETA, RETROK_LMETA }, + { KBD_RIGHTMETA, RETROK_RMETA }, + { KBD_COMPOSE, RETROK_COMPOSE }, + { KBD_HELP, RETROK_HELP }, + { KBD_PAUSE, RETROK_BREAK }, + { KBD_POWER, RETROK_POWER }, + { KBD_UNDO, RETROK_UNDO }, + { 0, RETROK_UNKNOWN } +}; +#endif + #if defined(HAVE_SDL) || defined(HAVE_SDL2) const struct rarch_key_map rarch_key_map_sdl[] = { { SDLK_BACKSPACE, RETROK_BACKSPACE }, diff --git a/input/input_keymaps.h b/input/input_keymaps.h index d682af4e0e..69fe66d6fc 100644 --- a/input/input_keymaps.h +++ b/input/input_keymaps.h @@ -65,6 +65,9 @@ extern const struct rarch_key_map rarch_key_map_qnx[]; extern const struct rarch_key_map rarch_key_map_dos[]; extern const struct rarch_key_map rarch_key_map_wiiu[]; extern const struct rarch_key_map rarch_key_map_winraw[]; +#ifdef HAVE_LIBNX +extern const struct rarch_key_map rarch_key_map_switch[]; +#endif /** * input_keymaps_init_keyboard_lut: