mirror of
https://github.com/libretro/RetroArch
synced 2025-03-03 04:14:00 +00:00
[LIBNX] USB keyboard support
This commit is contained in:
parent
46dc4508f4
commit
f943688dff
@ -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;
|
||||
|
@ -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 },
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user