From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778324030977347.8102133611584; Sat, 9 May 2026 03:53:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFf-0000dq-Js; Sat, 09 May 2026 06:49:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF4-0008MZ-0a; Sat, 09 May 2026 06:49:07 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEw-0001dq-Th; Sat, 09 May 2026 06:49:04 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY22090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:56 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=5ggO6w+ivZFTq2fSHCFP6OeJvLpPb3Y3y1XdWbItDyw=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323677; v=1; b=LORt5Ng1g1B+5j5Ca/OJhSkMqxx9PJ5ppeQJ8NaTBCcOB5QlMZ20wji5dngmVZrH YMB4m/3Dw4kev6Yw8knq9dzO+vjBjpXnk7U9C9pTcJGYmSY5QFcmyiSRy0doVx+i K8lnD8A14kUfy41VcmdlVTq0biZgKSA96tGjwY/q3lIsldicplo108wr++tNQOyY nu+m8q6N0OAIml+QsgAhxpxfuNeKosiI/xf9y1B4IoYpv+5FEa3841jTeJPLShO6 YUIjihKres95416w3k5n8KwiavI56MYA8EGRzvdAa5AoUX7HkumdF9dKAwtJTOdk ICoF0NonayW7qIdTAnct5w== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:13 +0900 Subject: [PATCH RFC 01/28] ui/input: Introduce QemuInputEvent typedef MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-1-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=19238; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=krs/8Duw6kmL+Gr3ZJlgcNsnWXMJ5I2BmT9SAYFTWQM=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gVPLp+Wv/il45dOCpBUPJIyKhGU2awvKrz2zqqLD8 dopHz69jlIWBjEuBlkxRZaUot3cGtG1nwoT4ltg5rAygQxh4OIUgImILWb4Z25c+8PmY6Kij0R8 wWeFxZ+5j09O+rxzU1yM2JX/qj/THBgZThzvaWc1/Kdx3/vrlp0lXv/mBH+Wm3V6hd+5p9sEJHV 0OQA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778324032859158500 Add QemuInputEvent as the input subsystem's name for InputEvent and use it in input handler, queue, and replay interfaces. This prepares for decoupling QEMU's internal input event representation from the QAPI InputEvent type. Signed-off-by: Akihiko Odaki --- include/qemu/typedefs.h | 1 + include/system/replay.h | 2 +- include/ui/input.h | 6 +++--- replay/replay-internal.h | 6 +++--- chardev/msmouse.c | 2 +- chardev/wctablet.c | 2 +- hw/arm/musicpal.c | 2 +- hw/char/escc.c | 4 ++-- hw/display/xenfb.c | 4 ++-- hw/input/adb-kbd.c | 2 +- hw/input/adb-mouse.c | 2 +- hw/input/hid.c | 4 ++-- hw/input/ps2.c | 4 ++-- hw/input/stellaris_gamepad.c | 2 +- hw/input/virtio-input-hid.c | 2 +- hw/m68k/next-kbd.c | 3 ++- replay/replay-events.c | 4 ++-- replay/replay-input.c | 8 ++++---- replay/stubs-system.c | 2 +- ui/input-legacy.c | 2 +- ui/input.c | 26 +++++++++++++------------- ui/vdagent.c | 2 +- 22 files changed, 47 insertions(+), 45 deletions(-) diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h index 416a8c9acead..8bd1f3c0f0ea 100644 --- a/include/qemu/typedefs.h +++ b/include/qemu/typedefs.h @@ -93,6 +93,7 @@ typedef struct QBool QBool; typedef struct QDict QDict; typedef struct QEMUBH QEMUBH; typedef struct QemuConsole QemuConsole; +typedef struct InputEvent QemuInputEvent; typedef struct QEMUCursor QEMUCursor; typedef struct QEMUFile QEMUFile; typedef struct QemuMutex QemuMutex; diff --git a/include/system/replay.h b/include/system/replay.h index 19fb6dbb3963..3b00386821b6 100644 --- a/include/system/replay.h +++ b/include/system/replay.h @@ -126,7 +126,7 @@ void replay_bh_schedule_event(QEMUBH *bh); void replay_bh_schedule_oneshot_event(AioContext *ctx, QEMUBHFunc *cb, void *opaque); /*! Adds input event to the queue */ -void replay_input_event(QemuConsole *src, InputEvent *evt); +void replay_input_event(QemuConsole *src, QemuInputEvent *evt); /*! Adds input sync event to the queue */ void replay_input_sync_event(void); /*! Adds block layer event to the queue */ diff --git a/include/ui/input.h b/include/ui/input.h index 8f9aac562ed2..1f6487a3d376 100644 --- a/include/ui/input.h +++ b/include/ui/input.h @@ -19,7 +19,7 @@ typedef struct QemuInputHandler QemuInputHandler; typedef struct QemuInputHandlerState QemuInputHandlerState; =20 typedef void (*QemuInputHandlerEvent)(DeviceState *dev, QemuConsole *src, - InputEvent *evt); + QemuInputEvent *evt); typedef void (*QemuInputHandlerSync)(DeviceState *dev); =20 struct QemuInputHandler { @@ -37,8 +37,8 @@ void qemu_input_handler_unregister(QemuInputHandlerState = *s); void qemu_input_handler_bind(QemuInputHandlerState *s, const char *device_id, int head, Error **errp); -void qemu_input_event_send(QemuConsole *src, InputEvent *evt); -void qemu_input_event_send_impl(QemuConsole *src, InputEvent *evt); +void qemu_input_event_send(QemuConsole *src, QemuInputEvent *evt); +void qemu_input_event_send_impl(QemuConsole *src, QemuInputEvent *evt); void qemu_input_event_sync(void); void qemu_input_event_sync_impl(void); =20 diff --git a/replay/replay-internal.h b/replay/replay-internal.h index 643b357da121..42c393542eb3 100644 --- a/replay/replay-internal.h +++ b/replay/replay-internal.h @@ -171,11 +171,11 @@ void replay_add_event(ReplayAsyncEventKind event_kind= , void *opaque, /* Input events */ =20 /*! Saves input event to the log */ -void replay_save_input_event(InputEvent *evt); +void replay_save_input_event(QemuInputEvent *evt); /*! Reads input event from the log */ -InputEvent *replay_read_input_event(void); +QemuInputEvent *replay_read_input_event(void); /*! Adds input event to the queue */ -void replay_add_input_event(struct InputEvent *event); +void replay_add_input_event(QemuInputEvent *event); /*! Adds input sync event to the queue */ void replay_add_input_sync_event(void); =20 diff --git a/chardev/msmouse.c b/chardev/msmouse.c index 365f04546e91..146457661f9e 100644 --- a/chardev/msmouse.c +++ b/chardev/msmouse.c @@ -122,7 +122,7 @@ static void msmouse_queue_event(MouseChardev *mouse) } =20 static void msmouse_input_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { MouseChardev *mouse =3D MOUSE_CHARDEV(dev); InputMoveEvent *move; diff --git a/chardev/wctablet.c b/chardev/wctablet.c index 214d5ca2e282..05d2333fb0c7 100644 --- a/chardev/wctablet.c +++ b/chardev/wctablet.c @@ -146,7 +146,7 @@ static void wctablet_queue_event(TabletChardev *tablet) } =20 static void wctablet_input_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { TabletChardev *tablet =3D (TabletChardev *)dev; InputMoveEvent *move; diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c index 441a11100a35..19c12715378b 100644 --- a/hw/arm/musicpal.c +++ b/hw/arm/musicpal.c @@ -1065,7 +1065,7 @@ struct musicpal_key_state { }; =20 static void musicpal_key_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { musicpal_key_state *s =3D MUSICPAL_KEY(dev); InputKeyEvent *key =3D evt->u.key.data; diff --git a/hw/char/escc.c b/hw/char/escc.c index 3b46818ecc98..677c3a120e13 100644 --- a/hw/char/escc.c +++ b/hw/char/escc.c @@ -794,7 +794,7 @@ static const VMStateDescription vmstate_escc =3D { }; =20 static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { ESCCChannelState *s =3D (ESCCChannelState *)dev; int qcode, keycode; @@ -954,7 +954,7 @@ static void handle_kbd_command(ESCCChannelState *s, int= val) } =20 static void sunmouse_handle_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { ESCCChannelState *s =3D (ESCCChannelState *)dev; InputMoveEvent *move; diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c index ba886a940ee3..598b7682ceb4 100644 --- a/hw/display/xenfb.c +++ b/hw/display/xenfb.c @@ -200,7 +200,7 @@ static int xenfb_send_position(struct XenInput *xenfb, * already has code for dealing with this... */ static void xenfb_key_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { struct XenInput *xenfb =3D (struct XenInput *)dev; InputKeyEvent *key =3D evt->u.key.data; @@ -227,7 +227,7 @@ static void xenfb_key_event(DeviceState *dev, QemuConso= le *src, * the button state. */ static void xenfb_mouse_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { struct XenInput *xenfb =3D (struct XenInput *)dev; InputBtnEvent *btn; diff --git a/hw/input/adb-kbd.c b/hw/input/adb-kbd.c index 507557deecc1..5ba6c9a7b5df 100644 --- a/hw/input/adb-kbd.c +++ b/hw/input/adb-kbd.c @@ -306,7 +306,7 @@ static bool adb_kbd_has_data(ADBDevice *d) =20 /* This is where keyboard events enter this file */ static void adb_keyboard_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { KBDState *s =3D (KBDState *)dev; int qcode, keycode; diff --git a/hw/input/adb-mouse.c b/hw/input/adb-mouse.c index 373ef3f953ca..c37ccf26c169 100644 --- a/hw/input/adb-mouse.c +++ b/hw/input/adb-mouse.c @@ -56,7 +56,7 @@ struct ADBMouseClass { #define ADB_MOUSE_BUTTON_RIGHT 0x02 =20 static void adb_mouse_handle_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { MouseState *s =3D (MouseState *)dev; InputMoveEvent *move; diff --git a/hw/input/hid.c b/hw/input/hid.c index de24cd0ef045..53afb1d43405 100644 --- a/hw/input/hid.c +++ b/hw/input/hid.c @@ -108,7 +108,7 @@ void hid_set_next_idle(HIDState *hs) } =20 static void hid_pointer_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { static const int bmap[INPUT_BUTTON__MAX] =3D { [INPUT_BUTTON_LEFT] =3D 0x01, @@ -226,7 +226,7 @@ static void hid_pointer_sync(DeviceState *dev) } =20 static void hid_keyboard_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { HIDState *hs =3D (HIDState *)dev; int scancodes[3], i, count; diff --git a/hw/input/ps2.c b/hw/input/ps2.c index 10ac7324030b..90bcbcdff889 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -310,7 +310,7 @@ static void ps2_put_keycode(void *opaque, int keycode) } =20 static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { PS2KbdState *s =3D (PS2KbdState *)dev; InputKeyEvent *key =3D evt->u.key.data; @@ -787,7 +787,7 @@ static int ps2_mouse_send_packet(PS2MouseState *s) } =20 static void ps2_mouse_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { static const int bmap[INPUT_BUTTON__MAX] =3D { [INPUT_BUTTON_LEFT] =3D PS2_MOUSE_BUTTON_LEFT, diff --git a/hw/input/stellaris_gamepad.c b/hw/input/stellaris_gamepad.c index 42d43f9af51f..db35905554d5 100644 --- a/hw/input/stellaris_gamepad.c +++ b/hw/input/stellaris_gamepad.c @@ -16,7 +16,7 @@ #include "ui/console.h" =20 static void stellaris_gamepad_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { StellarisGamepad *s =3D STELLARIS_GAMEPAD(dev); InputKeyEvent *key =3D evt->u.key.data; diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index 14dde90a48b3..5b9f407c546d 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -79,7 +79,7 @@ static void virtio_input_extend_config(VirtIOInput *vinpu= t, } =20 static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { VirtIOInput *vinput =3D VIRTIO_INPUT(dev); virtio_input_event event; diff --git a/hw/m68k/next-kbd.c b/hw/m68k/next-kbd.c index 571a95550404..9dbedac6479e 100644 --- a/hw/m68k/next-kbd.c +++ b/hw/m68k/next-kbd.c @@ -242,7 +242,8 @@ static void nextkbd_put_keycode(NextKBDState *s, int ke= ycode) /* s->update_irq(s->update_arg, 1); */ } =20 -static void nextkbd_event(DeviceState *dev, QemuConsole *src, InputEvent *= evt) +static void nextkbd_event(DeviceState *dev, QemuConsole *src, + QemuInputEvent *evt) { NextKBDState *s =3D NEXTKBD(dev); int qcode, keycode; diff --git a/replay/replay-events.c b/replay/replay-events.c index 9e5af5e84954..20df810279e2 100644 --- a/replay/replay-events.c +++ b/replay/replay-events.c @@ -41,7 +41,7 @@ static void replay_run_event(Event *event) ((QEMUBHFunc *)event->opaque)(event->opaque2); break; case REPLAY_ASYNC_EVENT_INPUT: - qemu_input_event_send_impl(NULL, (InputEvent *)event->opaque); + qemu_input_event_send_impl(NULL, (QemuInputEvent *)event->opaque); qapi_free_InputEvent((InputEvent *)event->opaque); break; case REPLAY_ASYNC_EVENT_INPUT_SYNC: @@ -143,7 +143,7 @@ void replay_bh_schedule_oneshot_event(AioContext *ctx, } } =20 -void replay_add_input_event(struct InputEvent *event) +void replay_add_input_event(QemuInputEvent *event) { replay_add_event(REPLAY_ASYNC_EVENT_INPUT, event, NULL, 0); } diff --git a/replay/replay-input.c b/replay/replay-input.c index 562bbf371751..3f506f2338a3 100644 --- a/replay/replay-input.c +++ b/replay/replay-input.c @@ -17,7 +17,7 @@ #include "qapi/clone-visitor.h" #include "qapi/qapi-visit-ui.h" =20 -void replay_save_input_event(InputEvent *evt) +void replay_save_input_event(QemuInputEvent *evt) { InputKeyEvent *key; InputBtnEvent *btn; @@ -73,9 +73,9 @@ void replay_save_input_event(InputEvent *evt) } } =20 -InputEvent *replay_read_input_event(void) +QemuInputEvent *replay_read_input_event(void) { - InputEvent evt; + QemuInputEvent evt; KeyValue keyValue; InputKeyEvent key; key.key =3D &keyValue; @@ -135,7 +135,7 @@ InputEvent *replay_read_input_event(void) return QAPI_CLONE(InputEvent, &evt); } =20 -void replay_input_event(QemuConsole *src, InputEvent *evt) +void replay_input_event(QemuConsole *src, QemuInputEvent *evt) { if (replay_mode =3D=3D REPLAY_MODE_PLAY) { /* Nothing */ diff --git a/replay/stubs-system.c b/replay/stubs-system.c index b2c52bc40436..f8e17dcf1ce9 100644 --- a/replay/stubs-system.c +++ b/replay/stubs-system.c @@ -2,7 +2,7 @@ #include "system/replay.h" #include "ui/input.h" =20 -void replay_input_event(QemuConsole *src, InputEvent *evt) +void replay_input_event(QemuConsole *src, QemuInputEvent *evt) { qemu_input_event_send_impl(src, evt); } diff --git a/ui/input-legacy.c b/ui/input-legacy.c index ca4bccb41134..5467010c3713 100644 --- a/ui/input-legacy.c +++ b/ui/input-legacy.c @@ -110,7 +110,7 @@ void qmp_send_key(KeyValueList *keys, bool has_hold_tim= e, int64_t hold_time, } =20 static void legacy_mouse_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { static const int bmap[INPUT_BUTTON__MAX] =3D { [INPUT_BUTTON_LEFT] =3D MOUSE_EVENT_LBUTTON, diff --git a/ui/input.c b/ui/input.c index 147e69c1c3c5..52ab7beb9428 100644 --- a/ui/input.c +++ b/ui/input.c @@ -30,7 +30,7 @@ struct QemuInputEventQueue { QEMUTimer *timer; uint32_t delay_ms; QemuConsole *src; - InputEvent *evt; + QemuInputEvent *evt; QTAILQ_ENTRY(QemuInputEventQueue) node; }; =20 @@ -174,7 +174,7 @@ void qmp_input_send_event(const char *device, qemu_input_event_sync(); } =20 -static void qemu_input_event_trace(QemuConsole *src, InputEvent *evt) +static void qemu_input_event_trace(QemuConsole *src, QemuInputEvent *evt) { const char *name; int qcode, idx =3D -1; @@ -283,7 +283,7 @@ static void qemu_input_queue_delay(QemuInputEventQueueH= ead *queue, } =20 static void qemu_input_queue_event(QemuInputEventQueueHead *queue, - QemuConsole *src, InputEvent *evt) + QemuConsole *src, QemuInputEvent *evt) { QemuInputEventQueue *item =3D g_new0(QemuInputEventQueue, 1); =20 @@ -303,7 +303,7 @@ static void qemu_input_queue_sync(QemuInputEventQueueHe= ad *queue) queue_count++; } =20 -void qemu_input_event_send_impl(QemuConsole *src, InputEvent *evt) +void qemu_input_event_send_impl(QemuConsole *src, QemuInputEvent *evt) { QemuInputHandlerState *s; =20 @@ -318,7 +318,7 @@ void qemu_input_event_send_impl(QemuConsole *src, Input= Event *evt) s->events++; } =20 -void qemu_input_event_send(QemuConsole *src, InputEvent *evt) +void qemu_input_event_send(QemuConsole *src, QemuInputEvent *evt) { /* Expect all parts of QEMU to send events with QCodes exclusively. * Key numbers are only supported as end-user input via QMP */ @@ -372,9 +372,9 @@ void qemu_input_event_sync(void) replay_input_sync_event(); } =20 -static InputEvent *qemu_input_event_new_key(KeyValue *key, bool down) +static QemuInputEvent *qemu_input_event_new_key(KeyValue *key, bool down) { - InputEvent *evt =3D g_new0(InputEvent, 1); + QemuInputEvent *evt =3D g_new0(QemuInputEvent, 1); evt->u.key.data =3D g_new0(InputKeyEvent, 1); evt->type =3D INPUT_EVENT_KIND_KEY; evt->u.key.data->key =3D key; @@ -384,7 +384,7 @@ static InputEvent *qemu_input_event_new_key(KeyValue *k= ey, bool down) =20 void qemu_input_event_send_key(QemuConsole *src, KeyValue *key, bool down) { - InputEvent *evt; + QemuInputEvent *evt; evt =3D qemu_input_event_new_key(key, down); if (QTAILQ_EMPTY(&kbd_queue)) { qemu_input_event_send(src, evt); @@ -435,7 +435,7 @@ void qemu_input_queue_btn(QemuConsole *src, InputButton= btn, bool down) .button =3D btn, .down =3D down, }; - InputEvent evt =3D { + QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_BTN, .u.btn.data =3D &bevt, }; @@ -486,7 +486,7 @@ void qemu_input_queue_rel(QemuConsole *src, InputAxis a= xis, int value) .axis =3D axis, .value =3D value, }; - InputEvent evt =3D { + QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_REL, .u.rel.data =3D &move, }; @@ -503,7 +503,7 @@ void qemu_input_queue_abs(QemuConsole *src, InputAxis a= xis, int value, INPUT_EVENT_ABS_MIN, INPUT_EVENT_ABS_MAX), }; - InputEvent evt =3D { + QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_ABS, .u.abs.data =3D &move, }; @@ -519,7 +519,7 @@ void qemu_input_queue_mtt(QemuConsole *src, InputMultiT= ouchType type, .slot =3D slot, .tracking_id =3D tracking_id, }; - InputEvent evt =3D { + QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_MTT, .u.mtt.data =3D &mtt, }; @@ -539,7 +539,7 @@ void qemu_input_queue_mtt_abs(QemuConsole *src, InputAx= is axis, int value, INPUT_EVENT_ABS_MIN, INPUT_EVENT_ABS_MAX), }; - InputEvent evt =3D { + QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_MTT, .u.mtt.data =3D &mtt, }; diff --git a/ui/vdagent.c b/ui/vdagent.c index bb55cbefc9c3..28a83c7c389c 100644 --- a/ui/vdagent.c +++ b/ui/vdagent.c @@ -226,7 +226,7 @@ static void vdagent_send_mouse(VDAgentChardev *vd) } =20 static void vdagent_pointer_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) + QemuInputEvent *evt) { static const int bmap[INPUT_BUTTON__MAX] =3D { [INPUT_BUTTON_LEFT] =3D VD_AGENT_LBUTTON_MASK, --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778323850751494.02797883308335; Sat, 9 May 2026 03:50:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFe-0000Vs-1a; Sat, 09 May 2026 06:49:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfFB-0008QX-9R; Sat, 09 May 2026 06:49:13 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF3-0001h2-QC; Sat, 09 May 2026 06:49:11 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY23090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:57 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=3mJX9hs79KtAwpT4Ol0xakcOoqlc4mHJPHCV4mjkPiU=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323677; v=1; b=f35HEc2c4BalOd7G5BXFoiMWrh79UIOK8Jm/lazks9gc3OwpQS181GDHHQlw6nad rs5+jwqB+qZkpJW5WaewHo0VOY2mxshUxj/7ikAEeP5eD0+KRwGOfeqS9596/7Q6 WnqvuqDeUbFjD1H68r5ysacgtXKuqYO1FC54mteoMaqfsAVLpz5ntkSp7syvYCaw X0m7mDLl4NXcwFMHRGysEcS9zz1yvOOSrbM9sMQmV9EdgGfvAL8LbRwunpgiJz9q iRhjm78mIVVg569T5jm/+kpi+tBiG+BY0YeWXDgCgt4GjhMsO+BADWA0u+3pYiNE kjW3xS21R1NeJcySyaEyTw== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:14 +0900 Subject: [PATCH RFC 02/28] ui/input: Remove QAPI wrappers from QemuInputEvent MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-2-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=59437; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=qJx92yph9XV3GXpidgE44v0dbhbEJknwh3BFt2VDdHY=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gXPXPq27sVT6RtjUIxsipWK0eornvnka9FMs0Cd3x 0WLNU+kOkpZGMS4GGTFFFlSinZza0TXfipMiG+BmcPKBDKEgYtTACZyQZyRYYH0aZsHR5R3hxqs T9i0MM7j1qMYyYKPd805r5Yomv/39mb4n/82Qv1JRMU5a2nR7uurDO/MF89ZtYFR6rLAxd44/nc rmQA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778323852656154100 QAPI represents union members with wrapper structs and pointer indirections. They are useful at the QMP boundary, but unnecessary for QEMU's internal input events and make handlers more verbose. Define QemuInputEvent as a plain internal tagged union and convert input handlers, queues, and replay code to access payloads directly. Signed-off-by: Akihiko Odaki --- include/qemu/typedefs.h | 2 +- include/ui/input.h | 16 ++++ chardev/msmouse.c | 10 +-- chardev/wctablet.c | 8 +- hw/arm/musicpal.c | 11 ++- hw/char/escc.c | 32 +++---- hw/display/xenfb.c | 32 +++---- hw/input/adb-kbd.c | 4 +- hw/input/adb-mouse.c | 20 ++--- hw/input/hid.c | 36 ++++---- hw/input/ps2.c | 67 +++++++-------- hw/input/stellaris_gamepad.c | 9 +- hw/input/virtio-input-hid.c | 53 +++++------- hw/m68k/next-kbd.c | 9 +- replay/replay-events.c | 2 +- replay/replay-input.c | 101 +++++++++------------- ui/input-legacy.c | 23 ++--- ui/input.c | 197 ++++++++++++++++++++++++---------------= ---- ui/vdagent.c | 18 ++-- 19 files changed, 305 insertions(+), 345 deletions(-) diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h index 8bd1f3c0f0ea..5580e1fc4aba 100644 --- a/include/qemu/typedefs.h +++ b/include/qemu/typedefs.h @@ -93,7 +93,7 @@ typedef struct QBool QBool; typedef struct QDict QDict; typedef struct QEMUBH QEMUBH; typedef struct QemuConsole QemuConsole; -typedef struct InputEvent QemuInputEvent; +typedef struct QemuInputEvent QemuInputEvent; typedef struct QEMUCursor QEMUCursor; typedef struct QEMUFile QEMUFile; typedef struct QemuMutex QemuMutex; diff --git a/include/ui/input.h b/include/ui/input.h index 1f6487a3d376..bcca0f886f84 100644 --- a/include/ui/input.h +++ b/include/ui/input.h @@ -18,6 +18,22 @@ typedef struct QemuInputHandler QemuInputHandler; typedef struct QemuInputHandlerState QemuInputHandlerState; =20 +typedef struct QemuInputKeyEvent { + KeyValue key; + bool down; +} QemuInputKeyEvent; + +typedef struct QemuInputEvent { + InputEventKind type; + union { + QemuInputKeyEvent key; + InputBtnEvent btn; + InputMoveEvent rel; + InputMoveEvent abs; + InputMultiTouchEvent mtt; + }; +} QemuInputEvent; + typedef void (*QemuInputHandlerEvent)(DeviceState *dev, QemuConsole *src, QemuInputEvent *evt); typedef void (*QemuInputHandlerSync)(DeviceState *dev); diff --git a/chardev/msmouse.c b/chardev/msmouse.c index 146457661f9e..d72a16a28335 100644 --- a/chardev/msmouse.c +++ b/chardev/msmouse.c @@ -125,8 +125,6 @@ static void msmouse_input_event(DeviceState *dev, QemuC= onsole *src, QemuInputEvent *evt) { MouseChardev *mouse =3D MOUSE_CHARDEV(dev); - InputMoveEvent *move; - InputBtnEvent *btn; =20 /* Ignore events if serial mouse powered down. */ if (!MSMOUSE_PWR(mouse->tiocm)) { @@ -135,14 +133,12 @@ static void msmouse_input_event(DeviceState *dev, Qem= uConsole *src, =20 switch (evt->type) { case INPUT_EVENT_KIND_REL: - move =3D evt->u.rel.data; - mouse->axis[move->axis] +=3D move->value; + mouse->axis[evt->rel.axis] +=3D evt->rel.value; break; =20 case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - mouse->btns[btn->button] =3D btn->down; - mouse->btnc[btn->button] =3D true; + mouse->btns[evt->btn.button] =3D evt->btn.down; + mouse->btnc[evt->btn.button] =3D true; break; =20 default: diff --git a/chardev/wctablet.c b/chardev/wctablet.c index 05d2333fb0c7..3ad24cce1752 100644 --- a/chardev/wctablet.c +++ b/chardev/wctablet.c @@ -149,18 +149,14 @@ static void wctablet_input_event(DeviceState *dev, Qe= muConsole *src, QemuInputEvent *evt) { TabletChardev *tablet =3D (TabletChardev *)dev; - InputMoveEvent *move; - InputBtnEvent *btn; =20 switch (evt->type) { case INPUT_EVENT_KIND_ABS: - move =3D evt->u.abs.data; - tablet->axis[move->axis] =3D move->value; + tablet->axis[evt->abs.axis] =3D evt->abs.value; break; =20 case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - tablet->btns[btn->button] =3D btn->down; + tablet->btns[evt->btn.button] =3D evt->btn.down; break; =20 default: diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c index 19c12715378b..b9a2295e75d2 100644 --- a/hw/arm/musicpal.c +++ b/hw/arm/musicpal.c @@ -1068,8 +1068,7 @@ static void musicpal_key_event(DeviceState *dev, Qemu= Console *src, QemuInputEvent *evt) { musicpal_key_state *s =3D MUSICPAL_KEY(dev); - InputKeyEvent *key =3D evt->u.key.data; - int qcode =3D qemu_input_key_value_to_qcode(key->key); + int qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); uint32_t event =3D 0; int i; =20 @@ -1112,14 +1111,14 @@ static void musicpal_key_event(DeviceState *dev, Qe= muConsole *src, * but do not repeat already-pressed buttons for the other key inputs. */ if (!(event & (MP_KEY_WHEEL_NAV | MP_KEY_WHEEL_VOL))) { - if (key->down && (s->pressed_keys & event)) { + if (evt->key.down && (s->pressed_keys & event)) { event =3D 0; } } =20 if (event) { /* Raise GPIO pin first if repeating a key */ - if (key->down && (s->pressed_keys & event)) { + if (evt->key.down && (s->pressed_keys & event)) { for (i =3D 0; i <=3D 7; i++) { if (event & (1 << i)) { qemu_set_irq(s->out[i], 1); @@ -1128,10 +1127,10 @@ static void musicpal_key_event(DeviceState *dev, Qe= muConsole *src, } for (i =3D 0; i <=3D 7; i++) { if (event & (1 << i)) { - qemu_set_irq(s->out[i], !key->down); + qemu_set_irq(s->out[i], !evt->key.down); } } - if (key->down) { + if (evt->key.down) { s->pressed_keys |=3D event; } else { s->pressed_keys &=3D ~event; diff --git a/hw/char/escc.c b/hw/char/escc.c index 677c3a120e13..c88b2d54ebe0 100644 --- a/hw/char/escc.c +++ b/hw/char/escc.c @@ -798,16 +798,14 @@ static void sunkbd_handle_event(DeviceState *dev, Qem= uConsole *src, { ESCCChannelState *s =3D (ESCCChannelState *)dev; int qcode, keycode; - InputKeyEvent *key; =20 assert(evt->type =3D=3D INPUT_EVENT_KIND_KEY); - key =3D evt->u.key.data; - qcode =3D qemu_input_key_value_to_qcode(key->key); + qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); trace_escc_sunkbd_event_in(qcode, QKeyCode_str(qcode), - key->down); + evt->key.down); =20 if (qcode =3D=3D Q_KEY_CODE_CAPS_LOCK) { - if (key->down) { + if (evt->key.down) { s->caps_lock_mode ^=3D 1; if (s->caps_lock_mode =3D=3D 2) { return; /* Drop second press */ @@ -821,7 +819,7 @@ static void sunkbd_handle_event(DeviceState *dev, QemuC= onsole *src, } =20 if (qcode =3D=3D Q_KEY_CODE_NUM_LOCK) { - if (key->down) { + if (evt->key.down) { s->num_lock_mode ^=3D 1; if (s->num_lock_mode =3D=3D 2) { return; /* Drop second press */ @@ -839,7 +837,7 @@ static void sunkbd_handle_event(DeviceState *dev, QemuC= onsole *src, } =20 keycode =3D qemu_input_map_qcode_to_sun[qcode]; - if (!key->down) { + if (!evt->key.down) { keycode |=3D 0x80; } trace_escc_sunkbd_event_out(keycode); @@ -957,8 +955,6 @@ static void sunmouse_handle_event(DeviceState *dev, Qem= uConsole *src, QemuInputEvent *evt) { ESCCChannelState *s =3D (ESCCChannelState *)dev; - InputMoveEvent *move; - InputBtnEvent *btn; static const int bmap[INPUT_BUTTON__MAX] =3D { [INPUT_BUTTON_LEFT] =3D 0x4, [INPUT_BUTTON_MIDDLE] =3D 0x2, @@ -967,21 +963,19 @@ static void sunmouse_handle_event(DeviceState *dev, Q= emuConsole *src, =20 switch (evt->type) { case INPUT_EVENT_KIND_REL: - move =3D evt->u.rel.data; - if (move->axis =3D=3D INPUT_AXIS_X) { - s->sunmouse_dx +=3D move->value; - } else if (move->axis =3D=3D INPUT_AXIS_Y) { - s->sunmouse_dy -=3D move->value; + if (evt->rel.axis =3D=3D INPUT_AXIS_X) { + s->sunmouse_dx +=3D evt->rel.value; + } else if (evt->rel.axis =3D=3D INPUT_AXIS_Y) { + s->sunmouse_dy -=3D evt->rel.value; } break; =20 case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - if (bmap[btn->button]) { - if (btn->down) { - s->sunmouse_buttons |=3D bmap[btn->button]; + if (bmap[evt->btn.button]) { + if (evt->btn.down) { + s->sunmouse_buttons |=3D bmap[evt->btn.button]; } else { - s->sunmouse_buttons &=3D ~bmap[btn->button]; + s->sunmouse_buttons &=3D ~bmap[evt->btn.button]; } /* Indicate we have a supported button event */ s->sunmouse_buttons |=3D 0x80; diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c index 598b7682ceb4..a6ef89fcb280 100644 --- a/hw/display/xenfb.c +++ b/hw/display/xenfb.c @@ -203,16 +203,15 @@ static void xenfb_key_event(DeviceState *dev, QemuCon= sole *src, QemuInputEvent *evt) { struct XenInput *xenfb =3D (struct XenInput *)dev; - InputKeyEvent *key =3D evt->u.key.data; - int qcode =3D qemu_input_key_value_to_qcode(key->key); + int qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); int lnx; =20 if (qcode < qemu_input_map_qcode_to_linux_len) { lnx =3D qemu_input_map_qcode_to_linux[qcode]; =20 if (lnx) { - trace_xenfb_key_event(xenfb, lnx, key->down); - xenfb_send_key(xenfb, key->down, lnx); + trace_xenfb_key_event(xenfb, lnx, evt->key.down); + xenfb_send_key(xenfb, evt->key.down, lnx); } } } @@ -230,32 +229,29 @@ static void xenfb_mouse_event(DeviceState *dev, QemuC= onsole *src, QemuInputEvent *evt) { struct XenInput *xenfb =3D (struct XenInput *)dev; - InputBtnEvent *btn; - InputMoveEvent *move; QemuConsole *con; DisplaySurface *surface; int scale; =20 switch (evt->type) { case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - switch (btn->button) { + switch (evt->btn.button) { case INPUT_BUTTON_LEFT: - xenfb_send_key(xenfb, btn->down, BTN_LEFT); + xenfb_send_key(xenfb, evt->btn.down, BTN_LEFT); break; case INPUT_BUTTON_RIGHT: - xenfb_send_key(xenfb, btn->down, BTN_LEFT + 1); + xenfb_send_key(xenfb, evt->btn.down, BTN_LEFT + 1); break; case INPUT_BUTTON_MIDDLE: - xenfb_send_key(xenfb, btn->down, BTN_LEFT + 2); + xenfb_send_key(xenfb, evt->btn.down, BTN_LEFT + 2); break; case INPUT_BUTTON_WHEEL_UP: - if (btn->down) { + if (evt->btn.down) { xenfb->wheel--; } break; case INPUT_BUTTON_WHEEL_DOWN: - if (btn->down) { + if (evt->btn.down) { xenfb->wheel++; } break; @@ -265,9 +261,8 @@ static void xenfb_mouse_event(DeviceState *dev, QemuCon= sole *src, break; =20 case INPUT_EVENT_KIND_ABS: - move =3D evt->u.abs.data; if (xenfb->raw_pointer_wanted) { - xenfb->axis[move->axis] =3D move->value; + xenfb->axis[evt->abs.axis] =3D evt->abs.value; } else { con =3D qemu_console_lookup_by_index(0); if (!con) { @@ -275,7 +270,7 @@ static void xenfb_mouse_event(DeviceState *dev, QemuCon= sole *src, return; } surface =3D qemu_console_surface(con); - switch (move->axis) { + switch (evt->abs.axis) { case INPUT_AXIS_X: scale =3D surface_width(surface) - 1; break; @@ -285,13 +280,12 @@ static void xenfb_mouse_event(DeviceState *dev, QemuC= onsole *src, default: g_assert_not_reached(); } - xenfb->axis[move->axis] =3D move->value * scale / 0x7fff; + xenfb->axis[evt->abs.axis] =3D evt->abs.value * scale / 0x7fff; } break; =20 case INPUT_EVENT_KIND_REL: - move =3D evt->u.rel.data; - xenfb->axis[move->axis] +=3D move->value; + xenfb->axis[evt->rel.axis] +=3D evt->rel.value; break; =20 default: diff --git a/hw/input/adb-kbd.c b/hw/input/adb-kbd.c index 5ba6c9a7b5df..5911e7139257 100644 --- a/hw/input/adb-kbd.c +++ b/hw/input/adb-kbd.c @@ -311,7 +311,7 @@ static void adb_keyboard_event(DeviceState *dev, QemuCo= nsole *src, KBDState *s =3D (KBDState *)dev; int qcode, keycode; =20 - qcode =3D qemu_input_key_value_to_qcode(evt->u.key.data->key); + qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); if (qcode >=3D ARRAY_SIZE(qcode_to_adb_keycode)) { return; } @@ -321,7 +321,7 @@ static void adb_keyboard_event(DeviceState *dev, QemuCo= nsole *src, trace_adb_device_kbd_no_key(); return; } - if (evt->u.key.data->down =3D=3D false) { /* if key release event */ + if (evt->key.down =3D=3D false) { /* if key release event */ keycode =3D keycode | 0x80; /* create keyboard break code */ } =20 diff --git a/hw/input/adb-mouse.c b/hw/input/adb-mouse.c index c37ccf26c169..5dcdc851fcdf 100644 --- a/hw/input/adb-mouse.c +++ b/hw/input/adb-mouse.c @@ -59,8 +59,6 @@ static void adb_mouse_handle_event(DeviceState *dev, Qemu= Console *src, QemuInputEvent *evt) { MouseState *s =3D (MouseState *)dev; - InputMoveEvent *move; - InputBtnEvent *btn; static const int bmap[INPUT_BUTTON__MAX] =3D { [INPUT_BUTTON_LEFT] =3D ADB_MOUSE_BUTTON_LEFT, [INPUT_BUTTON_RIGHT] =3D ADB_MOUSE_BUTTON_RIGHT, @@ -68,21 +66,19 @@ static void adb_mouse_handle_event(DeviceState *dev, Qe= muConsole *src, =20 switch (evt->type) { case INPUT_EVENT_KIND_REL: - move =3D evt->u.rel.data; - if (move->axis =3D=3D INPUT_AXIS_X) { - s->dx +=3D move->value; - } else if (move->axis =3D=3D INPUT_AXIS_Y) { - s->dy +=3D move->value; + if (evt->rel.axis =3D=3D INPUT_AXIS_X) { + s->dx +=3D evt->rel.value; + } else if (evt->rel.axis =3D=3D INPUT_AXIS_Y) { + s->dy +=3D evt->rel.value; } break; =20 case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - if (bmap[btn->button]) { - if (btn->down) { - s->buttons_state |=3D bmap[btn->button]; + if (bmap[evt->btn.button]) { + if (evt->btn.down) { + s->buttons_state |=3D bmap[evt->btn.button]; } else { - s->buttons_state &=3D ~bmap[btn->button]; + s->buttons_state &=3D ~bmap[evt->btn.button]; } } break; diff --git a/hw/input/hid.c b/hw/input/hid.c index 53afb1d43405..90b29682a254 100644 --- a/hw/input/hid.c +++ b/hw/input/hid.c @@ -119,42 +119,37 @@ static void hid_pointer_event(DeviceState *dev, QemuC= onsole *src, }; HIDState *hs =3D (HIDState *)dev; HIDPointerEvent *e; - InputMoveEvent *move; - InputBtnEvent *btn; =20 assert(hs->n < QUEUE_LENGTH); e =3D &hs->ptr.queue[(hs->head + hs->n) & QUEUE_MASK]; =20 switch (evt->type) { case INPUT_EVENT_KIND_REL: - move =3D evt->u.rel.data; - if (move->axis =3D=3D INPUT_AXIS_X) { - e->xdx +=3D move->value; - } else if (move->axis =3D=3D INPUT_AXIS_Y) { - e->ydy +=3D move->value; + if (evt->rel.axis =3D=3D INPUT_AXIS_X) { + e->xdx +=3D evt->rel.value; + } else if (evt->rel.axis =3D=3D INPUT_AXIS_Y) { + e->ydy +=3D evt->rel.value; } break; =20 case INPUT_EVENT_KIND_ABS: - move =3D evt->u.abs.data; - if (move->axis =3D=3D INPUT_AXIS_X) { - e->xdx =3D move->value; - } else if (move->axis =3D=3D INPUT_AXIS_Y) { - e->ydy =3D move->value; + if (evt->abs.axis =3D=3D INPUT_AXIS_X) { + e->xdx =3D evt->abs.value; + } else if (evt->abs.axis =3D=3D INPUT_AXIS_Y) { + e->ydy =3D evt->abs.value; } break; =20 case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - if (btn->down) { - e->buttons_state |=3D bmap[btn->button]; - if (btn->button =3D=3D INPUT_BUTTON_WHEEL_UP) { + if (evt->btn.down) { + e->buttons_state |=3D bmap[evt->btn.button]; + if (evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_UP) { e->dz--; - } else if (btn->button =3D=3D INPUT_BUTTON_WHEEL_DOWN) { + } else if (evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_DOWN) { e->dz++; } } else { - e->buttons_state &=3D ~bmap[btn->button]; + e->buttons_state &=3D ~bmap[evt->btn.button]; } break; =20 @@ -231,10 +226,9 @@ static void hid_keyboard_event(DeviceState *dev, QemuC= onsole *src, HIDState *hs =3D (HIDState *)dev; int scancodes[3], i, count; int slot; - InputKeyEvent *key =3D evt->u.key.data; =20 - count =3D qemu_input_key_value_to_scancode(key->key, - key->down, + count =3D qemu_input_key_value_to_scancode(&evt->key.key, + evt->key.down, scancodes); if (hs->n + count > QUEUE_LENGTH) { trace_hid_kbd_queue_full(); diff --git a/hw/input/ps2.c b/hw/input/ps2.c index 90bcbcdff889..3e553176ef6e 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -313,7 +313,6 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, QemuInputEvent *evt) { PS2KbdState *s =3D (PS2KbdState *)dev; - InputKeyEvent *key =3D evt->u.key.data; int qcode; uint16_t keycode =3D 0; int mod; @@ -325,12 +324,12 @@ static void ps2_keyboard_event(DeviceState *dev, Qemu= Console *src, =20 qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL); assert(evt->type =3D=3D INPUT_EVENT_KIND_KEY); - qcode =3D qemu_input_key_value_to_qcode(key->key); + qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); =20 mod =3D ps2_modifier_bit(qcode); - trace_ps2_keyboard_event(s, qcode, key->down, mod, + trace_ps2_keyboard_event(s, qcode, evt->key.down, mod, s->modifiers, s->scancode_set, s->translate); - if (key->down) { + if (evt->key.down) { s->modifiers |=3D mod; } else { s->modifiers &=3D ~mod; @@ -339,14 +338,14 @@ static void ps2_keyboard_event(DeviceState *dev, Qemu= Console *src, if (s->scancode_set =3D=3D 1) { if (qcode =3D=3D Q_KEY_CODE_PAUSE) { if (s->modifiers & (MOD_CTRL_L | MOD_CTRL_R)) { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0x46); ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0xc6); } } else { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xe1); ps2_put_keycode(s, 0x1d); ps2_put_keycode(s, 0x45); @@ -357,7 +356,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, } } else if (qcode =3D=3D Q_KEY_CODE_PRINT) { if (s->modifiers & MOD_ALT_L) { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xb8); ps2_put_keycode(s, 0x38); ps2_put_keycode(s, 0x54); @@ -367,7 +366,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, ps2_put_keycode(s, 0x38); } } else if (s->modifiers & MOD_ALT_R) { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0xb8); ps2_put_keycode(s, 0xe0); @@ -382,7 +381,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, } } else if (s->modifiers & (MOD_SHIFT_L | MOD_CTRL_L | MOD_SHIFT_R | MOD_CTRL_R)) { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0x37); } else { @@ -390,7 +389,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, ps2_put_keycode(s, 0xb7); } } else { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0x2a); ps2_put_keycode(s, 0xe0); @@ -403,7 +402,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, } } } else if ((qcode =3D=3D Q_KEY_CODE_LANG1 || qcode =3D=3D Q_KEY_CO= DE_LANG2) - && !key->down) { + && !evt->key.down) { /* Ignore release for these keys */ } else { if (qcode < qemu_input_map_qcode_to_atset1_len) { @@ -413,7 +412,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, if (keycode & 0xff00) { ps2_put_keycode(s, keycode >> 8); } - if (!key->down) { + if (!evt->key.down) { keycode |=3D 0x80; } ps2_put_keycode(s, keycode & 0xff); @@ -425,7 +424,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, } else if (s->scancode_set =3D=3D 2) { if (qcode =3D=3D Q_KEY_CODE_PAUSE) { if (s->modifiers & (MOD_CTRL_L | MOD_CTRL_R)) { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0x7e); ps2_put_keycode(s, 0xe0); @@ -433,7 +432,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, ps2_put_keycode(s, 0x7e); } } else { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xe1); ps2_put_keycode(s, 0x14); ps2_put_keycode(s, 0x77); @@ -446,7 +445,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, } } else if (qcode =3D=3D Q_KEY_CODE_PRINT) { if (s->modifiers & MOD_ALT_L) { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xf0); ps2_put_keycode(s, 0x11); ps2_put_keycode(s, 0x11); @@ -459,7 +458,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, ps2_put_keycode(s, 0x11); } } else if (s->modifiers & MOD_ALT_R) { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0xf0); ps2_put_keycode(s, 0x11); @@ -477,7 +476,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, } } else if (s->modifiers & (MOD_SHIFT_L | MOD_CTRL_L | MOD_SHIFT_R | MOD_CTRL_R)) { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0x7c); } else { @@ -486,7 +485,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, ps2_put_keycode(s, 0x7c); } } else { - if (key->down) { + if (evt->key.down) { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0x12); ps2_put_keycode(s, 0xe0); @@ -501,7 +500,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, } } } else if ((qcode =3D=3D Q_KEY_CODE_LANG1 || qcode =3D=3D Q_KEY_CO= DE_LANG2) && - !key->down) { + !evt->key.down) { /* Ignore release for these keys */ } else { if (qcode < qemu_input_map_qcode_to_atset2_len) { @@ -511,7 +510,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, if (keycode & 0xff00) { ps2_put_keycode(s, keycode >> 8); } - if (!key->down) { + if (!evt->key.down) { ps2_put_keycode(s, 0xf0); } ps2_put_keycode(s, keycode & 0xff); @@ -526,7 +525,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, } if (keycode) { /* FIXME: break code should be configured on a key by key basi= s */ - if (!key->down) { + if (!evt->key.down) { ps2_put_keycode(s, 0xf0); } ps2_put_keycode(s, keycode); @@ -797,8 +796,6 @@ static void ps2_mouse_event(DeviceState *dev, QemuConso= le *src, [INPUT_BUTTON_EXTRA] =3D PS2_MOUSE_BUTTON_EXTRA, }; PS2MouseState *s =3D (PS2MouseState *)dev; - InputMoveEvent *move; - InputBtnEvent *btn; =20 /* check if deltas are recorded when disabled */ if (!(s->mouse_status & MOUSE_STATUS_ENABLED)) { @@ -807,31 +804,29 @@ static void ps2_mouse_event(DeviceState *dev, QemuCon= sole *src, =20 switch (evt->type) { case INPUT_EVENT_KIND_REL: - move =3D evt->u.rel.data; - if (move->axis =3D=3D INPUT_AXIS_X) { - s->mouse_dx +=3D move->value; - } else if (move->axis =3D=3D INPUT_AXIS_Y) { - s->mouse_dy -=3D move->value; + if (evt->rel.axis =3D=3D INPUT_AXIS_X) { + s->mouse_dx +=3D evt->rel.value; + } else if (evt->rel.axis =3D=3D INPUT_AXIS_Y) { + s->mouse_dy -=3D evt->rel.value; } break; =20 case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - if (btn->down) { - s->mouse_buttons |=3D bmap[btn->button]; - if (btn->button =3D=3D INPUT_BUTTON_WHEEL_UP) { + if (evt->btn.down) { + s->mouse_buttons |=3D bmap[evt->btn.button]; + if (evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_UP) { s->mouse_dz--; - } else if (btn->button =3D=3D INPUT_BUTTON_WHEEL_DOWN) { + } else if (evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_DOWN) { s->mouse_dz++; } =20 - if (btn->button =3D=3D INPUT_BUTTON_WHEEL_RIGHT) { + if (evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_RIGHT) { s->mouse_dw--; - } else if (btn->button =3D=3D INPUT_BUTTON_WHEEL_LEFT) { + } else if (evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_LEFT) { s->mouse_dw++; } } else { - s->mouse_buttons &=3D ~bmap[btn->button]; + s->mouse_buttons &=3D ~bmap[evt->btn.button]; } break; =20 diff --git a/hw/input/stellaris_gamepad.c b/hw/input/stellaris_gamepad.c index db35905554d5..7d8ec38e8885 100644 --- a/hw/input/stellaris_gamepad.c +++ b/hw/input/stellaris_gamepad.c @@ -19,14 +19,13 @@ static void stellaris_gamepad_event(DeviceState *dev, Q= emuConsole *src, QemuInputEvent *evt) { StellarisGamepad *s =3D STELLARIS_GAMEPAD(dev); - InputKeyEvent *key =3D evt->u.key.data; - int qcode =3D qemu_input_key_value_to_qcode(key->key); + int qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); int i; =20 for (i =3D 0; i < s->num_buttons; i++) { - if (s->keycodes[i] =3D=3D qcode && s->pressed[i] !=3D key->down) { - s->pressed[i] =3D key->down; - qemu_set_irq(s->irqs[i], key->down); + if (s->keycodes[i] =3D=3D qcode && s->pressed[i] !=3D evt->key.dow= n) { + s->pressed[i] =3D evt->key.down; + qemu_set_irq(s->irqs[i], evt->key.down); } } } diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index 5b9f407c546d..3f8a1bc249e0 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -84,80 +84,71 @@ static void virtio_input_handle_event(DeviceState *dev,= QemuConsole *src, VirtIOInput *vinput =3D VIRTIO_INPUT(dev); virtio_input_event event; int qcode; - InputKeyEvent *key; - InputMoveEvent *move; - InputBtnEvent *btn; - InputMultiTouchEvent *mtt; =20 switch (evt->type) { case INPUT_EVENT_KIND_KEY: - key =3D evt->u.key.data; - qcode =3D qemu_input_key_value_to_qcode(key->key); + qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); if (qcode < qemu_input_map_qcode_to_linux_len && qemu_input_map_qcode_to_linux[qcode]) { event.type =3D cpu_to_le16(EV_KEY); event.code =3D cpu_to_le16(qemu_input_map_qcode_to_linux[qcod= e]); - event.value =3D cpu_to_le32(key->down ? 1 : 0); + event.value =3D cpu_to_le32(evt->key.down ? 1 : 0); virtio_input_send(vinput, &event); } else { - if (key->down) { + if (evt->key.down) { fprintf(stderr, "%s: unmapped key: %d [%s]\n", __func__, qcode, QKeyCode_str(qcode)); } } break; case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - if ((btn->button =3D=3D INPUT_BUTTON_WHEEL_UP || - btn->button =3D=3D INPUT_BUTTON_WHEEL_DOWN) && - btn->down) { + if ((evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_UP || + evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_DOWN) && + evt->btn.down) { event.type =3D cpu_to_le16(EV_REL); event.code =3D cpu_to_le16(REL_WHEEL); - event.value =3D cpu_to_le32(btn->button =3D=3D INPUT_BUTTON_WH= EEL_UP + event.value =3D cpu_to_le32(evt->btn.button =3D=3D INPUT_BUTTO= N_WHEEL_UP ? 1 : -1); virtio_input_send(vinput, &event); - } else if (keymap_button[btn->button]) { + } else if (keymap_button[evt->btn.button]) { event.type =3D cpu_to_le16(EV_KEY); - event.code =3D cpu_to_le16(keymap_button[btn->button]); - event.value =3D cpu_to_le32(btn->down ? 1 : 0); + event.code =3D cpu_to_le16(keymap_button[evt->btn.button]); + event.value =3D cpu_to_le32(evt->btn.down ? 1 : 0); virtio_input_send(vinput, &event); } else { - if (btn->down) { + if (evt->btn.down) { fprintf(stderr, "%s: unmapped button: %d [%s]\n", __func__, - btn->button, - InputButton_str(btn->button)); + evt->btn.button, + InputButton_str(evt->btn.button)); } } break; case INPUT_EVENT_KIND_REL: - move =3D evt->u.rel.data; event.type =3D cpu_to_le16(EV_REL); - event.code =3D cpu_to_le16(axismap_rel[move->axis]); - event.value =3D cpu_to_le32(move->value); + event.code =3D cpu_to_le16(axismap_rel[evt->rel.axis]); + event.value =3D cpu_to_le32(evt->rel.value); virtio_input_send(vinput, &event); break; case INPUT_EVENT_KIND_ABS: - move =3D evt->u.abs.data; event.type =3D cpu_to_le16(EV_ABS); - event.code =3D cpu_to_le16(axismap_abs[move->axis]); - event.value =3D cpu_to_le32(move->value); + event.code =3D cpu_to_le16(axismap_abs[evt->abs.axis]); + event.value =3D cpu_to_le32(evt->abs.value); virtio_input_send(vinput, &event); break; case INPUT_EVENT_KIND_MTT: - mtt =3D evt->u.mtt.data; - if (mtt->type =3D=3D INPUT_MULTI_TOUCH_TYPE_DATA) { + if (evt->mtt.type =3D=3D INPUT_MULTI_TOUCH_TYPE_DATA) { event.type =3D cpu_to_le16(EV_ABS); - event.code =3D cpu_to_le16(axismap_tch[mtt->axis]); - event.value =3D cpu_to_le32(mtt->value); + event.code =3D cpu_to_le16(axismap_tch[evt->mtt.axis]); + event.value =3D cpu_to_le32(evt->mtt.value); virtio_input_send(vinput, &event); } else { event.type =3D cpu_to_le16(EV_ABS); event.code =3D cpu_to_le16(ABS_MT_SLOT); - event.value =3D cpu_to_le32(mtt->slot); + event.value =3D cpu_to_le32(evt->mtt.slot); virtio_input_send(vinput, &event); event.type =3D cpu_to_le16(EV_ABS); event.code =3D cpu_to_le16(ABS_MT_TRACKING_ID); - event.value =3D cpu_to_le32(mtt->tracking_id); + event.value =3D cpu_to_le32(evt->mtt.tracking_id); virtio_input_send(vinput, &event); } break; diff --git a/hw/m68k/next-kbd.c b/hw/m68k/next-kbd.c index 9dbedac6479e..f3110ea0bca4 100644 --- a/hw/m68k/next-kbd.c +++ b/hw/m68k/next-kbd.c @@ -247,16 +247,15 @@ static void nextkbd_event(DeviceState *dev, QemuConso= le *src, { NextKBDState *s =3D NEXTKBD(dev); int qcode, keycode; - bool key_down =3D evt->u.key.data->down; =20 - qcode =3D qemu_input_key_value_to_qcode(evt->u.key.data->key); + qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); if (qcode >=3D ARRAY_SIZE(qcode_to_nextkbd_keycode)) { return; } =20 /* Shift key currently has no keycode, so handle separately */ if (qcode =3D=3D Q_KEY_CODE_SHIFT) { - if (key_down) { + if (evt->key.down) { s->shift |=3D KD_LSHIFT; } else { s->shift &=3D ~KD_LSHIFT; @@ -264,7 +263,7 @@ static void nextkbd_event(DeviceState *dev, QemuConsole= *src, } =20 if (qcode =3D=3D Q_KEY_CODE_SHIFT_R) { - if (key_down) { + if (evt->key.down) { s->shift |=3D KD_RSHIFT; } else { s->shift &=3D ~KD_RSHIFT; @@ -277,7 +276,7 @@ static void nextkbd_event(DeviceState *dev, QemuConsole= *src, } =20 /* If key release event, create keyboard break code */ - if (!key_down) { + if (!evt->key.down) { keycode |=3D 0x80; } =20 diff --git a/replay/replay-events.c b/replay/replay-events.c index 20df810279e2..3ff42acb06bf 100644 --- a/replay/replay-events.c +++ b/replay/replay-events.c @@ -42,7 +42,7 @@ static void replay_run_event(Event *event) break; case REPLAY_ASYNC_EVENT_INPUT: qemu_input_event_send_impl(NULL, (QemuInputEvent *)event->opaque); - qapi_free_InputEvent((InputEvent *)event->opaque); + g_free(event->opaque); break; case REPLAY_ASYNC_EVENT_INPUT_SYNC: qemu_input_event_sync_impl(); diff --git a/replay/replay-input.c b/replay/replay-input.c index 3f506f2338a3..0995b125f244 100644 --- a/replay/replay-input.c +++ b/replay/replay-input.c @@ -19,25 +19,20 @@ =20 void replay_save_input_event(QemuInputEvent *evt) { - InputKeyEvent *key; - InputBtnEvent *btn; - InputMoveEvent *move; - InputMultiTouchEvent *mtt; replay_put_dword(evt->type); =20 switch (evt->type) { case INPUT_EVENT_KIND_KEY: - key =3D evt->u.key.data; - replay_put_dword(key->key->type); + replay_put_dword(evt->key.key.type); =20 - switch (key->key->type) { + switch (evt->key.key.type) { case KEY_VALUE_KIND_NUMBER: - replay_put_qword(key->key->u.number.data); - replay_put_byte(key->down); + replay_put_qword(evt->key.key.u.number.data); + replay_put_byte(evt->key.down); break; case KEY_VALUE_KIND_QCODE: - replay_put_dword(key->key->u.qcode.data); - replay_put_byte(key->down); + replay_put_dword(evt->key.key.u.qcode.data); + replay_put_byte(evt->key.down); break; case KEY_VALUE_KIND__MAX: /* keep gcc happy */ @@ -45,27 +40,23 @@ void replay_save_input_event(QemuInputEvent *evt) } break; case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - replay_put_dword(btn->button); - replay_put_byte(btn->down); + replay_put_dword(evt->btn.button); + replay_put_byte(evt->btn.down); break; case INPUT_EVENT_KIND_REL: - move =3D evt->u.rel.data; - replay_put_dword(move->axis); - replay_put_qword(move->value); + replay_put_dword(evt->rel.axis); + replay_put_qword(evt->rel.value); break; case INPUT_EVENT_KIND_ABS: - move =3D evt->u.abs.data; - replay_put_dword(move->axis); - replay_put_qword(move->value); + replay_put_dword(evt->abs.axis); + replay_put_qword(evt->abs.value); break; case INPUT_EVENT_KIND_MTT: - mtt =3D evt->u.mtt.data; - replay_put_dword(mtt->type); - replay_put_qword(mtt->slot); - replay_put_qword(mtt->tracking_id); - replay_put_dword(mtt->axis); - replay_put_qword(mtt->value); + replay_put_dword(evt->mtt.type); + replay_put_qword(evt->mtt.slot); + replay_put_qword(evt->mtt.tracking_id); + replay_put_dword(evt->mtt.axis); + replay_put_qword(evt->mtt.value); break; case INPUT_EVENT_KIND__MAX: /* keep gcc happy */ @@ -75,29 +66,21 @@ void replay_save_input_event(QemuInputEvent *evt) =20 QemuInputEvent *replay_read_input_event(void) { - QemuInputEvent evt; - KeyValue keyValue; - InputKeyEvent key; - key.key =3D &keyValue; - InputBtnEvent btn; - InputMoveEvent rel; - InputMoveEvent abs; - InputMultiTouchEvent mtt; + QemuInputEvent *evt =3D g_new(QemuInputEvent, 1); =20 - evt.type =3D replay_get_dword(); - switch (evt.type) { + evt->type =3D replay_get_dword(); + switch (evt->type) { case INPUT_EVENT_KIND_KEY: - evt.u.key.data =3D &key; - evt.u.key.data->key->type =3D replay_get_dword(); + evt->key.key.type =3D replay_get_dword(); =20 - switch (evt.u.key.data->key->type) { + switch (evt->key.key.type) { case KEY_VALUE_KIND_NUMBER: - evt.u.key.data->key->u.number.data =3D replay_get_qword(); - evt.u.key.data->down =3D replay_get_byte(); + evt->key.key.u.number.data =3D replay_get_qword(); + evt->key.down =3D replay_get_byte(); break; case KEY_VALUE_KIND_QCODE: - evt.u.key.data->key->u.qcode.data =3D (QKeyCode)replay_get_dwo= rd(); - evt.u.key.data->down =3D replay_get_byte(); + evt->key.key.u.qcode.data =3D (QKeyCode)replay_get_dword(); + evt->key.down =3D replay_get_byte(); break; case KEY_VALUE_KIND__MAX: /* keep gcc happy */ @@ -105,34 +88,30 @@ QemuInputEvent *replay_read_input_event(void) } break; case INPUT_EVENT_KIND_BTN: - evt.u.btn.data =3D &btn; - evt.u.btn.data->button =3D (InputButton)replay_get_dword(); - evt.u.btn.data->down =3D replay_get_byte(); + evt->btn.button =3D (InputButton)replay_get_dword(); + evt->btn.down =3D replay_get_byte(); break; case INPUT_EVENT_KIND_REL: - evt.u.rel.data =3D &rel; - evt.u.rel.data->axis =3D (InputAxis)replay_get_dword(); - evt.u.rel.data->value =3D replay_get_qword(); + evt->rel.axis =3D (InputAxis)replay_get_dword(); + evt->rel.value =3D replay_get_qword(); break; case INPUT_EVENT_KIND_ABS: - evt.u.abs.data =3D &abs; - evt.u.abs.data->axis =3D (InputAxis)replay_get_dword(); - evt.u.abs.data->value =3D replay_get_qword(); + evt->abs.axis =3D (InputAxis)replay_get_dword(); + evt->abs.value =3D replay_get_qword(); break; case INPUT_EVENT_KIND_MTT: - evt.u.mtt.data =3D &mtt; - evt.u.mtt.data->type =3D (InputMultiTouchType)replay_get_dword(); - evt.u.mtt.data->slot =3D replay_get_qword(); - evt.u.mtt.data->tracking_id =3D replay_get_qword(); - evt.u.mtt.data->axis =3D (InputAxis)replay_get_dword(); - evt.u.mtt.data->value =3D replay_get_qword(); + evt->mtt.type =3D (InputMultiTouchType)replay_get_dword(); + evt->mtt.slot =3D replay_get_qword(); + evt->mtt.tracking_id =3D replay_get_qword(); + evt->mtt.axis =3D (InputAxis)replay_get_dword(); + evt->mtt.value =3D replay_get_qword(); break; case INPUT_EVENT_KIND__MAX: /* keep gcc happy */ break; } =20 - return QAPI_CLONE(InputEvent, &evt); + return evt; } =20 void replay_input_event(QemuConsole *src, QemuInputEvent *evt) @@ -140,7 +119,9 @@ void replay_input_event(QemuConsole *src, QemuInputEven= t *evt) if (replay_mode =3D=3D REPLAY_MODE_PLAY) { /* Nothing */ } else if (replay_mode =3D=3D REPLAY_MODE_RECORD) { - replay_add_input_event(QAPI_CLONE(InputEvent, evt)); + QemuInputEvent *clone =3D g_new(QemuInputEvent, 1); + *clone =3D *evt; + replay_add_input_event(clone); } else { qemu_input_event_send_impl(src, evt); } diff --git a/ui/input-legacy.c b/ui/input-legacy.c index 5467010c3713..e2b48dd8f0aa 100644 --- a/ui/input-legacy.c +++ b/ui/input-legacy.c @@ -118,39 +118,36 @@ static void legacy_mouse_event(DeviceState *dev, Qemu= Console *src, [INPUT_BUTTON_RIGHT] =3D MOUSE_EVENT_RBUTTON, }; QEMUPutMouseEntry *s =3D (QEMUPutMouseEntry *)dev; - InputBtnEvent *btn; - InputMoveEvent *move; =20 switch (evt->type) { case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - if (btn->down) { - s->buttons |=3D bmap[btn->button]; + if (evt->btn.down) { + s->buttons |=3D bmap[evt->btn.button]; } else { - s->buttons &=3D ~bmap[btn->button]; + s->buttons &=3D ~bmap[evt->btn.button]; } - if (btn->down && btn->button =3D=3D INPUT_BUTTON_WHEEL_UP) { + if (evt->btn.down && evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_UP)= { s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque, s->axis[INPUT_AXIS_X], s->axis[INPUT_AXIS_Y], -1, s->buttons); } - if (btn->down && btn->button =3D=3D INPUT_BUTTON_WHEEL_DOWN) { + if (evt->btn.down && evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_DOW= N) { s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque, s->axis[INPUT_AXIS_X], s->axis[INPUT_AXIS_Y], 1, s->buttons); } - if (btn->down && btn->button =3D=3D INPUT_BUTTON_WHEEL_RIGHT) { + if (evt->btn.down && evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_RIG= HT) { s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque, s->axis[INPUT_AXIS_X], s->axis[INPUT_AXIS_Y], -2, s->buttons); } - if (btn->down && btn->button =3D=3D INPUT_BUTTON_WHEEL_LEFT) { + if (evt->btn.down && evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_LEF= T) { s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque, s->axis[INPUT_AXIS_X], s->axis[INPUT_AXIS_Y], @@ -159,12 +156,10 @@ static void legacy_mouse_event(DeviceState *dev, Qemu= Console *src, } break; case INPUT_EVENT_KIND_ABS: - move =3D evt->u.abs.data; - s->axis[move->axis] =3D move->value; + s->axis[evt->abs.axis] =3D evt->abs.value; break; case INPUT_EVENT_KIND_REL: - move =3D evt->u.rel.data; - s->axis[move->axis] +=3D move->value; + s->axis[evt->rel.axis] +=3D evt->rel.value; break; default: break; diff --git a/ui/input.c b/ui/input.c index 52ab7beb9428..a3ced08429e3 100644 --- a/ui/input.c +++ b/ui/input.c @@ -30,7 +30,7 @@ struct QemuInputEventQueue { QEMUTimer *timer; uint32_t delay_ms; QemuConsole *src; - QemuInputEvent *evt; + QemuInputEvent evt; QTAILQ_ENTRY(QemuInputEventQueue) node; }; =20 @@ -159,16 +159,55 @@ void qmp_input_send_event(const char *device, } =20 for (e =3D events; e !=3D NULL; e =3D e->next) { - InputEvent *evt =3D e->value; - - if (evt->type =3D=3D INPUT_EVENT_KIND_KEY && - evt->u.key.data->key->type =3D=3D KEY_VALUE_KIND_NUMBER) { - KeyValue *key =3D evt->u.key.data->key; - QKeyCode code =3D qemu_input_key_number_to_qcode(key->u.number= .data); - qemu_input_event_send_key_qcode(con, code, evt->u.key.data->do= wn); - } else { - qemu_input_event_send(con, evt); + InputEvent *qapi =3D e->value; + QemuInputEvent evt; + + evt.type =3D qapi->type; + + switch (qapi->type) { + case INPUT_EVENT_KIND_KEY: { + KeyValue *key =3D qapi->u.key.data->key; + QKeyCode code; + + switch (key->type) { + case KEY_VALUE_KIND_NUMBER: + code =3D qemu_input_key_number_to_qcode(key->u.number.data= ); + break; + case KEY_VALUE_KIND_QCODE: + code =3D key->u.qcode.data; + break; + default: + g_assert_not_reached(); + } + + evt.key.key.type =3D KEY_VALUE_KIND_QCODE; + evt.key.key.u.qcode.data =3D code; + evt.key.key =3D *qapi->u.key.data->key; + evt.key.down =3D qapi->u.key.data->down; + break; } + + case INPUT_EVENT_KIND_BTN: + evt.btn =3D *qapi->u.btn.data; + break; + + case INPUT_EVENT_KIND_REL: + evt.rel =3D *qapi->u.rel.data; + break; + + case INPUT_EVENT_KIND_ABS: + evt.abs =3D *qapi->u.abs.data; + break; + + case INPUT_EVENT_KIND_MTT: + evt.mtt =3D *qapi->u.mtt.data; + break; + + default: + g_assert_not_reached(); + } + + qemu_input_event_send(con, &evt); } =20 qemu_input_event_sync(); @@ -178,27 +217,22 @@ static void qemu_input_event_trace(QemuConsole *src, = QemuInputEvent *evt) { const char *name; int qcode, idx =3D -1; - InputKeyEvent *key; - InputBtnEvent *btn; - InputMoveEvent *move; - InputMultiTouchEvent *mtt; =20 if (src) { idx =3D qemu_console_get_index(src); } switch (evt->type) { case INPUT_EVENT_KIND_KEY: - key =3D evt->u.key.data; - switch (key->key->type) { + switch (evt->key.key.type) { case KEY_VALUE_KIND_NUMBER: - qcode =3D qemu_input_key_number_to_qcode(key->key->u.number.da= ta); + qcode =3D qemu_input_key_number_to_qcode(evt->key.key.u.number= .data); name =3D QKeyCode_str(qcode); - trace_input_event_key_number(idx, key->key->u.number.data, - name, key->down); + trace_input_event_key_number(idx, evt->key.key.u.number.data, + name, evt->key.down); break; case KEY_VALUE_KIND_QCODE: - name =3D QKeyCode_str(key->key->u.qcode.data); - trace_input_event_key_qcode(idx, name, key->down); + name =3D QKeyCode_str(evt->key.key.u.qcode.data); + trace_input_event_key_qcode(idx, name, evt->key.down); break; case KEY_VALUE_KIND__MAX: /* keep gcc happy */ @@ -206,24 +240,20 @@ static void qemu_input_event_trace(QemuConsole *src, = QemuInputEvent *evt) } break; case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - name =3D InputButton_str(btn->button); - trace_input_event_btn(idx, name, btn->down); + name =3D InputButton_str(evt->btn.button); + trace_input_event_btn(idx, name, evt->btn.down); break; case INPUT_EVENT_KIND_REL: - move =3D evt->u.rel.data; - name =3D InputAxis_str(move->axis); - trace_input_event_rel(idx, name, move->value); + name =3D InputAxis_str(evt->rel.axis); + trace_input_event_rel(idx, name, evt->rel.value); break; case INPUT_EVENT_KIND_ABS: - move =3D evt->u.abs.data; - name =3D InputAxis_str(move->axis); - trace_input_event_abs(idx, name, move->value); + name =3D InputAxis_str(evt->abs.axis); + trace_input_event_abs(idx, name, evt->abs.value); break; case INPUT_EVENT_KIND_MTT: - mtt =3D evt->u.mtt.data; - name =3D InputAxis_str(mtt->axis); - trace_input_event_mtt(idx, name, mtt->value); + name =3D InputAxis_str(evt->mtt.axis); + trace_input_event_mtt(idx, name, evt->mtt.value); break; case INPUT_EVENT_KIND__MAX: /* keep gcc happy */ @@ -251,8 +281,7 @@ static void qemu_input_queue_process(void *opaque) + item->delay_ms); return; case QEMU_INPUT_QUEUE_EVENT: - qemu_input_event_send(item->src, item->evt); - qapi_free_InputEvent(item->evt); + qemu_input_event_send(item->src, &item->evt); break; case QEMU_INPUT_QUEUE_SYNC: qemu_input_event_sync(); @@ -289,7 +318,7 @@ static void qemu_input_queue_event(QemuInputEventQueueH= ead *queue, =20 item->type =3D QEMU_INPUT_QUEUE_EVENT; item->src =3D src; - item->evt =3D evt; + item->evt =3D *evt; QTAILQ_INSERT_TAIL(queue, item, node); queue_count++; } @@ -323,7 +352,7 @@ void qemu_input_event_send(QemuConsole *src, QemuInputE= vent *evt) /* Expect all parts of QEMU to send events with QCodes exclusively. * Key numbers are only supported as end-user input via QMP */ assert(!(evt->type =3D=3D INPUT_EVENT_KIND_KEY && - evt->u.key.data->key->type =3D=3D KEY_VALUE_KIND_NUMBER)); + evt->key.key.type =3D=3D KEY_VALUE_KIND_NUMBER)); =20 =20 /* @@ -335,8 +364,8 @@ void qemu_input_event_send(QemuConsole *src, QemuInputE= vent *evt) * need to deal with this mistake */ if (evt->type =3D=3D INPUT_EVENT_KIND_KEY && - evt->u.key.data->key->u.qcode.data =3D=3D Q_KEY_CODE_SYSRQ) { - evt->u.key.data->key->u.qcode.data =3D Q_KEY_CODE_PRINT; + evt->key.key.u.qcode.data =3D=3D Q_KEY_CODE_SYSRQ) { + evt->key.key.u.qcode.data =3D Q_KEY_CODE_PRINT; } =20 if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) { @@ -372,29 +401,24 @@ void qemu_input_event_sync(void) replay_input_sync_event(); } =20 -static QemuInputEvent *qemu_input_event_new_key(KeyValue *key, bool down) -{ - QemuInputEvent *evt =3D g_new0(QemuInputEvent, 1); - evt->u.key.data =3D g_new0(InputKeyEvent, 1); - evt->type =3D INPUT_EVENT_KIND_KEY; - evt->u.key.data->key =3D key; - evt->u.key.data->down =3D down; - return evt; -} - void qemu_input_event_send_key(QemuConsole *src, KeyValue *key, bool down) { - QemuInputEvent *evt; - evt =3D qemu_input_event_new_key(key, down); + QemuInputEvent evt =3D { + .type =3D INPUT_EVENT_KIND_KEY, + .key =3D { + .key =3D *key, + .down =3D down, + }, + }; + + g_free(key); + if (QTAILQ_EMPTY(&kbd_queue)) { - qemu_input_event_send(src, evt); + qemu_input_event_send(src, &evt); qemu_input_event_sync(); - qapi_free_InputEvent(evt); } else if (queue_count < queue_limit) { - qemu_input_queue_event(&kbd_queue, src, evt); + qemu_input_queue_event(&kbd_queue, src, &evt); qemu_input_queue_sync(&kbd_queue); - } else { - qapi_free_InputEvent(evt); } } =20 @@ -431,13 +455,12 @@ void qemu_input_event_send_key_delay(uint32_t delay_m= s) =20 void qemu_input_queue_btn(QemuConsole *src, InputButton btn, bool down) { - InputBtnEvent bevt =3D { - .button =3D btn, - .down =3D down, - }; QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_BTN, - .u.btn.data =3D &bevt, + .btn =3D { + .button =3D btn, + .down =3D down, + } }; =20 qemu_input_event_send(src, &evt); @@ -482,13 +505,12 @@ int qemu_input_scale_axis(int value, =20 void qemu_input_queue_rel(QemuConsole *src, InputAxis axis, int value) { - InputMoveEvent move =3D { - .axis =3D axis, - .value =3D value, - }; QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_REL, - .u.rel.data =3D &move, + .rel =3D { + .axis =3D axis, + .value =3D value, + }, }; =20 qemu_input_event_send(src, &evt); @@ -497,15 +519,14 @@ void qemu_input_queue_rel(QemuConsole *src, InputAxis= axis, int value) void qemu_input_queue_abs(QemuConsole *src, InputAxis axis, int value, int min_in, int max_in) { - InputMoveEvent move =3D { - .axis =3D axis, - .value =3D qemu_input_scale_axis(value, min_in, max_in, - INPUT_EVENT_ABS_MIN, - INPUT_EVENT_ABS_MAX), - }; QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_ABS, - .u.abs.data =3D &move, + .abs =3D { + .axis =3D axis, + .value =3D qemu_input_scale_axis(value, min_in, max_in, + INPUT_EVENT_ABS_MIN, + INPUT_EVENT_ABS_MAX), + }, }; =20 qemu_input_event_send(src, &evt); @@ -514,14 +535,13 @@ void qemu_input_queue_abs(QemuConsole *src, InputAxis= axis, int value, void qemu_input_queue_mtt(QemuConsole *src, InputMultiTouchType type, int slot, int tracking_id) { - InputMultiTouchEvent mtt =3D { - .type =3D type, - .slot =3D slot, - .tracking_id =3D tracking_id, - }; QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_MTT, - .u.mtt.data =3D &mtt, + .mtt =3D { + .type =3D type, + .slot =3D slot, + .tracking_id =3D tracking_id, + }, }; =20 qemu_input_event_send(src, &evt); @@ -530,18 +550,17 @@ void qemu_input_queue_mtt(QemuConsole *src, InputMult= iTouchType type, void qemu_input_queue_mtt_abs(QemuConsole *src, InputAxis axis, int value, int min_in, int max_in, int slot, int tracki= ng_id) { - InputMultiTouchEvent mtt =3D { - .type =3D INPUT_MULTI_TOUCH_TYPE_DATA, - .slot =3D slot, - .tracking_id =3D tracking_id, - .axis =3D axis, - .value =3D qemu_input_scale_axis(value, min_in, max_in, - INPUT_EVENT_ABS_MIN, - INPUT_EVENT_ABS_MAX), - }; QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_MTT, - .u.mtt.data =3D &mtt, + .mtt =3D { + .type =3D INPUT_MULTI_TOUCH_TYPE_DATA, + .slot =3D slot, + .tracking_id =3D tracking_id, + .axis =3D axis, + .value =3D qemu_input_scale_axis(value, min_in, max_in, + INPUT_EVENT_ABS_MIN, + INPUT_EVENT_ABS_MAX), + } }; =20 qemu_input_event_send(src, &evt); diff --git a/ui/vdagent.c b/ui/vdagent.c index 28a83c7c389c..8fa325bffa32 100644 --- a/ui/vdagent.c +++ b/ui/vdagent.c @@ -241,22 +241,19 @@ static void vdagent_pointer_event(DeviceState *dev, Q= emuConsole *src, }; =20 VDAgentChardev *vd =3D container_of(dev, struct VDAgentChardev, mouse_= dev); - InputMoveEvent *move; - InputBtnEvent *btn; uint32_t xres, yres; =20 switch (evt->type) { case INPUT_EVENT_KIND_ABS: - move =3D evt->u.abs.data; xres =3D qemu_console_get_width(src, 1024); yres =3D qemu_console_get_height(src, 768); - if (move->axis =3D=3D INPUT_AXIS_X) { - vd->mouse_x =3D qemu_input_scale_axis(move->value, + if (evt->abs.axis =3D=3D INPUT_AXIS_X) { + vd->mouse_x =3D qemu_input_scale_axis(evt->abs.value, INPUT_EVENT_ABS_MIN, INPUT_EVENT_ABS_MAX, 0, xres); - } else if (move->axis =3D=3D INPUT_AXIS_Y) { - vd->mouse_y =3D qemu_input_scale_axis(move->value, + } else if (evt->abs.axis =3D=3D INPUT_AXIS_Y) { + vd->mouse_y =3D qemu_input_scale_axis(evt->abs.value, INPUT_EVENT_ABS_MIN, INPUT_EVENT_ABS_MAX, 0, yres); @@ -265,11 +262,10 @@ static void vdagent_pointer_event(DeviceState *dev, Q= emuConsole *src, break; =20 case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; - if (btn->down) { - vd->mouse_btn |=3D bmap[btn->button]; + if (evt->btn.down) { + vd->mouse_btn |=3D bmap[evt->btn.button]; } else { - vd->mouse_btn &=3D ~bmap[btn->button]; + vd->mouse_btn &=3D ~bmap[evt->btn.button]; } break; =20 --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778323843153103.0399948722503; Sat, 9 May 2026 03:50:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFj-0000xA-Gn; Sat, 09 May 2026 06:49:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF7-0008Py-QA; Sat, 09 May 2026 06:49:11 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF0-0001fI-2M; Sat, 09 May 2026 06:49:07 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY24090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:57 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=QiD9+kXlaVObjOxaTFX7+dM8Zt+46Qtj4EsZY5ikwXY=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323677; v=1; b=lxyrOHvLXPpmRxvkVXdI2WoJkCctS8rfeqhryah7NpSit8QNizOJIL+02uNIpie5 Jd9nblxrN7agF1LJYb9K9Vrnuu73cXqXpnB6Jt1C1VWAlx/oQvNpADDcUg3nfHsH 9HLq8o0+Mbkh3hDHvD+XaMMgDmeeSfQMoQgLg3rrokFBj/GCYk4VlUuI94WhzPi3 WtwQNPO8MysHK8bEltWFcRWcs0PDIqn70YC94ncXjAsHVNTVpnYQr7E04Jr0Zdd+ bMGelHsDXZCqwUCl+AQ3Vs8qL/VDY0hsFzCWgdbZ3V76OFSkCQAV9DGzPyzAXq2M WMXB0xuToqs0UYIiZeEv2g== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:15 +0900 Subject: [PATCH RFC 03/28] ui/input: Store QKeyCode directly in QemuInputKeyEvent MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-3-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=13392; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=e8iT2H/Fth8Ht2jHdp/kdfZUeIhljVo9RaAdfEWNurc=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gfPRsz93Lp9jPIfJ3bZIVkjuu1hx1TefpjPXQk5aB oa//tbaUcrCIMbFICumyJJStJtbI7r2U2FCfAvMHFYmkCEMXJwCMBH2xYwMH7ZduM+Uov30YroC +9FlVzoKCn+s0HPYNeGxi46xA5dmJyPDt7Xc81+pzbtT5rqs6pl66ZHC+kz1zb4ei4917GN1zbn MDgA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778323844392158500 Since commit af07e5ff02ae ("ui: convert key events to QKeyCodes immediately"), all internal key events are expected to be represented as QKeyCode. Replace KeyValue in QemuInputKeyEvent with QKeyCode to enforce that and simplify key code retrieval. Signed-off-by: Akihiko Odaki --- include/ui/input.h | 5 ++--- hw/arm/musicpal.c | 2 +- hw/char/escc.c | 2 +- hw/display/xenfb.c | 2 +- hw/input/adb-kbd.c | 2 +- hw/input/hid.c | 5 ++--- hw/input/ps2.c | 2 +- hw/input/stellaris_gamepad.c | 2 +- hw/input/virtio-input-hid.c | 2 +- hw/m68k/next-kbd.c | 2 +- replay/replay-input.c | 29 ++++++----------------------- ui/input-keymap.c | 9 ++++----- ui/input.c | 35 +++++++---------------------------- ui/trace-events | 1 - 14 files changed, 29 insertions(+), 71 deletions(-) diff --git a/include/ui/input.h b/include/ui/input.h index bcca0f886f84..1ad5d781a4cf 100644 --- a/include/ui/input.h +++ b/include/ui/input.h @@ -19,7 +19,7 @@ typedef struct QemuInputHandler QemuInputHandler; typedef struct QemuInputHandlerState QemuInputHandlerState; =20 typedef struct QemuInputKeyEvent { - KeyValue key; + QKeyCode key; bool down; } QemuInputKeyEvent; =20 @@ -65,8 +65,7 @@ void qemu_input_event_send_key_delay(uint32_t delay_ms); int qemu_input_key_number_to_qcode(unsigned int nr); int qemu_input_key_value_to_number(const KeyValue *value); int qemu_input_key_value_to_qcode(const KeyValue *value); -int qemu_input_key_value_to_scancode(const KeyValue *value, bool down, - int *codes); +int qemu_input_qcode_to_scancode(QKeyCode qcode, bool down, int *codes); int qemu_input_linux_to_qcode(unsigned int lnx); =20 void qemu_input_queue_btn(QemuConsole *src, InputButton btn, bool down); diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c index b9a2295e75d2..43037ca29038 100644 --- a/hw/arm/musicpal.c +++ b/hw/arm/musicpal.c @@ -1068,7 +1068,7 @@ static void musicpal_key_event(DeviceState *dev, Qemu= Console *src, QemuInputEvent *evt) { musicpal_key_state *s =3D MUSICPAL_KEY(dev); - int qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); + int qcode =3D evt->key.key; uint32_t event =3D 0; int i; =20 diff --git a/hw/char/escc.c b/hw/char/escc.c index c88b2d54ebe0..3ad803537e5e 100644 --- a/hw/char/escc.c +++ b/hw/char/escc.c @@ -800,7 +800,7 @@ static void sunkbd_handle_event(DeviceState *dev, QemuC= onsole *src, int qcode, keycode; =20 assert(evt->type =3D=3D INPUT_EVENT_KIND_KEY); - qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); + qcode =3D evt->key.key; trace_escc_sunkbd_event_in(qcode, QKeyCode_str(qcode), evt->key.down); =20 diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c index a6ef89fcb280..6227b34a5acc 100644 --- a/hw/display/xenfb.c +++ b/hw/display/xenfb.c @@ -203,7 +203,7 @@ static void xenfb_key_event(DeviceState *dev, QemuConso= le *src, QemuInputEvent *evt) { struct XenInput *xenfb =3D (struct XenInput *)dev; - int qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); + int qcode =3D evt->key.key; int lnx; =20 if (qcode < qemu_input_map_qcode_to_linux_len) { diff --git a/hw/input/adb-kbd.c b/hw/input/adb-kbd.c index 5911e7139257..db3c77775009 100644 --- a/hw/input/adb-kbd.c +++ b/hw/input/adb-kbd.c @@ -311,7 +311,7 @@ static void adb_keyboard_event(DeviceState *dev, QemuCo= nsole *src, KBDState *s =3D (KBDState *)dev; int qcode, keycode; =20 - qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); + qcode =3D evt->key.key; if (qcode >=3D ARRAY_SIZE(qcode_to_adb_keycode)) { return; } diff --git a/hw/input/hid.c b/hw/input/hid.c index 90b29682a254..31f6331c7d7e 100644 --- a/hw/input/hid.c +++ b/hw/input/hid.c @@ -227,9 +227,8 @@ static void hid_keyboard_event(DeviceState *dev, QemuCo= nsole *src, int scancodes[3], i, count; int slot; =20 - count =3D qemu_input_key_value_to_scancode(&evt->key.key, - evt->key.down, - scancodes); + count =3D qemu_input_qcode_to_scancode(evt->key.key, evt->key.down, + scancodes); if (hs->n + count > QUEUE_LENGTH) { trace_hid_kbd_queue_full(); return; diff --git a/hw/input/ps2.c b/hw/input/ps2.c index 3e553176ef6e..9090a0427bd8 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -324,7 +324,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, =20 qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL); assert(evt->type =3D=3D INPUT_EVENT_KIND_KEY); - qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); + qcode =3D evt->key.key; =20 mod =3D ps2_modifier_bit(qcode); trace_ps2_keyboard_event(s, qcode, evt->key.down, mod, diff --git a/hw/input/stellaris_gamepad.c b/hw/input/stellaris_gamepad.c index 7d8ec38e8885..6f42c46ddad3 100644 --- a/hw/input/stellaris_gamepad.c +++ b/hw/input/stellaris_gamepad.c @@ -19,7 +19,7 @@ static void stellaris_gamepad_event(DeviceState *dev, Qem= uConsole *src, QemuInputEvent *evt) { StellarisGamepad *s =3D STELLARIS_GAMEPAD(dev); - int qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); + int qcode =3D evt->key.key; int i; =20 for (i =3D 0; i < s->num_buttons; i++) { diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index 3f8a1bc249e0..d48be1ea211e 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -87,7 +87,7 @@ static void virtio_input_handle_event(DeviceState *dev, Q= emuConsole *src, =20 switch (evt->type) { case INPUT_EVENT_KIND_KEY: - qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); + qcode =3D evt->key.key; if (qcode < qemu_input_map_qcode_to_linux_len && qemu_input_map_qcode_to_linux[qcode]) { event.type =3D cpu_to_le16(EV_KEY); diff --git a/hw/m68k/next-kbd.c b/hw/m68k/next-kbd.c index f3110ea0bca4..39f223d02114 100644 --- a/hw/m68k/next-kbd.c +++ b/hw/m68k/next-kbd.c @@ -248,7 +248,7 @@ static void nextkbd_event(DeviceState *dev, QemuConsole= *src, NextKBDState *s =3D NEXTKBD(dev); int qcode, keycode; =20 - qcode =3D qemu_input_key_value_to_qcode(&evt->key.key); + qcode =3D evt->key.key; if (qcode >=3D ARRAY_SIZE(qcode_to_nextkbd_keycode)) { return; } diff --git a/replay/replay-input.c b/replay/replay-input.c index 0995b125f244..f1ee678ef726 100644 --- a/replay/replay-input.c +++ b/replay/replay-input.c @@ -23,21 +23,9 @@ void replay_save_input_event(QemuInputEvent *evt) =20 switch (evt->type) { case INPUT_EVENT_KIND_KEY: - replay_put_dword(evt->key.key.type); - - switch (evt->key.key.type) { - case KEY_VALUE_KIND_NUMBER: - replay_put_qword(evt->key.key.u.number.data); - replay_put_byte(evt->key.down); - break; - case KEY_VALUE_KIND_QCODE: - replay_put_dword(evt->key.key.u.qcode.data); - replay_put_byte(evt->key.down); - break; - case KEY_VALUE_KIND__MAX: - /* keep gcc happy */ - break; - } + replay_put_dword(KEY_VALUE_KIND_QCODE); + replay_put_dword(evt->key.key); + replay_put_byte(evt->key.down); break; case INPUT_EVENT_KIND_BTN: replay_put_dword(evt->btn.button); @@ -71,20 +59,15 @@ QemuInputEvent *replay_read_input_event(void) evt->type =3D replay_get_dword(); switch (evt->type) { case INPUT_EVENT_KIND_KEY: - evt->key.key.type =3D replay_get_dword(); - - switch (evt->key.key.type) { + switch (replay_get_dword()) { case KEY_VALUE_KIND_NUMBER: - evt->key.key.u.number.data =3D replay_get_qword(); + evt->key.key =3D qemu_input_key_number_to_qcode(replay_get_qwo= rd()); evt->key.down =3D replay_get_byte(); break; case KEY_VALUE_KIND_QCODE: - evt->key.key.u.qcode.data =3D (QKeyCode)replay_get_dword(); + evt->key.key =3D (QKeyCode)replay_get_dword(); evt->key.down =3D replay_get_byte(); break; - case KEY_VALUE_KIND__MAX: - /* keep gcc happy */ - break; } break; case INPUT_EVENT_KIND_BTN: diff --git a/ui/input-keymap.c b/ui/input-keymap.c index 1b756a6970c0..2f6d431c8246 100644 --- a/ui/input-keymap.c +++ b/ui/input-keymap.c @@ -61,14 +61,13 @@ int qemu_input_key_value_to_qcode(const KeyValue *value) } } =20 -int qemu_input_key_value_to_scancode(const KeyValue *value, bool down, - int *codes) +int qemu_input_qcode_to_scancode(QKeyCode qcode, bool down, int *codes) { - int keycode =3D qemu_input_key_value_to_number(value); + int keycode =3D qcode < qemu_input_map_qcode_to_qnum_len ? + qemu_input_map_qcode_to_qnum[qcode] : 0; int count =3D 0; =20 - if (value->type =3D=3D KEY_VALUE_KIND_QCODE && - value->u.qcode.data =3D=3D Q_KEY_CODE_PAUSE) { + if (qcode =3D=3D Q_KEY_CODE_PAUSE) { /* specific case */ int v =3D down ? 0 : 0x80; codes[count++] =3D 0xe1; diff --git a/ui/input.c b/ui/input.c index a3ced08429e3..07d7d2bc728d 100644 --- a/ui/input.c +++ b/ui/input.c @@ -180,9 +180,7 @@ void qmp_input_send_event(const char *device, g_assert_not_reached(); } =20 - evt.key.key.type =3D KEY_VALUE_KIND_QCODE; - evt.key.key.u.qcode.data =3D code; - evt.key.key =3D *qapi->u.key.data->key; + evt.key.key =3D code; evt.key.down =3D qapi->u.key.data->down; break; } @@ -216,28 +214,15 @@ void qmp_input_send_event(const char *device, static void qemu_input_event_trace(QemuConsole *src, QemuInputEvent *evt) { const char *name; - int qcode, idx =3D -1; + int idx =3D -1; =20 if (src) { idx =3D qemu_console_get_index(src); } switch (evt->type) { case INPUT_EVENT_KIND_KEY: - switch (evt->key.key.type) { - case KEY_VALUE_KIND_NUMBER: - qcode =3D qemu_input_key_number_to_qcode(evt->key.key.u.number= .data); - name =3D QKeyCode_str(qcode); - trace_input_event_key_number(idx, evt->key.key.u.number.data, - name, evt->key.down); - break; - case KEY_VALUE_KIND_QCODE: - name =3D QKeyCode_str(evt->key.key.u.qcode.data); - trace_input_event_key_qcode(idx, name, evt->key.down); - break; - case KEY_VALUE_KIND__MAX: - /* keep gcc happy */ - break; - } + name =3D QKeyCode_str(evt->key.key); + trace_input_event_key_qcode(idx, name, evt->key.down); break; case INPUT_EVENT_KIND_BTN: name =3D InputButton_str(evt->btn.button); @@ -349,12 +334,6 @@ void qemu_input_event_send_impl(QemuConsole *src, Qemu= InputEvent *evt) =20 void qemu_input_event_send(QemuConsole *src, QemuInputEvent *evt) { - /* Expect all parts of QEMU to send events with QCodes exclusively. - * Key numbers are only supported as end-user input via QMP */ - assert(!(evt->type =3D=3D INPUT_EVENT_KIND_KEY && - evt->key.key.type =3D=3D KEY_VALUE_KIND_NUMBER)); - - /* * 'sysrq' was mistakenly added to hack around the fact that * the ps2 driver was not generating correct scancodes sequences @@ -364,8 +343,8 @@ void qemu_input_event_send(QemuConsole *src, QemuInputE= vent *evt) * need to deal with this mistake */ if (evt->type =3D=3D INPUT_EVENT_KIND_KEY && - evt->key.key.u.qcode.data =3D=3D Q_KEY_CODE_SYSRQ) { - evt->key.key.u.qcode.data =3D Q_KEY_CODE_PRINT; + evt->key.key =3D=3D Q_KEY_CODE_SYSRQ) { + evt->key.key =3D Q_KEY_CODE_PRINT; } =20 if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) { @@ -406,7 +385,7 @@ void qemu_input_event_send_key(QemuConsole *src, KeyVal= ue *key, bool down) QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_KEY, .key =3D { - .key =3D *key, + .key =3D qemu_input_key_value_to_qcode(key), .down =3D down, }, }; diff --git a/ui/trace-events b/ui/trace-events index 3eba9ca3a825..4d112bd2ba3b 100644 --- a/ui/trace-events +++ b/ui/trace-events @@ -100,7 +100,6 @@ vnc_auth_sasl_acl(void *state, int allow) "VNC client a= uth SASL ACL state=3D%p all =20 =20 # input.c -input_event_key_number(int conidx, int number, const char *qcode, bool dow= n) "con %d, key number 0x%x [%s], down %d" input_event_key_qcode(int conidx, const char *qcode, bool down) "con %d, k= ey qcode %s, down %d" input_event_btn(int conidx, const char *btn, bool down) "con %d, button %s= , down %d" input_event_rel(int conidx, const char *axis, int value) "con %d, axis %s,= value %d" --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778324137983853.9348878375989; Sat, 9 May 2026 03:55:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFb-0000NB-MX; Sat, 09 May 2026 06:49:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF2-0008KN-75; Sat, 09 May 2026 06:49:05 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEw-0001bv-0c; Sat, 09 May 2026 06:49:03 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY25090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:57 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=/GWxOnuajskexwKc9OE6D+CI0Ie1YR0V1+wdyS3cKYQ=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323677; v=1; b=B6g4OFPAsf4uOy/IJUqFWQ6hNxXG5zevU1KYtst1m86ScOHA5/zZkz59mGM7CJqn K5BrVxnMRM0GKwm3uMzytj/fdAKGmhTN0JHXoJRfkxKlezFlYjykx37jtEDfaGzt Y/+hF5MlyCf1qjD/Bj+ERoo04LVwtPkIxaKoXRYYS/CrQx0hI+MIGtIXdqPvu1zH 4WRYVQcSZhut7+beaDxAn6WI/NdarYJg/P9qo6jFcexuUwdv1Kr5AEvCXUHoHhaF YfJscvkja7NWB4bdaA5uyNMNswV29Q9v0XUAGkEjHZK63nfnoDLOmb9Cg1xwkaV3 4MmPR7PxyFpbwDasmVGt/A== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:16 +0900 Subject: [PATCH RFC 04/28] ui/input: Use Linux key codes for internal key events MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-4-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=21768; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=rcyAHDWR3A39yaxqpgqNNsKwwwYf+p3rYZIyPgjkpRc=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gfOVGWZtv6dvjmh9eDHuSUBnkX7Qxwmux6bNdYrMF 1kmvWBNRykLgxgXg6yYIktK0W5ujejaT4UJ8S0wc1iZQIYwcHEKwET69zL8L+7e9mTF17VCnkZP jiWw3p5WnH4l1aJm4ZnE7a/705PfaTH8rxQ32+CS8r7hHMO8Z8tV/wgvFtHleWhlqbK5pdbu8ZF bTAA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778324139353158500 Linux input key codes are a better internal representation than QKeyCode: - With Linux input key codes as the internal representation, keys previously lost solely because the middle layer between event sources and sinks used QKeyCode will be preserved, since Linux key codes cover all keys that those sources and sinks use. For example, KEY_KPJPCOMMA cannot be represented with QKeyCode, but it is widely supported by event sources and sinks since it is included in linux, atset1, atset2, usb, x11, osx, qnum (derived from atset1), xorgxquartz, and xorgevdev (derived from linux). - They make it possible to pass through Linux host key codes to Linux guests to preserve all key inputs. - They simplify consumers by avoiding QKeyCode aliases, namely asterisk/kp_multiply and sysrq/print. This matches the approach used by virtio and Xen. Signed-off-by: Akihiko Odaki --- include/ui/input.h | 49 +++++++++++++++++++++++++++++++++++++- hw/arm/musicpal.c | 2 +- hw/char/escc.c | 2 +- hw/display/xenfb.c | 2 +- hw/input/adb-kbd.c | 2 +- hw/input/hid.c | 3 ++- hw/input/ps2.c | 2 +- hw/input/stellaris_gamepad.c | 2 +- hw/input/virtio-input-hid.c | 2 +- hw/m68k/next-kbd.c | 2 +- replay/replay-input.c | 11 ++++++--- ui/input-keymap.c | 56 +++++++++++++++++++++++++++++++++++-----= ---- ui/input.c | 51 ++++++++++++---------------------------- ui/meson.build | 14 +++++++++++ 14 files changed, 140 insertions(+), 60 deletions(-) diff --git a/include/ui/input.h b/include/ui/input.h index 1ad5d781a4cf..caa757ea1c2e 100644 --- a/include/ui/input.h +++ b/include/ui/input.h @@ -19,7 +19,7 @@ typedef struct QemuInputHandler QemuInputHandler; typedef struct QemuInputHandlerState QemuInputHandlerState; =20 typedef struct QemuInputKeyEvent { - QKeyCode key; + unsigned int key; bool down; } QemuInputKeyEvent; =20 @@ -59,13 +59,18 @@ void qemu_input_event_sync(void); void qemu_input_event_sync_impl(void); =20 void qemu_input_event_send_key(QemuConsole *src, KeyValue *key, bool down); +void qemu_input_event_send_key_linux(QemuConsole *src, unsigned int lnx, + bool down); void qemu_input_event_send_key_number(QemuConsole *src, int num, bool down= ); void qemu_input_event_send_key_qcode(QemuConsole *src, QKeyCode q, bool do= wn); void qemu_input_event_send_key_delay(uint32_t delay_ms); int qemu_input_key_number_to_qcode(unsigned int nr); +unsigned int qemu_input_key_number_to_linux(unsigned int nr); int qemu_input_key_value_to_number(const KeyValue *value); int qemu_input_key_value_to_qcode(const KeyValue *value); +unsigned int qemu_input_key_value_to_linux(const KeyValue *value); int qemu_input_qcode_to_scancode(QKeyCode qcode, bool down, int *codes); +int qemu_input_linux_to_scancode(unsigned int lnx, bool down, int *codes); int qemu_input_linux_to_qcode(unsigned int lnx); =20 void qemu_input_queue_btn(QemuConsole *src, InputButton btn, bool down); @@ -92,52 +97,94 @@ void qemu_remove_mouse_mode_change_notifier(Notifier *n= otify); extern const guint qemu_input_map_atset1_to_qcode_len; extern const guint16 qemu_input_map_atset1_to_qcode[]; =20 +extern const guint qemu_input_map_atset1_to_linux_len; +extern const guint16 qemu_input_map_atset1_to_linux[]; + extern const guint qemu_input_map_linux_to_qcode_len; extern const guint16 qemu_input_map_linux_to_qcode[]; =20 extern const guint qemu_input_map_qcode_to_atset1_len; extern const guint16 qemu_input_map_qcode_to_atset1[]; =20 +extern const guint qemu_input_map_linux_to_atset1_len; +extern const guint16 qemu_input_map_linux_to_atset1[]; + extern const guint qemu_input_map_qcode_to_atset2_len; extern const guint16 qemu_input_map_qcode_to_atset2[]; =20 +extern const guint qemu_input_map_linux_to_atset2_len; +extern const guint16 qemu_input_map_linux_to_atset2[]; + extern const guint qemu_input_map_qcode_to_atset3_len; extern const guint16 qemu_input_map_qcode_to_atset3[]; =20 +extern const guint qemu_input_map_linux_to_atset3_len; +extern const guint16 qemu_input_map_linux_to_atset3[]; + extern const guint qemu_input_map_qcode_to_linux_len; extern const guint16 qemu_input_map_qcode_to_linux[]; =20 extern const guint qemu_input_map_qcode_to_qnum_len; extern const guint16 qemu_input_map_qcode_to_qnum[]; =20 +extern const guint qemu_input_map_linux_to_qnum_len; +extern const guint16 qemu_input_map_linux_to_qnum[]; + extern const guint qemu_input_map_qcode_to_sun_len; extern const guint16 qemu_input_map_qcode_to_sun[]; =20 +extern const guint qemu_input_map_linux_to_sun_len; +extern const guint16 qemu_input_map_linux_to_sun[]; + extern const guint qemu_input_map_qnum_to_qcode_len; extern const guint16 qemu_input_map_qnum_to_qcode[]; =20 +extern const guint qemu_input_map_qnum_to_linux_len; +extern const guint16 qemu_input_map_qnum_to_linux[]; + extern const guint qemu_input_map_usb_to_qcode_len; extern const guint16 qemu_input_map_usb_to_qcode[]; =20 +extern const guint qemu_input_map_usb_to_linux_len; +extern const guint16 qemu_input_map_usb_to_linux[]; + extern const guint qemu_input_map_win32_to_qcode_len; extern const guint16 qemu_input_map_win32_to_qcode[]; =20 +extern const guint qemu_input_map_win32_to_linux_len; +extern const guint16 qemu_input_map_win32_to_linux[]; + extern const guint qemu_input_map_x11_to_qcode_len; extern const guint16 qemu_input_map_x11_to_qcode[]; =20 +extern const guint qemu_input_map_x11_to_linux_len; +extern const guint16 qemu_input_map_x11_to_linux[]; + extern const guint qemu_input_map_xorgevdev_to_qcode_len; extern const guint16 qemu_input_map_xorgevdev_to_qcode[]; =20 extern const guint qemu_input_map_xorgkbd_to_qcode_len; extern const guint16 qemu_input_map_xorgkbd_to_qcode[]; =20 +extern const guint qemu_input_map_xorgkbd_to_linux_len; +extern const guint16 qemu_input_map_xorgkbd_to_linux[]; + extern const guint qemu_input_map_xorgxquartz_to_qcode_len; extern const guint16 qemu_input_map_xorgxquartz_to_qcode[]; =20 +extern const guint qemu_input_map_xorgxquartz_to_linux_len; +extern const guint16 qemu_input_map_xorgxquartz_to_linux[]; + extern const guint qemu_input_map_xorgxwin_to_qcode_len; extern const guint16 qemu_input_map_xorgxwin_to_qcode[]; =20 +extern const guint qemu_input_map_xorgxwin_to_linux_len; +extern const guint16 qemu_input_map_xorgxwin_to_linux[]; + extern const guint qemu_input_map_osx_to_qcode_len; extern const guint16 qemu_input_map_osx_to_qcode[]; =20 +extern const guint qemu_input_map_osx_to_linux_len; +extern const guint16 qemu_input_map_osx_to_linux[]; + #endif /* INPUT_H */ diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c index 43037ca29038..bddbfb5d20a3 100644 --- a/hw/arm/musicpal.c +++ b/hw/arm/musicpal.c @@ -1068,7 +1068,7 @@ static void musicpal_key_event(DeviceState *dev, Qemu= Console *src, QemuInputEvent *evt) { musicpal_key_state *s =3D MUSICPAL_KEY(dev); - int qcode =3D evt->key.key; + int qcode =3D qemu_input_linux_to_qcode(evt->key.key); uint32_t event =3D 0; int i; =20 diff --git a/hw/char/escc.c b/hw/char/escc.c index 3ad803537e5e..39483ca03bf2 100644 --- a/hw/char/escc.c +++ b/hw/char/escc.c @@ -800,7 +800,7 @@ static void sunkbd_handle_event(DeviceState *dev, QemuC= onsole *src, int qcode, keycode; =20 assert(evt->type =3D=3D INPUT_EVENT_KIND_KEY); - qcode =3D evt->key.key; + qcode =3D qemu_input_linux_to_qcode(evt->key.key); trace_escc_sunkbd_event_in(qcode, QKeyCode_str(qcode), evt->key.down); =20 diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c index 6227b34a5acc..9bf89a1e6223 100644 --- a/hw/display/xenfb.c +++ b/hw/display/xenfb.c @@ -203,7 +203,7 @@ static void xenfb_key_event(DeviceState *dev, QemuConso= le *src, QemuInputEvent *evt) { struct XenInput *xenfb =3D (struct XenInput *)dev; - int qcode =3D evt->key.key; + int qcode =3D qemu_input_linux_to_qcode(evt->key.key); int lnx; =20 if (qcode < qemu_input_map_qcode_to_linux_len) { diff --git a/hw/input/adb-kbd.c b/hw/input/adb-kbd.c index db3c77775009..060481d0db6d 100644 --- a/hw/input/adb-kbd.c +++ b/hw/input/adb-kbd.c @@ -311,7 +311,7 @@ static void adb_keyboard_event(DeviceState *dev, QemuCo= nsole *src, KBDState *s =3D (KBDState *)dev; int qcode, keycode; =20 - qcode =3D evt->key.key; + qcode =3D qemu_input_linux_to_qcode(evt->key.key); if (qcode >=3D ARRAY_SIZE(qcode_to_adb_keycode)) { return; } diff --git a/hw/input/hid.c b/hw/input/hid.c index 31f6331c7d7e..013840562f60 100644 --- a/hw/input/hid.c +++ b/hw/input/hid.c @@ -224,10 +224,11 @@ static void hid_keyboard_event(DeviceState *dev, Qemu= Console *src, QemuInputEvent *evt) { HIDState *hs =3D (HIDState *)dev; + int qcode =3D qemu_input_linux_to_qcode(evt->key.key); int scancodes[3], i, count; int slot; =20 - count =3D qemu_input_qcode_to_scancode(evt->key.key, evt->key.down, + count =3D qemu_input_qcode_to_scancode(qcode, evt->key.down, scancodes); if (hs->n + count > QUEUE_LENGTH) { trace_hid_kbd_queue_full(); diff --git a/hw/input/ps2.c b/hw/input/ps2.c index 9090a0427bd8..93c3c7372054 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -324,7 +324,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, =20 qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL); assert(evt->type =3D=3D INPUT_EVENT_KIND_KEY); - qcode =3D evt->key.key; + qcode =3D qemu_input_linux_to_qcode(evt->key.key); =20 mod =3D ps2_modifier_bit(qcode); trace_ps2_keyboard_event(s, qcode, evt->key.down, mod, diff --git a/hw/input/stellaris_gamepad.c b/hw/input/stellaris_gamepad.c index 6f42c46ddad3..25769fc26168 100644 --- a/hw/input/stellaris_gamepad.c +++ b/hw/input/stellaris_gamepad.c @@ -19,7 +19,7 @@ static void stellaris_gamepad_event(DeviceState *dev, Qem= uConsole *src, QemuInputEvent *evt) { StellarisGamepad *s =3D STELLARIS_GAMEPAD(dev); - int qcode =3D evt->key.key; + int qcode =3D qemu_input_linux_to_qcode(evt->key.key); int i; =20 for (i =3D 0; i < s->num_buttons; i++) { diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index d48be1ea211e..1d2e922567ab 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -87,7 +87,7 @@ static void virtio_input_handle_event(DeviceState *dev, Q= emuConsole *src, =20 switch (evt->type) { case INPUT_EVENT_KIND_KEY: - qcode =3D evt->key.key; + qcode =3D qemu_input_linux_to_qcode(evt->key.key); if (qcode < qemu_input_map_qcode_to_linux_len && qemu_input_map_qcode_to_linux[qcode]) { event.type =3D cpu_to_le16(EV_KEY); diff --git a/hw/m68k/next-kbd.c b/hw/m68k/next-kbd.c index 39f223d02114..7efbd806b7c8 100644 --- a/hw/m68k/next-kbd.c +++ b/hw/m68k/next-kbd.c @@ -248,7 +248,7 @@ static void nextkbd_event(DeviceState *dev, QemuConsole= *src, NextKBDState *s =3D NEXTKBD(dev); int qcode, keycode; =20 - qcode =3D evt->key.key; + qcode =3D qemu_input_linux_to_qcode(evt->key.key); if (qcode >=3D ARRAY_SIZE(qcode_to_nextkbd_keycode)) { return; } diff --git a/replay/replay-input.c b/replay/replay-input.c index f1ee678ef726..acf0993c7285 100644 --- a/replay/replay-input.c +++ b/replay/replay-input.c @@ -24,7 +24,7 @@ void replay_save_input_event(QemuInputEvent *evt) switch (evt->type) { case INPUT_EVENT_KIND_KEY: replay_put_dword(KEY_VALUE_KIND_QCODE); - replay_put_dword(evt->key.key); + replay_put_dword(qemu_input_linux_to_qcode(evt->key.key)); replay_put_byte(evt->key.down); break; case INPUT_EVENT_KIND_BTN: @@ -55,20 +55,25 @@ void replay_save_input_event(QemuInputEvent *evt) QemuInputEvent *replay_read_input_event(void) { QemuInputEvent *evt =3D g_new(QemuInputEvent, 1); + int qcode; =20 evt->type =3D replay_get_dword(); switch (evt->type) { case INPUT_EVENT_KIND_KEY: switch (replay_get_dword()) { case KEY_VALUE_KIND_NUMBER: - evt->key.key =3D qemu_input_key_number_to_qcode(replay_get_qwo= rd()); + qcode =3D qemu_input_key_number_to_qcode(replay_get_qword()); evt->key.down =3D replay_get_byte(); break; case KEY_VALUE_KIND_QCODE: - evt->key.key =3D (QKeyCode)replay_get_dword(); + qcode =3D (QKeyCode)replay_get_dword(); evt->key.down =3D replay_get_byte(); break; + default: + g_assert_not_reached(); } + evt->key.key =3D qcode < qemu_input_map_qcode_to_linux_len ? + qemu_input_map_qcode_to_linux[qcode] : 0; break; case INPUT_EVENT_KIND_BTN: evt->btn.button =3D (InputButton)replay_get_dword(); diff --git a/ui/input-keymap.c b/ui/input-keymap.c index 2f6d431c8246..2b77ef09fd66 100644 --- a/ui/input-keymap.c +++ b/ui/input-keymap.c @@ -5,22 +5,36 @@ #include "standard-headers/linux/input.h" =20 #include "ui/input-keymap-atset1-to-qcode.c.inc" +#include "ui/input-keymap-atset1-to-linux.c.inc" #include "ui/input-keymap-linux-to-qcode.c.inc" #include "ui/input-keymap-qcode-to-atset1.c.inc" +#include "ui/input-keymap-linux-to-atset1.c.inc" #include "ui/input-keymap-qcode-to-atset2.c.inc" +#include "ui/input-keymap-linux-to-atset2.c.inc" #include "ui/input-keymap-qcode-to-atset3.c.inc" +#include "ui/input-keymap-linux-to-atset3.c.inc" #include "ui/input-keymap-qcode-to-linux.c.inc" #include "ui/input-keymap-qcode-to-qnum.c.inc" +#include "ui/input-keymap-linux-to-qnum.c.inc" #include "ui/input-keymap-qcode-to-sun.c.inc" +#include "ui/input-keymap-linux-to-sun.c.inc" #include "ui/input-keymap-qnum-to-qcode.c.inc" +#include "ui/input-keymap-qnum-to-linux.c.inc" #include "ui/input-keymap-usb-to-qcode.c.inc" +#include "ui/input-keymap-usb-to-linux.c.inc" #include "ui/input-keymap-win32-to-qcode.c.inc" +#include "ui/input-keymap-win32-to-linux.c.inc" #include "ui/input-keymap-x11-to-qcode.c.inc" +#include "ui/input-keymap-x11-to-linux.c.inc" #include "ui/input-keymap-xorgevdev-to-qcode.c.inc" #include "ui/input-keymap-xorgkbd-to-qcode.c.inc" +#include "ui/input-keymap-xorgkbd-to-linux.c.inc" #include "ui/input-keymap-xorgxquartz-to-qcode.c.inc" +#include "ui/input-keymap-xorgxquartz-to-linux.c.inc" #include "ui/input-keymap-xorgxwin-to-qcode.c.inc" +#include "ui/input-keymap-xorgxwin-to-linux.c.inc" #include "ui/input-keymap-osx-to-qcode.c.inc" +#include "ui/input-keymap-osx-to-linux.c.inc" =20 int qemu_input_linux_to_qcode(unsigned int lnx) { @@ -45,29 +59,49 @@ int qemu_input_key_value_to_number(const KeyValue *valu= e) =20 int qemu_input_key_number_to_qcode(unsigned int nr) { - if (nr >=3D qemu_input_map_qnum_to_qcode_len) { - return 0; + return qemu_input_linux_to_qcode(qemu_input_key_number_to_linux(nr)); +} + +unsigned int qemu_input_key_number_to_linux(unsigned int nr) +{ + if (nr >=3D qemu_input_map_qnum_to_linux_len) { + return KEY_RESERVED; } - return qemu_input_map_qnum_to_qcode[nr]; + return qemu_input_map_qnum_to_linux[nr]; } =20 int qemu_input_key_value_to_qcode(const KeyValue *value) { - if (value->type =3D=3D KEY_VALUE_KIND_QCODE) { - return value->u.qcode.data; - } else { - assert(value->type =3D=3D KEY_VALUE_KIND_NUMBER); - return qemu_input_key_number_to_qcode(value->u.number.data); + return qemu_input_linux_to_qcode(qemu_input_key_value_to_linux(value)); +} + +unsigned int qemu_input_key_value_to_linux(const KeyValue *value) +{ + switch (value->type) { + case KEY_VALUE_KIND_NUMBER: + return qemu_input_key_number_to_linux(value->u.number.data); + + case KEY_VALUE_KIND_QCODE: + return qemu_input_map_qcode_to_linux[value->u.qcode.data]; + + default: + g_assert_not_reached(); } } =20 int qemu_input_qcode_to_scancode(QKeyCode qcode, bool down, int *codes) { - int keycode =3D qcode < qemu_input_map_qcode_to_qnum_len ? - qemu_input_map_qcode_to_qnum[qcode] : 0; + return qemu_input_linux_to_scancode(qemu_input_map_qcode_to_linux[qcod= e], + down, codes); +} + +int qemu_input_linux_to_scancode(unsigned int lnx, bool down, int *codes) +{ + int keycode =3D lnx < qemu_input_map_linux_to_qnum_len ? + qemu_input_map_linux_to_qnum[lnx] : 0; int count =3D 0; =20 - if (qcode =3D=3D Q_KEY_CODE_PAUSE) { + if (lnx =3D=3D KEY_PAUSE) { /* specific case */ int v =3D down ? 0 : 0x80; codes[count++] =3D 0xe1; diff --git a/ui/input.c b/ui/input.c index 07d7d2bc728d..e3e277117949 100644 --- a/ui/input.c +++ b/ui/input.c @@ -165,25 +165,10 @@ void qmp_input_send_event(const char *device, evt.type =3D qapi->type; =20 switch (qapi->type) { - case INPUT_EVENT_KIND_KEY: { - KeyValue *key =3D qapi->u.key.data->key; - QKeyCode code; - - switch (key->type) { - case KEY_VALUE_KIND_NUMBER: - code =3D qemu_input_key_number_to_qcode(key->u.number.data= ); - break; - case KEY_VALUE_KIND_QCODE: - code =3D key->u.qcode.data; - break; - default: - g_assert_not_reached(); - } - - evt.key.key =3D code; + case INPUT_EVENT_KIND_KEY: + evt.key.key =3D qemu_input_key_value_to_linux(qapi->u.key.data= ->key); evt.key.down =3D qapi->u.key.data->down; break; - } =20 case INPUT_EVENT_KIND_BTN: evt.btn =3D *qapi->u.btn.data; @@ -221,7 +206,7 @@ static void qemu_input_event_trace(QemuConsole *src, Qe= muInputEvent *evt) } switch (evt->type) { case INPUT_EVENT_KIND_KEY: - name =3D QKeyCode_str(evt->key.key); + name =3D QKeyCode_str(qemu_input_linux_to_qcode(evt->key.key)); trace_input_event_key_qcode(idx, name, evt->key.down); break; case INPUT_EVENT_KIND_BTN: @@ -334,19 +319,6 @@ void qemu_input_event_send_impl(QemuConsole *src, Qemu= InputEvent *evt) =20 void qemu_input_event_send(QemuConsole *src, QemuInputEvent *evt) { - /* - * 'sysrq' was mistakenly added to hack around the fact that - * the ps2 driver was not generating correct scancodes sequences - * when 'alt+print' was pressed. This flaw is now fixed and the - * 'sysrq' key serves no further purpose. We normalize it to - * 'print', so that downstream receivers of the event don't - * need to deal with this mistake - */ - if (evt->type =3D=3D INPUT_EVENT_KIND_KEY && - evt->key.key =3D=3D Q_KEY_CODE_SYSRQ) { - evt->key.key =3D Q_KEY_CODE_PRINT; - } - if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) { return; } @@ -381,17 +353,24 @@ void qemu_input_event_sync(void) } =20 void qemu_input_event_send_key(QemuConsole *src, KeyValue *key, bool down) +{ + unsigned int lnx =3D qemu_input_key_value_to_linux(key); + + g_free(key); + qemu_input_event_send_key_linux(src, lnx, down); +} + +void qemu_input_event_send_key_linux(QemuConsole *src, unsigned int lnx, + bool down) { QemuInputEvent evt =3D { .type =3D INPUT_EVENT_KIND_KEY, .key =3D { - .key =3D qemu_input_key_value_to_qcode(key), + .key =3D lnx, .down =3D down, }, }; =20 - g_free(key); - if (QTAILQ_EMPTY(&kbd_queue)) { qemu_input_event_send(src, &evt); qemu_input_event_sync(); @@ -403,8 +382,8 @@ void qemu_input_event_send_key(QemuConsole *src, KeyVal= ue *key, bool down) =20 void qemu_input_event_send_key_number(QemuConsole *src, int num, bool down) { - QKeyCode code =3D qemu_input_key_number_to_qcode(num); - qemu_input_event_send_key_qcode(src, code, down); + unsigned int lnx =3D qemu_input_key_number_to_linux(num); + qemu_input_event_send_key_qcode(src, lnx, down); } =20 void qemu_input_event_send_key_qcode(QemuConsole *src, QKeyCode q, bool do= wn) diff --git a/ui/meson.build b/ui/meson.build index 4e533d304603..4aa2a38c52f4 100644 --- a/ui/meson.build +++ b/ui/meson.build @@ -150,22 +150,36 @@ endif =20 keymaps =3D [ ['atset1', 'qcode'], + ['atset1', 'linux'], ['linux', 'qcode'], ['qcode', 'atset1'], + ['linux', 'atset1'], ['qcode', 'atset2'], + ['linux', 'atset2'], ['qcode', 'atset3'], + ['linux', 'atset3'], ['qcode', 'linux'], ['qcode', 'qnum'], + ['linux', 'qnum'], ['qcode', 'sun'], + ['linux', 'sun'], ['qnum', 'qcode'], + ['qnum', 'linux'], ['usb', 'qcode'], + ['usb', 'linux'], ['win32', 'qcode'], + ['win32', 'linux'], ['x11', 'qcode'], + ['x11', 'linux'], ['xorgevdev', 'qcode'], ['xorgkbd', 'qcode'], + ['xorgkbd', 'linux'], ['xorgxquartz', 'qcode'], + ['xorgxquartz', 'linux'], ['xorgxwin', 'qcode'], + ['xorgxwin', 'linux'], ['osx', 'qcode'], + ['osx', 'linux'], ] =20 if have_system or xkbcommon.found() --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778324008463940.702927869451; Sat, 9 May 2026 03:53:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFb-0000Mw-4S; Sat, 09 May 2026 06:49:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF2-0008KU-7T; Sat, 09 May 2026 06:49:05 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEw-0001dN-M5; Sat, 09 May 2026 06:49:02 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY26090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:57 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=hGOFiD00Glo0fBswkqjI/7OTMbTW5n0eiWKQppeYbd0=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323678; v=1; b=eVReSBk+5O16z/orvROKu5BUm5cHER3CERIuh7+epI6hV9R0kZOUFb8hW1tP1t6K ZhB2etTFcrzwy1trJjnV6nfxeVggyFWXFAH4OCj617537lY8Wzw307KOodbGIL2U 0o/WtsVhnYhw+ajZ9hw1WRuwRpYI1oNjYjfQlbZPpJmWudPkUHqFBw17JB/0F0Lq /7vDwpifj04PLudyjakTH3yzoQd6DtaSNO+KV26Wp6Ts9JfTXuPMGQ55ZlMcKGFN 7v+gMqo6hoRfx8+5j66GtHF7sL042DwdEd2r0rXrHQg4vj28GytlyKPhxa/wC0HU nGlVF88CCQ6QRfY7anzbqQ== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:17 +0900 Subject: [PATCH RFC 05/28] ui/console: Add qemu_text_console_put_linux() MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-5-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=4217; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=DBcHgvIDy3mhQHfAB+o+m74GI/J2n+SZ3u8oWWgmfj0=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gQslQWF/ogUnJitLBE87L35+9/zZ9TtTVgQv/yI98 0TVqeuvO0pZGMS4GGTFFFlSinZza0TXfipMiG+BmcPKBDKEgYtTACZivoPhf8jn138vSKXldX9Z HsEX+/xR/M8/VaEXpXnXz5byv5l2czPDPwVHR/07UdsvzE6OlcjrdmPnYuxqkS5baNFTO33Dn9/ XuQA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778324008828158500 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 --- 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 e2e5ff76ec1c..ea267a673a6a 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -109,6 +109,8 @@ bool qemu_mouse_set(int index, Error **errp); =20 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); =20 /* Touch devices */ diff --git a/ui/console.c b/ui/console.c index a7bd22515b9d..012fbeb007f2 100644 --- a/ui/console.c +++ b/ui/console.c @@ -23,6 +23,7 @@ */ =20 #include "qemu/osdep.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/console.h" #include "hw/core/qdev.h" #include "qapi/error.h" @@ -304,36 +305,57 @@ void qemu_text_console_put_keysym(QemuTextConsole *s,= int keysym) qemu_text_console_handle_keysym(s, keysym); } =20 -static const int qcode_to_keysym[Q_KEY_CODE__MAX] =3D { - [Q_KEY_CODE_UP] =3D QEMU_KEY_UP, - [Q_KEY_CODE_DOWN] =3D QEMU_KEY_DOWN, - [Q_KEY_CODE_RIGHT] =3D QEMU_KEY_RIGHT, - [Q_KEY_CODE_LEFT] =3D QEMU_KEY_LEFT, - [Q_KEY_CODE_HOME] =3D QEMU_KEY_HOME, - [Q_KEY_CODE_END] =3D QEMU_KEY_END, - [Q_KEY_CODE_PGUP] =3D QEMU_KEY_PAGEUP, - [Q_KEY_CODE_PGDN] =3D QEMU_KEY_PAGEDOWN, - [Q_KEY_CODE_DELETE] =3D QEMU_KEY_DELETE, - [Q_KEY_CODE_TAB] =3D QEMU_KEY_TAB, - [Q_KEY_CODE_BACKSPACE] =3D QEMU_KEY_BACKSPACE, +static const int linux_to_keysym[] =3D { + [KEY_UP] =3D QEMU_KEY_UP, + [KEY_DOWN] =3D QEMU_KEY_DOWN, + [KEY_RIGHT] =3D QEMU_KEY_RIGHT, + [KEY_LEFT] =3D QEMU_KEY_LEFT, + [KEY_HOME] =3D QEMU_KEY_HOME, + [KEY_END] =3D QEMU_KEY_END, + [KEY_PAGEUP] =3D QEMU_KEY_PAGEUP, + [KEY_PAGEDOWN] =3D QEMU_KEY_PAGEDOWN, + [KEY_DELETE] =3D QEMU_KEY_DELETE, + [KEY_TAB] =3D QEMU_KEY_TAB, + [KEY_BACKSPACE] =3D QEMU_KEY_BACKSPACE, }; =20 -static const int ctrl_qcode_to_keysym[Q_KEY_CODE__MAX] =3D { - [Q_KEY_CODE_UP] =3D QEMU_KEY_CTRL_UP, - [Q_KEY_CODE_DOWN] =3D QEMU_KEY_CTRL_DOWN, - [Q_KEY_CODE_RIGHT] =3D QEMU_KEY_CTRL_RIGHT, - [Q_KEY_CODE_LEFT] =3D QEMU_KEY_CTRL_LEFT, - [Q_KEY_CODE_HOME] =3D QEMU_KEY_CTRL_HOME, - [Q_KEY_CODE_END] =3D QEMU_KEY_CTRL_END, - [Q_KEY_CODE_PGUP] =3D QEMU_KEY_CTRL_PAGEUP, - [Q_KEY_CODE_PGDN] =3D QEMU_KEY_CTRL_PAGEDOWN, +static const int ctrl_linux_to_keysym[] =3D { + [KEY_UP] =3D QEMU_KEY_CTRL_UP, + [KEY_DOWN] =3D QEMU_KEY_CTRL_DOWN, + [KEY_RIGHT] =3D QEMU_KEY_CTRL_RIGHT, + [KEY_LEFT] =3D QEMU_KEY_CTRL_LEFT, + [KEY_HOME] =3D QEMU_KEY_CTRL_HOME, + [KEY_END] =3D QEMU_KEY_CTRL_END, + [KEY_PAGEUP] =3D QEMU_KEY_CTRL_PAGEUP, + [KEY_PAGEDOWN] =3D QEMU_KEY_CTRL_PAGEDOWN, }; =20 bool qemu_text_console_put_qcode(QemuTextConsole *s, int qcode, bool ctrl) { + unsigned int lnx =3D 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; =20 - keysym =3D ctrl ? ctrl_qcode_to_keysym[qcode] : qcode_to_keysym[qcode]; + if (ctrl) { + maplen =3D ARRAY_SIZE(ctrl_linux_to_keysym); + map =3D ctrl_linux_to_keysym; + } else { + maplen =3D ARRAY_SIZE(linux_to_keysym); + map =3D linux_to_keysym; + } + + if (lnx >=3D maplen) { + return false; + } + + keysym =3D map[lnx]; if (keysym =3D=3D 0) { return false; } --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778323801962713.3173165732884; Sat, 9 May 2026 03:50:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfF1-0008J3-SC; Sat, 09 May 2026 06:49:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEa-00088V-6P; Sat, 09 May 2026 06:48:36 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEV-0001bD-At; Sat, 09 May 2026 06:48:35 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY27090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:58 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=UZEisyAdVNdTB2Cvi/n+lPCOojjdZuM5xsvr/g4rYy0=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323678; v=1; b=WG4EeNz0BhJxFsu+tLYdf/h7f0/W6KS/KjLtyvsJdyTUAegHD92hJ0r3NKOe8TqQ k39AGkAZTDi+sA3V1qByb22w6xyPVoBg4iRodTV8KGsbdHBCvkZ+06htAtMo32F2 WHz737uTYOq0UCkPN0Vtmec/h8Yg2Y3yumYm58MiAjNgzHCoJJz54MEFBYNvWaPQ ssFSA1+s6k4DF8BM2pIxMTgXlx502NInjXvFpIoeNcY2G+Kdn0aj0p5d4iViqr2d TOwvfzV8U5u+RcmlCPpKYtMkuHBnPpNHf5Ux3firfqhqDbfhvWGOKBRxhrN3EmK1 ruyMTVMV3a0P5u09qhSt6g== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:18 +0900 Subject: [PATCH RFC 06/28] ui/kbd-state: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-6-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=15815; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=odzPk+1Je+4NyMwOFyWTQYhGWXC0mcHIaoheKSnAvAA=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gQsH0l+2PX25fZsT86OcC58l3n8/rfN294rTUfO05 9/2tpmf01HKwiDGxSArpsiSUrSbWyO69lNhQnwLzBxWJpAhDFycAjCRbkOG/yH+dppTLkS3KLXx LPPpXrfuT8cjxYW1QRednvwv/WGaws3wV0Z03uZrrRy8i08xaZVp1f7t9Z6zvDlxa92ar4vYzrm /ZgMA X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778323804172154100 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 --- include/ui/kbd-state.h | 8 +++--- ui/dbus-console.c | 4 +-- ui/gtk.c | 7 +++--- ui/kbd-state.c | 55 +++++++++++++++++++++-------------------- ui/keymaps.c | 3 ++- ui/sdl2-input.c | 3 ++- ui/vnc.c | 10 +++++--- ui/cocoa.m | 67 +++++++++++++++++++++++++++++++++++++---------= ---- 8 files changed, 99 insertions(+), 58 deletions(-) diff --git a/include/ui/kbd-state.h b/include/ui/kbd-state.h index 1f37b932eb62..102634d917e5 100644 --- a/include/ui/kbd-state.h +++ b/include/ui/kbd-state.h @@ -53,10 +53,10 @@ void qkbd_state_free(QKbdState *kbd); * for a key not pressed for example). * * @kbd: state tracker state. - * @qcode: the key pressed or released. + * @lnx: the key pressed or released. * @down: true for key down events, false otherwise. */ -void qkbd_state_key_event(QKbdState *kbd, QKeyCode qcode, bool down); +void qkbd_state_key_event(QKbdState *kbd, unsigned int lnx, bool down); =20 /** * qkbd_state_set_delay: set key press delay. @@ -75,9 +75,9 @@ void qkbd_state_set_delay(QKbdState *kbd, int delay_ms); * Returns true when the key is down. * * @kbd: state tracker state. - * @qcode: the key to query. + * @lnx: the key to query. */ -bool qkbd_state_key_get(QKbdState *kbd, QKeyCode qcode); +bool qkbd_state_key_get(QKbdState *kbd, unsigned int lnx); =20 /** * qkbd_state_modifier_get: get modifier state. diff --git a/ui/dbus-console.c b/ui/dbus-console.c index 85e215ef2334..a46c2531c6f8 100644 --- a/ui/dbus-console.c +++ b/ui/dbus-console.c @@ -344,7 +344,7 @@ dbus_kbd_press(DBusDisplayConsole *ddc, =20 trace_dbus_kbd_press(arg_keycode); =20 - qkbd_state_key_event(ddc->kbd, qcode, true); + qkbd_state_key_event(ddc->kbd, qemu_input_map_qcode_to_linux[qcode], t= rue); =20 qemu_dbus_display1_keyboard_complete_press(ddc->iface_kbd, invocation); =20 @@ -360,7 +360,7 @@ dbus_kbd_release(DBusDisplayConsole *ddc, =20 trace_dbus_kbd_release(arg_keycode); =20 - qkbd_state_key_event(ddc->kbd, qcode, false); + qkbd_state_key_event(ddc->kbd, qemu_input_map_qcode_to_linux[qcode], f= alse); =20 qemu_dbus_display1_keyboard_complete_release(ddc->iface_kbd, invocatio= n); =20 diff --git a/ui/gtk.c b/ui/gtk.c index 9ebe7e8df0de..3e3fd57c7638 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -1343,7 +1343,8 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEv= entKey *key, void *opaque) || key->hardware_keycode =3D=3D VK_PAUSE #endif ) { - qkbd_state_key_event(vc->gfx.kbd, Q_KEY_CODE_PAUSE, + qkbd_state_key_event(vc->gfx.kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_PAUS= E], key->type =3D=3D GDK_KEY_PRESS); return TRUE; } @@ -1351,10 +1352,10 @@ static gboolean gd_key_event(GtkWidget *widget, Gdk= EventKey *key, void *opaque) keycode =3D gd_get_keycode(key); qcode =3D gd_map_keycode(keycode); =20 - trace_gd_key_event(vc->label, keycode, qcode, + trace_gd_key_event(vc->label, keycode, qemu_input_map_qcode_to_linux[q= code], (key->type =3D=3D GDK_KEY_PRESS) ? "down" : "up"); =20 - qkbd_state_key_event(vc->gfx.kbd, qcode, + qkbd_state_key_event(vc->gfx.kbd, qemu_input_map_qcode_to_linux[qcode], key->type =3D=3D GDK_KEY_PRESS); =20 return TRUE; diff --git a/ui/kbd-state.c b/ui/kbd-state.c index 52ed28b8a89b..8e5e6f418ac9 100644 --- a/ui/kbd-state.c +++ b/ui/kbd-state.c @@ -5,6 +5,7 @@ */ #include "qemu/osdep.h" #include "qemu/bitmap.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/console.h" #include "ui/input.h" #include "ui/kbd-state.h" @@ -12,15 +13,15 @@ struct QKbdState { QemuConsole *con; int key_delay_ms; - DECLARE_BITMAP(keys, Q_KEY_CODE__MAX); + DECLARE_BITMAP(keys, KEY_CNT); DECLARE_BITMAP(mods, QKBD_MOD__MAX); }; =20 static void qkbd_state_modifier_update(QKbdState *kbd, - QKeyCode qcode1, QKeyCode qcode2, + unsigned int lnx1, unsigned int lnx= 2, QKbdModifier mod) { - if (test_bit(qcode1, kbd->keys) || test_bit(qcode2, kbd->keys)) { + if (test_bit(lnx1, kbd->keys) || test_bit(lnx2, kbd->keys)) { set_bit(mod, kbd->mods); } else { clear_bit(mod, kbd->mods); @@ -32,14 +33,14 @@ bool qkbd_state_modifier_get(QKbdState *kbd, QKbdModifi= er mod) return test_bit(mod, kbd->mods); } =20 -bool qkbd_state_key_get(QKbdState *kbd, QKeyCode qcode) +bool qkbd_state_key_get(QKbdState *kbd, unsigned int lnx) { - return test_bit(qcode, kbd->keys); + return test_bit(lnx, kbd->keys); } =20 -void qkbd_state_key_event(QKbdState *kbd, QKeyCode qcode, bool down) +void qkbd_state_key_event(QKbdState *kbd, unsigned int lnx, bool down) { - bool state =3D test_bit(qcode, kbd->keys); + bool state =3D test_bit(lnx, kbd->keys); =20 if (down =3D=3D false /* got key-up event */ && state =3D=3D false /* key is not pressed */) { @@ -59,35 +60,35 @@ void qkbd_state_key_event(QKbdState *kbd, QKeyCode qcod= e, bool down) =20 /* update key and modifier state */ if (down) { - set_bit(qcode, kbd->keys); + set_bit(lnx, kbd->keys); } else { - clear_bit(qcode, kbd->keys); + clear_bit(lnx, kbd->keys); } - switch (qcode) { - case Q_KEY_CODE_SHIFT: - case Q_KEY_CODE_SHIFT_R: - qkbd_state_modifier_update(kbd, Q_KEY_CODE_SHIFT, Q_KEY_CODE_SHIFT= _R, + switch (lnx) { + case KEY_LEFTSHIFT: + case KEY_RIGHTSHIFT: + qkbd_state_modifier_update(kbd, KEY_LEFTSHIFT, KEY_RIGHTSHIFT, QKBD_MOD_SHIFT); break; - case Q_KEY_CODE_CTRL: - case Q_KEY_CODE_CTRL_R: - qkbd_state_modifier_update(kbd, Q_KEY_CODE_CTRL, Q_KEY_CODE_CTRL_R, + case KEY_LEFTCTRL: + case KEY_RIGHTCTRL: + qkbd_state_modifier_update(kbd, KEY_LEFTCTRL, KEY_RIGHTCTRL, QKBD_MOD_CTRL); break; - case Q_KEY_CODE_ALT: - qkbd_state_modifier_update(kbd, Q_KEY_CODE_ALT, Q_KEY_CODE_ALT, + case KEY_LEFTALT: + qkbd_state_modifier_update(kbd, KEY_LEFTALT, KEY_LEFTALT, QKBD_MOD_ALT); break; - case Q_KEY_CODE_ALT_R: - qkbd_state_modifier_update(kbd, Q_KEY_CODE_ALT_R, Q_KEY_CODE_ALT_R, + case KEY_RIGHTALT: + qkbd_state_modifier_update(kbd, KEY_RIGHTALT, KEY_RIGHTALT, QKBD_MOD_ALTGR); break; - case Q_KEY_CODE_CAPS_LOCK: + case KEY_CAPSLOCK: if (down) { change_bit(QKBD_MOD_CAPSLOCK, kbd->mods); } break; - case Q_KEY_CODE_NUM_LOCK: + case KEY_NUMLOCK: if (down) { change_bit(QKBD_MOD_NUMLOCK, kbd->mods); } @@ -99,7 +100,7 @@ void qkbd_state_key_event(QKbdState *kbd, QKeyCode qcode= , bool down) =20 /* send to guest */ if (qemu_console_is_graphic(kbd->con)) { - qemu_input_event_send_key_qcode(kbd->con, qcode, down); + qemu_input_event_send_key_linux(kbd->con, lnx, down); if (kbd->key_delay_ms) { qemu_input_event_send_key_delay(kbd->key_delay_ms); } @@ -108,11 +109,11 @@ void qkbd_state_key_event(QKbdState *kbd, QKeyCode qc= ode, bool down) =20 void qkbd_state_lift_all_keys(QKbdState *kbd) { - int qcode; + unsigned int lnx; =20 - for (qcode =3D 0; qcode < Q_KEY_CODE__MAX; qcode++) { - if (test_bit(qcode, kbd->keys)) { - qkbd_state_key_event(kbd, qcode, false); + for (lnx =3D 0; lnx < KEY_CNT; lnx++) { + if (test_bit(lnx, kbd->keys)) { + qkbd_state_key_event(kbd, lnx, false); } } } diff --git a/ui/keymaps.c b/ui/keymaps.c index d1b3f43dc8a3..7a7c13c47a0c 100644 --- a/ui/keymaps.c +++ b/ui/keymaps.c @@ -257,7 +257,8 @@ int keysym2scancode(kbd_layout_t *k, int keysym, for (i =3D 0; i < keysym2code->count; i++) { QKeyCode qcode =3D qemu_input_key_number_to_qcode (keysym2code->keycodes[i]); - if (kbd && qkbd_state_key_get(kbd, qcode)) { + unsigned int lnx =3D qemu_input_map_qcode_to_linux[qcode]; + if (kbd && qkbd_state_key_get(kbd, lnx)) { return keysym2code->keycodes[i]; } } diff --git a/ui/sdl2-input.c b/ui/sdl2-input.c index 2286df4223dc..fdbdc427dc9e 100644 --- a/ui/sdl2-input.c +++ b/ui/sdl2-input.c @@ -41,7 +41,8 @@ void sdl2_process_key(struct sdl2_console *scon, qcode =3D qemu_input_map_usb_to_qcode[ev->keysym.scancode]; trace_sdl2_process_key(ev->keysym.scancode, qcode, ev->type =3D=3D SDL_KEYDOWN ? "down" : "up"); - qkbd_state_key_event(scon->kbd, qcode, ev->type =3D=3D SDL_KEYDOWN); + qkbd_state_key_event(scon->kbd, qemu_input_map_qcode_to_linux[qcode], + ev->type =3D=3D SDL_KEYDOWN); =20 if (QEMU_IS_TEXT_CONSOLE(con)) { QemuTextConsole *s =3D QEMU_TEXT_CONSOLE(con); diff --git a/ui/vnc.c b/ui/vnc.c index ad8d58a23d7c..940dae1a0010 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -1807,8 +1807,11 @@ static void pointer_event(VncState *vs, int button_m= ask, int x, int y) =20 static void press_key(VncState *vs, QKeyCode qcode) { - qkbd_state_key_event(vs->vd->kbd, qcode, true); - qkbd_state_key_event(vs->vd->kbd, qcode, false); + 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); } =20 static void vnc_led_state_change(VncState *vs) @@ -1916,7 +1919,8 @@ static void do_key_event(VncState *vs, int down, int = keycode, int sym) } } =20 - qkbd_state_key_event(vs->vd->kbd, qcode, down); + qkbd_state_key_event(vs->vd->kbd, qemu_input_map_qcode_to_linux[qcode], + down); if (QEMU_IS_TEXT_CONSOLE(vs->vd->dcl.con)) { QemuTextConsole *con =3D QEMU_TEXT_CONSOLE(vs->vd->dcl.con); bool numlock =3D qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUM= LOCK); diff --git a/ui/cocoa.m b/ui/cocoa.m index 9093d1e408ff..2322c590cbc0 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -770,7 +770,8 @@ - (void) setFullGrab:(id)sender } =20 - (void) toggleKey: (int)keycode { - qkbd_state_key_event(kbd, keycode, !qkbd_state_key_get(kbd, keycode)); + unsigned int lnx =3D qemu_input_map_qcode_to_linux[keycode]; + qkbd_state_key_event(kbd, lnx, !qkbd_state_key_get(kbd, lnx)); } =20 // Does the work of sending input to the monitor @@ -892,34 +893,62 @@ - (bool) handleEventLocked:(NSEvent *)event */ if (!!(modifiers & NSEventModifierFlagCapsLock) !=3D qkbd_state_modifier_get(kbd, QKBD_MOD_CAPSLOCK)) { - qkbd_state_key_event(kbd, Q_KEY_CODE_CAPS_LOCK, true); - qkbd_state_key_event(kbd, Q_KEY_CODE_CAPS_LOCK, false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_CAPS= _LOCK], + true); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_CAPS= _LOCK], + false); } =20 if (!(modifiers & NSEventModifierFlagShift)) { - qkbd_state_key_event(kbd, Q_KEY_CODE_SHIFT, false); - qkbd_state_key_event(kbd, Q_KEY_CODE_SHIFT_R, false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_SHIF= T], + false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_SHIF= T_R], + false); } if (!(modifiers & NSEventModifierFlagControl)) { - qkbd_state_key_event(kbd, Q_KEY_CODE_CTRL, false); - qkbd_state_key_event(kbd, Q_KEY_CODE_CTRL_R, false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_CTRL= ], + false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_CTRL= _R], + false); } if (!(modifiers & NSEventModifierFlagOption)) { if (swap_opt_cmd) { - qkbd_state_key_event(kbd, Q_KEY_CODE_META_L, false); - qkbd_state_key_event(kbd, Q_KEY_CODE_META_R, false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_= META_L], + false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_= META_R], + false); } else { - qkbd_state_key_event(kbd, Q_KEY_CODE_ALT, false); - qkbd_state_key_event(kbd, Q_KEY_CODE_ALT_R, false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_= ALT], + false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_= ALT_R], + false); } } if (!(modifiers & NSEventModifierFlagCommand)) { if (swap_opt_cmd) { - qkbd_state_key_event(kbd, Q_KEY_CODE_ALT, false); - qkbd_state_key_event(kbd, Q_KEY_CODE_ALT_R, false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_= ALT], + false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_= ALT_R], + false); } else { - qkbd_state_key_event(kbd, Q_KEY_CODE_META_L, false); - qkbd_state_key_event(kbd, Q_KEY_CODE_META_R, false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_= META_L], + false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[Q_KEY_CODE_= META_R], + false); } } =20 @@ -1026,7 +1055,9 @@ - (bool) handleEventLocked:(NSEvent *)event } =20 if (qemu_console_is_graphic(dcl.con)) { - qkbd_state_key_event(kbd, keycode, true); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[keycode= ], + true); } else { [self handleMonitorInput: event]; } @@ -1041,7 +1072,9 @@ - (bool) handleEventLocked:(NSEvent *)event } =20 if (qemu_console_is_graphic(dcl.con)) { - qkbd_state_key_event(kbd, keycode, false); + qkbd_state_key_event(kbd, + qemu_input_map_qcode_to_linux[keycode= ], + false); } return true; case NSEventTypeScrollWheel: --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177832399296587.67977587661665; Sat, 9 May 2026 03:53:12 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFc-0000OK-KK; Sat, 09 May 2026 06:49:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF4-0008Me-3L; Sat, 09 May 2026 06:49:07 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEy-0001eP-4v; Sat, 09 May 2026 06:49:05 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY28090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:58 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=z/EGey40LOEv17Pvn66VgBRZhGLL4HJQUkguBO+Y1og=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323678; v=1; b=GYMIwyk8UNicrCM4cO6ol5CgpiMFcpyJRHEzaB1y5mMJ+e3G+jJD2FY7wc/tdjei 7uUvvXCo6sKFT+7m2CiA6Sn6VjJdZ6yMVyLdypAGnRE6FR49gnosYvZwSGdD0BNJ BLt8KWwisGb+lka6q95XTW5npP71NUeEmPKae8cz2NKD+4z1APN3rVOO8Btis6XC 2vD9H3TXrYSEtxq+CvV0GYaknE6MAWunPOAB5whuoXeCFzt0P6mwKFQo2swNQX6L eR2rCUwiOvOlH3rNFroJPwuT2QqE4ar4Tp8nvmErDCT9a6LIUYdVfCfuDmLGufaz yq6BbhtvoCB0m8ld80Q1rQ== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:19 +0900 Subject: [PATCH RFC 07/28] hw/arm/musicpal: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-7-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=1974; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=RnkN4NRWsDSiP2qNkaQCIyNqKJi7Ny8kXSY3/H4eSpI=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gYvPjmwQMus5Pi/fPct8to3mcd5pYs93zy5bH+/D+ b53sfWDjlIWBjEuBlkxRZaUot3cGtG1nwoT4ltg5rAygQxh4OIUgIlkqzP8M515nLfzurpPbNha jc28ofbaTSt2xdss37tO9u5e55n3djL896hgWnhaYVHuhojiOVV1d2OUp01esjVzWnrC7VncsVL nWAE= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778323994710154100 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 --- hw/arm/musicpal.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c index bddbfb5d20a3..10722e2f6d07 100644 --- a/hw/arm/musicpal.c +++ b/hw/arm/musicpal.c @@ -24,6 +24,7 @@ #include "hw/core/ptimer.h" #include "hw/core/qdev-properties.h" #include "hw/block/flash.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/console.h" #include "hw/i2c/i2c.h" #include "hw/i2c/bitbang_i2c.h" @@ -1068,40 +1069,39 @@ static void musicpal_key_event(DeviceState *dev, Qe= muConsole *src, QemuInputEvent *evt) { musicpal_key_state *s =3D MUSICPAL_KEY(dev); - int qcode =3D qemu_input_linux_to_qcode(evt->key.key); uint32_t event =3D 0; int i; =20 - switch (qcode) { - case Q_KEY_CODE_UP: + switch (evt->key.key) { + case KEY_UP: event =3D MP_KEY_WHEEL_NAV | MP_KEY_WHEEL_NAV_INV; break; =20 - case Q_KEY_CODE_DOWN: + case KEY_DOWN: event =3D MP_KEY_WHEEL_NAV; break; =20 - case Q_KEY_CODE_LEFT: + case KEY_LEFT: event =3D MP_KEY_WHEEL_VOL | MP_KEY_WHEEL_VOL_INV; break; =20 - case Q_KEY_CODE_RIGHT: + case KEY_RIGHT: event =3D MP_KEY_WHEEL_VOL; break; =20 - case Q_KEY_CODE_F: + case KEY_F: event =3D MP_KEY_BTN_FAVORITS; break; =20 - case Q_KEY_CODE_TAB: + case KEY_TAB: event =3D MP_KEY_BTN_VOLUME; break; =20 - case Q_KEY_CODE_RET: + case KEY_ENTER: event =3D MP_KEY_BTN_NAVIGATION; break; =20 - case Q_KEY_CODE_M: + case KEY_M: event =3D MP_KEY_BTN_MENU; break; } --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778323979534262.12203704329704; Sat, 9 May 2026 03:52:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFd-0000Qu-7P; Sat, 09 May 2026 06:49:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF4-0008Mm-3L; Sat, 09 May 2026 06:49:07 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEx-0001eD-K8; Sat, 09 May 2026 06:49:03 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY29090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:58 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=rjK8VdqZzGwrfnLNXD1G7rM6q+c/dHmZh6ojIHVBQdw=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323678; v=1; b=WHVY6wYqTKtG/kGKpTTjlE0KkPPzotCE+ueoojGldByG50OOjX9LB+yBxOWvxupC GTz5QzmWmxnuFwImkqqDvEUu+964sVRBcwpCNuWaJwl1kXXY7DB/BZcjImA9aoaw cDHyXAj9W2loigD9w5j/G95wdZvAC2MADJX4CXbHqkeRDSjihhRwdDIBjEkCfOVN SHoL1JYVuDw85P1NEdExhQdFMT0NHzWywRH23Cyopgk8eaeF9aGk9yHhgbODgJ7A h56UoV9DXov+6DiFpethbpFxWLY2L+SzJsnLQkZwvZWMJjAgkt6LhAQPUOmjLZzs ucI7uxfvEt24UgmmaV9RTQ== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:20 +0900 Subject: [PATCH RFC 08/28] hw/char/escc: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-8-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=1806; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=sl/mWODr9o1gArcAX6QS2hK8SRqnl+M7Q2UAxTmMU64=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gYtsklJSexc0CQQs7v5WOzPsuNzGt2Zz6y/4WSk+8 XngqVTUUcrCIMbFICumyJJStJtbI7r2U2FCfAvMHFYmkCEMXJwCMJG3sYwMqwKuJ8nsz9nfubQn b/PrRQw29U8VHjpPWJWSUFvLfl0/kJFh2v6FkbodlZ55/BveTPeW4QvkN7gnKlSztr3n8KMq2zZ uAA== X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778323980652154100 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 --- hw/char/escc.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/hw/char/escc.c b/hw/char/escc.c index 39483ca03bf2..7aae627fb48f 100644 --- a/hw/char/escc.c +++ b/hw/char/escc.c @@ -30,6 +30,7 @@ #include "migration/vmstate.h" #include "qemu/module.h" #include "hw/char/escc.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/console.h" =20 #include "qemu/cutils.h" @@ -804,7 +805,7 @@ static void sunkbd_handle_event(DeviceState *dev, QemuC= onsole *src, trace_escc_sunkbd_event_in(qcode, QKeyCode_str(qcode), evt->key.down); =20 - if (qcode =3D=3D Q_KEY_CODE_CAPS_LOCK) { + if (evt->key.key =3D=3D KEY_CAPSLOCK) { if (evt->key.down) { s->caps_lock_mode ^=3D 1; if (s->caps_lock_mode =3D=3D 2) { @@ -818,7 +819,7 @@ static void sunkbd_handle_event(DeviceState *dev, QemuC= onsole *src, } } =20 - if (qcode =3D=3D Q_KEY_CODE_NUM_LOCK) { + if (evt->key.key =3D=3D KEY_NUMLOCK) { if (evt->key.down) { s->num_lock_mode ^=3D 1; if (s->num_lock_mode =3D=3D 2) { @@ -832,11 +833,11 @@ static void sunkbd_handle_event(DeviceState *dev, Qem= uConsole *src, } } =20 - if (qcode >=3D qemu_input_map_qcode_to_sun_len) { + if (evt->key.key >=3D qemu_input_map_linux_to_sun_len) { return; } =20 - keycode =3D qemu_input_map_qcode_to_sun[qcode]; + keycode =3D qemu_input_map_linux_to_sun[evt->key.key]; if (!evt->key.down) { keycode |=3D 0x80; } --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1778323747777391.05693721279397; Sat, 9 May 2026 03:49:07 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1304604.1577551 (Exim 4.92) (envelope-from ) id 1wLfEU-0002fU-6A; Sat, 09 May 2026 10:48:30 +0000 Received: by outflank-mailman (output) from mailman id 1304604.1577551; Sat, 09 May 2026 10:48:30 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfEU-0002fN-2g; Sat, 09 May 2026 10:48:30 +0000 Received: by outflank-mailman (input) for mailman id 1304604; Sat, 09 May 2026 10:48:28 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfES-0002X2-FY for xen-devel@lists.xenproject.org; Sat, 09 May 2026 10:48:28 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1wLfER-007lJU-Sq for xen-devel@lists.xenproject.org; Sat, 09 May 2026 12:48:27 +0200 Received: from [10.42.69.8] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 69ff10ec-5cb7-0a2a0a5109dd-0a2a4508be8e-4 for ; Sat, 09 May 2026 12:48:27 +0200 Received: from [49.212.243.89] (helo=www3579.sakura.ne.jp) by tlsNG-c1860d.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1) (envelope-from ) id 69ff10f8-63b5-0a2a45080019-31d4f359d6d6-3 for ; Sat, 09 May 2026 12:48:27 +0200 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2A090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:58 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=temperror header.s=rs20250326 header.d=rsg.ci.i.u-tokyo.ac.jp header.i="@rsg.ci.i.u-tokyo.ac.jp" DKIM-Signature: a=rsa-sha256; bh=SBZa0nIoCp0ki8/Oc5ku4abkqOmqJgEICyF8p7mx+3g=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323679; v=1; b=jMm6FSTg3+WzoljBa1xx0VEIo3rCyipLRB/bXqKMrcdNR+6DvkjrOPX+E8rgREyl fuoDukk7jeWjRH1RJb//0ZivG9KN+Ul5uESgLkuohDwIcRoPNt8uRy5T0Gp++vJT 4ljy4BIr3xPq7yw9Gpv9nXQvfz4i8pRAk2U38IxKW5FtOqeKZ0ntoI+Lqs3KyDDv nDjEcHNRD6ijVNCuvkoaQ5cAbV5r1D3Dhm5B8CbAEzMIQN3EJEZr5W6C+DSMzgNd cVHxAtdtdiH/vXly+xP1n9bu5GWF/sZlyQ+nRmXFWnTsPqR04jZ5qyvejk2hAT2O axrvfxvwxSeG40g+JiQtnw== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:21 +0900 Subject: [PATCH RFC 09/28] hw/display/xenfb: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-9-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=1604; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=Q2mGMH2ClWf3nbm1bPmZWB8Bg9tg0j4lbTXQFfwDMGE=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gUtdcxRqAx2EuLe8LbbcLJ3V2baEYQqb3WGOpp0vp j7/IbKxo5SFQYyLQVZMkSWlaDe3RnTtp8KE+BaYOaxMIEMYuDgFYCI9RQy/2Q8qiKx+tYp1h+il SjZJSbOzDF2vF/9SspNzeul288a9zYwMdxVK8qJ7uQ2LMkV3Hb/AejX38skJoiU7t+x5kynJVxz DBgA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C X-purgate-ID: tlsNG-c1860d/1778323707-C4A7ADB1-63265AD0/0/0 X-purgate-type: clean X-purgate-size: 1606 X-ZM-MESSAGEID: 1778323749226154100 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 --- hw/display/xenfb.c | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c index 9bf89a1e6223..ee23c483499f 100644 --- a/hw/display/xenfb.c +++ b/hw/display/xenfb.c @@ -191,29 +191,14 @@ static int xenfb_send_position(struct XenInput *xenfb, return xenfb_kbd_event(xenfb, &event); } =20 -/* - * Send a key event from the client to the guest OS - * QEMU gives us a QCode. - * We have to turn this into a Linux Input layer keycode. - * - * Wish we could just send scancodes straight to the guest which - * already has code for dealing with this... - */ +/* Send a key event from the client to the guest OS */ static void xenfb_key_event(DeviceState *dev, QemuConsole *src, QemuInputEvent *evt) { struct XenInput *xenfb =3D (struct XenInput *)dev; - int qcode =3D qemu_input_linux_to_qcode(evt->key.key); - int lnx; =20 - if (qcode < qemu_input_map_qcode_to_linux_len) { - lnx =3D qemu_input_map_qcode_to_linux[qcode]; - - if (lnx) { - trace_xenfb_key_event(xenfb, lnx, evt->key.down); - xenfb_send_key(xenfb, evt->key.down, lnx); - } - } + trace_xenfb_key_event(xenfb, evt->key.key, evt->key.down); + xenfb_send_key(xenfb, evt->key.down, evt->key.key); } =20 /* --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 177832374754381.48200102823512; Sat, 9 May 2026 03:49:07 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1304605.1577556 (Exim 4.92) (envelope-from ) id 1wLfEU-0002hy-Ip; Sat, 09 May 2026 10:48:30 +0000 Received: by outflank-mailman (output) from mailman id 1304605.1577556; Sat, 09 May 2026 10:48:30 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfEU-0002h7-Aw; Sat, 09 May 2026 10:48:30 +0000 Received: by outflank-mailman (input) for mailman id 1304605; Sat, 09 May 2026 10:48:28 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfES-0002X5-Gq for xen-devel@lists.xenproject.org; Sat, 09 May 2026 10:48:28 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1wLfER-007lJU-Tw for xen-devel@lists.xenproject.org; Sat, 09 May 2026 12:48:27 +0200 Received: from [10.42.69.8] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 69ff10ec-5cb7-0a2a0a5109dd-0a2a4508be8e-6 for ; Sat, 09 May 2026 12:48:27 +0200 Received: from [49.212.243.89] (helo=www3579.sakura.ne.jp) by tlsNG-c1860d.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1) (envelope-from ) id 69ff10f9-63b5-0a2a45080019-31d4f359d6d7-3 for ; Sat, 09 May 2026 12:48:27 +0200 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2B090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:59 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=temperror header.s=rs20250326 header.d=rsg.ci.i.u-tokyo.ac.jp header.i="@rsg.ci.i.u-tokyo.ac.jp" DKIM-Signature: a=rsa-sha256; bh=ROUhaRxtDzPB8FJJRyCm0S9ppDBULPhLkvEBb93D+50=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323679; v=1; b=lzTC9DyfFbto9QQqJIWX4TjTyGPPBAJyLLupmTJeGxRQGJSl/m+z8PbzrGj5hs5Y 84QpcOTGt4CAoUiRUmz6+tjrT/UqoeEQb9qAfhRxtUf7YNGY1wd1b3Lf8a0T6c11 vor9zI6VjIBEyD7sutt1sCCc/pt+vyuQiA4Lr+CzuVgmzPORLpPOaycOiNXJy1aR KB2DGB0ETvv4v37fuYY7QfFxlZDJE9F4XyhrMnY5UaUcbnwTnYSm5SVr4SuKM/aQ E/5b8EMUHyI+CPmrnRojYg9V7ff5dRTjDhRpOe1G4l0ZZ3zplR32h3OZGA5AouHL XzFQzM4WKw9gg6KvIq+S0g== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:22 +0900 Subject: [PATCH RFC 10/28] hw/input/adb-kbd: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-10-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=11545; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=IuNc0nZq13Cfg85XfjaPn1/m1nF4glzSwdiuAeVhaoQ=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gUu3xSqPLlG2uVqgmuKU9vDaMn/3f4kTXl74G97Rw mkd//9PRykLgxgXg6yYIktK0W5ujejaT4UJ8S0wc1iZQIYwcHEKwEQi8hn+x/GuUVd/6lP7xX1l htXZq2nLzl24X71jt8LHrOe79m7oMGP4Xyd7QKOyrOl61MacbtUXanklidZJsRM2Meeov2i8r/u FAwA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C X-purgate-ID: tlsNG-c1860d/1778323707-C4E78DB1-4D55FD79/0/0 X-purgate-type: clean X-purgate-size: 11547 X-ZM-MESSAGEID: 1778323749279154100 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 --- hw/input/adb-kbd.c | 242 ++++++++++++++++++++++++++-----------------------= ---- 1 file changed, 120 insertions(+), 122 deletions(-) diff --git a/hw/input/adb-kbd.c b/hw/input/adb-kbd.c index 060481d0db6d..c4ef9ebb90c8 100644 --- a/hw/input/adb-kbd.c +++ b/hw/input/adb-kbd.c @@ -26,6 +26,7 @@ #include "hw/input/adb.h" #include "migration/vmstate.h" #include "qemu/module.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/input.h" #include "hw/input/adb-keys.h" #include "adb-internal.h" @@ -55,124 +56,122 @@ struct ADBKeyboardClass { /* The adb keyboard doesn't have every key imaginable */ #define NO_KEY 0xff =20 -int qcode_to_adb_keycode[] =3D { +int linux_to_adb_keycode[] =3D { /* Make sure future additions are automatically set to NO_KEY */ - [0 ... 0xff] =3D NO_KEY, - - [Q_KEY_CODE_SHIFT] =3D ADB_KEY_LEFT_SHIFT, - [Q_KEY_CODE_SHIFT_R] =3D ADB_KEY_RIGHT_SHIFT, - [Q_KEY_CODE_ALT] =3D ADB_KEY_LEFT_OPTION, - [Q_KEY_CODE_ALT_R] =3D ADB_KEY_RIGHT_OPTION, - [Q_KEY_CODE_CTRL] =3D ADB_KEY_LEFT_CONTROL, - [Q_KEY_CODE_CTRL_R] =3D ADB_KEY_RIGHT_CONTROL, - [Q_KEY_CODE_META_L] =3D ADB_KEY_COMMAND, - [Q_KEY_CODE_META_R] =3D ADB_KEY_COMMAND, - [Q_KEY_CODE_SPC] =3D ADB_KEY_SPACEBAR, - - [Q_KEY_CODE_ESC] =3D ADB_KEY_ESC, - [Q_KEY_CODE_1] =3D ADB_KEY_1, - [Q_KEY_CODE_2] =3D ADB_KEY_2, - [Q_KEY_CODE_3] =3D ADB_KEY_3, - [Q_KEY_CODE_4] =3D ADB_KEY_4, - [Q_KEY_CODE_5] =3D ADB_KEY_5, - [Q_KEY_CODE_6] =3D ADB_KEY_6, - [Q_KEY_CODE_7] =3D ADB_KEY_7, - [Q_KEY_CODE_8] =3D ADB_KEY_8, - [Q_KEY_CODE_9] =3D ADB_KEY_9, - [Q_KEY_CODE_0] =3D ADB_KEY_0, - [Q_KEY_CODE_MINUS] =3D ADB_KEY_MINUS, - [Q_KEY_CODE_EQUAL] =3D ADB_KEY_EQUAL, - [Q_KEY_CODE_BACKSPACE] =3D ADB_KEY_DELETE, - [Q_KEY_CODE_TAB] =3D ADB_KEY_TAB, - [Q_KEY_CODE_Q] =3D ADB_KEY_Q, - [Q_KEY_CODE_W] =3D ADB_KEY_W, - [Q_KEY_CODE_E] =3D ADB_KEY_E, - [Q_KEY_CODE_R] =3D ADB_KEY_R, - [Q_KEY_CODE_T] =3D ADB_KEY_T, - [Q_KEY_CODE_Y] =3D ADB_KEY_Y, - [Q_KEY_CODE_U] =3D ADB_KEY_U, - [Q_KEY_CODE_I] =3D ADB_KEY_I, - [Q_KEY_CODE_O] =3D ADB_KEY_O, - [Q_KEY_CODE_P] =3D ADB_KEY_P, - [Q_KEY_CODE_BRACKET_LEFT] =3D ADB_KEY_LEFT_BRACKET, - [Q_KEY_CODE_BRACKET_RIGHT] =3D ADB_KEY_RIGHT_BRACKET, - [Q_KEY_CODE_RET] =3D ADB_KEY_RETURN, - [Q_KEY_CODE_A] =3D ADB_KEY_A, - [Q_KEY_CODE_S] =3D ADB_KEY_S, - [Q_KEY_CODE_D] =3D ADB_KEY_D, - [Q_KEY_CODE_F] =3D ADB_KEY_F, - [Q_KEY_CODE_G] =3D ADB_KEY_G, - [Q_KEY_CODE_H] =3D ADB_KEY_H, - [Q_KEY_CODE_J] =3D ADB_KEY_J, - [Q_KEY_CODE_K] =3D ADB_KEY_K, - [Q_KEY_CODE_L] =3D ADB_KEY_L, - [Q_KEY_CODE_SEMICOLON] =3D ADB_KEY_SEMICOLON, - [Q_KEY_CODE_APOSTROPHE] =3D ADB_KEY_APOSTROPHE, - [Q_KEY_CODE_GRAVE_ACCENT] =3D ADB_KEY_GRAVE_ACCENT, - [Q_KEY_CODE_BACKSLASH] =3D ADB_KEY_BACKSLASH, - [Q_KEY_CODE_Z] =3D ADB_KEY_Z, - [Q_KEY_CODE_X] =3D ADB_KEY_X, - [Q_KEY_CODE_C] =3D ADB_KEY_C, - [Q_KEY_CODE_V] =3D ADB_KEY_V, - [Q_KEY_CODE_B] =3D ADB_KEY_B, - [Q_KEY_CODE_N] =3D ADB_KEY_N, - [Q_KEY_CODE_M] =3D ADB_KEY_M, - [Q_KEY_CODE_COMMA] =3D ADB_KEY_COMMA, - [Q_KEY_CODE_DOT] =3D ADB_KEY_PERIOD, - [Q_KEY_CODE_SLASH] =3D ADB_KEY_FORWARD_SLASH, - [Q_KEY_CODE_ASTERISK] =3D ADB_KEY_KP_MULTIPLY, - [Q_KEY_CODE_CAPS_LOCK] =3D ADB_KEY_CAPS_LOCK, - - [Q_KEY_CODE_F1] =3D ADB_KEY_F1, - [Q_KEY_CODE_F2] =3D ADB_KEY_F2, - [Q_KEY_CODE_F3] =3D ADB_KEY_F3, - [Q_KEY_CODE_F4] =3D ADB_KEY_F4, - [Q_KEY_CODE_F5] =3D ADB_KEY_F5, - [Q_KEY_CODE_F6] =3D ADB_KEY_F6, - [Q_KEY_CODE_F7] =3D ADB_KEY_F7, - [Q_KEY_CODE_F8] =3D ADB_KEY_F8, - [Q_KEY_CODE_F9] =3D ADB_KEY_F9, - [Q_KEY_CODE_F10] =3D ADB_KEY_F10, - [Q_KEY_CODE_F11] =3D ADB_KEY_F11, - [Q_KEY_CODE_F12] =3D ADB_KEY_F12, - [Q_KEY_CODE_PRINT] =3D ADB_KEY_F13, - [Q_KEY_CODE_SYSRQ] =3D ADB_KEY_F13, - [Q_KEY_CODE_SCROLL_LOCK] =3D ADB_KEY_F14, - [Q_KEY_CODE_PAUSE] =3D ADB_KEY_F15, - - [Q_KEY_CODE_NUM_LOCK] =3D ADB_KEY_KP_CLEAR, - [Q_KEY_CODE_KP_EQUALS] =3D ADB_KEY_KP_EQUAL, - [Q_KEY_CODE_KP_DIVIDE] =3D ADB_KEY_KP_DIVIDE, - [Q_KEY_CODE_KP_MULTIPLY] =3D ADB_KEY_KP_MULTIPLY, - [Q_KEY_CODE_KP_SUBTRACT] =3D ADB_KEY_KP_SUBTRACT, - [Q_KEY_CODE_KP_ADD] =3D ADB_KEY_KP_PLUS, - [Q_KEY_CODE_KP_ENTER] =3D ADB_KEY_KP_ENTER, - [Q_KEY_CODE_KP_DECIMAL] =3D ADB_KEY_KP_PERIOD, - [Q_KEY_CODE_KP_0] =3D ADB_KEY_KP_0, - [Q_KEY_CODE_KP_1] =3D ADB_KEY_KP_1, - [Q_KEY_CODE_KP_2] =3D ADB_KEY_KP_2, - [Q_KEY_CODE_KP_3] =3D ADB_KEY_KP_3, - [Q_KEY_CODE_KP_4] =3D ADB_KEY_KP_4, - [Q_KEY_CODE_KP_5] =3D ADB_KEY_KP_5, - [Q_KEY_CODE_KP_6] =3D ADB_KEY_KP_6, - [Q_KEY_CODE_KP_7] =3D ADB_KEY_KP_7, - [Q_KEY_CODE_KP_8] =3D ADB_KEY_KP_8, - [Q_KEY_CODE_KP_9] =3D ADB_KEY_KP_9, - - [Q_KEY_CODE_UP] =3D ADB_KEY_UP, - [Q_KEY_CODE_DOWN] =3D ADB_KEY_DOWN, - [Q_KEY_CODE_LEFT] =3D ADB_KEY_LEFT, - [Q_KEY_CODE_RIGHT] =3D ADB_KEY_RIGHT, - - [Q_KEY_CODE_HELP] =3D ADB_KEY_HELP, - [Q_KEY_CODE_INSERT] =3D ADB_KEY_HELP, - [Q_KEY_CODE_DELETE] =3D ADB_KEY_FORWARD_DELETE, - [Q_KEY_CODE_HOME] =3D ADB_KEY_HOME, - [Q_KEY_CODE_END] =3D ADB_KEY_END, - [Q_KEY_CODE_PGUP] =3D ADB_KEY_PAGE_UP, - [Q_KEY_CODE_PGDN] =3D ADB_KEY_PAGE_DOWN, - - [Q_KEY_CODE_POWER] =3D ADB_KEY_POWER + [0 ... KEY_MAX] =3D NO_KEY, + + [KEY_LEFTSHIFT] =3D ADB_KEY_LEFT_SHIFT, + [KEY_RIGHTSHIFT] =3D ADB_KEY_RIGHT_SHIFT, + [KEY_LEFTALT] =3D ADB_KEY_LEFT_OPTION, + [KEY_RIGHTALT] =3D ADB_KEY_RIGHT_OPTION, + [KEY_LEFTCTRL] =3D ADB_KEY_LEFT_CONTROL, + [KEY_RIGHTCTRL] =3D ADB_KEY_RIGHT_CONTROL, + [KEY_LEFTMETA] =3D ADB_KEY_COMMAND, + [KEY_RIGHTMETA] =3D ADB_KEY_COMMAND, + [KEY_SPACE] =3D ADB_KEY_SPACEBAR, + + [KEY_ESC] =3D ADB_KEY_ESC, + [KEY_1] =3D ADB_KEY_1, + [KEY_2] =3D ADB_KEY_2, + [KEY_3] =3D ADB_KEY_3, + [KEY_4] =3D ADB_KEY_4, + [KEY_5] =3D ADB_KEY_5, + [KEY_6] =3D ADB_KEY_6, + [KEY_7] =3D ADB_KEY_7, + [KEY_8] =3D ADB_KEY_8, + [KEY_9] =3D ADB_KEY_9, + [KEY_0] =3D ADB_KEY_0, + [KEY_MINUS] =3D ADB_KEY_MINUS, + [KEY_EQUAL] =3D ADB_KEY_EQUAL, + [KEY_BACKSPACE] =3D ADB_KEY_DELETE, + [KEY_TAB] =3D ADB_KEY_TAB, + [KEY_Q] =3D ADB_KEY_Q, + [KEY_W] =3D ADB_KEY_W, + [KEY_E] =3D ADB_KEY_E, + [KEY_R] =3D ADB_KEY_R, + [KEY_T] =3D ADB_KEY_T, + [KEY_Y] =3D ADB_KEY_Y, + [KEY_U] =3D ADB_KEY_U, + [KEY_I] =3D ADB_KEY_I, + [KEY_O] =3D ADB_KEY_O, + [KEY_P] =3D ADB_KEY_P, + [KEY_LEFTBRACE] =3D ADB_KEY_LEFT_BRACKET, + [KEY_RIGHTBRACE] =3D ADB_KEY_RIGHT_BRACKET, + [KEY_ENTER] =3D ADB_KEY_RETURN, + [KEY_A] =3D ADB_KEY_A, + [KEY_S] =3D ADB_KEY_S, + [KEY_D] =3D ADB_KEY_D, + [KEY_F] =3D ADB_KEY_F, + [KEY_G] =3D ADB_KEY_G, + [KEY_H] =3D ADB_KEY_H, + [KEY_J] =3D ADB_KEY_J, + [KEY_K] =3D ADB_KEY_K, + [KEY_L] =3D ADB_KEY_L, + [KEY_SEMICOLON] =3D ADB_KEY_SEMICOLON, + [KEY_APOSTROPHE] =3D ADB_KEY_APOSTROPHE, + [KEY_GRAVE] =3D ADB_KEY_GRAVE_ACCENT, + [KEY_BACKSLASH] =3D ADB_KEY_BACKSLASH, + [KEY_Z] =3D ADB_KEY_Z, + [KEY_X] =3D ADB_KEY_X, + [KEY_C] =3D ADB_KEY_C, + [KEY_V] =3D ADB_KEY_V, + [KEY_B] =3D ADB_KEY_B, + [KEY_N] =3D ADB_KEY_N, + [KEY_M] =3D ADB_KEY_M, + [KEY_COMMA] =3D ADB_KEY_COMMA, + [KEY_DOT] =3D ADB_KEY_PERIOD, + [KEY_SLASH] =3D ADB_KEY_FORWARD_SLASH, + [KEY_CAPSLOCK] =3D ADB_KEY_CAPS_LOCK, + + [KEY_F1] =3D ADB_KEY_F1, + [KEY_F2] =3D ADB_KEY_F2, + [KEY_F3] =3D ADB_KEY_F3, + [KEY_F4] =3D ADB_KEY_F4, + [KEY_F5] =3D ADB_KEY_F5, + [KEY_F6] =3D ADB_KEY_F6, + [KEY_F7] =3D ADB_KEY_F7, + [KEY_F8] =3D ADB_KEY_F8, + [KEY_F9] =3D ADB_KEY_F9, + [KEY_F10] =3D ADB_KEY_F10, + [KEY_F11] =3D ADB_KEY_F11, + [KEY_F12] =3D ADB_KEY_F12, + [KEY_SYSRQ] =3D ADB_KEY_F13, + [KEY_SCROLLLOCK] =3D ADB_KEY_F14, + [KEY_PAUSE] =3D ADB_KEY_F15, + + [KEY_NUMLOCK] =3D ADB_KEY_KP_CLEAR, + [KEY_KPEQUAL] =3D ADB_KEY_KP_EQUAL, + [KEY_KPSLASH] =3D ADB_KEY_KP_DIVIDE, + [KEY_KPASTERISK] =3D ADB_KEY_KP_MULTIPLY, + [KEY_KPMINUS] =3D ADB_KEY_KP_SUBTRACT, + [KEY_KPPLUS] =3D ADB_KEY_KP_PLUS, + [KEY_KPENTER] =3D ADB_KEY_KP_ENTER, + [KEY_KPDOT] =3D ADB_KEY_KP_PERIOD, + [KEY_KP0] =3D ADB_KEY_KP_0, + [KEY_KP1] =3D ADB_KEY_KP_1, + [KEY_KP2] =3D ADB_KEY_KP_2, + [KEY_KP3] =3D ADB_KEY_KP_3, + [KEY_KP4] =3D ADB_KEY_KP_4, + [KEY_KP5] =3D ADB_KEY_KP_5, + [KEY_KP6] =3D ADB_KEY_KP_6, + [KEY_KP7] =3D ADB_KEY_KP_7, + [KEY_KP8] =3D ADB_KEY_KP_8, + [KEY_KP9] =3D ADB_KEY_KP_9, + + [KEY_UP] =3D ADB_KEY_UP, + [KEY_DOWN] =3D ADB_KEY_DOWN, + [KEY_LEFT] =3D ADB_KEY_LEFT, + [KEY_RIGHT] =3D ADB_KEY_RIGHT, + + [KEY_HELP] =3D ADB_KEY_HELP, + [KEY_INSERT] =3D ADB_KEY_HELP, + [KEY_DELETE] =3D ADB_KEY_FORWARD_DELETE, + [KEY_HOME] =3D ADB_KEY_HOME, + [KEY_END] =3D ADB_KEY_END, + [KEY_PAGEUP] =3D ADB_KEY_PAGE_UP, + [KEY_PAGEDOWN] =3D ADB_KEY_PAGE_DOWN, + + [KEY_POWER] =3D ADB_KEY_POWER }; =20 static void adb_kbd_put_keycode(void *opaque, int keycode) @@ -309,14 +308,13 @@ static void adb_keyboard_event(DeviceState *dev, Qemu= Console *src, QemuInputEvent *evt) { KBDState *s =3D (KBDState *)dev; - int qcode, keycode; + int keycode; =20 - qcode =3D qemu_input_linux_to_qcode(evt->key.key); - if (qcode >=3D ARRAY_SIZE(qcode_to_adb_keycode)) { + if (evt->key.key >=3D ARRAY_SIZE(linux_to_adb_keycode)) { return; } - /* FIXME: take handler into account when translating qcode */ - keycode =3D qcode_to_adb_keycode[qcode]; + /* FIXME: take handler into account when translating evt->key.key */ + keycode =3D linux_to_adb_keycode[evt->key.key]; if (keycode =3D=3D NO_KEY) { /* We don't want to send this to the gue= st */ trace_adb_device_kbd_no_key(); return; --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778324130997499.21168896259167; Sat, 9 May 2026 03:55:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFa-0000Ju-HZ; Sat, 09 May 2026 06:49:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF2-0008KZ-7E; Sat, 09 May 2026 06:49:05 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEx-0001e9-Hh; Sat, 09 May 2026 06:49:03 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2C090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:59 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=ctYWFW44+JRS6P/6Fa2o8C0z5VCfh5rD+JQVUvCvh1Y=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323679; v=1; b=NKLfL7r33zhnImhPmqERT9PsrudcoabDGGtVeid5EXlcWWlpHUizQQ0EpahZ86HS b1iNo+JCw6y7/S3u2OrAjUkj47ssMaNLN6+ZAX5Z3K35hZ7KZiouqesuTPIRDQLI zNksm1EL+pg4VTxZQ1J4swB5/WxjMcrVDQh1DjzoN3IlN0fScyqapQt4bv5xIFEw H/grfQr0HBHxzVOMbYa4frr3Wm3tv6VTOsY03rvp4t2aNTYgvmSsBHL+JotIN1aZ Um1+y4Jyl19BYeQ1uijyJWSOhJvUMSlmqAebmIJauoADGMYab7laJ0v2q7TswPoq VvPSuhg8/LGW5kmT0MXreg== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:23 +0900 Subject: [PATCH RFC 11/28] hw/input/hid: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-11-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=1012; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=F6pNPUoV378dGf+lw/tgs4TqsOj9bQ11tihkFkSZ+wg=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gcuxnDveLHLvmDFhom7qcZ3vPB9yZk+LsZz4NjKJd U+/8PJNHaUsDGJcDLJiiiwpRbu5NaJrPxUmxLfAzGFlAhnCwMUpABOx1WT4w5NUOO1r+vfcMyd7 J5fcqkhN/f1HteG1waNNr7/MubfH4zPD//RS1ldt+hZxSp97X1zxLH/lzHWE71r0L6msV7Pqt3f uYQIA X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778324133301158500 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 --- hw/input/hid.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hw/input/hid.c b/hw/input/hid.c index 013840562f60..467ba8f14f32 100644 --- a/hw/input/hid.c +++ b/hw/input/hid.c @@ -224,11 +224,10 @@ static void hid_keyboard_event(DeviceState *dev, Qemu= Console *src, QemuInputEvent *evt) { HIDState *hs =3D (HIDState *)dev; - int qcode =3D qemu_input_linux_to_qcode(evt->key.key); int scancodes[3], i, count; int slot; =20 - count =3D qemu_input_qcode_to_scancode(qcode, evt->key.down, + count =3D qemu_input_linux_to_scancode(evt->key.key, evt->key.down, scancodes); if (hs->n + count > QUEUE_LENGTH) { trace_hid_kbd_queue_full(); --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778323769700471.9279170693636; Sat, 9 May 2026 03:49:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfEa-00087j-59; Sat, 09 May 2026 06:48:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEX-00085x-Jp; Sat, 09 May 2026 06:48:33 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEU-0001bU-Nl; Sat, 09 May 2026 06:48:33 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2D090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:59 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=ZlmjbgTUw+wgKfabijKz5yS6icG8HdUDHEMC62aDAC8=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323679; v=1; b=fFHtPdTzvBJuv7S/2hZosdfoHhrgg9KaOD4aOFl0qfFSNer0a7/ba7UcgA1watWo kU6S/cwELpvR13emxpCYf0w6EP+CGmZ/BwJ9fDBvM98sLe56zCwTf1vMz4wSFFB7 lYa+6dXHM8VlC3qcYFhqQcb8CyXJhBlIGS/weSwyvtAcyGoGcgoXjv224kFQ8QAX Qpy3QzzlteDTvv9M0f5lCp0hBcSuZNCBrsVPIOpJjMEh3ONGh2trX8to9PXUIvCY Xg0nFQ65NtZ5NbRBkFMGDeMJwiILp70FcMYpzLdSxZVRg++nyPpNDG+TTHHtO714 l7no3aFh+U0mcg2yp3z2lg== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:24 +0900 Subject: [PATCH RFC 12/28] hw/input/ps2: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-12-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=7753; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=XguFzVmFNzkZssfgO9k7SyIjps6ojovNRXR7/cfGhKk=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gcuuO38LNp6x+ftKxaH3ZMneFezbJOXk/8S1nd8cV n2s2/96RykLgxgXg6yYIktK0W5ujejaT4UJ8S0wc1iZQIYwcHEKwES8pBj+Sv1VmvWg+sISgadx 14TKY1iipije23Jqh7vl7pCkT52r9jAybGKf39YTe4SJ/fXjmznmEuccTxt+al91Qu+khtlK/ZK PLAA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778323773039154100 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 --- hw/input/ps2.c | 49 ++++++++++++++++++++++++-----------------------= -- hw/input/trace-events | 2 +- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/hw/input/ps2.c b/hw/input/ps2.c index 93c3c7372054..1f266bc6a075 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -28,6 +28,7 @@ #include "hw/core/sysbus.h" #include "hw/input/ps2.h" #include "migration/vmstate.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/console.h" #include "ui/input.h" #include "system/reset.h" @@ -126,17 +127,17 @@ static uint8_t translate_table[256] =3D { static unsigned int ps2_modifier_bit(QKeyCode key) { switch (key) { - case Q_KEY_CODE_CTRL: + case KEY_LEFTCTRL: return MOD_CTRL_L; - case Q_KEY_CODE_CTRL_R: + case KEY_RIGHTCTRL: return MOD_CTRL_R; - case Q_KEY_CODE_SHIFT: + case KEY_LEFTSHIFT: return MOD_SHIFT_L; - case Q_KEY_CODE_SHIFT_R: + case KEY_RIGHTSHIFT: return MOD_SHIFT_R; - case Q_KEY_CODE_ALT: + case KEY_LEFTALT: return MOD_ALT_L; - case Q_KEY_CODE_ALT_R: + case KEY_RIGHTALT: return MOD_ALT_R; default: return 0; @@ -313,7 +314,6 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, QemuInputEvent *evt) { PS2KbdState *s =3D (PS2KbdState *)dev; - int qcode; uint16_t keycode =3D 0; int mod; =20 @@ -324,10 +324,9 @@ static void ps2_keyboard_event(DeviceState *dev, QemuC= onsole *src, =20 qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER, NULL); assert(evt->type =3D=3D INPUT_EVENT_KIND_KEY); - qcode =3D qemu_input_linux_to_qcode(evt->key.key); =20 - mod =3D ps2_modifier_bit(qcode); - trace_ps2_keyboard_event(s, qcode, evt->key.down, mod, + mod =3D ps2_modifier_bit(evt->key.key); + trace_ps2_keyboard_event(s, evt->key.key, evt->key.down, mod, s->modifiers, s->scancode_set, s->translate); if (evt->key.down) { s->modifiers |=3D mod; @@ -336,7 +335,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, } =20 if (s->scancode_set =3D=3D 1) { - if (qcode =3D=3D Q_KEY_CODE_PAUSE) { + if (evt->key.key =3D=3D KEY_PAUSE) { if (s->modifiers & (MOD_CTRL_L | MOD_CTRL_R)) { if (evt->key.down) { ps2_put_keycode(s, 0xe0); @@ -354,7 +353,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, ps2_put_keycode(s, 0xc5); } } - } else if (qcode =3D=3D Q_KEY_CODE_PRINT) { + } else if (evt->key.key =3D=3D KEY_SYSRQ) { if (s->modifiers & MOD_ALT_L) { if (evt->key.down) { ps2_put_keycode(s, 0xb8); @@ -401,12 +400,12 @@ static void ps2_keyboard_event(DeviceState *dev, Qemu= Console *src, ps2_put_keycode(s, 0xaa); } } - } else if ((qcode =3D=3D Q_KEY_CODE_LANG1 || qcode =3D=3D Q_KEY_CO= DE_LANG2) + } else if ((evt->key.key =3D=3D KEY_HANGEUL || evt->key.key =3D=3D= KEY_HANJA) && !evt->key.down) { /* Ignore release for these keys */ } else { - if (qcode < qemu_input_map_qcode_to_atset1_len) { - keycode =3D qemu_input_map_qcode_to_atset1[qcode]; + if (evt->key.key < qemu_input_map_linux_to_atset1_len) { + keycode =3D qemu_input_map_linux_to_atset1[evt->key.key]; } if (keycode) { if (keycode & 0xff00) { @@ -418,11 +417,11 @@ static void ps2_keyboard_event(DeviceState *dev, Qemu= Console *src, ps2_put_keycode(s, keycode & 0xff); } else { qemu_log_mask(LOG_UNIMP, - "ps2: ignoring key with qcode %d\n", qcode); + "ps2: ignoring key %u\n", evt->key.key); } } } else if (s->scancode_set =3D=3D 2) { - if (qcode =3D=3D Q_KEY_CODE_PAUSE) { + if (evt->key.key =3D=3D KEY_PAUSE) { if (s->modifiers & (MOD_CTRL_L | MOD_CTRL_R)) { if (evt->key.down) { ps2_put_keycode(s, 0xe0); @@ -443,7 +442,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, ps2_put_keycode(s, 0x77); } } - } else if (qcode =3D=3D Q_KEY_CODE_PRINT) { + } else if (evt->key.key =3D=3D KEY_SYSRQ) { if (s->modifiers & MOD_ALT_L) { if (evt->key.down) { ps2_put_keycode(s, 0xf0); @@ -499,12 +498,12 @@ static void ps2_keyboard_event(DeviceState *dev, Qemu= Console *src, ps2_put_keycode(s, 0x12); } } - } else if ((qcode =3D=3D Q_KEY_CODE_LANG1 || qcode =3D=3D Q_KEY_CO= DE_LANG2) && + } else if ((evt->key.key =3D=3D KEY_HANGEUL || evt->key.key =3D=3D= KEY_HANJA) && !evt->key.down) { /* Ignore release for these keys */ } else { - if (qcode < qemu_input_map_qcode_to_atset2_len) { - keycode =3D qemu_input_map_qcode_to_atset2[qcode]; + if (evt->key.key < qemu_input_map_linux_to_atset2_len) { + keycode =3D qemu_input_map_linux_to_atset2[evt->key.key]; } if (keycode) { if (keycode & 0xff00) { @@ -516,12 +515,12 @@ static void ps2_keyboard_event(DeviceState *dev, Qemu= Console *src, ps2_put_keycode(s, keycode & 0xff); } else { qemu_log_mask(LOG_UNIMP, - "ps2: ignoring key with qcode %d\n", qcode); + "ps2: ignoring key %u\n", evt->key.key); } } } else if (s->scancode_set =3D=3D 3) { - if (qcode < qemu_input_map_qcode_to_atset3_len) { - keycode =3D qemu_input_map_qcode_to_atset3[qcode]; + if (evt->key.key < qemu_input_map_linux_to_atset3_len) { + keycode =3D qemu_input_map_linux_to_atset3[evt->key.key]; } if (keycode) { /* FIXME: break code should be configured on a key by key basi= s */ @@ -531,7 +530,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuCo= nsole *src, ps2_put_keycode(s, keycode); } else { qemu_log_mask(LOG_UNIMP, - "ps2: ignoring key with qcode %d\n", qcode); + "ps2: ignoring key %u\n", evt->key.key); } } } diff --git a/hw/input/trace-events b/hw/input/trace-events index 1484625565b5..43900914be28 100644 --- a/hw/input/trace-events +++ b/hw/input/trace-events @@ -30,7 +30,7 @@ pckbd_kbd_write_data(uint64_t val) "0x%02"PRIx64 =20 # ps2.c ps2_put_keycode(void *opaque, int keycode) "%p keycode 0x%02x" -ps2_keyboard_event(void *opaque, int qcode, int down, unsigned int modifie= r, unsigned int modifiers, int set, int xlate) "%p qcode %d down %d modifie= r 0x%x modifiers 0x%x set %d xlate %d" +ps2_keyboard_event(void *opaque, unsigned int lnx, int down, unsigned int = modifier, unsigned int modifiers, int set, int xlate) "%p lnx %u down %d mo= difier 0x%x modifiers 0x%x set %d xlate %d" ps2_read_data(void *opaque) "%p" ps2_set_ledstate(void *s, int ledstate) "%p ledstate %d" ps2_reset_keyboard(void *s) "%p" --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778324111902634.7978507275711; Sat, 9 May 2026 03:55:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFb-0000NT-Qx; Sat, 09 May 2026 06:49:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF2-0008KV-6s; Sat, 09 May 2026 06:49:05 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEx-0001e6-Ib; Sat, 09 May 2026 06:49:02 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2E090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:47:59 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=jYzmLTbWax8JogN3WJf0BurekwSvWMhETlPn4yFttW0=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323680; v=1; b=iunl5CceMu7WtKDfvF4u1wtP4gK8f2BvxgidjHusJV9SVQMKD/7i69jH8M1ebFU3 8OmeptkXILo4vLeHMJMqccFaQr/CGDspkHNnC1+ssA8QFjq/P5uJ0vBAaiCKvPld zsgVNMNyo9G6pG4aoAHSasB1Pnvjl/NUWeXFzCYsZHhXt0eF4nSnhrG9qhl8hysh 4loo6PYKlcLs3l2b1hM7zIqjzB4+XHqgLFv2dKyXwVH1io0bD+rTTDBKC7l1+upV 0xpR+OFd0lIwWXPJVgsDGC+nnmBRIu99BtWyPTXpQ9UC8CinnVfJfI8RB4QdU7PV fNDJbFAXY33ow3cKZaUMrA== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:25 +0900 Subject: [PATCH RFC 13/28] hw/input/virtio-input: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-13-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=3015; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=EmtPHZ4VrwnBl0E92Q8PvtguFqdBkezuol02LtNVvV0=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gSvzfv+xztew1A+df7T50dHW53turpq15NGvZXNlS vW/r47f1VHKwiDGxSArpsiSUrSbWyO69lNhQnwLzBxWJpAhDFycAjCRa2cYGS6cPLNlwn1OU/c2 qY6GvRsP5i3et6l30cfC6DMc/2Y8dExn+CvGt4ndQ6pMOqLZK1Ohxn69sG3GNOMZhvZXdSpXbjF QZQIA X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778324114608154100 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 --- hw/input/virtio-input-hid.c | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index 1d2e922567ab..75fe45d89a2a 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -83,23 +83,13 @@ static void virtio_input_handle_event(DeviceState *dev,= QemuConsole *src, { VirtIOInput *vinput =3D VIRTIO_INPUT(dev); virtio_input_event event; - int qcode; =20 switch (evt->type) { case INPUT_EVENT_KIND_KEY: - qcode =3D qemu_input_linux_to_qcode(evt->key.key); - if (qcode < qemu_input_map_qcode_to_linux_len && - qemu_input_map_qcode_to_linux[qcode]) { - event.type =3D cpu_to_le16(EV_KEY); - event.code =3D cpu_to_le16(qemu_input_map_qcode_to_linux[qcod= e]); - event.value =3D cpu_to_le32(evt->key.down ? 1 : 0); - virtio_input_send(vinput, &event); - } else { - if (evt->key.down) { - fprintf(stderr, "%s: unmapped key: %d [%s]\n", __func__, - qcode, QKeyCode_str(qcode)); - } - } + event.type =3D cpu_to_le16(EV_KEY); + event.code =3D cpu_to_le16(evt->key.key); + event.value =3D cpu_to_le32(evt->key.down ? 1 : 0); + virtio_input_send(vinput, &event); break; case INPUT_EVENT_KIND_BTN: if ((evt->btn.button =3D=3D INPUT_BUTTON_WHEEL_UP || @@ -293,12 +283,28 @@ static void virtio_keyboard_init(Object *obj) { VirtIOInputHID *vhid =3D VIRTIO_INPUT_HID(obj); VirtIOInput *vinput =3D VIRTIO_INPUT(obj); + virtio_input_config ext =3D { + .select =3D VIRTIO_INPUT_CFG_EV_BITS, + .subsel =3D EV_KEY, + .size =3D DIV_ROUND_UP(KEY_REPLY, 8) + }; + unsigned int i; =20 vhid->handler =3D &virtio_keyboard_handler; virtio_input_init_config(vinput, virtio_keyboard_config); - virtio_input_extend_config(vinput, qemu_input_map_qcode_to_linux, - qemu_input_map_qcode_to_linux_len, - VIRTIO_INPUT_CFG_EV_BITS, EV_KEY); + + /* + * Cover as many keys as possible since we cannot tell what keys the h= ost + * supports. This follows Linux xen-kbdfront's approach: + * https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/= diff/drivers/input/xen-kbdfront.c?id=3D4ee36dc08e5c4d16d078f59acd6d9d536f97= 18dd + * + * Stop before KEY_REPLY for migration compatibility. + */ + for (i =3D KEY_ESC; i < KEY_REPLY; i++) { + ext.u.bitmap[i / 8] |=3D (1 << (i % 8)); + } + + virtio_input_add_config(vinput, &ext); } =20 static const TypeInfo virtio_keyboard_info =3D { --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778324022906739.9942474475936; Sat, 9 May 2026 03:53:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFg-0000lY-MW; Sat, 09 May 2026 06:49:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF5-0008Ok-SU; Sat, 09 May 2026 06:49:09 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEz-0001f3-Ph; Sat, 09 May 2026 06:49:06 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2F090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:00 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=f4nMAQnz85jIi6jdDFcVx4lxK79NORQbClAxHDODkiQ=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323680; v=1; b=mkWozBtIhSQ4AErzPubxtD762Kk4buzYx8ChukK/HzpnL3QUE2HfOlfsbXCGcQLY Cm9OAO0R4TlKWJQuZR7cWD91wQYcHeayJWfY3H1kbb5t6l0XLRzfSMMIQTa08mkD k07uQZvGLtbCIP0ZXNHpuZTB1Nu9vhzLqn9atc5rNz8LWVeOhq9wYmPO8glQXBx0 nKM1e1/8YLtvM9mpAoEZ5qiuQdz0hp4On1cB4wUWeexrlrmsr7d1G/DANIb3GzAj arQ31vS1fRfccHvZzYXeeK4lwLgH9YBArxPobVIqeuBNz/TMt0yicUsRclRigYfN 9aIgyonBSPJP+3H7aa6KHQ== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:26 +0900 Subject: [PATCH RFC 14/28] hw/m68k/next-kbd: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-14-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=5735; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=iyLiD2EoMRDRtaROtRWs8sE4KAkgfKNGzp5wMpy28GQ=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gSsKE61i8g7VZT+d07hUrfdU++y2ltBH3EGHZArWx zp+CPLsKGVhEONikBVTZEkp2s2tEV37qTAhvgVmDisTyBAGLk4BmMi28wz/fabx+od63yyqvST5 52crq7GqX9rM/VJxvtuMz/9ItztmxMhwatcr+R91c+ep+Iu+d/1WkKde9VX1YceOuQFKl189SXr NAgA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778324025151154100 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 --- hw/m68k/next-kbd.c | 118 ++++++++++++++++++++++++++-----------------------= ---- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/hw/m68k/next-kbd.c b/hw/m68k/next-kbd.c index 7efbd806b7c8..7be5ab2fb798 100644 --- a/hw/m68k/next-kbd.c +++ b/hw/m68k/next-kbd.c @@ -31,6 +31,7 @@ #include "qemu/log.h" #include "hw/core/sysbus.h" #include "hw/m68k/next-cube.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/console.h" #include "migration/vmstate.h" #include "qom/object.h" @@ -165,59 +166,59 @@ static const MemoryRegionOps kbd_ops =3D { .endianness =3D DEVICE_BIG_ENDIAN, }; =20 -static const int qcode_to_nextkbd_keycode[] =3D { - [Q_KEY_CODE_ESC] =3D 0x49, - [Q_KEY_CODE_1] =3D 0x4a, - [Q_KEY_CODE_2] =3D 0x4b, - [Q_KEY_CODE_3] =3D 0x4c, - [Q_KEY_CODE_4] =3D 0x4d, - [Q_KEY_CODE_5] =3D 0x50, - [Q_KEY_CODE_6] =3D 0x4f, - [Q_KEY_CODE_7] =3D 0x4e, - [Q_KEY_CODE_8] =3D 0x1e, - [Q_KEY_CODE_9] =3D 0x1f, - [Q_KEY_CODE_0] =3D 0x20, - [Q_KEY_CODE_MINUS] =3D 0x1d, - [Q_KEY_CODE_EQUAL] =3D 0x1c, - [Q_KEY_CODE_BACKSPACE] =3D 0x1b, - - [Q_KEY_CODE_Q] =3D 0x42, - [Q_KEY_CODE_W] =3D 0x43, - [Q_KEY_CODE_E] =3D 0x44, - [Q_KEY_CODE_R] =3D 0x45, - [Q_KEY_CODE_T] =3D 0x48, - [Q_KEY_CODE_Y] =3D 0x47, - [Q_KEY_CODE_U] =3D 0x46, - [Q_KEY_CODE_I] =3D 0x06, - [Q_KEY_CODE_O] =3D 0x07, - [Q_KEY_CODE_P] =3D 0x08, - [Q_KEY_CODE_RET] =3D 0x2a, - [Q_KEY_CODE_A] =3D 0x39, - [Q_KEY_CODE_S] =3D 0x3a, - - [Q_KEY_CODE_D] =3D 0x3b, - [Q_KEY_CODE_F] =3D 0x3c, - [Q_KEY_CODE_G] =3D 0x3d, - [Q_KEY_CODE_H] =3D 0x40, - [Q_KEY_CODE_J] =3D 0x3f, - [Q_KEY_CODE_K] =3D 0x3e, - [Q_KEY_CODE_L] =3D 0x2d, - [Q_KEY_CODE_SEMICOLON] =3D 0x2c, - [Q_KEY_CODE_APOSTROPHE] =3D 0x2b, - [Q_KEY_CODE_GRAVE_ACCENT] =3D 0x26, - [Q_KEY_CODE_Z] =3D 0x31, - [Q_KEY_CODE_X] =3D 0x32, - [Q_KEY_CODE_C] =3D 0x33, - [Q_KEY_CODE_V] =3D 0x34, - - [Q_KEY_CODE_B] =3D 0x35, - [Q_KEY_CODE_N] =3D 0x37, - [Q_KEY_CODE_M] =3D 0x36, - [Q_KEY_CODE_COMMA] =3D 0x2e, - [Q_KEY_CODE_DOT] =3D 0x2f, - [Q_KEY_CODE_SLASH] =3D 0x30, - - [Q_KEY_CODE_SPC] =3D 0x38, +static const int linux_to_nextkbd_keycode[] =3D { + [KEY_ESC] =3D 0x49, + [KEY_1] =3D 0x4a, + [KEY_2] =3D 0x4b, + [KEY_3] =3D 0x4c, + [KEY_4] =3D 0x4d, + [KEY_5] =3D 0x50, + [KEY_6] =3D 0x4f, + [KEY_7] =3D 0x4e, + [KEY_8] =3D 0x1e, + [KEY_9] =3D 0x1f, + [KEY_0] =3D 0x20, + [KEY_MINUS] =3D 0x1d, + [KEY_EQUAL] =3D 0x1c, + [KEY_BACKSPACE] =3D 0x1b, + + [KEY_Q] =3D 0x42, + [KEY_W] =3D 0x43, + [KEY_E] =3D 0x44, + [KEY_R] =3D 0x45, + [KEY_T] =3D 0x48, + [KEY_Y] =3D 0x47, + [KEY_U] =3D 0x46, + [KEY_I] =3D 0x06, + [KEY_O] =3D 0x07, + [KEY_P] =3D 0x08, + [KEY_ENTER] =3D 0x2a, + [KEY_A] =3D 0x39, + [KEY_S] =3D 0x3a, + + [KEY_D] =3D 0x3b, + [KEY_F] =3D 0x3c, + [KEY_G] =3D 0x3d, + [KEY_H] =3D 0x40, + [KEY_J] =3D 0x3f, + [KEY_K] =3D 0x3e, + [KEY_L] =3D 0x2d, + [KEY_SEMICOLON] =3D 0x2c, + [KEY_APOSTROPHE] =3D 0x2b, + [KEY_GRAVE] =3D 0x26, + [KEY_Z] =3D 0x31, + [KEY_X] =3D 0x32, + [KEY_C] =3D 0x33, + [KEY_V] =3D 0x34, + + [KEY_B] =3D 0x35, + [KEY_N] =3D 0x37, + [KEY_M] =3D 0x36, + [KEY_COMMA] =3D 0x2e, + [KEY_DOT] =3D 0x2f, + [KEY_SLASH] =3D 0x30, + + [KEY_SPACE] =3D 0x38, }; =20 static void nextkbd_put_keycode(NextKBDState *s, int keycode) @@ -246,15 +247,14 @@ static void nextkbd_event(DeviceState *dev, QemuConso= le *src, QemuInputEvent *evt) { NextKBDState *s =3D NEXTKBD(dev); - int qcode, keycode; + int keycode; =20 - qcode =3D qemu_input_linux_to_qcode(evt->key.key); - if (qcode >=3D ARRAY_SIZE(qcode_to_nextkbd_keycode)) { + if (evt->key.key >=3D ARRAY_SIZE(linux_to_nextkbd_keycode)) { return; } =20 /* Shift key currently has no keycode, so handle separately */ - if (qcode =3D=3D Q_KEY_CODE_SHIFT) { + if (evt->key.key =3D=3D KEY_LEFTSHIFT) { if (evt->key.down) { s->shift |=3D KD_LSHIFT; } else { @@ -262,7 +262,7 @@ static void nextkbd_event(DeviceState *dev, QemuConsole= *src, } } =20 - if (qcode =3D=3D Q_KEY_CODE_SHIFT_R) { + if (evt->key.key =3D=3D KEY_RIGHTSHIFT) { if (evt->key.down) { s->shift |=3D KD_RSHIFT; } else { @@ -270,7 +270,7 @@ static void nextkbd_event(DeviceState *dev, QemuConsole= *src, } } =20 - keycode =3D qcode_to_nextkbd_keycode[qcode]; + keycode =3D linux_to_nextkbd_keycode[evt->key.key]; if (!keycode) { return; } --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1778323746088815.2697272960144; Sat, 9 May 2026 03:49:06 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1304599.1577509 (Exim 4.92) (envelope-from ) id 1wLfEQ-0001cK-5H; Sat, 09 May 2026 10:48:26 +0000 Received: by outflank-mailman (output) from mailman id 1304599.1577509; Sat, 09 May 2026 10:48:26 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfEQ-0001bU-0D; Sat, 09 May 2026 10:48:26 +0000 Received: by outflank-mailman (input) for mailman id 1304599; Sat, 09 May 2026 10:48:24 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfEN-0001aR-8o for xen-devel@lists.xenproject.org; Sat, 09 May 2026 10:48:24 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1wLfEM-007lJU-M4 for xen-devel@lists.xenproject.org; Sat, 09 May 2026 12:48:22 +0200 Received: from [10.42.69.7] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 69ff10e2-5cb7-0a2a0a5109dd-0a2a45079184-8 for ; Sat, 09 May 2026 12:48:22 +0200 Received: from [49.212.243.89] (helo=www3579.sakura.ne.jp) by tlsNG-ef75cf.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1) (envelope-from ) id 69ff10f3-229c-0a2a45070019-31d4f359d5ec-3 for ; Sat, 09 May 2026 12:48:21 +0200 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2G090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:00 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=temperror header.s=rs20250326 header.d=rsg.ci.i.u-tokyo.ac.jp header.i="@rsg.ci.i.u-tokyo.ac.jp" DKIM-Signature: a=rsa-sha256; bh=uJTvyFxVV0KiKR88wATfRrbdCU5rpbZH8pTJ+9EpZgo=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323680; v=1; b=ck991oxPhvCSI7vlQnQmqDhO8qPNpIzbu7vQgVPPFIogHVvJJp6FOUtEbLRQs7Wq rJybWJpAWrQKHDhTosWtzhajw2VXe/kw3fqKqiG2UhS9trsPHRXw5t29i1L3Pa2s +j0bnxv4lZ7iKLJ+RSnx/Fk6fV06j1QEd0f2DZaYOkH+hIvabREPjGBGXAfix4UT u5sxCXEef9jdvlJ4+vb2i2Iaa1BR1/88G7zSBM9FftH39xA9FNW9i9w0sJwKTfQE R8iErBOQm5A6UBQcyPdBjMiMgsjAiy42tAkuW960cpjVozRZs7xwxt+nafvBV0Ls pc6J3r84Hg0rUW0OzLGetw== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:27 +0900 Subject: [PATCH RFC 15/28] replay: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-15-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=2453; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=VN8yQ5lgMxcp3qE4EJjzPaXZLmpoeQItNok0BraEMYc=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gautArYL7NVW29YU/82Suvbv1+mU9UyamRs3sy+8c O1P+/W5HaUsDGJcDLJiiiwpRbu5NaJrPxUmxLfAzGFlAhnCwMUpABOZZM3wz26v8oI5qjXvGxZy vDj3JaP5tf5XTkkXuTjpzYxcrldXaTIyXGPb6Kos+3ROQNmxc851LwXPL1cJKFylWjyxeb+YNMN ETgA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C X-purgate-ID: tlsNG-ef75cf/1778323702-0B374C48-FF672CCC/0/0 X-purgate-type: clean X-purgate-size: 2455 X-ZM-MESSAGEID: 1778323749234154100 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 --- replay/replay-input.c | 20 +++----------------- replay/replay.c | 2 +- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/replay/replay-input.c b/replay/replay-input.c index acf0993c7285..c86e00af0efd 100644 --- a/replay/replay-input.c +++ b/replay/replay-input.c @@ -23,8 +23,7 @@ void replay_save_input_event(QemuInputEvent *evt) =20 switch (evt->type) { case INPUT_EVENT_KIND_KEY: - replay_put_dword(KEY_VALUE_KIND_QCODE); - replay_put_dword(qemu_input_linux_to_qcode(evt->key.key)); + replay_put_dword(evt->key.key); replay_put_byte(evt->key.down); break; case INPUT_EVENT_KIND_BTN: @@ -55,25 +54,12 @@ void replay_save_input_event(QemuInputEvent *evt) QemuInputEvent *replay_read_input_event(void) { QemuInputEvent *evt =3D g_new(QemuInputEvent, 1); - int qcode; =20 evt->type =3D replay_get_dword(); switch (evt->type) { case INPUT_EVENT_KIND_KEY: - switch (replay_get_dword()) { - case KEY_VALUE_KIND_NUMBER: - qcode =3D qemu_input_key_number_to_qcode(replay_get_qword()); - evt->key.down =3D replay_get_byte(); - break; - case KEY_VALUE_KIND_QCODE: - qcode =3D (QKeyCode)replay_get_dword(); - evt->key.down =3D replay_get_byte(); - break; - default: - g_assert_not_reached(); - } - evt->key.key =3D qcode < qemu_input_map_qcode_to_linux_len ? - qemu_input_map_qcode_to_linux[qcode] : 0; + evt->key.key =3D replay_get_dword(); + evt->key.down =3D replay_get_byte(); break; case INPUT_EVENT_KIND_BTN: evt->btn.button =3D (InputButton)replay_get_dword(); diff --git a/replay/replay.c b/replay/replay.c index 2e5c6fa82eaa..14437b32566b 100644 --- a/replay/replay.c +++ b/replay/replay.c @@ -22,7 +22,7 @@ =20 /* Current version of the replay mechanism. Increase it when file format changes. */ -#define REPLAY_VERSION 0xe0200d +#define REPLAY_VERSION 0xe0200e /* Size of replay log header */ #define HEADER_SIZE (sizeof(uint32_t) + sizeof(uint64_t)) =20 --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778324103310637.6071579280001; Sat, 9 May 2026 03:55:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFc-0000O9-BR; Sat, 09 May 2026 06:49:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF5-0008Op-ST; Sat, 09 May 2026 06:49:09 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEz-0001f1-Kc; Sat, 09 May 2026 06:49:07 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2H090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:00 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=gkxRfmhwkMY4g+S+WEuTzEvmi4wzQaAGYuAfCMapg0A=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323680; v=1; b=NJrJoRiGLLxqMa0lMY6Rh19isgTMkU+oPrkMUSWr0drsIU+2Gy7kodTh04H4QJWe p2hG3XWP7pYslJI2NrxCybg9res96sdo72slm/dwpdrLNSBliD8NhWZ7Otq0rH/h K1ZUcSyPEHlko5K/hZOpi+F8l5pFphZRl7/V56Z0BAoTXzx6cVEsxgXIvEIuyO6/ xgvr/3dHZrYYQmYMu2mmcsu7qU0QNoHsLhuAUQPs7IiO5p5ZGDGae68kTOb/WBRR D7rTBfccnutVqfX2cgc94Ul3sixV6ZYEOMPaW2we0biY5ZtMMVtUQ9fWrTL/ChWN /qKe62k84rENPbEF1cZN7A== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:28 +0900 Subject: [PATCH RFC 16/28] ui/cocoa: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-16-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=18862; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=tV1ogjuk1q8Bmv1QndVZt/tE+dOaJaxGwVIX/iF1iAs=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gasMTjsYbN0X3nR/emW33qJQ/R3/BGe4ls2YNXNv6 JfT1iGdHaUsDGJcDLJiiiwpRbu5NaJrPxUmxLfAzGFlAhvCxSkAE7nPyvDPSlZdb3niis68vT0P 9i+aPWnrqTClY92rp07ysvXd37A7k5HhqEW4hegMvV8W9+3/Ol+4Nym9opRXPPS896ksp3+aszm YAQ== X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778324105147158500 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 --- ui/cocoa.m | 326 ++++++++++++++++++++++++++++-----------------------------= ---- 1 file changed, 147 insertions(+), 179 deletions(-) diff --git a/ui/cocoa.m b/ui/cocoa.m index 2322c590cbc0..e82815483c4e 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -30,6 +30,7 @@ =20 #include "qemu/help-texts.h" #include "qemu-main.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/clipboard.h" #include "ui/console.h" #include "ui/input.h" @@ -142,124 +143,124 @@ static bool bool_with_bql(BoolCodeBlock block) return val; } =20 -// Mac to QKeyCode conversion -static const int mac_to_qkeycode_map[] =3D { - [kVK_ANSI_A] =3D Q_KEY_CODE_A, - [kVK_ANSI_B] =3D Q_KEY_CODE_B, - [kVK_ANSI_C] =3D Q_KEY_CODE_C, - [kVK_ANSI_D] =3D Q_KEY_CODE_D, - [kVK_ANSI_E] =3D Q_KEY_CODE_E, - [kVK_ANSI_F] =3D Q_KEY_CODE_F, - [kVK_ANSI_G] =3D Q_KEY_CODE_G, - [kVK_ANSI_H] =3D Q_KEY_CODE_H, - [kVK_ANSI_I] =3D Q_KEY_CODE_I, - [kVK_ANSI_J] =3D Q_KEY_CODE_J, - [kVK_ANSI_K] =3D Q_KEY_CODE_K, - [kVK_ANSI_L] =3D Q_KEY_CODE_L, - [kVK_ANSI_M] =3D Q_KEY_CODE_M, - [kVK_ANSI_N] =3D Q_KEY_CODE_N, - [kVK_ANSI_O] =3D Q_KEY_CODE_O, - [kVK_ANSI_P] =3D Q_KEY_CODE_P, - [kVK_ANSI_Q] =3D Q_KEY_CODE_Q, - [kVK_ANSI_R] =3D Q_KEY_CODE_R, - [kVK_ANSI_S] =3D Q_KEY_CODE_S, - [kVK_ANSI_T] =3D Q_KEY_CODE_T, - [kVK_ANSI_U] =3D Q_KEY_CODE_U, - [kVK_ANSI_V] =3D Q_KEY_CODE_V, - [kVK_ANSI_W] =3D Q_KEY_CODE_W, - [kVK_ANSI_X] =3D Q_KEY_CODE_X, - [kVK_ANSI_Y] =3D Q_KEY_CODE_Y, - [kVK_ANSI_Z] =3D Q_KEY_CODE_Z, - - [kVK_ANSI_0] =3D Q_KEY_CODE_0, - [kVK_ANSI_1] =3D Q_KEY_CODE_1, - [kVK_ANSI_2] =3D Q_KEY_CODE_2, - [kVK_ANSI_3] =3D Q_KEY_CODE_3, - [kVK_ANSI_4] =3D Q_KEY_CODE_4, - [kVK_ANSI_5] =3D Q_KEY_CODE_5, - [kVK_ANSI_6] =3D Q_KEY_CODE_6, - [kVK_ANSI_7] =3D Q_KEY_CODE_7, - [kVK_ANSI_8] =3D Q_KEY_CODE_8, - [kVK_ANSI_9] =3D Q_KEY_CODE_9, - - [kVK_ANSI_Grave] =3D Q_KEY_CODE_GRAVE_ACCENT, - [kVK_ANSI_Minus] =3D Q_KEY_CODE_MINUS, - [kVK_ANSI_Equal] =3D Q_KEY_CODE_EQUAL, - [kVK_Delete] =3D Q_KEY_CODE_BACKSPACE, - [kVK_CapsLock] =3D Q_KEY_CODE_CAPS_LOCK, - [kVK_Tab] =3D Q_KEY_CODE_TAB, - [kVK_Return] =3D Q_KEY_CODE_RET, - [kVK_ANSI_LeftBracket] =3D Q_KEY_CODE_BRACKET_LEFT, - [kVK_ANSI_RightBracket] =3D Q_KEY_CODE_BRACKET_RIGHT, - [kVK_ANSI_Backslash] =3D Q_KEY_CODE_BACKSLASH, - [kVK_ANSI_Semicolon] =3D Q_KEY_CODE_SEMICOLON, - [kVK_ANSI_Quote] =3D Q_KEY_CODE_APOSTROPHE, - [kVK_ANSI_Comma] =3D Q_KEY_CODE_COMMA, - [kVK_ANSI_Period] =3D Q_KEY_CODE_DOT, - [kVK_ANSI_Slash] =3D Q_KEY_CODE_SLASH, - [kVK_Space] =3D Q_KEY_CODE_SPC, - - [kVK_ANSI_Keypad0] =3D Q_KEY_CODE_KP_0, - [kVK_ANSI_Keypad1] =3D Q_KEY_CODE_KP_1, - [kVK_ANSI_Keypad2] =3D Q_KEY_CODE_KP_2, - [kVK_ANSI_Keypad3] =3D Q_KEY_CODE_KP_3, - [kVK_ANSI_Keypad4] =3D Q_KEY_CODE_KP_4, - [kVK_ANSI_Keypad5] =3D Q_KEY_CODE_KP_5, - [kVK_ANSI_Keypad6] =3D Q_KEY_CODE_KP_6, - [kVK_ANSI_Keypad7] =3D Q_KEY_CODE_KP_7, - [kVK_ANSI_Keypad8] =3D Q_KEY_CODE_KP_8, - [kVK_ANSI_Keypad9] =3D Q_KEY_CODE_KP_9, - [kVK_ANSI_KeypadDecimal] =3D Q_KEY_CODE_KP_DECIMAL, - [kVK_ANSI_KeypadEnter] =3D Q_KEY_CODE_KP_ENTER, - [kVK_ANSI_KeypadPlus] =3D Q_KEY_CODE_KP_ADD, - [kVK_ANSI_KeypadMinus] =3D Q_KEY_CODE_KP_SUBTRACT, - [kVK_ANSI_KeypadMultiply] =3D Q_KEY_CODE_KP_MULTIPLY, - [kVK_ANSI_KeypadDivide] =3D Q_KEY_CODE_KP_DIVIDE, - [kVK_ANSI_KeypadEquals] =3D Q_KEY_CODE_KP_EQUALS, - [kVK_ANSI_KeypadClear] =3D Q_KEY_CODE_NUM_LOCK, - - [kVK_UpArrow] =3D Q_KEY_CODE_UP, - [kVK_DownArrow] =3D Q_KEY_CODE_DOWN, - [kVK_LeftArrow] =3D Q_KEY_CODE_LEFT, - [kVK_RightArrow] =3D Q_KEY_CODE_RIGHT, - - [kVK_Help] =3D Q_KEY_CODE_INSERT, - [kVK_Home] =3D Q_KEY_CODE_HOME, - [kVK_PageUp] =3D Q_KEY_CODE_PGUP, - [kVK_PageDown] =3D Q_KEY_CODE_PGDN, - [kVK_End] =3D Q_KEY_CODE_END, - [kVK_ForwardDelete] =3D Q_KEY_CODE_DELETE, - - [kVK_Escape] =3D Q_KEY_CODE_ESC, +// Mac to Linux conversion +static const unsigned int mac_to_linux_map[] =3D { + [kVK_ANSI_A] =3D KEY_A, + [kVK_ANSI_B] =3D KEY_B, + [kVK_ANSI_C] =3D KEY_C, + [kVK_ANSI_D] =3D KEY_D, + [kVK_ANSI_E] =3D KEY_E, + [kVK_ANSI_F] =3D KEY_F, + [kVK_ANSI_G] =3D KEY_G, + [kVK_ANSI_H] =3D KEY_H, + [kVK_ANSI_I] =3D KEY_I, + [kVK_ANSI_J] =3D KEY_J, + [kVK_ANSI_K] =3D KEY_K, + [kVK_ANSI_L] =3D KEY_L, + [kVK_ANSI_M] =3D KEY_M, + [kVK_ANSI_N] =3D KEY_N, + [kVK_ANSI_O] =3D KEY_O, + [kVK_ANSI_P] =3D KEY_P, + [kVK_ANSI_Q] =3D KEY_Q, + [kVK_ANSI_R] =3D KEY_R, + [kVK_ANSI_S] =3D KEY_S, + [kVK_ANSI_T] =3D KEY_T, + [kVK_ANSI_U] =3D KEY_U, + [kVK_ANSI_V] =3D KEY_V, + [kVK_ANSI_W] =3D KEY_W, + [kVK_ANSI_X] =3D KEY_X, + [kVK_ANSI_Y] =3D KEY_Y, + [kVK_ANSI_Z] =3D KEY_Z, + + [kVK_ANSI_0] =3D KEY_0, + [kVK_ANSI_1] =3D KEY_1, + [kVK_ANSI_2] =3D KEY_2, + [kVK_ANSI_3] =3D KEY_3, + [kVK_ANSI_4] =3D KEY_4, + [kVK_ANSI_5] =3D KEY_5, + [kVK_ANSI_6] =3D KEY_6, + [kVK_ANSI_7] =3D KEY_7, + [kVK_ANSI_8] =3D KEY_8, + [kVK_ANSI_9] =3D KEY_9, + + [kVK_ANSI_Grave] =3D KEY_GRAVE, + [kVK_ANSI_Minus] =3D KEY_MINUS, + [kVK_ANSI_Equal] =3D KEY_EQUAL, + [kVK_Delete] =3D KEY_BACKSPACE, + [kVK_CapsLock] =3D KEY_CAPSLOCK, + [kVK_Tab] =3D KEY_TAB, + [kVK_Return] =3D KEY_ENTER, + [kVK_ANSI_LeftBracket] =3D KEY_LEFTBRACE, + [kVK_ANSI_RightBracket] =3D KEY_RIGHTBRACE, + [kVK_ANSI_Backslash] =3D KEY_BACKSLASH, + [kVK_ANSI_Semicolon] =3D KEY_SEMICOLON, + [kVK_ANSI_Quote] =3D KEY_APOSTROPHE, + [kVK_ANSI_Comma] =3D KEY_COMMA, + [kVK_ANSI_Period] =3D KEY_DOT, + [kVK_ANSI_Slash] =3D KEY_SLASH, + [kVK_Space] =3D KEY_SPACE, + + [kVK_ANSI_Keypad0] =3D KEY_KP0, + [kVK_ANSI_Keypad1] =3D KEY_KP1, + [kVK_ANSI_Keypad2] =3D KEY_KP2, + [kVK_ANSI_Keypad3] =3D KEY_KP3, + [kVK_ANSI_Keypad4] =3D KEY_KP4, + [kVK_ANSI_Keypad5] =3D KEY_KP5, + [kVK_ANSI_Keypad6] =3D KEY_KP6, + [kVK_ANSI_Keypad7] =3D KEY_KP7, + [kVK_ANSI_Keypad8] =3D KEY_KP8, + [kVK_ANSI_Keypad9] =3D KEY_KP9, + [kVK_ANSI_KeypadDecimal] =3D KEY_KPDOT, + [kVK_ANSI_KeypadEnter] =3D KEY_KPENTER, + [kVK_ANSI_KeypadPlus] =3D KEY_KPPLUS, + [kVK_ANSI_KeypadMinus] =3D KEY_KPMINUS, + [kVK_ANSI_KeypadMultiply] =3D KEY_KPASTERISK, + [kVK_ANSI_KeypadDivide] =3D KEY_KPSLASH, + [kVK_ANSI_KeypadEquals] =3D KEY_KPEQUAL, + [kVK_ANSI_KeypadClear] =3D KEY_NUMLOCK, + + [kVK_UpArrow] =3D KEY_UP, + [kVK_DownArrow] =3D KEY_DOWN, + [kVK_LeftArrow] =3D KEY_LEFT, + [kVK_RightArrow] =3D KEY_RIGHT, + + [kVK_Help] =3D KEY_INSERT, + [kVK_Home] =3D KEY_HOME, + [kVK_PageUp] =3D KEY_PAGEUP, + [kVK_PageDown] =3D KEY_PAGEDOWN, + [kVK_End] =3D KEY_END, + [kVK_ForwardDelete] =3D KEY_DELETE, + + [kVK_Escape] =3D KEY_ESC, =20 /* The Power key can't be used directly because the operating system u= ses * it. This key can be emulated by using it in place of another key su= ch as * F1. Don't forget to disable the real key binding. */ - /* [kVK_F1] =3D Q_KEY_CODE_POWER, */ - - [kVK_F1] =3D Q_KEY_CODE_F1, - [kVK_F2] =3D Q_KEY_CODE_F2, - [kVK_F3] =3D Q_KEY_CODE_F3, - [kVK_F4] =3D Q_KEY_CODE_F4, - [kVK_F5] =3D Q_KEY_CODE_F5, - [kVK_F6] =3D Q_KEY_CODE_F6, - [kVK_F7] =3D Q_KEY_CODE_F7, - [kVK_F8] =3D Q_KEY_CODE_F8, - [kVK_F9] =3D Q_KEY_CODE_F9, - [kVK_F10] =3D Q_KEY_CODE_F10, - [kVK_F11] =3D Q_KEY_CODE_F11, - [kVK_F12] =3D Q_KEY_CODE_F12, - [kVK_F13] =3D Q_KEY_CODE_PRINT, - [kVK_F14] =3D Q_KEY_CODE_SCROLL_LOCK, - [kVK_F15] =3D Q_KEY_CODE_PAUSE, + /* [kVK_F1] =3D KEY_POWER, */ + + [kVK_F1] =3D KEY_F1, + [kVK_F2] =3D KEY_F2, + [kVK_F3] =3D KEY_F3, + [kVK_F4] =3D KEY_F4, + [kVK_F5] =3D KEY_F5, + [kVK_F6] =3D KEY_F6, + [kVK_F7] =3D KEY_F7, + [kVK_F8] =3D KEY_F8, + [kVK_F9] =3D KEY_F9, + [kVK_F10] =3D KEY_F10, + [kVK_F11] =3D KEY_F11, + [kVK_F12] =3D KEY_F12, + [kVK_F13] =3D KEY_SYSRQ, + [kVK_F14] =3D KEY_SCROLLLOCK, + [kVK_F15] =3D KEY_PAUSE, =20 // JIS keyboards only - [kVK_JIS_Yen] =3D Q_KEY_CODE_YEN, - [kVK_JIS_Underscore] =3D Q_KEY_CODE_RO, - [kVK_JIS_KeypadComma] =3D Q_KEY_CODE_KP_COMMA, - [kVK_JIS_Eisu] =3D Q_KEY_CODE_MUHENKAN, - [kVK_JIS_Kana] =3D Q_KEY_CODE_HENKAN, + [kVK_JIS_Yen] =3D KEY_YEN, + [kVK_JIS_Underscore] =3D KEY_RO, + [kVK_JIS_KeypadComma] =3D KEY_KPCOMMA, + [kVK_JIS_Eisu] =3D KEY_MUHENKAN, + [kVK_JIS_Kana] =3D KEY_HENKAN, =20 /* * The eject and volume keys can't be used here because they are handl= ed at @@ -267,13 +268,13 @@ static bool bool_with_bql(BoolCodeBlock block) */ }; =20 -static int cocoa_keycode_to_qemu(int keycode) +static unsigned int cocoa_keycode_to_linux(int keycode) { - if (ARRAY_SIZE(mac_to_qkeycode_map) <=3D keycode) { + if (ARRAY_SIZE(mac_to_linux_map) <=3D keycode) { error_report("(cocoa) warning unknown keycode 0x%x", keycode); return 0; } - return mac_to_qkeycode_map[keycode]; + return mac_to_linux_map[keycode]; } =20 /* Displays an alert dialog box with the specified message */ @@ -770,8 +771,7 @@ - (void) setFullGrab:(id)sender } =20 - (void) toggleKey: (int)keycode { - unsigned int lnx =3D qemu_input_map_qcode_to_linux[keycode]; - qkbd_state_key_event(kbd, lnx, !qkbd_state_key_get(kbd, lnx)); + qkbd_state_key_event(kbd, keycode, !qkbd_state_key_get(kbd, keycode)); } =20 // Does the work of sending input to the monitor @@ -851,7 +851,7 @@ - (bool) handleEventLocked:(NSEvent *)event /* Return true if we handled the event, false if it should be given to= OSX */ COCOA_DEBUG("QemuCocoaView: handleEvent\n"); InputButton button; - int keycode =3D 0; + unsigned int keycode; NSUInteger modifiers =3D [event modifierFlags]; =20 /* @@ -893,62 +893,34 @@ - (bool) handleEventLocked:(NSEvent *)event */ if (!!(modifiers & NSEventModifierFlagCapsLock) !=3D qkbd_state_modifier_get(kbd, QKBD_MOD_CAPSLOCK)) { - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_CAPS= _LOCK], - true); - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_CAPS= _LOCK], - false); + qkbd_state_key_event(kbd, KEY_CAPSLOCK, true); + qkbd_state_key_event(kbd, KEY_CAPSLOCK, false); } =20 if (!(modifiers & NSEventModifierFlagShift)) { - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_SHIF= T], - false); - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_SHIF= T_R], - false); + qkbd_state_key_event(kbd, KEY_LEFTSHIFT, false); + qkbd_state_key_event(kbd, KEY_RIGHTSHIFT, false); } if (!(modifiers & NSEventModifierFlagControl)) { - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_CTRL= ], - false); - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_CTRL= _R], - false); + qkbd_state_key_event(kbd, KEY_LEFTCTRL, false); + qkbd_state_key_event(kbd, KEY_RIGHTCTRL, false); } if (!(modifiers & NSEventModifierFlagOption)) { if (swap_opt_cmd) { - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_= META_L], - false); - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_= META_R], - false); + qkbd_state_key_event(kbd, KEY_LEFTMETA, false); + qkbd_state_key_event(kbd, KEY_RIGHTMETA, false); } else { - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_= ALT], - false); - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_= ALT_R], - false); + qkbd_state_key_event(kbd, KEY_LEFTALT, false); + qkbd_state_key_event(kbd, KEY_RIGHTALT, false); } } if (!(modifiers & NSEventModifierFlagCommand)) { if (swap_opt_cmd) { - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_= ALT], - false); - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_= ALT_R], - false); + qkbd_state_key_event(kbd, KEY_LEFTALT, false); + qkbd_state_key_event(kbd, KEY_RIGHTALT, false); } else { - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_= META_L], - false); - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_= META_R], - false); + qkbd_state_key_event(kbd, KEY_LEFTMETA, false); + qkbd_state_key_event(kbd, KEY_RIGHTMETA, false); } } =20 @@ -957,34 +929,34 @@ - (bool) handleEventLocked:(NSEvent *)event switch ([event keyCode]) { case kVK_Shift: if (!!(modifiers & NSEventModifierFlagShift)) { - [self toggleKey:Q_KEY_CODE_SHIFT]; + [self toggleKey:KEY_LEFTSHIFT]; } break; =20 case kVK_RightShift: if (!!(modifiers & NSEventModifierFlagShift)) { - [self toggleKey:Q_KEY_CODE_SHIFT_R]; + [self toggleKey:KEY_RIGHTSHIFT]; } break; =20 case kVK_Control: if (!!(modifiers & NSEventModifierFlagControl)) { - [self toggleKey:Q_KEY_CODE_CTRL]; + [self toggleKey:KEY_LEFTCTRL]; } break; =20 case kVK_RightControl: if (!!(modifiers & NSEventModifierFlagControl)) { - [self toggleKey:Q_KEY_CODE_CTRL_R]; + [self toggleKey:KEY_RIGHTCTRL]; } break; =20 case kVK_Option: if (!!(modifiers & NSEventModifierFlagOption)) { if (swap_opt_cmd) { - [self toggleKey:Q_KEY_CODE_META_L]; + [self toggleKey:KEY_LEFTMETA]; } else { - [self toggleKey:Q_KEY_CODE_ALT]; + [self toggleKey:KEY_LEFTALT]; } } break; @@ -992,9 +964,9 @@ - (bool) handleEventLocked:(NSEvent *)event case kVK_RightOption: if (!!(modifiers & NSEventModifierFlagOption)) { if (swap_opt_cmd) { - [self toggleKey:Q_KEY_CODE_META_R]; + [self toggleKey:KEY_RIGHTMETA]; } else { - [self toggleKey:Q_KEY_CODE_ALT_R]; + [self toggleKey:KEY_RIGHTALT]; } } break; @@ -1005,9 +977,9 @@ - (bool) handleEventLocked:(NSEvent *)event !!(modifiers & NSEventModifierFlagCommand) && left_command_key_enabled) { if (swap_opt_cmd) { - [self toggleKey:Q_KEY_CODE_ALT]; + [self toggleKey:KEY_LEFTALT]; } else { - [self toggleKey:Q_KEY_CODE_META_L]; + [self toggleKey:KEY_LEFTMETA]; } } break; @@ -1016,16 +988,16 @@ - (bool) handleEventLocked:(NSEvent *)event if (isMouseGrabbed && !!(modifiers & NSEventModifierFlagCommand)) { if (swap_opt_cmd) { - [self toggleKey:Q_KEY_CODE_ALT_R]; + [self toggleKey:KEY_RIGHTALT]; } else { - [self toggleKey:Q_KEY_CODE_META_R]; + [self toggleKey:KEY_RIGHTMETA]; } } break; } return true; case NSEventTypeKeyDown: - keycode =3D cocoa_keycode_to_qemu([event keyCode]); + keycode =3D cocoa_keycode_to_linux([event keyCode]); =20 // forward command key combos to the host UI unless the mouse = is grabbed if (!isMouseGrabbed && ([event modifierFlags] & NSEventModifie= rFlagCommand)) { @@ -1055,15 +1027,13 @@ - (bool) handleEventLocked:(NSEvent *)event } =20 if (qemu_console_is_graphic(dcl.con)) { - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[keycode= ], - true); + qkbd_state_key_event(kbd, keycode, true); } else { [self handleMonitorInput: event]; } return true; case NSEventTypeKeyUp: - keycode =3D cocoa_keycode_to_qemu([event keyCode]); + keycode =3D cocoa_keycode_to_linux([event keyCode]); =20 // don't pass the guest a spurious key-up if we treated this // command-key combo as a host UI action @@ -1072,9 +1042,7 @@ - (bool) handleEventLocked:(NSEvent *)event } =20 if (qemu_console_is_graphic(dcl.con)) { - qkbd_state_key_event(kbd, - qemu_input_map_qcode_to_linux[keycode= ], - false); + qkbd_state_key_event(kbd, keycode, false); } return true; case NSEventTypeScrollWheel: --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778323850821885.8381528051303; Sat, 9 May 2026 03:50:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFW-0000CJ-JY; Sat, 09 May 2026 06:49:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF2-0008Ke-82; Sat, 09 May 2026 06:49:05 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEx-0001eB-Ir; Sat, 09 May 2026 06:49:02 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2I090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:00 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=kULJOiJnDDjssqVDbI5iwGpZTZrb3TnrgM+JgQAbtfc=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323681; v=1; b=U7FvxOZYb64dASiStS8BYG0QX9xqQOpZaG2vOiD81Rlf2Cp8TbwcgU5rr752oPph 9MGipn7EliRW4uuk9qMoi9pOu95ZPjeniOhz7o+qts5lTr5BaGNHBGOhuxXY5vVr hdfTZqLO62gPqN/b10sJL7P9R0XtbF+hoMxRObdmwSC9LvEKTuiDkpM+pZauJPHK TUxbnx752HSlz6cyXbpPStsJAOOHc4TepjfXIhwFjRL7yS87EfDq8G8TG1oB0c6e WqtmQvkEmaINu/vsAx+5j0/zPSJeY4Oqw7GymMFtgb65PEQY4Nzhn3HpBA0Jsnmb m3wWx9gqG3w91Klt33dj3g== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:29 +0900 Subject: [PATCH RFC 17/28] ui/dbus: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-17-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=1585; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=xAuXkeg2eNkRQq4YBbr0QEEzWGOMz8DYnOVntd0qrj0=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gWuXo1R/6JfWaxc65h9V3zL3t7zKKqktF+eICFUXP P+2uHl3RykLgxgXg6yYIktK0W5ujejaT4UJ8S0wc1iZQIYwcHEKwETaYhkZjq0zP3c28VffKpVZ LtePbl/FyTF3+Tfb598vfFcvPqG1tobhf27D4/K9lk/2Gy7cnbYhUTByyZqIlb8/G5s7J1sHdQa fYAAA X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778323852194158500 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 --- ui/dbus-console.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/dbus-console.c b/ui/dbus-console.c index a46c2531c6f8..c7f2c69baf2c 100644 --- a/ui/dbus-console.c +++ b/ui/dbus-console.c @@ -340,11 +340,11 @@ dbus_kbd_press(DBusDisplayConsole *ddc, GDBusMethodInvocation *invocation, guint arg_keycode) { - QKeyCode qcode =3D qemu_input_key_number_to_qcode(arg_keycode); + unsigned int lnx =3D qemu_input_key_number_to_linux(arg_keycode); =20 trace_dbus_kbd_press(arg_keycode); =20 - qkbd_state_key_event(ddc->kbd, qemu_input_map_qcode_to_linux[qcode], t= rue); + qkbd_state_key_event(ddc->kbd, lnx, true); =20 qemu_dbus_display1_keyboard_complete_press(ddc->iface_kbd, invocation); =20 @@ -356,11 +356,11 @@ dbus_kbd_release(DBusDisplayConsole *ddc, GDBusMethodInvocation *invocation, guint arg_keycode) { - QKeyCode qcode =3D qemu_input_key_number_to_qcode(arg_keycode); + unsigned int lnx =3D qemu_input_key_number_to_linux(arg_keycode); =20 trace_dbus_kbd_release(arg_keycode); =20 - qkbd_state_key_event(ddc->kbd, qemu_input_map_qcode_to_linux[qcode], f= alse); + qkbd_state_key_event(ddc->kbd, lnx, false); =20 qemu_dbus_display1_keyboard_complete_release(ddc->iface_kbd, invocatio= n); =20 --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778323837249447.9114040601978; Sat, 9 May 2026 03:50:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFe-0000WO-3I; Sat, 09 May 2026 06:49:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF5-0008Oq-Ti; Sat, 09 May 2026 06:49:09 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF0-0001fK-3a; Sat, 09 May 2026 06:49:06 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2J090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:01 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=6y1UpLEqR3haXQERpXObg2630L3bGSBDTthm07GFH88=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323681; v=1; b=oo8n2a1wTQQJPo/gvrS1HfAbImRsSH9a5lFzKb69VlhP4gz+oIz3AcuAFlmHt/12 gEns38pv8qNqj4tUe1H7ZZQznDBIculY+eBtczepY6wtUGEMSCzU5tj6mbUdhjpu l0CKdTutEIPL8dti20Xu3X4+2OOkzD4DHl8HEpjB03tGrQV6g1GBHWFWEA6x+zmA EPAT/g8418uDROdDc9j6rYujVx018/Fa9yNQYule1H+7T5EjiXyU//y4rRzG87Xs zS8nlVsrE94TZSYP0INBM+7LfEuDCbYRDrb2obLHyQbSjRZ00EjJr++KJyfT1n0a C1erddqFG/uWNYOM7lU7iQ== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:30 +0900 Subject: [PATCH RFC 18/28] ui/gtk: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-18-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=8756; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=1hU4vdVyspHc02WHXuzADNhy5i+hIxN7RJnRwkPpUIs=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gWtz5ptZ6p0uChOLqM/y3bxF8oyHmczOUoeAA1d/3 gwNbAvuKGVhEONikBVTZEkp2s2tEV37qTAhvgVmDisTyBAGLk4BmEgCD8N/b4bmT++vTP2TXnNy ilvXWz5X+e1dUSn2DoktKbEpE+8bMjJsem3RNnNOiUS1VKfKPJl2n+zUl7Mv553ObBLbsjgsfBk TAA== X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778323838218158500 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 --- ui/x_keymap.h | 3 ++- ui/gtk.c | 50 ++++++++++++++++++++++++++++---------------------- ui/x_keymap.c | 24 +++++++++++++----------- 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/ui/x_keymap.h b/ui/x_keymap.h index 0395e335fffd..0d58459dd210 100644 --- a/ui/x_keymap.h +++ b/ui/x_keymap.h @@ -27,6 +27,7 @@ =20 #include =20 -const guint16 *qemu_xkeymap_mapping_table(Display *dpy, size_t *maplen); +const guint16 *qemu_xkeymap_mapping_table(Display *dpy, size_t *maplen, + bool *evdev); =20 #endif diff --git a/ui/gtk.c b/ui/gtk.c index 3e3fd57c7638..a276aab95d82 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -55,6 +55,7 @@ #include =20 #include "trace.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/input.h" #include "system/runstate.h" #include "system/system.h" @@ -120,6 +121,7 @@ =20 static const guint16 *keycode_map; static size_t keycode_maplen; +static bool keycode_xorgevdev; =20 struct VCChardev { Chardev parent; @@ -1211,39 +1213,42 @@ static gboolean gd_touch_event(GtkWidget *widget, G= dkEventTouch *touch, return TRUE; } =20 -static const guint16 *gd_get_keymap(size_t *maplen) +static const guint16 *gd_get_keymap(size_t *maplen, bool *xorgevdev) { GdkDisplay *dpy =3D gdk_display_get_default(); =20 + *maplen =3D 0; + *xorgevdev =3D false; + #ifdef GDK_WINDOWING_X11 if (GDK_IS_X11_DISPLAY(dpy)) { trace_gd_keymap_windowing("x11"); return qemu_xkeymap_mapping_table( - gdk_x11_display_get_xdisplay(dpy), maplen); + gdk_x11_display_get_xdisplay(dpy), maplen, xorgevdev); } #endif =20 #ifdef GDK_WINDOWING_WAYLAND if (GDK_IS_WAYLAND_DISPLAY(dpy)) { trace_gd_keymap_windowing("wayland"); - *maplen =3D qemu_input_map_xorgevdev_to_qcode_len; - return qemu_input_map_xorgevdev_to_qcode; + *xorgevdev =3D true; + return NULL; } #endif =20 #ifdef GDK_WINDOWING_WIN32 if (GDK_IS_WIN32_DISPLAY(dpy)) { trace_gd_keymap_windowing("win32"); - *maplen =3D qemu_input_map_atset1_to_qcode_len; - return qemu_input_map_atset1_to_qcode; + *maplen =3D qemu_input_map_atset1_to_linux_len; + return qemu_input_map_atset1_to_linux; } #endif =20 #ifdef GDK_WINDOWING_QUARTZ if (GDK_IS_QUARTZ_DISPLAY(dpy)) { trace_gd_keymap_windowing("quartz"); - *maplen =3D qemu_input_map_osx_to_qcode_len; - return qemu_input_map_osx_to_qcode; + *maplen =3D qemu_input_map_osx_to_linux_len; + return qemu_input_map_osx_to_linux; } #endif =20 @@ -1253,8 +1258,8 @@ static const guint16 *gd_get_keymap(size_t *maplen) g_warning("experimental: using broadway, x11 virtual keysym\n" "mapping - with very limited support. See also\n" "https://bugzilla.gnome.org/show_bug.cgi?id=3D700105"); - *maplen =3D qemu_input_map_x11_to_qcode_len; - return qemu_input_map_x11_to_qcode; + *maplen =3D qemu_input_map_x11_to_linux_len; + return qemu_input_map_x11_to_linux; } #endif =20 @@ -1269,8 +1274,11 @@ static const guint16 *gd_get_keymap(size_t *maplen) } =20 =20 -static int gd_map_keycode(int scancode) +static unsigned int gd_map_keycode(int scancode) { + if (keycode_xorgevdev) { + return scancode < 8 ? KEY_RESERVED : scancode - 8; + } if (!keycode_map) { return 0; } @@ -1307,12 +1315,12 @@ static gboolean gd_text_key_down(GtkWidget *widget, QemuTextConsole *con =3D QEMU_TEXT_CONSOLE(vc->gfx.dcl.con); =20 if (key->keyval =3D=3D GDK_KEY_Delete) { - qemu_text_console_put_qcode(con, Q_KEY_CODE_DELETE, false); + qemu_text_console_put_linux(con, KEY_DELETE, false); } else if (key->length) { qemu_text_console_put_string(con, key->string, key->length); } else { - int qcode =3D gd_map_keycode(gd_get_keycode(key)); - qemu_text_console_put_qcode(con, qcode, false); + unsigned int lnx =3D gd_map_keycode(gd_get_keycode(key)); + qemu_text_console_put_linux(con, lnx, false); } return TRUE; } @@ -1320,7 +1328,7 @@ static gboolean gd_text_key_down(GtkWidget *widget, static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *op= aque) { VirtualConsole *vc =3D opaque; - int keycode, qcode; + int keycode, lnx; =20 #ifdef G_OS_WIN32 /* on windows, we ought to ignore the reserved key event? */ @@ -1343,20 +1351,18 @@ static gboolean gd_key_event(GtkWidget *widget, Gdk= EventKey *key, void *opaque) || key->hardware_keycode =3D=3D VK_PAUSE #endif ) { - qkbd_state_key_event(vc->gfx.kbd, - qemu_input_map_qcode_to_linux[Q_KEY_CODE_PAUS= E], + qkbd_state_key_event(vc->gfx.kbd, KEY_PAUSE, key->type =3D=3D GDK_KEY_PRESS); return TRUE; } =20 keycode =3D gd_get_keycode(key); - qcode =3D gd_map_keycode(keycode); + lnx =3D gd_map_keycode(keycode); =20 - trace_gd_key_event(vc->label, keycode, qemu_input_map_qcode_to_linux[q= code], + trace_gd_key_event(vc->label, keycode, lnx, (key->type =3D=3D GDK_KEY_PRESS) ? "down" : "up"); =20 - qkbd_state_key_event(vc->gfx.kbd, qemu_input_map_qcode_to_linux[qcode], - key->type =3D=3D GDK_KEY_PRESS); + qkbd_state_key_event(vc->gfx.kbd, lnx, key->type =3D=3D GDK_KEY_PRESS); =20 return TRUE; } @@ -2660,7 +2666,7 @@ static void early_gtk_display_init(DisplayOptions *op= ts) #endif } =20 - keycode_map =3D gd_get_keymap(&keycode_maplen); + keycode_map =3D gd_get_keymap(&keycode_maplen, &keycode_xorgevdev); =20 #if defined(CONFIG_VTE) type_register_static(&char_gd_vc_type_info); diff --git a/ui/x_keymap.c b/ui/x_keymap.c index 2ce7b899615f..f7dc2edb91d6 100644 --- a/ui/x_keymap.c +++ b/ui/x_keymap.c @@ -52,11 +52,12 @@ static gboolean check_for_xquartz(Display *dpy) return match; } =20 -const guint16 *qemu_xkeymap_mapping_table(Display *dpy, size_t *maplen) +const guint16 *qemu_xkeymap_mapping_table(Display *dpy, size_t *maplen, + bool *evdev) { XkbDescPtr desc; const gchar *keycodes =3D NULL; - const guint16 *map; + const guint16 *map =3D NULL; =20 /* There is no easy way to determine what X11 server * and platform & keyboard driver is in use. Thus we @@ -81,24 +82,26 @@ const guint16 *qemu_xkeymap_mapping_table(Display *dpy,= size_t *maplen) XkbFreeKeyboard(desc, XkbGBN_AllComponentsMask, True); } =20 + *maplen =3D 0; + *evdev =3D false; + if (check_for_xwin(dpy)) { trace_xkeymap_keymap("xwin"); - *maplen =3D qemu_input_map_xorgxwin_to_qcode_len; - map =3D qemu_input_map_xorgxwin_to_qcode; + *maplen =3D qemu_input_map_xorgxwin_to_linux_len; + map =3D qemu_input_map_xorgxwin_to_linux; } else if (check_for_xquartz(dpy)) { trace_xkeymap_keymap("xquartz"); - *maplen =3D qemu_input_map_xorgxquartz_to_qcode_len; - map =3D qemu_input_map_xorgxquartz_to_qcode; + *maplen =3D qemu_input_map_xorgxquartz_to_linux_len; + map =3D qemu_input_map_xorgxquartz_to_linux; } else if ((keycodes && g_str_has_prefix(keycodes, "evdev")) || (XKeysymToKeycode(dpy, XK_Page_Up) =3D=3D 0x70)) { trace_xkeymap_keymap("evdev"); - *maplen =3D qemu_input_map_xorgevdev_to_qcode_len; - map =3D qemu_input_map_xorgevdev_to_qcode; + *evdev =3D true; } else if ((keycodes && g_str_has_prefix(keycodes, "xfree86")) || (XKeysymToKeycode(dpy, XK_Page_Up) =3D=3D 0x63)) { trace_xkeymap_keymap("kbd"); - *maplen =3D qemu_input_map_xorgkbd_to_qcode_len; - map =3D qemu_input_map_xorgkbd_to_qcode; + *maplen =3D qemu_input_map_xorgkbd_to_linux_len; + map =3D qemu_input_map_xorgkbd_to_linux; } else { trace_xkeymap_keymap("NULL"); g_warning("Unknown X11 keycode mapping '%s'.\n" @@ -110,7 +113,6 @@ const guint16 *qemu_xkeymap_mapping_table(Display *dpy,= size_t *maplen) " - xprop -root\n" " - xdpyinfo\n", keycodes ? keycodes : ""); - map =3D NULL; } if (keycodes) { XFree((void *)keycodes); --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1778323749957817.8035013384574; Sat, 9 May 2026 03:49:09 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1304601.1577515 (Exim 4.92) (envelope-from ) id 1wLfEQ-0001fu-DX; Sat, 09 May 2026 10:48:26 +0000 Received: by outflank-mailman (output) from mailman id 1304601.1577515; Sat, 09 May 2026 10:48:26 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfEQ-0001ez-7j; Sat, 09 May 2026 10:48:26 +0000 Received: by outflank-mailman (input) for mailman id 1304601; Sat, 09 May 2026 10:48:24 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfEN-0001aS-Ej for xen-devel@lists.xenproject.org; Sat, 09 May 2026 10:48:24 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1wLfEM-0010Ja-SC for xen-devel@lists.xenproject.org; Sat, 09 May 2026 12:48:22 +0200 Received: from [10.42.69.4] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 69ff10a2-e002-0a2a0a5209dd-0a2a4504db1e-44 for ; Sat, 09 May 2026 12:48:22 +0200 Received: from [49.212.243.89] (helo=www3579.sakura.ne.jp) by tlsNG-ebf023.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1) (envelope-from ) id 69ff10f3-1dec-0a2a45040019-31d4f359d5f0-3 for ; Sat, 09 May 2026 12:48:21 +0200 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2K090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:01 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=temperror header.s=rs20250326 header.d=rsg.ci.i.u-tokyo.ac.jp header.i="@rsg.ci.i.u-tokyo.ac.jp" DKIM-Signature: a=rsa-sha256; bh=+9TsdwOjpr1iHxskLt3f2EYt5zfwd9os5E2Yt8jChVM=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323681; v=1; b=aLv1AfwGALDvOFPckAZuQsHV3Iq6x1BBqVwrJH00u/XyCobZnIeo+UuTjIee/uF1 CE7iaauZdwme0etKlR5JtF6nC0R4K2QjXjLnqSFPtJWk2ZWtRkDDChsSXeBDsQYL t4cz59uBHpJkYTCKhAXYsXzKJcJw1fxZKr9JE5pnHcjQV/zCZWpQq4uz5NqOuYUA 6z35XYQLT0Y79u8LPa5ntwP90qqvy4sTBUAfjBYPNVktzrWr3HocC6rjxSB+UTXf dAYGRlX4aivYRczJu9IfluABueOT/ha6MU3Piq4vdmWISSPc6JXVQqkGpIhsq0Ym sxPNGql4PziyvN6QUjaK9A== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:31 +0900 Subject: [PATCH RFC 19/28] ui/input-barrier: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-19-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=3193; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=c6O0syJR1NIU9Ef/YUHm+OV3aKIWUGDzhmEGlDmaM/E=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gete29q+nqlp3CUa0eKVzCXTcqzHpGl5rly6/9OtT k8dj+7pKGVhEONikBVTZEkp2s2tEV37qTAhvgVmDisTyBAGLk4BmMiLBYwM7x9FPytacndF5S3l 7K2H5K7nWFySMXwgGDir9kdN9TrZDEaGJ1VfTL5p89oVhZ4UyOF8ofTxs8amlCAF+a3TbXacLtj BBAA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C X-purgate-ID: tlsNG-ebf023/1778323702-42D643FF-654C105C/0/0 X-purgate-type: clean X-purgate-size: 3195 X-ZM-MESSAGEID: 1778323751134154100 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 --- ui/input-barrier.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ui/input-barrier.c b/ui/input-barrier.c index 0a2198ca5003..eb7f0b952d51 100644 --- a/ui/input-barrier.c +++ b/ui/input-barrier.c @@ -84,11 +84,11 @@ static const char *cmd_names[] =3D { =20 static kbd_layout_t *kbd_layout; =20 -static int input_barrier_to_qcode(uint16_t keyid, uint16_t keycode) +static int input_barrier_to_linux(uint16_t keyid, uint16_t keycode) { /* keycode is optional, if it is not provided use keyid */ - if (keycode && keycode <=3D qemu_input_map_xorgkbd_to_qcode_len) { - return qemu_input_map_xorgkbd_to_qcode[keycode]; + if (keycode && keycode <=3D qemu_input_map_xorgkbd_to_linux_len) { + return qemu_input_map_xorgkbd_to_linux[keycode]; } =20 if (keyid >=3D 0xE000 && keyid <=3D 0xEFFF) { @@ -99,10 +99,10 @@ static int input_barrier_to_qcode(uint16_t keyid, uint1= 6_t keycode) if (kbd_layout) { keycode =3D keysym2scancode(kbd_layout, keyid, NULL, false); =20 - return qemu_input_key_number_to_qcode(keycode); + return qemu_input_key_number_to_linux(keycode); } =20 - return qemu_input_map_x11_to_qcode[keyid]; + return qemu_input_map_x11_to_linux[keyid]; } =20 static int input_barrier_to_mouse(uint8_t buttonid) @@ -431,23 +431,23 @@ static gboolean writecmd(InputBarrier *ib, struct bar= rierMsg *msg) =20 /* keyboard */ case barrierCmdDKeyDown: - qemu_input_event_send_key_qcode(NULL, - input_barrier_to_qcode(msg->key.keyid, msg->key.bu= tton), + qemu_input_event_send_key_linux(NULL, + input_barrier_to_linux(msg->key.keyid, msg->key.bu= tton), true); break; case barrierCmdDKeyRepeat: for (i =3D 0; i < msg->repeat.repeat; i++) { - qemu_input_event_send_key_qcode(NULL, - input_barrier_to_qcode(msg->repeat.keyid, msg->repeat.bu= tton), + qemu_input_event_send_key_linux(NULL, + input_barrier_to_linux(msg->repeat.keyid, msg->repeat.bu= tton), false); - qemu_input_event_send_key_qcode(NULL, - input_barrier_to_qcode(msg->repeat.keyid, msg->repeat.bu= tton), + qemu_input_event_send_key_linux(NULL, + input_barrier_to_linux(msg->repeat.keyid, msg->repeat.bu= tton), true); } break; case barrierCmdDKeyUp: - qemu_input_event_send_key_qcode(NULL, - input_barrier_to_qcode(msg->key.keyid, msg->key.bu= tton), + qemu_input_event_send_key_linux(NULL, + input_barrier_to_linux(msg->key.keyid, msg->key.bu= tton), false); break; default: --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1778323744306858.6140606314722; Sat, 9 May 2026 03:49:04 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1304603.1577542 (Exim 4.92) (envelope-from ) id 1wLfER-0002Ql-Vu; Sat, 09 May 2026 10:48:27 +0000 Received: by outflank-mailman (output) from mailman id 1304603.1577542; Sat, 09 May 2026 10:48:27 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfER-0002Qe-Se; Sat, 09 May 2026 10:48:27 +0000 Received: by outflank-mailman (input) for mailman id 1304603; Sat, 09 May 2026 10:48:26 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfEQ-0001il-M6 for xen-devel@lists.xenproject.org; Sat, 09 May 2026 10:48:26 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1wLfEQ-00FIIk-2o for xen-devel@lists.xenproject.org; Sat, 09 May 2026 12:48:26 +0200 Received: from [10.42.69.5] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 69ff10e4-bab6-0a2a0a5309dd-0a2a4505bea4-20 for ; Sat, 09 May 2026 12:48:26 +0200 Received: from [49.212.243.89] (helo=www3579.sakura.ne.jp) by tlsNG-c201ff.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1) (envelope-from ) id 69ff10f7-aaa8-0a2a45050019-31d4f359d68d-3 for ; Sat, 09 May 2026 12:48:25 +0200 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2L090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:01 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=temperror header.s=rs20250326 header.d=rsg.ci.i.u-tokyo.ac.jp header.i="@rsg.ci.i.u-tokyo.ac.jp" DKIM-Signature: a=rsa-sha256; bh=8DrbNDimPytD2Lqd2BsnuvqZLeFlu5Z+sunaR47ICfs=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323681; v=1; b=EZUG6OgWnMEi80mWOv2bjQh69KIzj095fUuL+GG0Y+Ocgqc0ySNqx21bn9jTgoBi gIOOXCAYQ6WtAM8ujVLEiqtd9gSR0j4rd4xO7o5RqI2XPMW3/UooD+7tSggeiP4L gE0NUbscSS8YA+Mx1Gfr2UylEtbic/4xW8GTk6m2P9EznvTyEH4iV/4IZA+UHNGx dUmXYXfrVKC7U3HU4oua43HgpUYTg1YNjbSpvneEbJ8jidGE8CTbWnEeqeiXZVip MXUMoqwQTbNunaDlZcL3/vUInNW0z7NbHiONGReOLeJaq1Zb585hY6sdxGHqBKgs ZyyMt54SD4C3BEJvhcbbUw== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:32 +0900 Subject: [PATCH RFC 20/28] ui/input-legacy: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-20-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=2048; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=Fw4LZt0Zxdxd+pp/aswa6uqQEJsaIMY4eIVuWOuDFDU=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gRuRrFtN2E/2hy4vFXHjb+T9L3/4tGJiRbZhv8OPb n3ll5YdpSwMYlwMsmKKLClFu7k1oms/FSbEt8DMYWUCGcLAxSkAE7nAz/A/x8pUpe/X57bWK/cM bW+638299/u5v635S2aD3y8sV8SyMjIsmraO89bZEL2iixLlB53cTK4dZf/jVxn+dprRhGtK56R 5AA== X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C X-purgate-ID: tlsNG-c201ff/1778323706-E338A443-BC534A78/0/0 X-purgate-type: clean X-purgate-size: 2050 X-ZM-MESSAGEID: 1778323746118158500 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 --- ui/input-legacy.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/ui/input-legacy.c b/ui/input-legacy.c index e2b48dd8f0aa..193c9ae2ef9f 100644 --- a/ui/input-legacy.c +++ b/ui/input-legacy.c @@ -71,23 +71,11 @@ int index_from_key(const char *key, size_t key_length) return i; } =20 -static KeyValue *copy_key_value(KeyValue *src) -{ - KeyValue *dst =3D g_new(KeyValue, 1); - memcpy(dst, src, sizeof(*src)); - if (dst->type =3D=3D KEY_VALUE_KIND_NUMBER) { - QKeyCode code =3D qemu_input_key_number_to_qcode(dst->u.number.dat= a); - dst->type =3D KEY_VALUE_KIND_QCODE; - dst->u.qcode.data =3D code; - } - return dst; -} - void qmp_send_key(KeyValueList *keys, bool has_hold_time, int64_t hold_tim= e, Error **errp) { KeyValueList *p; - KeyValue **up =3D NULL; + unsigned int *up =3D NULL; int count =3D 0; =20 if (!has_hold_time) { @@ -95,15 +83,15 @@ void qmp_send_key(KeyValueList *keys, bool has_hold_tim= e, int64_t hold_time, } =20 for (p =3D keys; p !=3D NULL; p =3D p->next) { - qemu_input_event_send_key(NULL, copy_key_value(p->value), true); - qemu_input_event_send_key_delay(hold_time); up =3D g_realloc(up, sizeof(*up) * (count+1)); - up[count] =3D copy_key_value(p->value); + up[count] =3D qemu_input_key_value_to_linux(p->value); + qemu_input_event_send_key_linux(NULL, up[count], true); + qemu_input_event_send_key_delay(hold_time); count++; } while (count) { count--; - qemu_input_event_send_key(NULL, up[count], false); + qemu_input_event_send_key_linux(NULL, up[count], false); qemu_input_event_send_key_delay(hold_time); } g_free(up); --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778324031064229.47736347619502; Sat, 9 May 2026 03:53:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfEc-00089k-7O; Sat, 09 May 2026 06:48:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEY-000865-1m; Sat, 09 May 2026 06:48:34 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEV-0001bF-2D; Sat, 09 May 2026 06:48:33 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2M090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:01 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=zvZRcDF6rPXqdkFSL8eojNejDsFaH8xzSLM1gva1gm8=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323682; v=1; b=V9uuMUUs5DEDNE5b7IixiigrqnjZoUocjcwrGobqqlld2rKzq7WPKsqYB5jkrVpD xsegaIiI70VJkXP+6hIEZJAwoJKTpZz+PXUXmE6a7cdjH6xLyFavvEyJ42i4n7uB i6RA79fQj3qIPLGfQFPl2CLpWJNPz+Xv0HUAZjQGcU3b6Ud57XVYeR5cwRd2RmGR M+QWWy8+TDG4O8CKMdwYa17SXEYnu1+RQ+L6wZqaFCSmX7PjKHpFn8Ving+uVPeF 4fF3sS39ajljH2OOIGCOCspDe+UkaMChaki3nZMSMJVGdQPth0Yy5P3rmYlHkBk1 bZYyGfFRhxHlFa6La3lUsw== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:33 +0900 Subject: [PATCH RFC 21/28] ui/input-linux: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-21-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=947; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=kRJ/7J804Tn8eBdIewmzxF/6sh/dIs4sMW2m0FcJ+rk=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gRvi0XP4lJj3xfz8KXyGcebk2rYAO0HJU+b7HrzxS g7xD5brKGVhEONikBVTZEkp2s2tEV37qTAhvgVmDisTyBAGLk4BmMi2Uwx/ZSUnxkn5JvgKtvmf LdmysI3hzK1nOs26q3m32r14cMaAn+GfwQfj73ccRVTnOetEBT79s9xqg36QqsDBV8r/Iut/SKu yAwA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778324033311154100 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 --- ui/input-linux.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ui/input-linux.c b/ui/input-linux.c index 74bc8511428a..f4eee1ffd7ec 100644 --- a/ui/input-linux.c +++ b/ui/input-linux.c @@ -166,8 +166,7 @@ static void input_linux_handle_keyboard(InputLinux *il, =20 /* send event to guest when grab is active */ if (il->grab_active && !input_linux_should_skip(il, event)) { - int qcode =3D qemu_input_linux_to_qcode(event->code); - qemu_input_event_send_key_qcode(NULL, qcode, event->value); + qemu_input_event_send_key_linux(NULL, event->code, event->valu= e); } =20 /* hotkey -> record switch request ... */ --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778323770543496.75870857881023; Sat, 9 May 2026 03:49:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfEf-0008Az-Hf; Sat, 09 May 2026 06:48:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEY-00086A-2H; Sat, 09 May 2026 06:48:34 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEV-0001bH-8o; Sat, 09 May 2026 06:48:33 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2N090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:02 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=wjb9QepD+N9kOBgJ3LwWLhwaARwVJCtdWkB5L24skKQ=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323682; v=1; b=Fp95rBWsKkIYNuWZf4Xv66Z6dwrCVwceAq5tt5M2+xAzhyNh+OvCw+bD6cBDtZI6 jXX1s78kiTCwCdQJ+EVMXFh/FPo5lnPLixX2ZtnFlaasRWfqdeOhdPYXeHX4hVb1 wAYnu4l0mRhuDwTlwFNB4wrXdU8LmBeiJiJCZb4/ePvQa0iqPJUCwVXXrOaMyR4I 9jbwy3g7g1IcGURRccjorc+pWV1Pba+AGNtvDULpe1qh9rFQvp/PhEhE2fd3XJQt z/iQevt79/8H1+JnUAPV/+3XZZJ+nb09P3QKcFwu9ZlPjsT8jLLerNk+i9kjYtbu SWqxD/E3kQqoPDfhnie36w== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:34 +0900 Subject: [PATCH RFC 22/28] ui/keymaps: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-22-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=998; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=GjLnmWFMm6QbQ3xMT3K1z5h8XWlcrfyqsaRBaDqGi1k=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gRsr91wVDYv58852Y4dcmdN6W1XprPx1RwXePO7/G da3sC29o5SFQYyLQVZMkSWlaDe3RnTtp8KE+BaYOaxMIEMYuDgFYCJOZxgZTuQsqv3P2e11fr8j 352zocUFmn514aGnbnE1qB8L78+qZfhnV/f/04MlJ+cVcx/78Oec9jbGeTa/77c5ee44e9PozrM HbAA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778323772954158500 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 --- ui/keymaps.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ui/keymaps.c b/ui/keymaps.c index 7a7c13c47a0c..ad54cbbc5c8c 100644 --- a/ui/keymaps.c +++ b/ui/keymaps.c @@ -255,9 +255,8 @@ int keysym2scancode(kbd_layout_t *k, int keysym, * On keyup: Try find a key which is actually down. */ for (i =3D 0; i < keysym2code->count; i++) { - QKeyCode qcode =3D qemu_input_key_number_to_qcode + unsigned int lnx =3D qemu_input_key_number_to_linux (keysym2code->keycodes[i]); - unsigned int lnx =3D qemu_input_map_qcode_to_linux[qcode]; if (kbd && qkbd_state_key_get(kbd, lnx)) { return keysym2code->keycodes[i]; } --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778323942345761.9934804641158; Sat, 9 May 2026 03:52:22 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfEl-0008CC-5c; Sat, 09 May 2026 06:48:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEZ-000888-BI; Sat, 09 May 2026 06:48:36 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEV-0001b4-Dh; Sat, 09 May 2026 06:48:35 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2O090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:02 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=YTUJN8DvpmZZcN9mDHOpec3svSSoyNrcd98/RwrJvLw=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323682; v=1; b=DyjeJ6PUd5UqbALRrC/mi1p+ibniqWi79qeUsWTcqYNqDVXvFpCAOPFnMX+5kHiy wOMJ56imL+NxJYGxuILmX81SUwO4IBugKzQRHqZS/sfljCToix8Alm1avwjCFYp7 8LVs333zTwY+9iIzyzTyu/ZxsajzitJFRGzA7jUMLqWHv8Rrqn33WP6r1MuMS9P/ hh9v+G1hBI9lOtNXtT4UNA27Vpk08/gxS6RMaaXqjmQbMiE6NrfmVPmGxdC+FNJ9 fNQFsc+KwcSc0xMFxgPrPA3sfkGeFAyOfNUrHcJ2nD4758AVIvJ5t2KFb3hlnuve l4aUjBb910hUuDTnLc9e5Q== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:35 +0900 Subject: [PATCH RFC 23/28] ui/sdl2: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-23-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=2925; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=OdEPbaMV5dgyq/JC3Lwkk0j6DIE06Qr7DPFSHzAnI3M=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gZvTT4U2ss8NKJdvXeg2Y0de6btz/9wzLLeGS7zfk B6u4t/eUcrCIMbFICumyJJStJtbI7r2U2FCfAvMHFYmkCEMXJwCMBGmuYwMx+5Pata+Zh5Wn7q0 I/L81PVyX9e94Hu3UUX9sfJmsY9tkYwMR1dwi33gvrf35Esls9dyZyvKls2+PEGvyb9Ik03yePN DHgA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778323943886154100 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 --- ui/sdl2-input.c | 18 +++++++++--------- ui/trace-events | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ui/sdl2-input.c b/ui/sdl2-input.c index fdbdc427dc9e..7bebc3f3e5ce 100644 --- a/ui/sdl2-input.c +++ b/ui/sdl2-input.c @@ -24,6 +24,7 @@ /* Ported SDL 1.2 code to 2.0 by Dave Airlie. */ =20 #include "qemu/osdep.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/console.h" #include "ui/input.h" #include "ui/sdl2.h" @@ -32,28 +33,27 @@ void sdl2_process_key(struct sdl2_console *scon, SDL_KeyboardEvent *ev) { - int qcode; + unsigned int lnx; QemuConsole *con =3D scon->dcl.con; =20 - if (ev->keysym.scancode >=3D qemu_input_map_usb_to_qcode_len) { + if (ev->keysym.scancode >=3D qemu_input_map_usb_to_linux_len) { return; } - qcode =3D qemu_input_map_usb_to_qcode[ev->keysym.scancode]; - trace_sdl2_process_key(ev->keysym.scancode, qcode, + lnx =3D qemu_input_map_usb_to_linux[ev->keysym.scancode]; + trace_sdl2_process_key(ev->keysym.scancode, lnx, ev->type =3D=3D SDL_KEYDOWN ? "down" : "up"); - qkbd_state_key_event(scon->kbd, qemu_input_map_qcode_to_linux[qcode], - ev->type =3D=3D SDL_KEYDOWN); + qkbd_state_key_event(scon->kbd, lnx, ev->type =3D=3D SDL_KEYDOWN); =20 if (QEMU_IS_TEXT_CONSOLE(con)) { QemuTextConsole *s =3D QEMU_TEXT_CONSOLE(con); bool ctrl =3D qkbd_state_modifier_get(scon->kbd, QKBD_MOD_CTRL); if (ev->type =3D=3D SDL_KEYDOWN) { - switch (qcode) { - case Q_KEY_CODE_RET: + switch (lnx) { + case KEY_ENTER: qemu_text_console_put_keysym(s, '\n'); break; default: - qemu_text_console_put_qcode(s, qcode, ctrl); + qemu_text_console_put_linux(s, lnx, ctrl); break; } } diff --git a/ui/trace-events b/ui/trace-events index 4d112bd2ba3b..c417d988893a 100644 --- a/ui/trace-events +++ b/ui/trace-events @@ -108,7 +108,7 @@ input_event_mtt(int conidx, const char *axis, int value= ) "con %d, axis %s, value input_event_sync(void) "" =20 # sdl2-input.c -sdl2_process_key(int sdl_scancode, int qcode, const char *action) "transla= ted SDL scancode %d to QKeyCode %d (%s)" +sdl2_process_key(int sdl_scancode, unsigned int lnx, const char *action) "= translated SDL scancode %d to Linux scancode %u (%s)" =20 # spice-display.c qemu_spice_add_memslot(int qid, uint32_t slot_id, unsigned long virt_start= , unsigned long virt_end, int async) "%d %u: host virt 0x%lx - 0x%lx async= =3D%d" --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778324016198437.2367691646025; Sat, 9 May 2026 03:53:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfEc-00089w-Bf; Sat, 09 May 2026 06:48:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEY-000866-1w; Sat, 09 May 2026 06:48:34 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEU-0001b0-TZ; Sat, 09 May 2026 06:48:33 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2P090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:02 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=7AZuQUmohs7ZB6VnyND7lAhsDMjIqEN9r+C6jbcO76g=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323682; v=1; b=fEi43hBiqIKX07s/CCaA/yzcRRTf8HvX9Tu5xNoCPzzRVMioDQZl++yPQf2/DTCd 8a+eDdlmXwcgEy6CNfIzy+boO+zCNmrBHySxv5S/dw2l15xx6pccghplv/zWEAFq IZHzApUgKguoHpJSMWIZ5KWuUABftTgFHAOP9DpCJzB3bVojUBBGTqADI6Ivr2KL Ah60ilg76wB8iPyxLXRi1n/8s853qu2Uzy0Y6EMdycmKnBxne3EoKstgZQ3w5VH4 ufJCuJSOZ2eMvBGkzY/9pH8iD4EzLxTk/DDTR3ZlvF4Rftmbk1HRMpgdQNTGH3DU Mc2/f0pJFyYgfIaSv94YFA== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:36 +0900 Subject: [PATCH RFC 24/28] ui/spice: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-24-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=1084; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=L0N6BRIMKIkMescHTP9EJDsdj8Wd6180kuylCT6g9zw=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gVut/ewpjrfFGFzNCz5cPvrwwZ7G02m3b1f+5Z9TG dN5/ENlRykLgxgXg6yYIktK0W5ujejaT4UJ8S0wc1iZQIYwcHEKwESClRgZfiW+M5xw+dby896y x7drPr6T/vqFhN5Dnmss5u4hp2buiWT4Z7B/keMikd2SuSqaxVaqz9OrdQ5cOR+3RC5E2sxcwZa LFwA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778324016994154100 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 --- ui/spice-input.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/spice-input.c b/ui/spice-input.c index a5c5d78474e7..f0bb915fd77b 100644 --- a/ui/spice-input.c +++ b/ui/spice-input.c @@ -20,6 +20,7 @@ #include #include =20 +#include "standard-headers/linux/input-event-codes.h" #include "ui/qemu-spice.h" #include "ui/console.h" #include "keymaps.h" @@ -61,7 +62,7 @@ static void kbd_push_key(SpiceKbdInstance *sin, uint8_t s= cancode) if (scancode =3D=3D pauseseq[kbd->pauseseq]) { kbd->pauseseq++; if (kbd->pauseseq =3D=3D G_N_ELEMENTS(pauseseq)) { - qemu_input_event_send_key_qcode(NULL, Q_KEY_CODE_PAUSE, true); + qemu_input_event_send_key_linux(NULL, KEY_PAUSE, true); kbd->pauseseq =3D 0; } return; --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778323947572180.04005441727486; Sat, 9 May 2026 03:52:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFg-0000k7-Ez; Sat, 09 May 2026 06:49:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF0-0008J8-5n; Sat, 09 May 2026 06:49:03 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEv-0001bV-Va; Sat, 09 May 2026 06:49:01 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2Q090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:02 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=5nVwcoBUMe6NuInaiAkPhWnMmFp6lK3p5hpEA3XbroE=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323682; v=1; b=XvWsSBeGcADW6BFvNqawo+H/2rF9dExFEwYJSr4ID+K1+jA8klG51WioCjgDfTRu GLQZjhvQ3Mshx6rFbwL4oxHBhij/Ze1H1t2Dh5Team7KwaAfJTGDaECNLWjRkdlD EISdwjHVMoM9Dh8URZ5C52jRIPoC4UMym2QZumWF8JHSsDfrNimFRGjMy9Us4gr3 HwjrvtMxzuJtwBe6ehfRcEFH0KCw0aa2uRFAZTibIiYoCMKqLsCo8KcwQ9R3Ll5x o4FjXt7lgP+vBhbm+nby7DpCxRb+xEo8zxuoM+W22YtfvAM8kCtKjrRADCy3bf+e qw6f/sVAiLiURg/PpkUjhA== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:37 +0900 Subject: [PATCH RFC 25/28] ui/vnc: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-25-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=3923; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=QerukY73VtCo9ipWBLNsjflRN8tp0sdYEDVJmULTugw=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gVuNCgeePe6uMpwkVrMyq+69pwSL/aS9ypcy+xQcE jXm65/vKGVhEONikBVTZEkp2s2tEV37qTAhvgVmDisTyBAGLk4BmAjPT4b/rttWTd/2aVffWcXN 5r9n2j9ebzvh76TqKGH7Q1MecU8UqmNkeFS70ItXTsvCvr358pbJd15f330i3ZPp8L26889WXZF w5wEA X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778323948585158500 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 --- ui/vnc.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/ui/vnc.c b/ui/vnc.c index 940dae1a0010..8ad24f82f776 100644 --- a/ui/vnc.c +++ b/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/input.h" #include "crypto/hash.h" #include "crypto/tlscreds.h" @@ -1805,13 +1806,10 @@ static void pointer_event(VncState *vs, int button_= mask, int x, int y) qemu_input_event_sync(); } =20 -static void press_key(VncState *vs, QKeyCode qcode) +static void press_key(VncState *vs, QKeyCode 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); } =20 static void vnc_led_state_change(VncState *vs) @@ -1852,15 +1850,15 @@ static void kbd_leds(void *opaque, int ledstate) =20 static void do_key_event(VncState *vs, int down, int keycode, int sym) { - QKeyCode qcode =3D qemu_input_key_number_to_qcode(keycode); + QKeyCode lnx =3D qemu_input_key_number_to_linux(keycode); =20 /* 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 =3D qemu_console_lookup_by_index(qcode - Q_KE= Y_CODE_1); + QemuConsole *con =3D qemu_console_lookup_by_index(lnx - KEY_1); if (con) { unregister_displaychangelistener(&vs->vd->dcl); qkbd_state_switch_console(vs->vd->kbd, con); @@ -1886,12 +1884,12 @@ static void do_key_event(VncState *vs, int down, in= t 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); } } } @@ -1909,18 +1907,17 @@ static void do_key_event(VncState *vs, int down, in= t keycode, int sym) if (capslock) { if (uppercase =3D=3D shift) { trace_vnc_key_sync_capslock(false); - press_key(vs, Q_KEY_CODE_CAPS_LOCK); + press_key(vs, KEY_CAPSLOCK); } } else { if (uppercase !=3D shift) { trace_vnc_key_sync_capslock(true); - press_key(vs, Q_KEY_CODE_CAPS_LOCK); + press_key(vs, KEY_CAPSLOCK); } } } =20 - 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 =3D QEMU_TEXT_CONSOLE(vs->vd->dcl.con); bool numlock =3D qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_NUM= LOCK); --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1778323748185926.051947224979; Sat, 9 May 2026 03:49:08 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1304600.1577506 (Exim 4.92) (envelope-from ) id 1wLfEP-0001ay-Uo; Sat, 09 May 2026 10:48:25 +0000 Received: by outflank-mailman (output) from mailman id 1304600.1577506; Sat, 09 May 2026 10:48:25 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfEP-0001ap-Pr; Sat, 09 May 2026 10:48:25 +0000 Received: by outflank-mailman (input) for mailman id 1304600; Sat, 09 May 2026 10:48:24 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfEN-0001aT-OQ for xen-devel@lists.xenproject.org; Sat, 09 May 2026 10:48:24 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1wLfEN-0010Ja-5Y for xen-devel@lists.xenproject.org; Sat, 09 May 2026 12:48:23 +0200 Received: from [10.42.69.4] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 69ff10a2-e002-0a2a0a5209dd-0a2a4504db1e-46 for ; Sat, 09 May 2026 12:48:23 +0200 Received: from [49.212.243.89] (helo=www3579.sakura.ne.jp) by tlsNG-ebf023.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1) (envelope-from ) id 69ff10f4-1dec-0a2a45040019-31d4f359d609-3 for ; Sat, 09 May 2026 12:48:22 +0200 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2R090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:03 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=temperror header.s=rs20250326 header.d=rsg.ci.i.u-tokyo.ac.jp header.i="@rsg.ci.i.u-tokyo.ac.jp" DKIM-Signature: a=rsa-sha256; bh=1HZL/g+SoS2O30ERYe2Yb6nxo7jFOLr4qDArV1Di8vs=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323683; v=1; b=t78Qg2FX6fQPQYjv6ccpjNB5PHM57Z7vH/sFNvFVepBntRbIzBYVxDoFA4Z8zcUH yNwbFuM/ho+hh5SZ7tf+Lkfd6Wii0FvKwt2Neo7Zxyyjj0CPtZ4hhs+44YPVNLLd H36Sm6ApZio0GZOtvJjE7gfl/iPNr1pEm9G79xaqieF17GWnxd4PNKVHVkqEn2ls /0VUSq1OHHAEnBbOUVdWr/eFNLlH0fNvZTrUrycauuM0c2twgV+IGere0olLlQui J1WlwuqN0kKbylZVRId1EEn/7T+bo86HLmzUhdvkZ04CYAklhxjCBTPvbnydSqGn /+uvgM+9RWPYf4U/G5z4Iw== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:38 +0900 Subject: [PATCH RFC 26/28] qemu-keymap: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-26-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=4832; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=gcrDwacqS5bkEtnqJY5QTRr0nAfP9KdzJWUdu+r+4i4=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gdv2pyc8enzc0iTzyvf7mQVVX9WD1Rq6ixadzH/JV yrMcK6po5SFQYyLQVZMkSWlaDe3RnTtp8KE+BaYOaxMIEMYuDgFYCJC+xn+x7yYeKUtmfn115RK 3xvJgtvLP+5/9FLHS22im/b1xpj4EIb/gfX6z9rXXG/80tV+1W2F992I945mHGvOMaadZLTVPBL LDwA= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C X-purgate-ID: tlsNG-ebf023/1778323703-42B633FF-F2E52775/0/0 X-purgate-type: clean X-purgate-size: 4834 X-ZM-MESSAGEID: 1778323751154154100 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 --- qemu-keymap.c | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/qemu-keymap.c b/qemu-keymap.c index d4dccf456ef3..d63b6be8ce32 100644 --- a/qemu-keymap.c +++ b/qemu-keymap.c @@ -11,6 +11,7 @@ */ #include "qemu/osdep.h" #include "qemu/notify.h" +#include "standard-headers/linux/input-event-codes.h" #include "ui/input.h" =20 #include @@ -32,19 +33,17 @@ static FILE *outfile; =20 /* -----------------------------------------------------------------------= - */ =20 -static uint32_t qcode_to_number(uint32_t qcode) +static uint32_t linux_to_number(uint32_t lnx) { - KeyValue keyvalue; uint32_t number; =20 - keyvalue.type =3D KEY_VALUE_KIND_QCODE; - keyvalue.u.qcode.data =3D qcode; - number =3D qemu_input_key_value_to_number(&keyvalue); + assert(lnx < qemu_input_map_linux_to_qnum_len); + number =3D qemu_input_map_linux_to_qnum[lnx]; assert(number !=3D 0); return number; } =20 -static void print_sym(xkb_keysym_t sym, uint32_t qcode, const char *mod) +static void print_sym(xkb_keysym_t sym, uint32_t lnx, const char *mod) { char name[64]; =20 @@ -54,7 +53,7 @@ static void print_sym(xkb_keysym_t sym, uint32_t qcode, c= onst char *mod) xkb_keysym_get_name(sym, name, sizeof(name)); =20 /* TODO: make ui/keymap.c parser accept QKeyCode names */ - fprintf(outfile, "%s 0x%02x%s\n", name, qcode_to_number(qcode), mod); + fprintf(outfile, "%s 0x%02x%s\n", name, linux_to_number(lnx), mod); } =20 static void walk_map(struct xkb_keymap *map, xkb_keycode_t code, void *dat= a) @@ -84,37 +83,37 @@ static void walk_map(struct xkb_keymap *map, xkb_keycod= e_t code, void *data) fprintf(outfile, "# evdev %d (0x%x), QKeyCode \"%s\", number 0x%x\n", evdev, evdev, QKeyCode_str(qcode), - qcode_to_number(qcode)); + linux_to_number(evdev)); =20 /* * check which modifier states generate which keysyms */ xkb_state_update_mask(state, 0, 0, 0, 0, 0, 0); kbase =3D xkb_state_key_get_one_sym(state, code); - print_sym(kbase, qcode, ""); + print_sym(kbase, evdev, ""); =20 xkb_state_update_mask(state, 0, 0, numlock, 0, 0, 0); knumlock =3D xkb_state_key_get_one_sym(state, code); if (kbase !=3D knumlock) { - print_sym(knumlock, qcode, " numlock"); + print_sym(knumlock, evdev, " numlock"); } =20 xkb_state_update_mask(state, shift, 0, 0, 0, 0, 0); kshift =3D xkb_state_key_get_one_sym(state, code); if (kbase !=3D kshift && knumlock !=3D kshift) { - print_sym(kshift, qcode, " shift"); + print_sym(kshift, evdev, " shift"); } =20 xkb_state_update_mask(state, altgr, 0, 0, 0, 0, 0); kaltgr =3D xkb_state_key_get_one_sym(state, code); if (kbase !=3D kaltgr) { - print_sym(kaltgr, qcode, " altgr"); + print_sym(kaltgr, evdev, " altgr"); } =20 xkb_state_update_mask(state, altgr | shift, 0, 0, 0, 0, 0); kaltgrshift =3D xkb_state_key_get_one_sym(state, code); if (kshift !=3D kaltgrshift && kaltgr !=3D kaltgrshift) { - print_sym(kaltgrshift, qcode, " shift altgr"); + print_sym(kaltgrshift, evdev, " shift altgr"); } } =20 @@ -251,16 +250,16 @@ int main(int argc, char *argv[]) "# keysyms. So append them here.\n" "#\n" "\n"); - print_sym(XKB_KEY_Print, Q_KEY_CODE_SYSRQ, ""); - print_sym(XKB_KEY_Sys_Req, Q_KEY_CODE_SYSRQ, ""); - print_sym(XKB_KEY_Execute, Q_KEY_CODE_SYSRQ, ""); + print_sym(XKB_KEY_Print, KEY_SYSRQ, ""); + print_sym(XKB_KEY_Sys_Req, KEY_SYSRQ, ""); + print_sym(XKB_KEY_Execute, KEY_SYSRQ, ""); =20 - print_sym(XKB_KEY_KP_Decimal, Q_KEY_CODE_KP_DECIMAL, " numlock"); - print_sym(XKB_KEY_KP_Separator, Q_KEY_CODE_KP_DECIMAL, " numlock"); + print_sym(XKB_KEY_KP_Decimal, KEY_KPDOT, " numlock"); + print_sym(XKB_KEY_KP_Separator, KEY_KPDOT, " numlock"); =20 - print_sym(XKB_KEY_Alt_R, Q_KEY_CODE_ALT_R, ""); - print_sym(XKB_KEY_ISO_Level3_Shift, Q_KEY_CODE_ALT_R, ""); - print_sym(XKB_KEY_Mode_switch, Q_KEY_CODE_ALT_R, ""); + print_sym(XKB_KEY_Alt_R, KEY_RIGHTALT, ""); + print_sym(XKB_KEY_ISO_Level3_Shift, KEY_RIGHTALT, ""); + print_sym(XKB_KEY_Mode_switch, KEY_RIGHTALT, ""); =20 fprintf(outfile, "\n" --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778324146172725.138257761014; Sat, 9 May 2026 03:55:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wLfFa-0000IS-Bz; Sat, 09 May 2026 06:49:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfF2-0008KT-7g; Sat, 09 May 2026 06:49:05 -0400 Received: from www3579.sakura.ne.jp ([49.212.243.89]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wLfEw-0001b9-3K; Sat, 09 May 2026 06:49:02 -0400 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2S090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:03 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=oD7Oz6DJPKhfTwDBn7qY6uv8mbGy6lFjBZ+noyIIS8w=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323683; v=1; b=bD6DowZ9vH3+48hXLUl9WDyqrz0FsRMdPq2QhGz67RPH3rIEdx5e7wLb7eqPGabc pSs2HvvuuSC/F35DIFrXSZaz9EGXSLggKZWoX4Pk0A7XP3Yz6kx2gcDTBJZtc0VH YL211ORk3pfIU8j/GqqAZqJ6O9fgksq3BbMabrj3zeLwILWnV8E/ikg97XmxKq3U 4jWYKIkwkMaeuspyfs2bCgCyz98XSgqdEK3ROXyOqaYst0C9LU/69UnxlsvEW4hI al1mJXeujZUxFP9mncX4htnUAiqCCfihy6qRIP1u9Dgd2q0A42FetuCX4g6dpQoI AOzpU1u6Q7x7YzyiGz5zgA== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:39 +0900 Subject: [PATCH RFC 27/28] ui/console: Remove qemu_text_console_put_qcode() MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-27-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=1398; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=SdvuE7+61fSYB2dvpKio7pECbok4Voz8EgqzbYNskqY=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gduea/xDD8+0iFSx6dMSvZKmm7bRp6U1wyyw3EjKL 2KnKXdHKQuDGBeDrJgiS0rRbm6N6NpPhQnxLTBzWJlAhjBwcQrARDZEMDKcKF9W0p9y66n4/skx wXMnv6v/8ac21Ophgbs9q63f5i9BDP/rX0W0t4cHb5stee7dBaPp4syrJJTEL2423SuQ/rheyY8 dAA== X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=49.212.243.89; envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1778324147399154100 It is no longer used. Signed-off-by: Akihiko Odaki --- include/ui/console.h | 1 - ui/console.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/include/ui/console.h b/include/ui/console.h index ea267a673a6a..a5e6f4b4d7d8 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -108,7 +108,6 @@ bool qemu_mouse_set(int index, Error **errp); #define QEMU_KEY_CTRL_PAGEDOWN 0xe407 =20 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); diff --git a/ui/console.c b/ui/console.c index 012fbeb007f2..74475d090f6a 100644 --- a/ui/console.c +++ b/ui/console.c @@ -330,12 +330,6 @@ static const int ctrl_linux_to_keysym[] =3D { [KEY_PAGEDOWN] =3D QEMU_KEY_CTRL_PAGEDOWN, }; =20 -bool qemu_text_console_put_qcode(QemuTextConsole *s, int qcode, bool ctrl) -{ - unsigned int lnx =3D 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) { --=20 2.54.0 From nobody Mon May 25 20:34:58 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1778323752114627.186363552912; Sat, 9 May 2026 03:49:12 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1304602.1577520 (Exim 4.92) (envelope-from ) id 1wLfEQ-0001ib-LJ; Sat, 09 May 2026 10:48:26 +0000 Received: by outflank-mailman (output) from mailman id 1304602.1577520; Sat, 09 May 2026 10:48:26 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfEQ-0001gc-EC; Sat, 09 May 2026 10:48:26 +0000 Received: by outflank-mailman (input) for mailman id 1304602; Sat, 09 May 2026 10:48:24 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wLfEO-0001aX-Db for xen-devel@lists.xenproject.org; Sat, 09 May 2026 10:48:24 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1wLfEN-00FIIk-Qi for xen-devel@lists.xenproject.org; Sat, 09 May 2026 12:48:23 +0200 Received: from [10.42.69.5] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 69ff10e4-bab6-0a2a0a5309dd-0a2a4505bea4-12 for ; Sat, 09 May 2026 12:48:23 +0200 Received: from [49.212.243.89] (helo=www3579.sakura.ne.jp) by tlsNG-c201ff.mxtls.expurgate.net with ESMTPS (eXpurgate 4.56.1) (envelope-from ) id 69ff10f4-aaa8-0a2a45050019-31d4f359d627-3 for ; Sat, 09 May 2026 12:48:23 +0200 Received: from h183.csg.ci.i.u-tokyo.ac.jp (h183.csg.ci.i.u-tokyo.ac.jp [133.11.54.183]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 649AlY2T090834 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 9 May 2026 19:48:03 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=temperror header.s=rs20250326 header.d=rsg.ci.i.u-tokyo.ac.jp header.i="@rsg.ci.i.u-tokyo.ac.jp" DKIM-Signature: a=rsa-sha256; bh=xdQOdc7TBZKnyuoO4opRDkTrA3cJx8lBTarnEJcV0aU=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778323683; v=1; b=GIZRVXUprHxdgxXu37WO+oDE2tz2qK9qCDhUVa6i501Q91fZ3ewidrfX+a8lpkAF 6GqCbMHjs4ZNM/T0U3JUUNO0lOuRgt45WaPhjxfRUQzQ7L41jedjZJWipNEubGOE phEjj2/PsKnUryJDy3atw73TABpx0Y4RKe2xapC3S35WIb2p/Sj+GgbMhxfd+I70 AZYj1bbqe2j25S7YFoc+uJIXEsy4Kj2NTOTGcdZAcyrOD159de5VRjVD/hXBc01L nZ1SauA8vcN6tXKEc/UJt4UHl2gikPAmNjculIMWV+molbtmhbb9DaqjVYaa6FS5 4ThCfIkHGRDhexBedKxrCQ== From: Akihiko Odaki Date: Sat, 09 May 2026 19:34:40 +0900 Subject: [PATCH RFC 28/28] ui/input: Remove unused QKeyCode helpers and keymaps MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-input-v1-28-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> References: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260509-input-v1-0-66f18d2edde6@rsg.ci.i.u-tokyo.ac.jp> To: qemu-devel@nongnu.org Cc: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Jan Kiszka , Peter Maydell , Stefano Stabellini , Anthony PERARD , "Edgar E. Iglesias" , Mark Cave-Ayland , Gerd Hoffmann , "Michael S. Tsirkin" , Thomas Huth , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-arm@nongnu.org, xen-devel@lists.xenproject.org, qemu-ppc@nongnu.org, =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Akihiko Odaki X-Mailer: b4 0.16-dev-16047 X-Developer-Signature: v=1; a=openpgp-sha256; l=10998; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=C1sfssKpLnbwImq0G/bJG/Pt5wdJQR3NAMSed0uq3qA=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQ+Z/gTsvbv/RVWZK0P/Ye32FUfvZF0LeavN4fqxacE/m2 LZffzYc7yhlYRDjYpAVU2RJKdrNrRFd+6kwIb4FZg4rE8gQBi5OAZiINAfD/zyXjrvBn7VsX/38 oJZuI3cv/2e13IRlN6JljeY/jlVWsWX4nz7hxrV1iZZ5b0xCA5OvZrmoHWAssvl9n2vl1as9GzJ yuQE= X-Developer-Key: i=odaki@rsg.ci.i.u-tokyo.ac.jp; a=openpgp; fpr=AEDC03C9AF734F2EC26A7BFFA4BAEAA73536753C X-purgate-ID: tlsNG-c201ff/1778323703-D8B78443-CA7F16EE/0/0 X-purgate-type: clean X-purgate-size: 11000 X-ZM-MESSAGEID: 1778323753125154100 Their users have migrated to Linux key codes. Signed-off-by: Akihiko Odaki --- include/ui/input.h | 50 -------------------------------------------------- ui/input-keymap.c | 39 --------------------------------------- ui/input.c | 18 +----------------- ui/meson.build | 15 --------------- 4 files changed, 1 insertion(+), 121 deletions(-) diff --git a/include/ui/input.h b/include/ui/input.h index caa757ea1c2e..6e4892b73155 100644 --- a/include/ui/input.h +++ b/include/ui/input.h @@ -58,18 +58,13 @@ void qemu_input_event_send_impl(QemuConsole *src, QemuI= nputEvent *evt); void qemu_input_event_sync(void); void qemu_input_event_sync_impl(void); =20 -void qemu_input_event_send_key(QemuConsole *src, KeyValue *key, bool down); void qemu_input_event_send_key_linux(QemuConsole *src, unsigned int lnx, bool down); void qemu_input_event_send_key_number(QemuConsole *src, int num, bool down= ); -void qemu_input_event_send_key_qcode(QemuConsole *src, QKeyCode q, bool do= wn); void qemu_input_event_send_key_delay(uint32_t delay_ms); int qemu_input_key_number_to_qcode(unsigned int nr); unsigned int qemu_input_key_number_to_linux(unsigned int nr); -int qemu_input_key_value_to_number(const KeyValue *value); -int qemu_input_key_value_to_qcode(const KeyValue *value); unsigned int qemu_input_key_value_to_linux(const KeyValue *value); -int qemu_input_qcode_to_scancode(QKeyCode qcode, bool down, int *codes); int qemu_input_linux_to_scancode(unsigned int lnx, bool down, int *codes); int qemu_input_linux_to_qcode(unsigned int lnx); =20 @@ -94,96 +89,51 @@ void qemu_input_check_mode_change(void); void qemu_add_mouse_mode_change_notifier(Notifier *notify); void qemu_remove_mouse_mode_change_notifier(Notifier *notify); =20 -extern const guint qemu_input_map_atset1_to_qcode_len; -extern const guint16 qemu_input_map_atset1_to_qcode[]; - extern const guint qemu_input_map_atset1_to_linux_len; extern const guint16 qemu_input_map_atset1_to_linux[]; =20 extern const guint qemu_input_map_linux_to_qcode_len; extern const guint16 qemu_input_map_linux_to_qcode[]; =20 -extern const guint qemu_input_map_qcode_to_atset1_len; -extern const guint16 qemu_input_map_qcode_to_atset1[]; - extern const guint qemu_input_map_linux_to_atset1_len; extern const guint16 qemu_input_map_linux_to_atset1[]; =20 -extern const guint qemu_input_map_qcode_to_atset2_len; -extern const guint16 qemu_input_map_qcode_to_atset2[]; - extern const guint qemu_input_map_linux_to_atset2_len; extern const guint16 qemu_input_map_linux_to_atset2[]; =20 -extern const guint qemu_input_map_qcode_to_atset3_len; -extern const guint16 qemu_input_map_qcode_to_atset3[]; - extern const guint qemu_input_map_linux_to_atset3_len; extern const guint16 qemu_input_map_linux_to_atset3[]; =20 extern const guint qemu_input_map_qcode_to_linux_len; extern const guint16 qemu_input_map_qcode_to_linux[]; =20 -extern const guint qemu_input_map_qcode_to_qnum_len; -extern const guint16 qemu_input_map_qcode_to_qnum[]; - extern const guint qemu_input_map_linux_to_qnum_len; extern const guint16 qemu_input_map_linux_to_qnum[]; =20 -extern const guint qemu_input_map_qcode_to_sun_len; -extern const guint16 qemu_input_map_qcode_to_sun[]; - extern const guint qemu_input_map_linux_to_sun_len; extern const guint16 qemu_input_map_linux_to_sun[]; =20 -extern const guint qemu_input_map_qnum_to_qcode_len; -extern const guint16 qemu_input_map_qnum_to_qcode[]; - extern const guint qemu_input_map_qnum_to_linux_len; extern const guint16 qemu_input_map_qnum_to_linux[]; =20 -extern const guint qemu_input_map_usb_to_qcode_len; -extern const guint16 qemu_input_map_usb_to_qcode[]; - extern const guint qemu_input_map_usb_to_linux_len; extern const guint16 qemu_input_map_usb_to_linux[]; =20 -extern const guint qemu_input_map_win32_to_qcode_len; -extern const guint16 qemu_input_map_win32_to_qcode[]; - extern const guint qemu_input_map_win32_to_linux_len; extern const guint16 qemu_input_map_win32_to_linux[]; =20 -extern const guint qemu_input_map_x11_to_qcode_len; -extern const guint16 qemu_input_map_x11_to_qcode[]; - extern const guint qemu_input_map_x11_to_linux_len; extern const guint16 qemu_input_map_x11_to_linux[]; =20 -extern const guint qemu_input_map_xorgevdev_to_qcode_len; -extern const guint16 qemu_input_map_xorgevdev_to_qcode[]; - -extern const guint qemu_input_map_xorgkbd_to_qcode_len; -extern const guint16 qemu_input_map_xorgkbd_to_qcode[]; - extern const guint qemu_input_map_xorgkbd_to_linux_len; extern const guint16 qemu_input_map_xorgkbd_to_linux[]; =20 -extern const guint qemu_input_map_xorgxquartz_to_qcode_len; -extern const guint16 qemu_input_map_xorgxquartz_to_qcode[]; - extern const guint qemu_input_map_xorgxquartz_to_linux_len; extern const guint16 qemu_input_map_xorgxquartz_to_linux[]; =20 -extern const guint qemu_input_map_xorgxwin_to_qcode_len; -extern const guint16 qemu_input_map_xorgxwin_to_qcode[]; - extern const guint qemu_input_map_xorgxwin_to_linux_len; extern const guint16 qemu_input_map_xorgxwin_to_linux[]; =20 -extern const guint qemu_input_map_osx_to_qcode_len; -extern const guint16 qemu_input_map_osx_to_qcode[]; - extern const guint qemu_input_map_osx_to_linux_len; extern const guint16 qemu_input_map_osx_to_linux[]; =20 diff --git a/ui/input-keymap.c b/ui/input-keymap.c index 2b77ef09fd66..ec2a1fbc1a95 100644 --- a/ui/input-keymap.c +++ b/ui/input-keymap.c @@ -4,36 +4,21 @@ =20 #include "standard-headers/linux/input.h" =20 -#include "ui/input-keymap-atset1-to-qcode.c.inc" #include "ui/input-keymap-atset1-to-linux.c.inc" #include "ui/input-keymap-linux-to-qcode.c.inc" -#include "ui/input-keymap-qcode-to-atset1.c.inc" #include "ui/input-keymap-linux-to-atset1.c.inc" -#include "ui/input-keymap-qcode-to-atset2.c.inc" #include "ui/input-keymap-linux-to-atset2.c.inc" -#include "ui/input-keymap-qcode-to-atset3.c.inc" #include "ui/input-keymap-linux-to-atset3.c.inc" #include "ui/input-keymap-qcode-to-linux.c.inc" -#include "ui/input-keymap-qcode-to-qnum.c.inc" #include "ui/input-keymap-linux-to-qnum.c.inc" -#include "ui/input-keymap-qcode-to-sun.c.inc" #include "ui/input-keymap-linux-to-sun.c.inc" -#include "ui/input-keymap-qnum-to-qcode.c.inc" #include "ui/input-keymap-qnum-to-linux.c.inc" -#include "ui/input-keymap-usb-to-qcode.c.inc" #include "ui/input-keymap-usb-to-linux.c.inc" -#include "ui/input-keymap-win32-to-qcode.c.inc" #include "ui/input-keymap-win32-to-linux.c.inc" -#include "ui/input-keymap-x11-to-qcode.c.inc" #include "ui/input-keymap-x11-to-linux.c.inc" -#include "ui/input-keymap-xorgevdev-to-qcode.c.inc" -#include "ui/input-keymap-xorgkbd-to-qcode.c.inc" #include "ui/input-keymap-xorgkbd-to-linux.c.inc" -#include "ui/input-keymap-xorgxquartz-to-qcode.c.inc" #include "ui/input-keymap-xorgxquartz-to-linux.c.inc" -#include "ui/input-keymap-xorgxwin-to-qcode.c.inc" #include "ui/input-keymap-xorgxwin-to-linux.c.inc" -#include "ui/input-keymap-osx-to-qcode.c.inc" #include "ui/input-keymap-osx-to-linux.c.inc" =20 int qemu_input_linux_to_qcode(unsigned int lnx) @@ -44,19 +29,6 @@ int qemu_input_linux_to_qcode(unsigned int lnx) return qemu_input_map_linux_to_qcode[lnx]; } =20 -int qemu_input_key_value_to_number(const KeyValue *value) -{ - if (value->type =3D=3D KEY_VALUE_KIND_QCODE) { - if (value->u.qcode.data >=3D qemu_input_map_qcode_to_qnum_len) { - return 0; - } - return qemu_input_map_qcode_to_qnum[value->u.qcode.data]; - } else { - assert(value->type =3D=3D KEY_VALUE_KIND_NUMBER); - return value->u.number.data; - } -} - int qemu_input_key_number_to_qcode(unsigned int nr) { return qemu_input_linux_to_qcode(qemu_input_key_number_to_linux(nr)); @@ -70,11 +42,6 @@ unsigned int qemu_input_key_number_to_linux(unsigned int= nr) return qemu_input_map_qnum_to_linux[nr]; } =20 -int qemu_input_key_value_to_qcode(const KeyValue *value) -{ - return qemu_input_linux_to_qcode(qemu_input_key_value_to_linux(value)); -} - unsigned int qemu_input_key_value_to_linux(const KeyValue *value) { switch (value->type) { @@ -89,12 +56,6 @@ unsigned int qemu_input_key_value_to_linux(const KeyValu= e *value) } } =20 -int qemu_input_qcode_to_scancode(QKeyCode qcode, bool down, int *codes) -{ - return qemu_input_linux_to_scancode(qemu_input_map_qcode_to_linux[qcod= e], - down, codes); -} - int qemu_input_linux_to_scancode(unsigned int lnx, bool down, int *codes) { int keycode =3D lnx < qemu_input_map_linux_to_qnum_len ? diff --git a/ui/input.c b/ui/input.c index e3e277117949..2524abaedf7b 100644 --- a/ui/input.c +++ b/ui/input.c @@ -352,14 +352,6 @@ void qemu_input_event_sync(void) replay_input_sync_event(); } =20 -void qemu_input_event_send_key(QemuConsole *src, KeyValue *key, bool down) -{ - unsigned int lnx =3D qemu_input_key_value_to_linux(key); - - g_free(key); - qemu_input_event_send_key_linux(src, lnx, down); -} - void qemu_input_event_send_key_linux(QemuConsole *src, unsigned int lnx, bool down) { @@ -383,15 +375,7 @@ void qemu_input_event_send_key_linux(QemuConsole *src,= unsigned int lnx, void qemu_input_event_send_key_number(QemuConsole *src, int num, bool down) { unsigned int lnx =3D qemu_input_key_number_to_linux(num); - qemu_input_event_send_key_qcode(src, lnx, down); -} - -void qemu_input_event_send_key_qcode(QemuConsole *src, QKeyCode q, bool do= wn) -{ - KeyValue *key =3D g_new0(KeyValue, 1); - key->type =3D KEY_VALUE_KIND_QCODE; - key->u.qcode.data =3D q; - qemu_input_event_send_key(src, key, down); + qemu_input_event_send_key_linux(src, lnx, down); } =20 void qemu_input_event_send_key_delay(uint32_t delay_ms) diff --git a/ui/meson.build b/ui/meson.build index 4aa2a38c52f4..0b810925d2db 100644 --- a/ui/meson.build +++ b/ui/meson.build @@ -149,36 +149,21 @@ if spice.found() endif =20 keymaps =3D [ - ['atset1', 'qcode'], ['atset1', 'linux'], ['linux', 'qcode'], - ['qcode', 'atset1'], ['linux', 'atset1'], - ['qcode', 'atset2'], ['linux', 'atset2'], - ['qcode', 'atset3'], ['linux', 'atset3'], ['qcode', 'linux'], - ['qcode', 'qnum'], ['linux', 'qnum'], - ['qcode', 'sun'], ['linux', 'sun'], - ['qnum', 'qcode'], ['qnum', 'linux'], - ['usb', 'qcode'], ['usb', 'linux'], - ['win32', 'qcode'], ['win32', 'linux'], - ['x11', 'qcode'], ['x11', 'linux'], - ['xorgevdev', 'qcode'], - ['xorgkbd', 'qcode'], ['xorgkbd', 'linux'], - ['xorgxquartz', 'qcode'], ['xorgxquartz', 'linux'], - ['xorgxwin', 'qcode'], ['xorgxwin', 'linux'], - ['osx', 'qcode'], ['osx', 'linux'], ] =20 --=20 2.54.0