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;