@samitouri / QOSamiQemu / commits / eb0608e88e

ui/console: Add qemu_text_console_put_linux()

Add a text console helper that accepts Linux input key codes and use it as the common implementation for qemu_text_console_put_qcode(). This lets callers that already use Linux key codes avoid converting them back to QKeyCode. 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-6-7c9e4c7abe34@rsg.ci.i.u-tokyo.ac.jp>

Akihiko Odaki committed May 20, 2026 at 15:47 UTC eb0608e88e1a9ccfd1308eb0da1067b85f0840c9
2 files changed +46 -22
include/ui/console.h
+2
@@ -109,6 +109,8 @@ bool qemu_mouse_set(int index, Error **errp);
109
110 void qemu_text_console_put_keysym(QemuTextConsole *s, int keysym);
111 bool qemu_text_console_put_qcode(QemuTextConsole *s, int qcode, bool ctrl);
112 +bool qemu_text_console_put_linux(QemuTextConsole *s, unsigned int lnx,
113 + bool ctrl);
114 void qemu_text_console_put_string(QemuTextConsole *s, const char *str, int len);
115
116 /* consoles */
ui/console.c
+44 -22
@@ -23,6 +23,7 @@
23 */
24
25 #include "qemu/osdep.h"
26 +#include "standard-headers/linux/input-event-codes.h"
27 #include "ui/console.h"
28 #include "ui/vgafont.h"
29 #include "hw/core/qdev.h"
@@ -302,36 +303,57 @@ void qemu_text_console_put_keysym(QemuTextConsole *s, int keysym)
303 qemu_text_console_handle_keysym(s, keysym);
304 }
305
305 -static const int qcode_to_keysym[Q_KEY_CODE__MAX] = {
306 - [Q_KEY_CODE_UP] = QEMU_KEY_UP,
307 - [Q_KEY_CODE_DOWN] = QEMU_KEY_DOWN,
308 - [Q_KEY_CODE_RIGHT] = QEMU_KEY_RIGHT,
309 - [Q_KEY_CODE_LEFT] = QEMU_KEY_LEFT,
310 - [Q_KEY_CODE_HOME] = QEMU_KEY_HOME,
311 - [Q_KEY_CODE_END] = QEMU_KEY_END,
312 - [Q_KEY_CODE_PGUP] = QEMU_KEY_PAGEUP,
313 - [Q_KEY_CODE_PGDN] = QEMU_KEY_PAGEDOWN,
314 - [Q_KEY_CODE_DELETE] = QEMU_KEY_DELETE,
315 - [Q_KEY_CODE_TAB] = QEMU_KEY_TAB,
316 - [Q_KEY_CODE_BACKSPACE] = QEMU_KEY_BACKSPACE,
306 +static const int linux_to_keysym[] = {
307 + [KEY_UP] = QEMU_KEY_UP,
308 + [KEY_DOWN] = QEMU_KEY_DOWN,
309 + [KEY_RIGHT] = QEMU_KEY_RIGHT,
310 + [KEY_LEFT] = QEMU_KEY_LEFT,
311 + [KEY_HOME] = QEMU_KEY_HOME,
312 + [KEY_END] = QEMU_KEY_END,
313 + [KEY_PAGEUP] = QEMU_KEY_PAGEUP,
314 + [KEY_PAGEDOWN] = QEMU_KEY_PAGEDOWN,
315 + [KEY_DELETE] = QEMU_KEY_DELETE,
316 + [KEY_TAB] = QEMU_KEY_TAB,
317 + [KEY_BACKSPACE] = QEMU_KEY_BACKSPACE,
318 };
319
319 -static const int ctrl_qcode_to_keysym[Q_KEY_CODE__MAX] = {
320 - [Q_KEY_CODE_UP] = QEMU_KEY_CTRL_UP,
321 - [Q_KEY_CODE_DOWN] = QEMU_KEY_CTRL_DOWN,
322 - [Q_KEY_CODE_RIGHT] = QEMU_KEY_CTRL_RIGHT,
323 - [Q_KEY_CODE_LEFT] = QEMU_KEY_CTRL_LEFT,
324 - [Q_KEY_CODE_HOME] = QEMU_KEY_CTRL_HOME,
325 - [Q_KEY_CODE_END] = QEMU_KEY_CTRL_END,
326 - [Q_KEY_CODE_PGUP] = QEMU_KEY_CTRL_PAGEUP,
327 - [Q_KEY_CODE_PGDN] = QEMU_KEY_CTRL_PAGEDOWN,
320 +static const int ctrl_linux_to_keysym[] = {
321 + [KEY_UP] = QEMU_KEY_CTRL_UP,
322 + [KEY_DOWN] = QEMU_KEY_CTRL_DOWN,
323 + [KEY_RIGHT] = QEMU_KEY_CTRL_RIGHT,
324 + [KEY_LEFT] = QEMU_KEY_CTRL_LEFT,
325 + [KEY_HOME] = QEMU_KEY_CTRL_HOME,
326 + [KEY_END] = QEMU_KEY_CTRL_END,
327 + [KEY_PAGEUP] = QEMU_KEY_CTRL_PAGEUP,
328 + [KEY_PAGEDOWN] = QEMU_KEY_CTRL_PAGEDOWN,
329 };
330
331 bool qemu_text_console_put_qcode(QemuTextConsole *s, int qcode, bool ctrl)
332 {
333 + unsigned int lnx = qemu_input_map_qcode_to_linux[qcode];
334 + return qemu_text_console_put_linux(s, lnx, ctrl);
335 +}
336 +
337 +bool qemu_text_console_put_linux(QemuTextConsole *s, unsigned int lnx,
338 + bool ctrl)
339 +{
340 + size_t maplen;
341 + const int *map;
342 int keysym;
343
334 - keysym = ctrl ? ctrl_qcode_to_keysym[qcode] : qcode_to_keysym[qcode];
344 + if (ctrl) {
345 + maplen = ARRAY_SIZE(ctrl_linux_to_keysym);
346 + map = ctrl_linux_to_keysym;
347 + } else {
348 + maplen = ARRAY_SIZE(linux_to_keysym);
349 + map = linux_to_keysym;
350 + }
351 +
352 + if (lnx >= maplen) {
353 + return false;
354 + }
355 +
356 + keysym = map[lnx];
357 if (keysym == 0) {
358 return false;
359 }