summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hw/input/goldfish_events.c514
-rw-r--r--include/hw/input/goldfish_events.h4
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