mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:56:38 +00:00
ui/vnc: 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-26-7c9e4c7abe34@rsg.ci.i.u-tokyo.ac.jp>
This commit is contained in:
committed by
Marc-André Lureau
parent
0283b5cff2
commit
4e13fca4c9
29
ui/vnc.c
29
ui/vnc.c
@@ -43,6 +43,7 @@
|
||||
#include "qapi/qapi-events-ui.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-commands-ui.h"
|
||||
#include "standard-headers/linux/input-event-codes.h"
|
||||
#include "ui/console.h"
|
||||
#include "ui/input.h"
|
||||
#include "crypto/hash.h"
|
||||
@@ -1797,13 +1798,10 @@ static void pointer_event(VncState *vs, int button_mask, int x, int y)
|
||||
qemu_input_event_sync();
|
||||
}
|
||||
|
||||
static void press_key(VncState *vs, QKeyCode qcode)
|
||||
static void press_key(VncState *vs, unsigned int lnx)
|
||||
{
|
||||
qkbd_state_key_event(vs->vd->kbd, qemu_input_map_qcode_to_linux[qcode],
|
||||
true);
|
||||
|
||||
qkbd_state_key_event(vs->vd->kbd, qemu_input_map_qcode_to_linux[qcode],
|
||||
false);
|
||||
qkbd_state_key_event(vs->vd->kbd, lnx, true);
|
||||
qkbd_state_key_event(vs->vd->kbd, lnx, false);
|
||||
}
|
||||
|
||||
static void vnc_led_state_change(VncState *vs)
|
||||
@@ -1844,15 +1842,15 @@ static void kbd_leds(void *opaque, int ledstate)
|
||||
|
||||
static void do_key_event(VncState *vs, int down, int keycode, int sym)
|
||||
{
|
||||
QKeyCode qcode = qemu_input_key_number_to_qcode(keycode);
|
||||
unsigned int lnx = qemu_input_key_number_to_linux(keycode);
|
||||
|
||||
/* QEMU console switch */
|
||||
switch (qcode) {
|
||||
case Q_KEY_CODE_1 ... Q_KEY_CODE_9: /* '1' to '9' keys */
|
||||
switch (lnx) {
|
||||
case KEY_1 ... KEY_9: /* '1' to '9' keys */
|
||||
if (down &&
|
||||
qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL) &&
|
||||
qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_ALT)) {
|
||||
QemuConsole *con = qemu_console_lookup_by_index(qcode - Q_KEY_CODE_1);
|
||||
QemuConsole *con = qemu_console_lookup_by_index(lnx - KEY_1);
|
||||
if (con) {
|
||||
qemu_console_unregister_listener(&vs->vd->dcl);
|
||||
qkbd_state_switch_console(vs->vd->kbd, con);
|
||||
@@ -1877,12 +1875,12 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
|
||||
if (keysym_is_numlock(vs->vd->kbd_layout, sym & 0xFFFF)) {
|
||||
if (!qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK)) {
|
||||
trace_vnc_key_sync_numlock(true);
|
||||
press_key(vs, Q_KEY_CODE_NUM_LOCK);
|
||||
press_key(vs, KEY_NUMLOCK);
|
||||
}
|
||||
} else {
|
||||
if (qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK)) {
|
||||
trace_vnc_key_sync_numlock(false);
|
||||
press_key(vs, Q_KEY_CODE_NUM_LOCK);
|
||||
press_key(vs, KEY_NUMLOCK);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1900,18 +1898,17 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
|
||||
if (capslock) {
|
||||
if (uppercase == shift) {
|
||||
trace_vnc_key_sync_capslock(false);
|
||||
press_key(vs, Q_KEY_CODE_CAPS_LOCK);
|
||||
press_key(vs, KEY_CAPSLOCK);
|
||||
}
|
||||
} else {
|
||||
if (uppercase != shift) {
|
||||
trace_vnc_key_sync_capslock(true);
|
||||
press_key(vs, Q_KEY_CODE_CAPS_LOCK);
|
||||
press_key(vs, KEY_CAPSLOCK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
qkbd_state_key_event(vs->vd->kbd, qemu_input_map_qcode_to_linux[qcode],
|
||||
down);
|
||||
qkbd_state_key_event(vs->vd->kbd, lnx, down);
|
||||
if (QEMU_IS_TEXT_CONSOLE(vs->vd->dcl.con)) {
|
||||
QemuTextConsole *con = QEMU_TEXT_CONSOLE(vs->vd->dcl.con);
|
||||
bool numlock = qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUMLOCK);
|
||||
|
||||
Reference in New Issue
Block a user