mirror of
https://github.com/libretro/RetroArch
synced 2025-02-06 00:39:53 +00:00
Merge pull request #2636 from diablodiab/android-keyboard-support
Add keyboard input functionality to Android version
This commit is contained in:
commit
db51b5a2c0
@ -470,7 +470,9 @@ static void *android_input_init(void)
|
||||
android->copy.pads_connected = 0;
|
||||
android->joypad = input_joypad_init_driver(
|
||||
settings->input.joypad_driver, android);
|
||||
|
||||
|
||||
input_keymaps_init_keyboard_lut(rarch_key_map_android);
|
||||
|
||||
frontend_android_get_version_sdk(&sdk);
|
||||
|
||||
RARCH_LOG("sdk version: %d\n", sdk);
|
||||
@ -823,6 +825,13 @@ static void handle_hotplug(android_input_data_t *android_data,
|
||||
else if (strstr(device_name, "MOGA"))
|
||||
strlcpy(name_buf, "Moga IME", sizeof(name_buf));
|
||||
|
||||
// if device is keyboard only and didn't match any of the devices above
|
||||
// then assume it is a keyboard and return leaving port number at -1
|
||||
else if(source == AINPUT_SOURCE_KEYBOARD)
|
||||
return;
|
||||
|
||||
// if device was not keyboard only, yet did not match any of the devices
|
||||
// above then try to autoconfigure as gamepad based on device_name
|
||||
else if (!string_is_empty(device_name))
|
||||
strlcpy(name_buf, device_name, sizeof(name_buf));
|
||||
|
||||
@ -920,8 +929,28 @@ static void android_input_poll_input(void *data)
|
||||
case AINPUT_EVENT_TYPE_KEY:
|
||||
{
|
||||
int keycode = AKeyEvent_getKeyCode(event);
|
||||
android_input_poll_event_type_key(android_app,
|
||||
|
||||
// If event source is keyboard-only and didn't get assigned to a port
|
||||
if (source == AINPUT_SOURCE_KEYBOARD && port < 0)
|
||||
{
|
||||
int keydown = (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_DOWN);
|
||||
unsigned keyboardcode = input_keymaps_translate_keysym_to_rk(keycode);
|
||||
|
||||
// Set keyboard modifier based on shift,ctrl and alt state
|
||||
uint16_t mod = 0;
|
||||
int meta = AKeyEvent_getMetaState(event);
|
||||
if(meta & AMETA_ALT_ON) mod |= RETROKMOD_ALT;
|
||||
if(meta & AMETA_CTRL_ON) mod |= RETROKMOD_CTRL;
|
||||
if(meta & AMETA_SHIFT_ON) mod |= RETROKMOD_SHIFT;
|
||||
|
||||
if (!predispatched) input_keyboard_event(keydown, keyboardcode, keyboardcode, mod, RETRO_DEVICE_KEYBOARD);
|
||||
}
|
||||
// If event source is not keyboard-only or if it was assigned to a port
|
||||
else
|
||||
{
|
||||
android_input_poll_event_type_key(android_app,
|
||||
event, port, keycode, source, type_event, &handled);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -16,6 +16,117 @@
|
||||
#ifndef _KEYBOARD_EVENT_ANDROID_H
|
||||
#define _KEYBOARD_EVENT_ANDROID_H
|
||||
|
||||
// The list of defined Android keycodes is incomplete in SDK version 12 and lower.
|
||||
// If using an SDK lower than 12 then add missing keycodes here
|
||||
#if __ANDROID_API__ < 13
|
||||
|
||||
/*
|
||||
* Key codes.
|
||||
*/
|
||||
enum {
|
||||
AKEYCODE_ESCAPE = 111,
|
||||
AKEYCODE_FORWARD_DEL = 112,
|
||||
AKEYCODE_CTRL_LEFT = 113,
|
||||
AKEYCODE_CTRL_RIGHT = 114,
|
||||
AKEYCODE_CAPS_LOCK = 115,
|
||||
AKEYCODE_SCROLL_LOCK = 116,
|
||||
AKEYCODE_META_LEFT = 117,
|
||||
AKEYCODE_META_RIGHT = 118,
|
||||
AKEYCODE_FUNCTION = 119,
|
||||
AKEYCODE_SYSRQ = 120,
|
||||
AKEYCODE_BREAK = 121,
|
||||
AKEYCODE_MOVE_HOME = 122,
|
||||
AKEYCODE_MOVE_END = 123,
|
||||
AKEYCODE_INSERT = 124,
|
||||
AKEYCODE_FORWARD = 125,
|
||||
AKEYCODE_MEDIA_PLAY = 126,
|
||||
AKEYCODE_MEDIA_PAUSE = 127,
|
||||
AKEYCODE_MEDIA_CLOSE = 128,
|
||||
AKEYCODE_MEDIA_EJECT = 129,
|
||||
AKEYCODE_MEDIA_RECORD = 130,
|
||||
AKEYCODE_F1 = 131,
|
||||
AKEYCODE_F2 = 132,
|
||||
AKEYCODE_F3 = 133,
|
||||
AKEYCODE_F4 = 134,
|
||||
AKEYCODE_F5 = 135,
|
||||
AKEYCODE_F6 = 136,
|
||||
AKEYCODE_F7 = 137,
|
||||
AKEYCODE_F8 = 138,
|
||||
AKEYCODE_F9 = 139,
|
||||
AKEYCODE_F10 = 140,
|
||||
AKEYCODE_F11 = 141,
|
||||
AKEYCODE_F12 = 142,
|
||||
AKEYCODE_NUM_LOCK = 143,
|
||||
AKEYCODE_NUMPAD_0 = 144,
|
||||
AKEYCODE_NUMPAD_1 = 145,
|
||||
AKEYCODE_NUMPAD_2 = 146,
|
||||
AKEYCODE_NUMPAD_3 = 147,
|
||||
AKEYCODE_NUMPAD_4 = 148,
|
||||
AKEYCODE_NUMPAD_5 = 149,
|
||||
AKEYCODE_NUMPAD_6 = 150,
|
||||
AKEYCODE_NUMPAD_7 = 151,
|
||||
AKEYCODE_NUMPAD_8 = 152,
|
||||
AKEYCODE_NUMPAD_9 = 153,
|
||||
AKEYCODE_NUMPAD_DIVIDE = 154,
|
||||
AKEYCODE_NUMPAD_MULTIPLY = 155,
|
||||
AKEYCODE_NUMPAD_SUBTRACT = 156,
|
||||
AKEYCODE_NUMPAD_ADD = 157,
|
||||
AKEYCODE_NUMPAD_DOT = 158,
|
||||
AKEYCODE_NUMPAD_COMMA = 159,
|
||||
AKEYCODE_NUMPAD_ENTER = 160,
|
||||
AKEYCODE_NUMPAD_EQUALS = 161,
|
||||
AKEYCODE_NUMPAD_LEFT_PAREN = 162,
|
||||
AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
|
||||
AKEYCODE_VOLUME_MUTE = 164,
|
||||
AKEYCODE_INFO = 165,
|
||||
AKEYCODE_CHANNEL_UP = 166,
|
||||
AKEYCODE_CHANNEL_DOWN = 167,
|
||||
AKEYCODE_ZOOM_IN = 168,
|
||||
AKEYCODE_ZOOM_OUT = 169,
|
||||
AKEYCODE_TV = 170,
|
||||
AKEYCODE_WINDOW = 171,
|
||||
AKEYCODE_GUIDE = 172,
|
||||
AKEYCODE_DVR = 173,
|
||||
AKEYCODE_BOOKMARK = 174,
|
||||
AKEYCODE_CAPTIONS = 175,
|
||||
AKEYCODE_SETTINGS = 176,
|
||||
AKEYCODE_TV_POWER = 177,
|
||||
AKEYCODE_TV_INPUT = 178,
|
||||
AKEYCODE_STB_POWER = 179,
|
||||
AKEYCODE_STB_INPUT = 180,
|
||||
AKEYCODE_AVR_POWER = 181,
|
||||
AKEYCODE_AVR_INPUT = 182,
|
||||
AKEYCODE_PROG_RED = 183,
|
||||
AKEYCODE_PROG_GREEN = 184,
|
||||
AKEYCODE_PROG_YELLOW = 185,
|
||||
AKEYCODE_PROG_BLUE = 186,
|
||||
AKEYCODE_APP_SWITCH = 187,
|
||||
AKEYCODE_BUTTON_1 = 188,
|
||||
AKEYCODE_BUTTON_2 = 189,
|
||||
AKEYCODE_BUTTON_3 = 190,
|
||||
AKEYCODE_BUTTON_4 = 191,
|
||||
AKEYCODE_BUTTON_5 = 192,
|
||||
AKEYCODE_BUTTON_6 = 193,
|
||||
AKEYCODE_BUTTON_7 = 194,
|
||||
AKEYCODE_BUTTON_8 = 195,
|
||||
AKEYCODE_BUTTON_9 = 196,
|
||||
AKEYCODE_BUTTON_10 = 197,
|
||||
AKEYCODE_BUTTON_11 = 198,
|
||||
AKEYCODE_BUTTON_12 = 199,
|
||||
AKEYCODE_BUTTON_13 = 200,
|
||||
AKEYCODE_BUTTON_14 = 201,
|
||||
AKEYCODE_BUTTON_15 = 202,
|
||||
AKEYCODE_BUTTON_16 = 203,
|
||||
};
|
||||
|
||||
/*
|
||||
* Meta key / modifer state.
|
||||
*/
|
||||
enum {
|
||||
AMETA_CTRL_ON = 0x1000,
|
||||
};
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <boolean.h>
|
||||
|
@ -18,6 +18,11 @@
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef ANDROID
|
||||
#include <android/keycodes.h>
|
||||
#include "drivers_keyboard/keyboard_event_android.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
@ -964,6 +969,119 @@ const struct rarch_key_map rarch_key_map_linux[] = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef ANDROID
|
||||
const struct rarch_key_map rarch_key_map_android[] = {
|
||||
{ AKEYCODE_DEL, RETROK_BACKSPACE },
|
||||
{ AKEYCODE_TAB, RETROK_TAB },
|
||||
{ AKEYCODE_CLEAR, RETROK_CLEAR },
|
||||
{ AKEYCODE_ENTER, RETROK_RETURN },
|
||||
{ AKEYCODE_BREAK, RETROK_PAUSE },
|
||||
{ AKEYCODE_ESCAPE, RETROK_ESCAPE },
|
||||
{ AKEYCODE_SPACE, RETROK_SPACE },
|
||||
{ AKEYCODE_APOSTROPHE, RETROK_QUOTE },
|
||||
{ AKEYCODE_NUMPAD_LEFT_PAREN, RETROK_LEFTPAREN },
|
||||
{ AKEYCODE_NUMPAD_RIGHT_PAREN, RETROK_RIGHTPAREN },
|
||||
{ AKEYCODE_NUMPAD_MULTIPLY, RETROK_ASTERISK },
|
||||
{ AKEYCODE_NUMPAD_ADD, RETROK_PLUS },
|
||||
{ AKEYCODE_COMMA, RETROK_COMMA },
|
||||
{ AKEYCODE_MINUS, RETROK_MINUS },
|
||||
{ AKEYCODE_PERIOD, RETROK_PERIOD },
|
||||
{ AKEYCODE_SLASH, RETROK_SLASH },
|
||||
{ AKEYCODE_0, RETROK_0 },
|
||||
{ AKEYCODE_1, RETROK_1 },
|
||||
{ AKEYCODE_2, RETROK_2 },
|
||||
{ AKEYCODE_3, RETROK_3 },
|
||||
{ AKEYCODE_4, RETROK_4 },
|
||||
{ AKEYCODE_5, RETROK_5 },
|
||||
{ AKEYCODE_6, RETROK_6 },
|
||||
{ AKEYCODE_7, RETROK_7 },
|
||||
{ AKEYCODE_8, RETROK_8 },
|
||||
{ AKEYCODE_9, RETROK_9 },
|
||||
{ AKEYCODE_SEMICOLON, RETROK_SEMICOLON },
|
||||
{ AKEYCODE_EQUALS, RETROK_EQUALS },
|
||||
{ AKEYCODE_LEFT_BRACKET, RETROK_LEFTBRACKET },
|
||||
{ AKEYCODE_BACKSLASH, RETROK_BACKSLASH },
|
||||
{ AKEYCODE_RIGHT_BRACKET, RETROK_RIGHTBRACKET },
|
||||
{ AKEYCODE_GRAVE, RETROK_BACKQUOTE },
|
||||
{ AKEYCODE_A, RETROK_a },
|
||||
{ AKEYCODE_B, RETROK_b },
|
||||
{ AKEYCODE_C, RETROK_c },
|
||||
{ AKEYCODE_D, RETROK_d },
|
||||
{ AKEYCODE_E, RETROK_e },
|
||||
{ AKEYCODE_F, RETROK_f },
|
||||
{ AKEYCODE_G, RETROK_g },
|
||||
{ AKEYCODE_H, RETROK_h },
|
||||
{ AKEYCODE_I, RETROK_i },
|
||||
{ AKEYCODE_J, RETROK_j },
|
||||
{ AKEYCODE_K, RETROK_k },
|
||||
{ AKEYCODE_L, RETROK_l },
|
||||
{ AKEYCODE_M, RETROK_m },
|
||||
{ AKEYCODE_N, RETROK_n },
|
||||
{ AKEYCODE_O, RETROK_o },
|
||||
{ AKEYCODE_P, RETROK_p },
|
||||
{ AKEYCODE_Q, RETROK_q },
|
||||
{ AKEYCODE_R, RETROK_r },
|
||||
{ AKEYCODE_S, RETROK_s },
|
||||
{ AKEYCODE_T, RETROK_t },
|
||||
{ AKEYCODE_U, RETROK_u },
|
||||
{ AKEYCODE_V, RETROK_v },
|
||||
{ AKEYCODE_W, RETROK_w },
|
||||
{ AKEYCODE_X, RETROK_x },
|
||||
{ AKEYCODE_Y, RETROK_y },
|
||||
{ AKEYCODE_Z, RETROK_z },
|
||||
{ AKEYCODE_DEL, RETROK_DELETE },
|
||||
{ AKEYCODE_NUMPAD_0, RETROK_KP0 },
|
||||
{ AKEYCODE_NUMPAD_1, RETROK_KP1 },
|
||||
{ AKEYCODE_NUMPAD_2, RETROK_KP2 },
|
||||
{ AKEYCODE_NUMPAD_3, RETROK_KP3 },
|
||||
{ AKEYCODE_NUMPAD_4, RETROK_KP4 },
|
||||
{ AKEYCODE_NUMPAD_5, RETROK_KP5 },
|
||||
{ AKEYCODE_NUMPAD_6, RETROK_KP6 },
|
||||
{ AKEYCODE_NUMPAD_7, RETROK_KP7 },
|
||||
{ AKEYCODE_NUMPAD_8, RETROK_KP8 },
|
||||
{ AKEYCODE_NUMPAD_9, RETROK_KP9 },
|
||||
{ AKEYCODE_NUMPAD_DOT, RETROK_KP_PERIOD },
|
||||
{ AKEYCODE_NUMPAD_DIVIDE, RETROK_KP_DIVIDE },
|
||||
{ AKEYCODE_NUMPAD_MULTIPLY, RETROK_KP_MULTIPLY },
|
||||
{ AKEYCODE_NUMPAD_SUBTRACT, RETROK_KP_MINUS },
|
||||
{ AKEYCODE_NUMPAD_ADD, RETROK_KP_PLUS },
|
||||
{ AKEYCODE_NUMPAD_ENTER, RETROK_KP_ENTER },
|
||||
{ AKEYCODE_NUMPAD_EQUALS, RETROK_KP_EQUALS },
|
||||
{ AKEYCODE_DPAD_UP, RETROK_UP },
|
||||
{ AKEYCODE_DPAD_DOWN, RETROK_DOWN },
|
||||
{ AKEYCODE_DPAD_RIGHT, RETROK_RIGHT },
|
||||
{ AKEYCODE_DPAD_LEFT, RETROK_LEFT },
|
||||
{ AKEYCODE_INSERT, RETROK_INSERT },
|
||||
{ AKEYCODE_MOVE_HOME, RETROK_HOME },
|
||||
{ AKEYCODE_MOVE_END, RETROK_END },
|
||||
{ AKEYCODE_PAGE_UP, RETROK_PAGEUP },
|
||||
{ AKEYCODE_PAGE_DOWN, RETROK_PAGEDOWN },
|
||||
{ AKEYCODE_F1, RETROK_F1 },
|
||||
{ AKEYCODE_F2, RETROK_F2 },
|
||||
{ AKEYCODE_F3, RETROK_F3 },
|
||||
{ AKEYCODE_F4, RETROK_F4 },
|
||||
{ AKEYCODE_F5, RETROK_F5 },
|
||||
{ AKEYCODE_F6, RETROK_F6 },
|
||||
{ AKEYCODE_F7, RETROK_F7 },
|
||||
{ AKEYCODE_F8, RETROK_F8 },
|
||||
{ AKEYCODE_F9, RETROK_F9 },
|
||||
{ AKEYCODE_F10, RETROK_F10 },
|
||||
{ AKEYCODE_F11, RETROK_F11 },
|
||||
{ AKEYCODE_F12, RETROK_F12 },
|
||||
{ AKEYCODE_NUM_LOCK, RETROK_NUMLOCK },
|
||||
{ AKEYCODE_CAPS_LOCK, RETROK_CAPSLOCK },
|
||||
{ AKEYCODE_SCROLL_LOCK, RETROK_SCROLLOCK },
|
||||
{ AKEYCODE_SHIFT_LEFT, RETROK_RSHIFT },
|
||||
{ AKEYCODE_SHIFT_RIGHT, RETROK_LSHIFT },
|
||||
{ AKEYCODE_CTRL_RIGHT, RETROK_RCTRL },
|
||||
{ AKEYCODE_CTRL_LEFT, RETROK_LCTRL },
|
||||
{ AKEYCODE_ALT_RIGHT, RETROK_RALT },
|
||||
{ AKEYCODE_ALT_LEFT, RETROK_LALT },
|
||||
{ 0, RETROK_UNKNOWN },
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
const struct rarch_key_map rarch_key_map_apple_hid[] = {
|
||||
{ KEY_Delete, RETROK_BACKSPACE },
|
||||
|
@ -56,6 +56,7 @@ extern const struct rarch_key_map rarch_key_map_dinput[];
|
||||
extern const struct rarch_key_map rarch_key_map_rwebinput[];
|
||||
extern const struct rarch_key_map rarch_key_map_linux[];
|
||||
extern const struct rarch_key_map rarch_key_map_apple_hid[];
|
||||
extern const struct rarch_key_map rarch_key_map_android[];
|
||||
|
||||
/**
|
||||
* input_keymaps_init_keyboard_lut:
|
||||
|
Loading…
x
Reference in New Issue
Block a user