diff options
-rw-r--r-- | hw/input/goldfish_events.c | 514 | ||||
-rw-r--r-- | include/hw/input/goldfish_events.h | 4 |
2 files changed, 504 insertions, 14 deletions
diff --git a/hw/input/goldfish_events.c b/hw/input/goldfish_events.c index 809ab2b45..a77e6ee54 100644 --- a/hw/input/goldfish_events.c +++ b/hw/input/goldfish_events.c @@ -28,6 +28,11 @@ #define MAX_EVENTS (256 * 4) +typedef struct { + const char *name; + int value; +} GoldfishEventCodeInfo; + /* Absolute axes */ #define ABS_X 0x00 #define ABS_Y 0x01 @@ -54,9 +59,424 @@ #define BTN_TOUCH 0x14a #define BTN_MOUSE 0x110 +#define EV_CODE(_code) {#_code, (_code)} +#define EV_CODE_END {NULL, 0} +static const GoldfishEventCodeInfo ev_abs_codes_table[] = { + EV_CODE(ABS_X), + EV_CODE(ABS_Y), + EV_CODE(ABS_Z), + EV_CODE(ABS_MT_SLOT), + EV_CODE(ABS_MT_TOUCH_MAJOR), + EV_CODE(ABS_MT_TOUCH_MINOR), + EV_CODE(ABS_MT_WIDTH_MAJOR), + EV_CODE(ABS_MT_WIDTH_MINOR), + EV_CODE(ABS_MT_ORIENTATION), + EV_CODE(ABS_MT_POSITION_X), + EV_CODE(ABS_MT_POSITION_Y), + EV_CODE(ABS_MT_TOOL_TYPE), + EV_CODE(ABS_MT_BLOB_ID), + EV_CODE(ABS_MT_TRACKING_ID), + EV_CODE(ABS_MT_PRESSURE), + EV_CODE(ABS_MT_DISTANCE), + EV_CODE(ABS_MAX), + EV_CODE_END, +}; + +/* Relative axes */ +#define REL_X 0x00 +#define REL_Y 0x01 +static const GoldfishEventCodeInfo ev_rel_codes_table[] = { + EV_CODE(REL_X), + EV_CODE(REL_Y), + EV_CODE_END, +}; + +#define BTN_MISC 0x100 +#define BTN_0 0x100 +#define BTN_1 0x101 +#define BTN_2 0x102 +#define BTN_3 0x103 +#define BTN_4 0x104 +#define BTN_5 0x105 +#define BTN_6 0x106 +#define BTN_7 0x107 +#define BTN_8 0x108 +#define BTN_9 0x109 +#define BTN_MOUSE 0x110 +#define BTN_LEFT 0x110 +#define BTN_RIGHT 0x111 +#define BTN_MIDDLE 0x112 +#define BTN_SIDE 0x113 +#define BTN_EXTRA 0x114 +#define BTN_FORWARD 0x115 +#define BTN_BACK 0x116 +#define BTN_TASK 0x117 +#define BTN_JOYSTICK 0x120 +#define BTN_TRIGGER 0x120 +#define BTN_THUMB 0x121 +#define BTN_THUMB2 0x122 +#define BTN_TOP 0x123 +#define BTN_TOP2 0x124 +#define BTN_PINKIE 0x125 +#define BTN_BASE 0x126 +#define BTN_BASE2 0x127 +#define BTN_BASE3 0x128 +#define BTN_BASE4 0x129 +#define BTN_BASE5 0x12a +#define BTN_BASE6 0x12b +#define BTN_DEAD 0x12f +#define BTN_GAMEPAD 0x130 +#define BTN_A 0x130 +#define BTN_B 0x131 +#define BTN_C 0x132 +#define BTN_X 0x133 +#define BTN_Y 0x134 +#define BTN_Z 0x135 +#define BTN_TL 0x136 +#define BTN_TR 0x137 +#define BTN_TL2 0x138 +#define BTN_TR2 0x139 +#define BTN_SELECT 0x13a +#define BTN_START 0x13b +#define BTN_MODE 0x13c +#define BTN_THUMBL 0x13d +#define BTN_THUMBR 0x13e +#define BTN_DIGI 0x140 +#define BTN_TOOL_PEN 0x140 +#define BTN_TOOL_RUBBER 0x141 +#define BTN_TOOL_BRUSH 0x142 +#define BTN_TOOL_PENCIL 0x143 +#define BTN_TOOL_AIRBRUSH 0x144 +#define BTN_TOOL_FINGER 0x145 +#define BTN_TOOL_MOUSE 0x146 +#define BTN_TOOL_LENS 0x147 +#define BTN_TOUCH 0x14a +#define BTN_STYLUS 0x14b +#define BTN_STYLUS2 0x14c +#define BTN_TOOL_DOUBLETAP 0x14d +#define BTN_TOOL_TRIPLETAP 0x14e +#define BTN_WHEEL 0x150 +#define BTN_GEAR_DOWN 0x150 +#define BTN_GEAR_UP 0x150 + +#define KEY_CODE(_name, _val) {#_name, _val} +#define BTN_CODE(_code) {#_code, (_code)} +static const GoldfishEventCodeInfo ev_key_codes_table[] = { + KEY_CODE(KEY_ESC, LINUX_KEY_ESC), + KEY_CODE(KEY_1, LINUX_KEY_1), + KEY_CODE(KEY_2, LINUX_KEY_2), + KEY_CODE(KEY_3, LINUX_KEY_3), + KEY_CODE(KEY_4, LINUX_KEY_4), + KEY_CODE(KEY_5, LINUX_KEY_5), + KEY_CODE(KEY_6, LINUX_KEY_6), + KEY_CODE(KEY_7, LINUX_KEY_7), + KEY_CODE(KEY_8, LINUX_KEY_8), + KEY_CODE(KEY_9, LINUX_KEY_9), + KEY_CODE(KEY_0, LINUX_KEY_0), + KEY_CODE(KEY_MINUS, LINUX_KEY_MINUS), + KEY_CODE(KEY_EQUAL, LINUX_KEY_EQUAL), + KEY_CODE(KEY_BACKSPACE, LINUX_KEY_BACKSPACE), + KEY_CODE(KEY_TAB, LINUX_KEY_TAB), + KEY_CODE(KEY_Q, LINUX_KEY_Q), + KEY_CODE(KEY_W, LINUX_KEY_W), + KEY_CODE(KEY_E, LINUX_KEY_E), + KEY_CODE(KEY_R, LINUX_KEY_R), + KEY_CODE(KEY_T, LINUX_KEY_T), + KEY_CODE(KEY_Y, LINUX_KEY_Y), + KEY_CODE(KEY_U, LINUX_KEY_U), + KEY_CODE(KEY_I, LINUX_KEY_I), + KEY_CODE(KEY_O, LINUX_KEY_O), + KEY_CODE(KEY_P, LINUX_KEY_P), + KEY_CODE(KEY_LEFTBRACE, LINUX_KEY_LEFTBRACE), + KEY_CODE(KEY_RIGHTBRACE, LINUX_KEY_RIGHTBRACE), + KEY_CODE(KEY_ENTER, LINUX_KEY_ENTER), + KEY_CODE(KEY_LEFTCTRL, LINUX_KEY_LEFTCTRL), + KEY_CODE(KEY_A, LINUX_KEY_A), + KEY_CODE(KEY_S, LINUX_KEY_S), + KEY_CODE(KEY_D, LINUX_KEY_D), + KEY_CODE(KEY_F, LINUX_KEY_F), + KEY_CODE(KEY_G, LINUX_KEY_G), + KEY_CODE(KEY_H, LINUX_KEY_H), + KEY_CODE(KEY_J, LINUX_KEY_J), + KEY_CODE(KEY_K, LINUX_KEY_K), + KEY_CODE(KEY_L, LINUX_KEY_L), + KEY_CODE(KEY_SEMICOLON, LINUX_KEY_SEMICOLON), + KEY_CODE(KEY_APOSTROPHE, LINUX_KEY_APOSTROPHE), + KEY_CODE(KEY_GRAVE, LINUX_KEY_GRAVE), + KEY_CODE(KEY_LEFTSHIFT, LINUX_KEY_LEFTSHIFT), + KEY_CODE(KEY_BACKSLASH, LINUX_KEY_BACKSLASH), + KEY_CODE(KEY_Z, LINUX_KEY_Z), + KEY_CODE(KEY_X, LINUX_KEY_X), + KEY_CODE(KEY_C, LINUX_KEY_C), + KEY_CODE(KEY_V, LINUX_KEY_V), + KEY_CODE(KEY_B, LINUX_KEY_B), + KEY_CODE(KEY_N, LINUX_KEY_N), + KEY_CODE(KEY_M, LINUX_KEY_M), + KEY_CODE(KEY_COMMA, LINUX_KEY_COMMA), + KEY_CODE(KEY_DOT, LINUX_KEY_DOT), + KEY_CODE(KEY_SLASH, LINUX_KEY_SLASH), + KEY_CODE(KEY_RIGHTSHIFT, LINUX_KEY_RIGHTSHIFT), + KEY_CODE(KEY_KPASTERISK, LINUX_KEY_KPASTERISK), + KEY_CODE(KEY_LEFTALT, LINUX_KEY_LEFTALT), + KEY_CODE(KEY_SPACE, LINUX_KEY_SPACE), + KEY_CODE(KEY_CAPSLOCK, LINUX_KEY_CAPSLOCK), + KEY_CODE(KEY_F1, LINUX_KEY_F1), + KEY_CODE(KEY_F2, LINUX_KEY_F2), + KEY_CODE(KEY_F3, LINUX_KEY_F3), + KEY_CODE(KEY_F4, LINUX_KEY_F4), + KEY_CODE(KEY_F5, LINUX_KEY_F5), + KEY_CODE(KEY_F6, LINUX_KEY_F6), + KEY_CODE(KEY_F7, LINUX_KEY_F7), + KEY_CODE(KEY_F8, LINUX_KEY_F8), + KEY_CODE(KEY_F9, LINUX_KEY_F9), + KEY_CODE(KEY_F10, LINUX_KEY_F10), + KEY_CODE(KEY_NUMLOCK, LINUX_KEY_NUMLOCK), + KEY_CODE(KEY_SCROLLLOCK, LINUX_KEY_SCROLLLOCK), + KEY_CODE(KEY_KP7, LINUX_KEY_KP7), + KEY_CODE(KEY_KP8, LINUX_KEY_KP8), + KEY_CODE(KEY_KP9, LINUX_KEY_KP9), + KEY_CODE(KEY_KPMINUS, LINUX_KEY_KPMINUS), + KEY_CODE(KEY_KP4, LINUX_KEY_KP4), + KEY_CODE(KEY_KP5, LINUX_KEY_KP5), + KEY_CODE(KEY_KP6, LINUX_KEY_KP6), + KEY_CODE(KEY_KPPLUS, LINUX_KEY_KPPLUS), + KEY_CODE(KEY_KP1, LINUX_KEY_KP1), + KEY_CODE(KEY_KP2, LINUX_KEY_KP2), + KEY_CODE(KEY_KP3, LINUX_KEY_KP3), + KEY_CODE(KEY_KP0, LINUX_KEY_KP0), + KEY_CODE(KEY_KPDOT, LINUX_KEY_KPDOT), + KEY_CODE(KEY_ZENKAKUHANKAKU, LINUX_KEY_ZENKAKUHANKAKU), + KEY_CODE(KEY_102ND, LINUX_KEY_102ND), + KEY_CODE(KEY_F11, LINUX_KEY_F11), + KEY_CODE(KEY_F12, LINUX_KEY_F12), + KEY_CODE(KEY_RO, LINUX_KEY_RO), + KEY_CODE(KEY_KATAKANA, LINUX_KEY_KATAKANA), + KEY_CODE(KEY_HIRAGANA, LINUX_KEY_HIRAGANA), + KEY_CODE(KEY_HENKAN, LINUX_KEY_HENKAN), + KEY_CODE(KEY_KATAKANAHIRAGANA, LINUX_KEY_KATAKANAHIRAGANA), + KEY_CODE(KEY_MUHENKAN, LINUX_KEY_MUHENKAN), + KEY_CODE(KEY_KPJPCOMMA, LINUX_KEY_KPJPCOMMA), + KEY_CODE(KEY_KPENTER, LINUX_KEY_KPENTER), + KEY_CODE(KEY_RIGHTCTRL, LINUX_KEY_RIGHTCTRL), + KEY_CODE(KEY_KPSLASH, LINUX_KEY_KPSLASH), + KEY_CODE(KEY_SYSRQ, LINUX_KEY_SYSRQ), + KEY_CODE(KEY_RIGHTALT, LINUX_KEY_RIGHTALT), + KEY_CODE(KEY_LINEFEED, LINUX_KEY_LINEFEED), + KEY_CODE(KEY_HOME, LINUX_KEY_HOME), + KEY_CODE(KEY_UP, LINUX_KEY_UP), + KEY_CODE(KEY_PAGEUP, LINUX_KEY_PAGEUP), + KEY_CODE(KEY_LEFT, LINUX_KEY_LEFT), + KEY_CODE(KEY_RIGHT, LINUX_KEY_RIGHT), + KEY_CODE(KEY_END, LINUX_KEY_END), + KEY_CODE(KEY_DOWN, LINUX_KEY_DOWN), + KEY_CODE(KEY_PAGEDOWN, LINUX_KEY_PAGEDOWN), + KEY_CODE(KEY_INSERT, LINUX_KEY_INSERT), + KEY_CODE(KEY_DELETE, LINUX_KEY_DELETE), + KEY_CODE(KEY_MACRO, LINUX_KEY_MACRO), + KEY_CODE(KEY_MUTE, LINUX_KEY_MUTE), + KEY_CODE(KEY_VOLUMEDOWN, LINUX_KEY_VOLUMEDOWN), + KEY_CODE(KEY_VOLUMEUP, LINUX_KEY_VOLUMEUP), + KEY_CODE(KEY_POWER, LINUX_KEY_POWER), + KEY_CODE(KEY_KPEQUAL, LINUX_KEY_KPEQUAL), + KEY_CODE(KEY_KPPLUSMINUS, LINUX_KEY_KPPLUSMINUS), + KEY_CODE(KEY_PAUSE, LINUX_KEY_PAUSE), + KEY_CODE(KEY_KPCOMMA, LINUX_KEY_KPCOMMA), + KEY_CODE(KEY_HANGEUL, LINUX_KEY_HANGEUL), + KEY_CODE(KEY_HANJA, LINUX_KEY_HANJA), + KEY_CODE(KEY_YEN, LINUX_KEY_YEN), + KEY_CODE(KEY_LEFTMETA, LINUX_KEY_LEFTMETA), + KEY_CODE(KEY_RIGHTMETA, LINUX_KEY_RIGHTMETA), + KEY_CODE(KEY_COMPOSE, LINUX_KEY_COMPOSE), + KEY_CODE(KEY_AGAIN, LINUX_KEY_AGAIN), + KEY_CODE(KEY_PROPS, LINUX_KEY_PROPS), + KEY_CODE(KEY_UNDO, LINUX_KEY_UNDO), + KEY_CODE(KEY_FRONT, LINUX_KEY_FRONT), + KEY_CODE(KEY_COPY, LINUX_KEY_COPY), + KEY_CODE(KEY_OPEN, LINUX_KEY_OPEN), + KEY_CODE(KEY_PASTE, LINUX_KEY_PASTE), + KEY_CODE(KEY_FIND, LINUX_KEY_FIND), + KEY_CODE(KEY_CUT, LINUX_KEY_CUT), + KEY_CODE(KEY_HELP, LINUX_KEY_HELP), + KEY_CODE(KEY_MENU, LINUX_KEY_MENU), + KEY_CODE(KEY_CALC, LINUX_KEY_CALC), + KEY_CODE(KEY_SETUP, LINUX_KEY_SETUP), + KEY_CODE(KEY_SLEEP, LINUX_KEY_SLEEP), + KEY_CODE(KEY_WAKEUP, LINUX_KEY_WAKEUP), + KEY_CODE(KEY_FILE, LINUX_KEY_FILE), + KEY_CODE(KEY_SENDFILE, LINUX_KEY_SENDFILE), + KEY_CODE(KEY_DELETEFILE, LINUX_KEY_DELETEFILE), + KEY_CODE(KEY_XFER, LINUX_KEY_XFER), + KEY_CODE(KEY_PROG1, LINUX_KEY_PROG1), + KEY_CODE(KEY_PROG2, LINUX_KEY_PROG2), + KEY_CODE(KEY_WWW, LINUX_KEY_WWW), + KEY_CODE(KEY_MSDOS, LINUX_KEY_MSDOS), + KEY_CODE(KEY_COFFEE, LINUX_KEY_COFFEE), + KEY_CODE(KEY_DIRECTION, LINUX_KEY_DIRECTION), + KEY_CODE(KEY_CYCLEWINDOWS, LINUX_KEY_CYCLEWINDOWS), + KEY_CODE(KEY_MAIL, LINUX_KEY_MAIL), + KEY_CODE(KEY_BOOKMARKS, LINUX_KEY_BOOKMARKS), + KEY_CODE(KEY_COMPUTER, LINUX_KEY_COMPUTER), + KEY_CODE(KEY_BACK, LINUX_KEY_BACK), + KEY_CODE(KEY_FORWARD, LINUX_KEY_FORWARD), + KEY_CODE(KEY_CLOSECD, LINUX_KEY_CLOSECD), + KEY_CODE(KEY_EJECTCD, LINUX_KEY_EJECTCD), + KEY_CODE(KEY_EJECTCLOSECD, LINUX_KEY_EJECTCLOSECD), + KEY_CODE(KEY_NEXTSONG, LINUX_KEY_NEXTSONG), + KEY_CODE(KEY_PLAYPAUSE, LINUX_KEY_PLAYPAUSE), + KEY_CODE(KEY_PREVIOUSSONG, LINUX_KEY_PREVIOUSSONG), + KEY_CODE(KEY_STOPCD, LINUX_KEY_STOPCD), + KEY_CODE(KEY_RECORD, LINUX_KEY_RECORD), + KEY_CODE(KEY_REWIND, LINUX_KEY_REWIND), + KEY_CODE(KEY_PHONE, LINUX_KEY_PHONE), + KEY_CODE(KEY_ISO, LINUX_KEY_ISO), + KEY_CODE(KEY_CONFIG, LINUX_KEY_CONFIG), + KEY_CODE(KEY_HOMEPAGE, LINUX_KEY_HOMEPAGE), + KEY_CODE(KEY_REFRESH, LINUX_KEY_REFRESH), + KEY_CODE(KEY_EXIT, LINUX_KEY_EXIT), + KEY_CODE(KEY_MOVE, LINUX_KEY_MOVE), + KEY_CODE(KEY_EDIT, LINUX_KEY_EDIT), + KEY_CODE(KEY_SCROLLUP, LINUX_KEY_SCROLLUP), + KEY_CODE(KEY_SCROLLDOWN, LINUX_KEY_SCROLLDOWN), + KEY_CODE(KEY_KPLEFTPAREN, LINUX_KEY_KPLEFTPAREN), + KEY_CODE(KEY_KPRIGHTPAREN, LINUX_KEY_KPRIGHTPAREN), + KEY_CODE(KEY_NEW, LINUX_KEY_NEW), + KEY_CODE(KEY_REDO, LINUX_KEY_REDO), + KEY_CODE(KEY_F13, LINUX_KEY_F13), + KEY_CODE(KEY_F14, LINUX_KEY_F14), + KEY_CODE(KEY_F15, LINUX_KEY_F15), + KEY_CODE(KEY_F16, LINUX_KEY_F16), + KEY_CODE(KEY_F17, LINUX_KEY_F17), + KEY_CODE(KEY_F18, LINUX_KEY_F18), + KEY_CODE(KEY_F19, LINUX_KEY_F19), + KEY_CODE(KEY_F20, LINUX_KEY_F20), + KEY_CODE(KEY_F21, LINUX_KEY_F21), + KEY_CODE(KEY_F22, LINUX_KEY_F22), + KEY_CODE(KEY_F23, LINUX_KEY_F23), + KEY_CODE(KEY_F24, LINUX_KEY_F24), + KEY_CODE(KEY_PLAYCD, LINUX_KEY_PLAYCD), + KEY_CODE(KEY_PAUSECD, LINUX_KEY_PAUSECD), + KEY_CODE(KEY_PROG3, LINUX_KEY_PROG3), + KEY_CODE(KEY_PROG4, LINUX_KEY_PROG4), + KEY_CODE(KEY_SUSPEND, LINUX_KEY_SUSPEND), + KEY_CODE(KEY_CLOSE, LINUX_KEY_CLOSE), + KEY_CODE(KEY_PLAY, LINUX_KEY_PLAY), + KEY_CODE(KEY_FASTFORWARD, LINUX_KEY_FASTFORWARD), + KEY_CODE(KEY_BASSBOOST, LINUX_KEY_BASSBOOST), + KEY_CODE(KEY_PRINT, LINUX_KEY_PRINT), + KEY_CODE(KEY_HP, LINUX_KEY_HP), + KEY_CODE(KEY_CAMERA, LINUX_KEY_CAMERA), + KEY_CODE(KEY_SOUND, LINUX_KEY_SOUND), + KEY_CODE(KEY_QUESTION, LINUX_KEY_QUESTION), + KEY_CODE(KEY_EMAIL, LINUX_KEY_EMAIL), + KEY_CODE(KEY_CHAT, LINUX_KEY_CHAT), + KEY_CODE(KEY_SEARCH, LINUX_KEY_SEARCH), + KEY_CODE(KEY_CONNECT, LINUX_KEY_CONNECT), + KEY_CODE(KEY_FINANCE, LINUX_KEY_FINANCE), + KEY_CODE(KEY_SPORT, LINUX_KEY_SPORT), + KEY_CODE(KEY_SHOP, LINUX_KEY_SHOP), + KEY_CODE(KEY_ALTERASE, LINUX_KEY_ALTERASE), + KEY_CODE(KEY_CANCEL, LINUX_KEY_CANCEL), + KEY_CODE(KEY_BRIGHTNESSDOWN, LINUX_KEY_BRIGHTNESSDOWN), + KEY_CODE(KEY_BRIGHTNESSUP, LINUX_KEY_BRIGHTNESSUP), + KEY_CODE(KEY_MEDIA, LINUX_KEY_MEDIA), + KEY_CODE(KEY_STAR, LINUX_KEY_STAR), + KEY_CODE(KEY_SHARP, LINUX_KEY_SHARP), + KEY_CODE(KEY_SOFT1, LINUX_KEY_SOFT1), + KEY_CODE(KEY_SOFT2, LINUX_KEY_SOFT2), + KEY_CODE(KEY_CENTER, LINUX_KEY_CENTER), + KEY_CODE(KEY_HEADSETHOOK, LINUX_KEY_HEADSETHOOK), + KEY_CODE(KEY_0_5, LINUX_KEY_0_5), + KEY_CODE(KEY_2_5, LINUX_KEY_2_5), + KEY_CODE(KEY_SWITCHVIDEOMODE, LINUX_KEY_SWITCHVIDEOMODE), + KEY_CODE(KEY_KBDILLUMTOGGLE, LINUX_KEY_KBDILLUMTOGGLE), + KEY_CODE(KEY_KBDILLUMDOWN, LINUX_KEY_KBDILLUMDOWN), + KEY_CODE(KEY_KBDILLUMUP, LINUX_KEY_KBDILLUMUP), + KEY_CODE(KEY_SEND, LINUX_KEY_SEND), + KEY_CODE(KEY_REPLY, LINUX_KEY_REPLY), + KEY_CODE(KEY_FORWARDMAIL, LINUX_KEY_FORWARDMAIL), + KEY_CODE(KEY_SAVE, LINUX_KEY_SAVE), + KEY_CODE(KEY_DOCUMENTS, LINUX_KEY_DOCUMENTS), + KEY_CODE(KEY_BATTERY, LINUX_KEY_BATTERY), + KEY_CODE(KEY_UNKNOWN, LINUX_KEY_UNKNOWN), + KEY_CODE(KEY_NUM, LINUX_KEY_NUM), + KEY_CODE(KEY_FOCUS, LINUX_KEY_FOCUS), + KEY_CODE(KEY_PLUS, LINUX_KEY_PLUS), + KEY_CODE(KEY_NOTIFICATION, LINUX_KEY_NOTIFICATION), + + BTN_CODE(BTN_MISC), + BTN_CODE(BTN_0), + BTN_CODE(BTN_1), + BTN_CODE(BTN_2), + BTN_CODE(BTN_3), + BTN_CODE(BTN_4), + BTN_CODE(BTN_5), + BTN_CODE(BTN_6), + BTN_CODE(BTN_7), + BTN_CODE(BTN_8), + BTN_CODE(BTN_9), + BTN_CODE(BTN_MOUSE), + BTN_CODE(BTN_LEFT), + BTN_CODE(BTN_RIGHT), + BTN_CODE(BTN_MIDDLE), + BTN_CODE(BTN_SIDE), + BTN_CODE(BTN_EXTRA), + BTN_CODE(BTN_FORWARD), + BTN_CODE(BTN_BACK), + BTN_CODE(BTN_TASK), + BTN_CODE(BTN_JOYSTICK), + BTN_CODE(BTN_TRIGGER), + BTN_CODE(BTN_THUMB), + BTN_CODE(BTN_THUMB2), + BTN_CODE(BTN_TOP), + BTN_CODE(BTN_TOP2), + BTN_CODE(BTN_PINKIE), + BTN_CODE(BTN_BASE), + BTN_CODE(BTN_BASE2), + BTN_CODE(BTN_BASE3), + BTN_CODE(BTN_BASE4), + BTN_CODE(BTN_BASE5), + BTN_CODE(BTN_BASE6), + BTN_CODE(BTN_DEAD), + BTN_CODE(BTN_GAMEPAD), + BTN_CODE(BTN_A), + BTN_CODE(BTN_B), + BTN_CODE(BTN_C), + BTN_CODE(BTN_X), + BTN_CODE(BTN_Y), + BTN_CODE(BTN_Z), + BTN_CODE(BTN_TL), + BTN_CODE(BTN_TR), + BTN_CODE(BTN_TL2), + BTN_CODE(BTN_TR2), + BTN_CODE(BTN_SELECT), + BTN_CODE(BTN_START), + BTN_CODE(BTN_MODE), + BTN_CODE(BTN_THUMBL), + BTN_CODE(BTN_THUMBR), + BTN_CODE(BTN_DIGI), + BTN_CODE(BTN_TOOL_PEN), + BTN_CODE(BTN_TOOL_RUBBER), + BTN_CODE(BTN_TOOL_BRUSH), + BTN_CODE(BTN_TOOL_PENCIL), + BTN_CODE(BTN_TOOL_AIRBRUSH), + BTN_CODE(BTN_TOOL_FINGER), + BTN_CODE(BTN_TOOL_MOUSE), + BTN_CODE(BTN_TOOL_LENS), + BTN_CODE(BTN_TOUCH), + BTN_CODE(BTN_STYLUS), + BTN_CODE(BTN_STYLUS2), + BTN_CODE(BTN_TOOL_DOUBLETAP), + BTN_CODE(BTN_TOOL_TRIPLETAP), + BTN_CODE(BTN_WHEEL), + BTN_CODE(BTN_GEAR_DOWN), + BTN_CODE(BTN_GEAR_UP), + EV_CODE_END, +}; + typedef struct { const char *name; int value; + const GoldfishEventCodeInfo *codes; } GoldfishEventTypeInfo; /* Event types (as per Linux input event layer) */ @@ -74,22 +494,22 @@ typedef struct { #define EV_FF_STATUS 0x17 #define EV_MAX 0x1f -#define EV_TYPE(_type) {#_type, (_type)} +#define EV_TYPE(_type, _codes) {#_type, (_type), _codes} #define EV_TYPE_END {NULL, 0} static const GoldfishEventTypeInfo ev_type_table[] = { - EV_TYPE(EV_SYN), - EV_TYPE(EV_KEY), - EV_TYPE(EV_REL), - EV_TYPE(EV_ABS), - EV_TYPE(EV_MSC), - EV_TYPE(EV_SW), - EV_TYPE(EV_LED), - EV_TYPE(EV_SND), - EV_TYPE(EV_REP), - EV_TYPE(EV_FF), - EV_TYPE(EV_PWR), - EV_TYPE(EV_FF_STATUS), - EV_TYPE(EV_MAX), + EV_TYPE(EV_SYN, NULL), + EV_TYPE(EV_KEY, ev_key_codes_table), + EV_TYPE(EV_REL, ev_rel_codes_table), + EV_TYPE(EV_ABS, ev_abs_codes_table), + EV_TYPE(EV_MSC, NULL), + EV_TYPE(EV_SW, NULL), + EV_TYPE(EV_LED, NULL), + EV_TYPE(EV_SND, NULL), + EV_TYPE(EV_REP, NULL), + EV_TYPE(EV_FF, NULL), + EV_TYPE(EV_PWR, NULL), + EV_TYPE(EV_FF_STATUS, NULL), + EV_TYPE(EV_MAX, NULL), EV_TYPE_END }; @@ -582,6 +1002,72 @@ int gf_get_event_type_value(char *typename) return ret; } +static const GoldfishEventCodeInfo *gf_get_event_code(int typeval, + const char *codename) +{ + const GoldfishEventTypeInfo *type = &ev_type_table[typeval]; + const GoldfishEventCodeInfo *code = NULL; + int count = 0; + + /* Find the type descriptor by doing a name match */ + while (type->codes[count].name != NULL) { + if (codename && !strcmp(type->codes[count].name, codename)) { + code = &type->codes[count]; + break; + } + count++; + } + + return code; +} + +int gf_get_event_code_count(const char *typename) +{ + const GoldfishEventTypeInfo *type = NULL; + const GoldfishEventCodeInfo *codes; + int count = -1; /* Return -1 if type not found */ + + type = gf_get_event_type(typename); + + /* Count the number of codes for the specified type if found */ + if (type) { + count = 0; + codes = type->codes; + if (codes) { + while (codes[count].name != NULL) { + count++; + } + } + } + + return count; +} + +int gf_get_event_code_name(const char *typename, unsigned int code, char *buf) +{ + const GoldfishEventTypeInfo *type = gf_get_event_type(typename); + int ret = -1; /* Return -1 if type not found */ + + if (type && type->codes && code < gf_get_event_code_count(typename)) { + g_stpcpy(buf, type->codes[code].name); + ret = 0; + } + + return ret; +} + +int gf_get_event_code_value(int typeval, char *codename) +{ + const GoldfishEventCodeInfo *code = gf_get_event_code(typeval, codename); + int ret = -1; + + if (code) { + ret = code->value; + } + + return ret; +} + static QemuInputHandler gf_evdev_key_input_handler = { .name = "goldfish event device key handler", .mask = INPUT_EVENT_MASK_KEY, diff --git a/include/hw/input/goldfish_events.h b/include/hw/input/goldfish_events.h index ef766d9bc..be426d599 100644 --- a/include/hw/input/goldfish_events.h +++ b/include/hw/input/goldfish_events.h @@ -15,5 +15,9 @@ extern int gf_get_event_type_count(void); extern int gf_get_event_type_name(int type, char *buf); extern int gf_get_event_type_value(char *codename); +extern int gf_get_event_code_count(const char *typename); +extern int gf_get_event_code_name(const char *typename, unsigned int code, + char *buf); +extern int gf_get_event_code_value(int typeval, char *codename); #endif |