@samitouri / QOSamiQemu / commits / 7725e540a3

hw/m68k/next-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-15-7c9e4c7abe34@rsg.ci.i.u-tokyo.ac.jp>

Akihiko Odaki committed May 20, 2026 at 15:47 UTC 7725e540a329b3e85fef1e101cdc7468c6de02f1
1 file changed +59 -59
hw/m68k/next-kbd.c
+59 -59
@@ -31,6 +31,7 @@
31 #include "qemu/log.h"
32 #include "hw/core/sysbus.h"
33 #include "hw/m68k/next-cube.h"
34 +#include "standard-headers/linux/input-event-codes.h"
35 #include "ui/console.h"
36 #include "migration/vmstate.h"
37 #include "qom/object.h"
@@ -165,59 +166,59 @@ static const MemoryRegionOps kbd_ops = {
166 .endianness = DEVICE_BIG_ENDIAN,
167 };
168
168 -static const int qcode_to_nextkbd_keycode[] = {
169 - [Q_KEY_CODE_ESC] = 0x49,
170 - [Q_KEY_CODE_1] = 0x4a,
171 - [Q_KEY_CODE_2] = 0x4b,
172 - [Q_KEY_CODE_3] = 0x4c,
173 - [Q_KEY_CODE_4] = 0x4d,
174 - [Q_KEY_CODE_5] = 0x50,
175 - [Q_KEY_CODE_6] = 0x4f,
176 - [Q_KEY_CODE_7] = 0x4e,
177 - [Q_KEY_CODE_8] = 0x1e,
178 - [Q_KEY_CODE_9] = 0x1f,
179 - [Q_KEY_CODE_0] = 0x20,
180 - [Q_KEY_CODE_MINUS] = 0x1d,
181 - [Q_KEY_CODE_EQUAL] = 0x1c,
182 - [Q_KEY_CODE_BACKSPACE] = 0x1b,
183 -
184 - [Q_KEY_CODE_Q] = 0x42,
185 - [Q_KEY_CODE_W] = 0x43,
186 - [Q_KEY_CODE_E] = 0x44,
187 - [Q_KEY_CODE_R] = 0x45,
188 - [Q_KEY_CODE_T] = 0x48,
189 - [Q_KEY_CODE_Y] = 0x47,
190 - [Q_KEY_CODE_U] = 0x46,
191 - [Q_KEY_CODE_I] = 0x06,
192 - [Q_KEY_CODE_O] = 0x07,
193 - [Q_KEY_CODE_P] = 0x08,
194 - [Q_KEY_CODE_RET] = 0x2a,
195 - [Q_KEY_CODE_A] = 0x39,
196 - [Q_KEY_CODE_S] = 0x3a,
197 -
198 - [Q_KEY_CODE_D] = 0x3b,
199 - [Q_KEY_CODE_F] = 0x3c,
200 - [Q_KEY_CODE_G] = 0x3d,
201 - [Q_KEY_CODE_H] = 0x40,
202 - [Q_KEY_CODE_J] = 0x3f,
203 - [Q_KEY_CODE_K] = 0x3e,
204 - [Q_KEY_CODE_L] = 0x2d,
205 - [Q_KEY_CODE_SEMICOLON] = 0x2c,
206 - [Q_KEY_CODE_APOSTROPHE] = 0x2b,
207 - [Q_KEY_CODE_GRAVE_ACCENT] = 0x26,
208 - [Q_KEY_CODE_Z] = 0x31,
209 - [Q_KEY_CODE_X] = 0x32,
210 - [Q_KEY_CODE_C] = 0x33,
211 - [Q_KEY_CODE_V] = 0x34,
212 -
213 - [Q_KEY_CODE_B] = 0x35,
214 - [Q_KEY_CODE_N] = 0x37,
215 - [Q_KEY_CODE_M] = 0x36,
216 - [Q_KEY_CODE_COMMA] = 0x2e,
217 - [Q_KEY_CODE_DOT] = 0x2f,
218 - [Q_KEY_CODE_SLASH] = 0x30,
219 -
220 - [Q_KEY_CODE_SPC] = 0x38,
169 +static const int linux_to_nextkbd_keycode[] = {
170 + [KEY_ESC] = 0x49,
171 + [KEY_1] = 0x4a,
172 + [KEY_2] = 0x4b,
173 + [KEY_3] = 0x4c,
174 + [KEY_4] = 0x4d,
175 + [KEY_5] = 0x50,
176 + [KEY_6] = 0x4f,
177 + [KEY_7] = 0x4e,
178 + [KEY_8] = 0x1e,
179 + [KEY_9] = 0x1f,
180 + [KEY_0] = 0x20,
181 + [KEY_MINUS] = 0x1d,
182 + [KEY_EQUAL] = 0x1c,
183 + [KEY_BACKSPACE] = 0x1b,
184 +
185 + [KEY_Q] = 0x42,
186 + [KEY_W] = 0x43,
187 + [KEY_E] = 0x44,
188 + [KEY_R] = 0x45,
189 + [KEY_T] = 0x48,
190 + [KEY_Y] = 0x47,
191 + [KEY_U] = 0x46,
192 + [KEY_I] = 0x06,
193 + [KEY_O] = 0x07,
194 + [KEY_P] = 0x08,
195 + [KEY_ENTER] = 0x2a,
196 + [KEY_A] = 0x39,
197 + [KEY_S] = 0x3a,
198 +
199 + [KEY_D] = 0x3b,
200 + [KEY_F] = 0x3c,
201 + [KEY_G] = 0x3d,
202 + [KEY_H] = 0x40,
203 + [KEY_J] = 0x3f,
204 + [KEY_K] = 0x3e,
205 + [KEY_L] = 0x2d,
206 + [KEY_SEMICOLON] = 0x2c,
207 + [KEY_APOSTROPHE] = 0x2b,
208 + [KEY_GRAVE] = 0x26,
209 + [KEY_Z] = 0x31,
210 + [KEY_X] = 0x32,
211 + [KEY_C] = 0x33,
212 + [KEY_V] = 0x34,
213 +
214 + [KEY_B] = 0x35,
215 + [KEY_N] = 0x37,
216 + [KEY_M] = 0x36,
217 + [KEY_COMMA] = 0x2e,
218 + [KEY_DOT] = 0x2f,
219 + [KEY_SLASH] = 0x30,
220 +
221 + [KEY_SPACE] = 0x38,
222 };
223
224 static void nextkbd_put_keycode(NextKBDState *s, int keycode)
@@ -246,15 +247,14 @@ static void nextkbd_event(DeviceState *dev, QemuConsole *src,
247 QemuInputEvent *evt)
248 {
249 NextKBDState *s = NEXTKBD(dev);
249 - int qcode, keycode;
250 + int keycode;
251
251 - qcode = qemu_input_linux_to_qcode(evt->key.key);
252 - if (qcode >= ARRAY_SIZE(qcode_to_nextkbd_keycode)) {
252 + if (evt->key.key >= ARRAY_SIZE(linux_to_nextkbd_keycode)) {
253 return;
254 }
255
256 /* Shift key currently has no keycode, so handle separately */
257 - if (qcode == Q_KEY_CODE_SHIFT) {
257 + if (evt->key.key == KEY_LEFTSHIFT) {
258 if (evt->key.down) {
259 s->shift |= KD_LSHIFT;
260 } else {
@@ -262,7 +262,7 @@ static void nextkbd_event(DeviceState *dev, QemuConsole *src,
262 }
263 }
264
265 - if (qcode == Q_KEY_CODE_SHIFT_R) {
265 + if (evt->key.key == KEY_RIGHTSHIFT) {
266 if (evt->key.down) {
267 s->shift |= KD_RSHIFT;
268 } else {
@@ -270,7 +270,7 @@ static void nextkbd_event(DeviceState *dev, QemuConsole *src,
270 }
271 }
272
273 - keycode = qcode_to_nextkbd_keycode[qcode];
273 + keycode = linux_to_nextkbd_keycode[evt->key.key];
274 if (!keycode) {
275 return;
276 }