@samitouri / QOSamiQemu / commits / 94cee809f7

hw/input/adb-kbd: Use Linux key codes

QemuInputEvent now stores Linux key codes for key events. Use those codes directly instead of translating between internal key code representations. Signed-off-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-ID: <20260520-input-v3-11-7c9e4c7abe34@rsg.ci.i.u-tokyo.ac.jp>

Akihiko Odaki committed May 20, 2026 at 15:47 UTC 94cee809f7bdec5199bb9d6385e739a64b5a4574
1 file changed +120 -122
hw/input/adb-kbd.c
+120 -122
@@ -26,6 +26,7 @@
26 #include "hw/input/adb.h"
27 #include "migration/vmstate.h"
28 #include "qemu/module.h"
29 +#include "standard-headers/linux/input-event-codes.h"
30 #include "ui/input.h"
31 #include "hw/input/adb-keys.h"
32 #include "adb-internal.h"
@@ -55,124 +56,122 @@ struct ADBKeyboardClass {
56 /* The adb keyboard doesn't have every key imaginable */
57 #define NO_KEY 0xff
58
58 -int qcode_to_adb_keycode[] = {
59 +int linux_to_adb_keycode[] = {
60 /* Make sure future additions are automatically set to NO_KEY */
60 - [0 ... 0xff] = NO_KEY,
61 -
62 - [Q_KEY_CODE_SHIFT] = ADB_KEY_LEFT_SHIFT,
63 - [Q_KEY_CODE_SHIFT_R] = ADB_KEY_RIGHT_SHIFT,
64 - [Q_KEY_CODE_ALT] = ADB_KEY_LEFT_OPTION,
65 - [Q_KEY_CODE_ALT_R] = ADB_KEY_RIGHT_OPTION,
66 - [Q_KEY_CODE_CTRL] = ADB_KEY_LEFT_CONTROL,
67 - [Q_KEY_CODE_CTRL_R] = ADB_KEY_RIGHT_CONTROL,
68 - [Q_KEY_CODE_META_L] = ADB_KEY_COMMAND,
69 - [Q_KEY_CODE_META_R] = ADB_KEY_COMMAND,
70 - [Q_KEY_CODE_SPC] = ADB_KEY_SPACEBAR,
71 -
72 - [Q_KEY_CODE_ESC] = ADB_KEY_ESC,
73 - [Q_KEY_CODE_1] = ADB_KEY_1,
74 - [Q_KEY_CODE_2] = ADB_KEY_2,
75 - [Q_KEY_CODE_3] = ADB_KEY_3,
76 - [Q_KEY_CODE_4] = ADB_KEY_4,
77 - [Q_KEY_CODE_5] = ADB_KEY_5,
78 - [Q_KEY_CODE_6] = ADB_KEY_6,
79 - [Q_KEY_CODE_7] = ADB_KEY_7,
80 - [Q_KEY_CODE_8] = ADB_KEY_8,
81 - [Q_KEY_CODE_9] = ADB_KEY_9,
82 - [Q_KEY_CODE_0] = ADB_KEY_0,
83 - [Q_KEY_CODE_MINUS] = ADB_KEY_MINUS,
84 - [Q_KEY_CODE_EQUAL] = ADB_KEY_EQUAL,
85 - [Q_KEY_CODE_BACKSPACE] = ADB_KEY_DELETE,
86 - [Q_KEY_CODE_TAB] = ADB_KEY_TAB,
87 - [Q_KEY_CODE_Q] = ADB_KEY_Q,
88 - [Q_KEY_CODE_W] = ADB_KEY_W,
89 - [Q_KEY_CODE_E] = ADB_KEY_E,
90 - [Q_KEY_CODE_R] = ADB_KEY_R,
91 - [Q_KEY_CODE_T] = ADB_KEY_T,
92 - [Q_KEY_CODE_Y] = ADB_KEY_Y,
93 - [Q_KEY_CODE_U] = ADB_KEY_U,
94 - [Q_KEY_CODE_I] = ADB_KEY_I,
95 - [Q_KEY_CODE_O] = ADB_KEY_O,
96 - [Q_KEY_CODE_P] = ADB_KEY_P,
97 - [Q_KEY_CODE_BRACKET_LEFT] = ADB_KEY_LEFT_BRACKET,
98 - [Q_KEY_CODE_BRACKET_RIGHT] = ADB_KEY_RIGHT_BRACKET,
99 - [Q_KEY_CODE_RET] = ADB_KEY_RETURN,
100 - [Q_KEY_CODE_A] = ADB_KEY_A,
101 - [Q_KEY_CODE_S] = ADB_KEY_S,
102 - [Q_KEY_CODE_D] = ADB_KEY_D,
103 - [Q_KEY_CODE_F] = ADB_KEY_F,
104 - [Q_KEY_CODE_G] = ADB_KEY_G,
105 - [Q_KEY_CODE_H] = ADB_KEY_H,
106 - [Q_KEY_CODE_J] = ADB_KEY_J,
107 - [Q_KEY_CODE_K] = ADB_KEY_K,
108 - [Q_KEY_CODE_L] = ADB_KEY_L,
109 - [Q_KEY_CODE_SEMICOLON] = ADB_KEY_SEMICOLON,
110 - [Q_KEY_CODE_APOSTROPHE] = ADB_KEY_APOSTROPHE,
111 - [Q_KEY_CODE_GRAVE_ACCENT] = ADB_KEY_GRAVE_ACCENT,
112 - [Q_KEY_CODE_BACKSLASH] = ADB_KEY_BACKSLASH,
113 - [Q_KEY_CODE_Z] = ADB_KEY_Z,
114 - [Q_KEY_CODE_X] = ADB_KEY_X,
115 - [Q_KEY_CODE_C] = ADB_KEY_C,
116 - [Q_KEY_CODE_V] = ADB_KEY_V,
117 - [Q_KEY_CODE_B] = ADB_KEY_B,
118 - [Q_KEY_CODE_N] = ADB_KEY_N,
119 - [Q_KEY_CODE_M] = ADB_KEY_M,
120 - [Q_KEY_CODE_COMMA] = ADB_KEY_COMMA,
121 - [Q_KEY_CODE_DOT] = ADB_KEY_PERIOD,
122 - [Q_KEY_CODE_SLASH] = ADB_KEY_FORWARD_SLASH,
123 - [Q_KEY_CODE_ASTERISK] = ADB_KEY_KP_MULTIPLY,
124 - [Q_KEY_CODE_CAPS_LOCK] = ADB_KEY_CAPS_LOCK,
125 -
126 - [Q_KEY_CODE_F1] = ADB_KEY_F1,
127 - [Q_KEY_CODE_F2] = ADB_KEY_F2,
128 - [Q_KEY_CODE_F3] = ADB_KEY_F3,
129 - [Q_KEY_CODE_F4] = ADB_KEY_F4,
130 - [Q_KEY_CODE_F5] = ADB_KEY_F5,
131 - [Q_KEY_CODE_F6] = ADB_KEY_F6,
132 - [Q_KEY_CODE_F7] = ADB_KEY_F7,
133 - [Q_KEY_CODE_F8] = ADB_KEY_F8,
134 - [Q_KEY_CODE_F9] = ADB_KEY_F9,
135 - [Q_KEY_CODE_F10] = ADB_KEY_F10,
136 - [Q_KEY_CODE_F11] = ADB_KEY_F11,
137 - [Q_KEY_CODE_F12] = ADB_KEY_F12,
138 - [Q_KEY_CODE_PRINT] = ADB_KEY_F13,
139 - [Q_KEY_CODE_SYSRQ] = ADB_KEY_F13,
140 - [Q_KEY_CODE_SCROLL_LOCK] = ADB_KEY_F14,
141 - [Q_KEY_CODE_PAUSE] = ADB_KEY_F15,
142 -
143 - [Q_KEY_CODE_NUM_LOCK] = ADB_KEY_KP_CLEAR,
144 - [Q_KEY_CODE_KP_EQUALS] = ADB_KEY_KP_EQUAL,
145 - [Q_KEY_CODE_KP_DIVIDE] = ADB_KEY_KP_DIVIDE,
146 - [Q_KEY_CODE_KP_MULTIPLY] = ADB_KEY_KP_MULTIPLY,
147 - [Q_KEY_CODE_KP_SUBTRACT] = ADB_KEY_KP_SUBTRACT,
148 - [Q_KEY_CODE_KP_ADD] = ADB_KEY_KP_PLUS,
149 - [Q_KEY_CODE_KP_ENTER] = ADB_KEY_KP_ENTER,
150 - [Q_KEY_CODE_KP_DECIMAL] = ADB_KEY_KP_PERIOD,
151 - [Q_KEY_CODE_KP_0] = ADB_KEY_KP_0,
152 - [Q_KEY_CODE_KP_1] = ADB_KEY_KP_1,
153 - [Q_KEY_CODE_KP_2] = ADB_KEY_KP_2,
154 - [Q_KEY_CODE_KP_3] = ADB_KEY_KP_3,
155 - [Q_KEY_CODE_KP_4] = ADB_KEY_KP_4,
156 - [Q_KEY_CODE_KP_5] = ADB_KEY_KP_5,
157 - [Q_KEY_CODE_KP_6] = ADB_KEY_KP_6,
158 - [Q_KEY_CODE_KP_7] = ADB_KEY_KP_7,
159 - [Q_KEY_CODE_KP_8] = ADB_KEY_KP_8,
160 - [Q_KEY_CODE_KP_9] = ADB_KEY_KP_9,
161 -
162 - [Q_KEY_CODE_UP] = ADB_KEY_UP,
163 - [Q_KEY_CODE_DOWN] = ADB_KEY_DOWN,
164 - [Q_KEY_CODE_LEFT] = ADB_KEY_LEFT,
165 - [Q_KEY_CODE_RIGHT] = ADB_KEY_RIGHT,
166 -
167 - [Q_KEY_CODE_HELP] = ADB_KEY_HELP,
168 - [Q_KEY_CODE_INSERT] = ADB_KEY_HELP,
169 - [Q_KEY_CODE_DELETE] = ADB_KEY_FORWARD_DELETE,
170 - [Q_KEY_CODE_HOME] = ADB_KEY_HOME,
171 - [Q_KEY_CODE_END] = ADB_KEY_END,
172 - [Q_KEY_CODE_PGUP] = ADB_KEY_PAGE_UP,
173 - [Q_KEY_CODE_PGDN] = ADB_KEY_PAGE_DOWN,
174 -
175 - [Q_KEY_CODE_POWER] = ADB_KEY_POWER
61 + [0 ... KEY_MAX] = NO_KEY,
62 +
63 + [KEY_LEFTSHIFT] = ADB_KEY_LEFT_SHIFT,
64 + [KEY_RIGHTSHIFT] = ADB_KEY_RIGHT_SHIFT,
65 + [KEY_LEFTALT] = ADB_KEY_LEFT_OPTION,
66 + [KEY_RIGHTALT] = ADB_KEY_RIGHT_OPTION,
67 + [KEY_LEFTCTRL] = ADB_KEY_LEFT_CONTROL,
68 + [KEY_RIGHTCTRL] = ADB_KEY_RIGHT_CONTROL,
69 + [KEY_LEFTMETA] = ADB_KEY_COMMAND,
70 + [KEY_RIGHTMETA] = ADB_KEY_COMMAND,
71 + [KEY_SPACE] = ADB_KEY_SPACEBAR,
72 +
73 + [KEY_ESC] = ADB_KEY_ESC,
74 + [KEY_1] = ADB_KEY_1,
75 + [KEY_2] = ADB_KEY_2,
76 + [KEY_3] = ADB_KEY_3,
77 + [KEY_4] = ADB_KEY_4,
78 + [KEY_5] = ADB_KEY_5,
79 + [KEY_6] = ADB_KEY_6,
80 + [KEY_7] = ADB_KEY_7,
81 + [KEY_8] = ADB_KEY_8,
82 + [KEY_9] = ADB_KEY_9,
83 + [KEY_0] = ADB_KEY_0,
84 + [KEY_MINUS] = ADB_KEY_MINUS,
85 + [KEY_EQUAL] = ADB_KEY_EQUAL,
86 + [KEY_BACKSPACE] = ADB_KEY_DELETE,
87 + [KEY_TAB] = ADB_KEY_TAB,
88 + [KEY_Q] = ADB_KEY_Q,
89 + [KEY_W] = ADB_KEY_W,
90 + [KEY_E] = ADB_KEY_E,
91 + [KEY_R] = ADB_KEY_R,
92 + [KEY_T] = ADB_KEY_T,
93 + [KEY_Y] = ADB_KEY_Y,
94 + [KEY_U] = ADB_KEY_U,
95 + [KEY_I] = ADB_KEY_I,
96 + [KEY_O] = ADB_KEY_O,
97 + [KEY_P] = ADB_KEY_P,
98 + [KEY_LEFTBRACE] = ADB_KEY_LEFT_BRACKET,
99 + [KEY_RIGHTBRACE] = ADB_KEY_RIGHT_BRACKET,
100 + [KEY_ENTER] = ADB_KEY_RETURN,
101 + [KEY_A] = ADB_KEY_A,
102 + [KEY_S] = ADB_KEY_S,
103 + [KEY_D] = ADB_KEY_D,
104 + [KEY_F] = ADB_KEY_F,
105 + [KEY_G] = ADB_KEY_G,
106 + [KEY_H] = ADB_KEY_H,
107 + [KEY_J] = ADB_KEY_J,
108 + [KEY_K] = ADB_KEY_K,
109 + [KEY_L] = ADB_KEY_L,
110 + [KEY_SEMICOLON] = ADB_KEY_SEMICOLON,
111 + [KEY_APOSTROPHE] = ADB_KEY_APOSTROPHE,
112 + [KEY_GRAVE] = ADB_KEY_GRAVE_ACCENT,
113 + [KEY_BACKSLASH] = ADB_KEY_BACKSLASH,
114 + [KEY_Z] = ADB_KEY_Z,
115 + [KEY_X] = ADB_KEY_X,
116 + [KEY_C] = ADB_KEY_C,
117 + [KEY_V] = ADB_KEY_V,
118 + [KEY_B] = ADB_KEY_B,
119 + [KEY_N] = ADB_KEY_N,
120 + [KEY_M] = ADB_KEY_M,
121 + [KEY_COMMA] = ADB_KEY_COMMA,
122 + [KEY_DOT] = ADB_KEY_PERIOD,
123 + [KEY_SLASH] = ADB_KEY_FORWARD_SLASH,
124 + [KEY_CAPSLOCK] = ADB_KEY_CAPS_LOCK,
125 +
126 + [KEY_F1] = ADB_KEY_F1,
127 + [KEY_F2] = ADB_KEY_F2,
128 + [KEY_F3] = ADB_KEY_F3,
129 + [KEY_F4] = ADB_KEY_F4,
130 + [KEY_F5] = ADB_KEY_F5,
131 + [KEY_F6] = ADB_KEY_F6,
132 + [KEY_F7] = ADB_KEY_F7,
133 + [KEY_F8] = ADB_KEY_F8,
134 + [KEY_F9] = ADB_KEY_F9,
135 + [KEY_F10] = ADB_KEY_F10,
136 + [KEY_F11] = ADB_KEY_F11,
137 + [KEY_F12] = ADB_KEY_F12,
138 + [KEY_SYSRQ] = ADB_KEY_F13,
139 + [KEY_SCROLLLOCK] = ADB_KEY_F14,
140 + [KEY_PAUSE] = ADB_KEY_F15,
141 +
142 + [KEY_NUMLOCK] = ADB_KEY_KP_CLEAR,
143 + [KEY_KPEQUAL] = ADB_KEY_KP_EQUAL,
144 + [KEY_KPSLASH] = ADB_KEY_KP_DIVIDE,
145 + [KEY_KPASTERISK] = ADB_KEY_KP_MULTIPLY,
146 + [KEY_KPMINUS] = ADB_KEY_KP_SUBTRACT,
147 + [KEY_KPPLUS] = ADB_KEY_KP_PLUS,
148 + [KEY_KPENTER] = ADB_KEY_KP_ENTER,
149 + [KEY_KPDOT] = ADB_KEY_KP_PERIOD,
150 + [KEY_KP0] = ADB_KEY_KP_0,
151 + [KEY_KP1] = ADB_KEY_KP_1,
152 + [KEY_KP2] = ADB_KEY_KP_2,
153 + [KEY_KP3] = ADB_KEY_KP_3,
154 + [KEY_KP4] = ADB_KEY_KP_4,
155 + [KEY_KP5] = ADB_KEY_KP_5,
156 + [KEY_KP6] = ADB_KEY_KP_6,
157 + [KEY_KP7] = ADB_KEY_KP_7,
158 + [KEY_KP8] = ADB_KEY_KP_8,
159 + [KEY_KP9] = ADB_KEY_KP_9,
160 +
161 + [KEY_UP] = ADB_KEY_UP,
162 + [KEY_DOWN] = ADB_KEY_DOWN,
163 + [KEY_LEFT] = ADB_KEY_LEFT,
164 + [KEY_RIGHT] = ADB_KEY_RIGHT,
165 +
166 + [KEY_HELP] = ADB_KEY_HELP,
167 + [KEY_INSERT] = ADB_KEY_HELP,
168 + [KEY_DELETE] = ADB_KEY_FORWARD_DELETE,
169 + [KEY_HOME] = ADB_KEY_HOME,
170 + [KEY_END] = ADB_KEY_END,
171 + [KEY_PAGEUP] = ADB_KEY_PAGE_UP,
172 + [KEY_PAGEDOWN] = ADB_KEY_PAGE_DOWN,
173 +
174 + [KEY_POWER] = ADB_KEY_POWER
175 };
176
177 static void adb_kbd_put_keycode(void *opaque, int keycode)
@@ -309,14 +308,13 @@ static void adb_keyboard_event(DeviceState *dev, QemuConsole *src,
308 QemuInputEvent *evt)
309 {
310 KBDState *s = (KBDState *)dev;
312 - int qcode, keycode;
311 + int keycode;
312
314 - qcode = qemu_input_linux_to_qcode(evt->key.key);
315 - if (qcode >= ARRAY_SIZE(qcode_to_adb_keycode)) {
313 + if (evt->key.key >= ARRAY_SIZE(linux_to_adb_keycode)) {
314 return;
315 }
318 - /* FIXME: take handler into account when translating qcode */
319 - keycode = qcode_to_adb_keycode[qcode];
316 + /* FIXME: take handler into account when translating evt->key.key */
317 + keycode = linux_to_adb_keycode[evt->key.key];
318 if (keycode == NO_KEY) { /* We don't want to send this to the guest */
319 trace_adb_device_kbd_no_key();
320 return;