[LIBNX] USB keyboard support

This commit is contained in:
rsn8887 2019-03-18 17:51:56 -05:00
parent 46dc4508f4
commit f943688dff
3 changed files with 165 additions and 2 deletions

View File

@ -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;

View File

@ -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 },

View File

@ -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: