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 <[email protected]> --- include/ui/console.h | 2 ++ ui/console.c | 66 ++++++++++++++++++++++++++++++++++------------------ 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/include/ui/console.h b/include/ui/console.h index cfa940d4c666..691040f5948d 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -109,6 +109,8 @@ bool qemu_mouse_set(int index, Error **errp); void qemu_text_console_put_keysym(QemuTextConsole *s, int keysym); bool qemu_text_console_put_qcode(QemuTextConsole *s, int qcode, bool ctrl); +bool qemu_text_console_put_linux(QemuTextConsole *s, unsigned int lnx, + bool ctrl); void qemu_text_console_put_string(QemuTextConsole *s, const char *str, int len); /* consoles */ diff --git a/ui/console.c b/ui/console.c index eaa410867431..2dcb4660fbf8 100644 --- a/ui/console.c +++ b/ui/console.c @@ -23,6 +23,7 @@ */ #include "qemu/osdep.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/console.h" #include "ui/vgafont.h" #include "hw/core/qdev.h" @@ -302,36 +303,57 @@ void qemu_text_console_put_keysym(QemuTextConsole *s, int keysym) qemu_text_console_handle_keysym(s, keysym); } -static const int qcode_to_keysym[Q_KEY_CODE__MAX] = { - [Q_KEY_CODE_UP] = QEMU_KEY_UP, - [Q_KEY_CODE_DOWN] = QEMU_KEY_DOWN, - [Q_KEY_CODE_RIGHT] = QEMU_KEY_RIGHT, - [Q_KEY_CODE_LEFT] = QEMU_KEY_LEFT, - [Q_KEY_CODE_HOME] = QEMU_KEY_HOME, - [Q_KEY_CODE_END] = QEMU_KEY_END, - [Q_KEY_CODE_PGUP] = QEMU_KEY_PAGEUP, - [Q_KEY_CODE_PGDN] = QEMU_KEY_PAGEDOWN, - [Q_KEY_CODE_DELETE] = QEMU_KEY_DELETE, - [Q_KEY_CODE_TAB] = QEMU_KEY_TAB, - [Q_KEY_CODE_BACKSPACE] = QEMU_KEY_BACKSPACE, +static const int linux_to_keysym[] = { + [KEY_UP] = QEMU_KEY_UP, + [KEY_DOWN] = QEMU_KEY_DOWN, + [KEY_RIGHT] = QEMU_KEY_RIGHT, + [KEY_LEFT] = QEMU_KEY_LEFT, + [KEY_HOME] = QEMU_KEY_HOME, + [KEY_END] = QEMU_KEY_END, + [KEY_PAGEUP] = QEMU_KEY_PAGEUP, + [KEY_PAGEDOWN] = QEMU_KEY_PAGEDOWN, + [KEY_DELETE] = QEMU_KEY_DELETE, + [KEY_TAB] = QEMU_KEY_TAB, + [KEY_BACKSPACE] = QEMU_KEY_BACKSPACE, }; -static const int ctrl_qcode_to_keysym[Q_KEY_CODE__MAX] = { - [Q_KEY_CODE_UP] = QEMU_KEY_CTRL_UP, - [Q_KEY_CODE_DOWN] = QEMU_KEY_CTRL_DOWN, - [Q_KEY_CODE_RIGHT] = QEMU_KEY_CTRL_RIGHT, - [Q_KEY_CODE_LEFT] = QEMU_KEY_CTRL_LEFT, - [Q_KEY_CODE_HOME] = QEMU_KEY_CTRL_HOME, - [Q_KEY_CODE_END] = QEMU_KEY_CTRL_END, - [Q_KEY_CODE_PGUP] = QEMU_KEY_CTRL_PAGEUP, - [Q_KEY_CODE_PGDN] = QEMU_KEY_CTRL_PAGEDOWN, +static const int ctrl_linux_to_keysym[] = { + [KEY_UP] = QEMU_KEY_CTRL_UP, + [KEY_DOWN] = QEMU_KEY_CTRL_DOWN, + [KEY_RIGHT] = QEMU_KEY_CTRL_RIGHT, + [KEY_LEFT] = QEMU_KEY_CTRL_LEFT, + [KEY_HOME] = QEMU_KEY_CTRL_HOME, + [KEY_END] = QEMU_KEY_CTRL_END, + [KEY_PAGEUP] = QEMU_KEY_CTRL_PAGEUP, + [KEY_PAGEDOWN] = QEMU_KEY_CTRL_PAGEDOWN, }; bool qemu_text_console_put_qcode(QemuTextConsole *s, int qcode, bool ctrl) { + unsigned int lnx = qemu_input_map_qcode_to_linux[qcode]; + return qemu_text_console_put_linux(s, lnx, ctrl); +} + +bool qemu_text_console_put_linux(QemuTextConsole *s, unsigned int lnx, + bool ctrl) +{ + size_t maplen; + const int *map; int keysym; - keysym = ctrl ? ctrl_qcode_to_keysym[qcode] : qcode_to_keysym[qcode]; + if (ctrl) { + maplen = ARRAY_SIZE(ctrl_linux_to_keysym); + map = ctrl_linux_to_keysym; + } else { + maplen = ARRAY_SIZE(linux_to_keysym); + map = linux_to_keysym; + } + + if (lnx >= maplen) { + return false; + } + + keysym = map[lnx]; if (keysym == 0) { return false; } -- 2.54.0
