From nobody Sat May 30 18:38:27 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 1778668997953232.62033416935333; Wed, 13 May 2026 03:43:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN710-0004al-RV; Wed, 13 May 2026 06:40:34 -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 1wN70b-00049F-8A; Wed, 13 May 2026 06:40: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 1wN70V-0002YB-Ot; Wed, 13 May 2026 06:40: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 64DAcPdP044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:54 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=3PTtI8wZma/BvQGXxn7cS2TOS6Ro5EjNGD2ikFoIUhU=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668734; v=1; b=J9RP9AWaW/aWfcdyG34wRjINQ7TNETJiJjJHj+tHfea9juuDmoyiyQSEREyUkgPp IdRcv9r5NX7UVAEouIpt5Yvej2B/vGcI/sJkFvGFJEU0zG5wY5Fy4FQcSM9YVy6R F0ONgCXJr39AGNmYy3TawdLDAqMZATzB/8+FZqjVMiABKq/vTP6/14O5bE27+e+J lei8BII5DnLde+o0VpRNQmRbs9ZroQpWF7co5Cqy0OnIDKZXYimyCrXmPWEaPiFO N5ghULfvH59OkfBvIbu5PcYCC8vjDV+6VsuUOtwuUlMAoizFjr+QTbSc0oiRYVsT Vc/Bc4aTS61xiuTAaO07jg== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:17 +0900 Subject: [PATCH v2 01/29] ui/input: Introduce QemuInputEvent typedef MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260513-input-v2-1-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=3qKuXrISGRWSIYKb75LW7Ng12F0fR/1kkjjhh8+MPFQ=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyMrsI9qHFyy01DPu1M4IKwq9aTnjhEfsmzMncxt5P aWerhPsKGVhEONikBVTZEkp2s2tEV37qTAhvgVmDisTyBAGLk4BmMjSeIZ/6v+vM2V67L6cX2b2 58zR/epL6zVuzdMtbdQraj/u2WX+kJFhV5/r8Y6ZWXd6Gn+du2X35FLEjw1nXJlXLvxRsflQqM4 kNgA= 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: 1778668999562158500 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 07f2ae7c9f1e..da7097c54401 100644 --- a/include/qemu/typedefs.h +++ b/include/qemu/typedefs.h @@ -94,6 +94,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 52c164bde572..c455abdec6af 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 83676eb7fea5..ae171710e349 100644 --- a/hw/arm/musicpal.c +++ b/hw/arm/musicpal.c @@ -1066,7 +1066,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 8e9953bda435..c71174e13762 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 966023d4f4d7..759855c67e8a 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 Sat May 30 18:38:27 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 1778669146880605.9129965370632; Wed, 13 May 2026 03:45:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN711-0004b9-36; Wed, 13 May 2026 06:40: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 1wN70d-0004DE-8A; Wed, 13 May 2026 06:40: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 1wN70X-0002ZA-6r; Wed, 13 May 2026 06:40:10 -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 64DAcPdQ044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:54 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=BpQW9AVRYkQ765Zs6xqZabFS3/BzVCHPEjaxd4rCcxQ=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668734; v=1; b=D/MFPc1rY3Wkw8t6ejpANC70vzpTYnU5jQHNyNUsjLbYmCW1DVOsiI8HMlwGO7K2 aq0I5mZO0xsBE2459PYKV4g8GKWGC9fjcA03ZNte/vsLVrzE8lmhu7Zyq/KYm+J/ rhr9I93r5fsMtl2iAoezsWT1nK1UetaNLgVEy6jQrPU1GHZqrh3w9a3s5oNjmqTm 0e63BQ5dwZDbvJOLVHeO3wBd+NDMhpDcySm4H23+PQ2llPEJ2E1KT1tCeEuI+4oY VHauhYMDJ63qF6FZxY9x6iYCQbi43myMUd8multBJgeVRcYRhnWH30y/swL27MBD EKwDimnp8nk/LB3ZgVrXsA== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:18 +0900 Subject: [PATCH v2 02/29] 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: <20260513-input-v2-2-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=59087; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=plYYaF/nozWhqTKACzzm98y1T+ByOBdyLyE34XFYMm4=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyCrW1zulMp7WZmgeNXueLPRO6uWpJI05DMvuP/9gl iAcvaCgo5SFQYyLQVZMkSWlaDe3RnTtp8KE+BaYOaxMIEMYuDgFYCKGRgz/XeYIZ1w+Z2isy5pw Kj1N/A7HoUlqq66Yc/e1zD4ZHfHYi5Fh712ZHWZO/n/E7Hyv35y2jjVWNXjH7aMT9hncEKh5s2I BJwA= 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: 1778669148683158500 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 | 177 +++++++++++++++++++++++++--------------= ---- ui/vdagent.c | 18 ++--- 19 files changed, 299 insertions(+), 331 deletions(-) diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h index da7097c54401..2344c92182ea 100644 --- a/include/qemu/typedefs.h +++ b/include/qemu/typedefs.h @@ -94,7 +94,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 c455abdec6af..0b8c439fca74 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 ae171710e349..43c93cb72d75 100644 --- a/hw/arm/musicpal.c +++ b/hw/arm/musicpal.c @@ -1069,8 +1069,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 @@ -1113,14 +1112,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); @@ -1129,10 +1128,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 c71174e13762..82d2cbae7cc5 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 759855c67e8a..97c473f40a2b 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,54 @@ 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; + 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.down =3D qapi->u.key.data->down; + break; + } =20 - 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); + 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,7 +216,7 @@ static void qemu_input_event_trace(QemuConsole *src, Qe= muInputEvent *evt) { const char *name; int qcode, idx =3D -1; - InputKeyEvent *key; + QemuInputKeyEvent *key; InputBtnEvent *btn; InputMoveEvent *move; InputMultiTouchEvent *mtt; @@ -188,16 +226,16 @@ static void qemu_input_event_trace(QemuConsole *src, = QemuInputEvent *evt) } switch (evt->type) { case INPUT_EVENT_KIND_KEY: - key =3D evt->u.key.data; - switch (key->key->type) { + key =3D &evt->key; + 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(key->key.u.number.dat= a); name =3D QKeyCode_str(qcode); - trace_input_event_key_number(idx, key->key->u.number.data, + trace_input_event_key_number(idx, key->key.u.number.data, name, key->down); break; case KEY_VALUE_KIND_QCODE: - name =3D QKeyCode_str(key->key->u.qcode.data); + name =3D QKeyCode_str(key->key.u.qcode.data); trace_input_event_key_qcode(idx, name, key->down); break; case KEY_VALUE_KIND__MAX: @@ -206,22 +244,22 @@ static void qemu_input_event_trace(QemuConsole *src, = QemuInputEvent *evt) } break; case INPUT_EVENT_KIND_BTN: - btn =3D evt->u.btn.data; + btn =3D &evt->btn; name =3D btn->button < INPUT_BUTTON__MAX ? InputButton_str(btn->bu= tton) : "invalid"; trace_input_event_btn(idx, name, btn->down); break; case INPUT_EVENT_KIND_REL: - move =3D evt->u.rel.data; + move =3D &evt->rel; name =3D move->axis < INPUT_AXIS__MAX ? InputAxis_str(move->axis) = : "invalid"; trace_input_event_rel(idx, name, move->value); break; case INPUT_EVENT_KIND_ABS: - move =3D evt->u.abs.data; + move =3D &evt->abs; name =3D move->axis < INPUT_AXIS__MAX ? InputAxis_str(move->axis) = : "invalid"; trace_input_event_abs(idx, name, move->value); break; case INPUT_EVENT_KIND_MTT: - mtt =3D evt->u.mtt.data; + mtt =3D &evt->mtt; name =3D mtt->axis < INPUT_AXIS__MAX ? InputAxis_str(mtt->axis) : = "invalid"; trace_input_event_mtt(idx, name, mtt->value); break; @@ -251,8 +289,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 +326,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 +360,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 +372,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 +409,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 +463,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 +513,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 +527,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 +543,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 +558,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 Sat May 30 18:38:27 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 1778669153553543.5263319829334; Wed, 13 May 2026 03:45:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70v-0004Ot-7m; Wed, 13 May 2026 06:40:29 -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 1wN70W-00041U-32; Wed, 13 May 2026 06:40:04 -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 1wN70Q-0002U6-Qe; Wed, 13 May 2026 06:40: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 64DAcPdR044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:54 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=V2vpcZGcvosxBrWzNCTMDzqaSpzXJBuutR9ILf7Q9sE=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668734; v=1; b=c3pYwf6/mK3anDLcwnEOe/GnvNLFg/UaLZFXm8eiLeE75+yex2TC9iKIoeguzl7t Z8JJQL/FdnATMFQ2sJyYIL8SedwQWhDKEm10Aq6hsKvj4fsauXyZCEu5pvTJFzHg Ac1yTFdiR9+W9YHFWJKUmxzE2+ckHCkovr9cfQu/4RNA/dGgx68pUab1as7B+/KJ i9adqIxpdIocuQUXGclNrtnhs9xLtiYO74Vv0hRXooGSKUp00nmvw/7EOMnp73+C QHzdZr2SVpfVOyAfHzYvt1i3nJZAsdKLN6iysaCuCSigetni0xDPfg1n60R3RB6p 53FkFv1CgxXtn5vUUT2Usw== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:19 +0900 Subject: [PATCH v2 03/29] 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: <20260513-input-v2-3-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=13419; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=ICg9/MxMUzQMb7xW3IgqjRSRtj/aZoiEPGWid0YCexg=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyKq3j9ZM3vS3IYLb4sG3ri36bqZpRXuDjNjurMjf2 DNrzjunjlIWBjEuBlkxRZaUot3cGtG1nwoT4ltg5rAygQxh4OIUgIm4PWb4H809ZcuinkYW54bq cNGSuU8eB95f8jckIjmDedU31kchIQz/ndKz+XbxT67cGJCcafBBh3GL0GWbsx0SLiLdb5b8uLa WGQA= 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: 1778669154713158500 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 | 34 +++++++--------------------------- ui/trace-events | 1 - 14 files changed, 29 insertions(+), 70 deletions(-) diff --git a/include/ui/input.h b/include/ui/input.h index 0b8c439fca74..3c3dfa7b59df 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 43c93cb72d75..f436bd13d912 100644 --- a/hw/arm/musicpal.c +++ b/hw/arm/musicpal.c @@ -1069,7 +1069,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 82d2cbae7cc5..176796cbf62f 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 97c473f40a2b..9232dd7fdae9 100644 --- a/ui/input.c +++ b/ui/input.c @@ -180,8 +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 code; evt.key.down =3D qapi->u.key.data->down; break; } @@ -215,7 +214,7 @@ 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; QemuInputKeyEvent *key; InputBtnEvent *btn; InputMoveEvent *move; @@ -227,21 +226,8 @@ static void qemu_input_event_trace(QemuConsole *src, Q= emuInputEvent *evt) switch (evt->type) { case INPUT_EVENT_KIND_KEY: key =3D &evt->key; - switch (evt->key.key.type) { - case KEY_VALUE_KIND_NUMBER: - qcode =3D qemu_input_key_number_to_qcode(key->key.u.number.dat= a); - name =3D QKeyCode_str(qcode); - trace_input_event_key_number(idx, key->key.u.number.data, - name, 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); - break; - case KEY_VALUE_KIND__MAX: - /* keep gcc happy */ - break; - } + name =3D QKeyCode_str(key->key); + trace_input_event_key_qcode(idx, name, key->down); break; case INPUT_EVENT_KIND_BTN: btn =3D &evt->btn; @@ -357,12 +343,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 @@ -372,8 +352,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)) { @@ -414,7 +394,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 c1ea56874ee9..1c0d96a92c39 100644 --- a/ui/trace-events +++ b/ui/trace-events @@ -127,7 +127,6 @@ vnc_tight_zlib_init(void *state, int stream_id, const v= oid *opaque) "VNC tight z =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 Sat May 30 18:38:27 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 177866904238894.07492966779523; Wed, 13 May 2026 03:44:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70s-0004KD-Hd; Wed, 13 May 2026 06:40:28 -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 1wN70S-00040j-VB; Wed, 13 May 2026 06:40:04 -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 1wN70M-0002Q8-Mp; Wed, 13 May 2026 06:40:00 -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 64DAcPdS044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:54 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=zo6sYmfUSDjLdkyNRS5+urMVJNaxveRevJkcPwrUzdc=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668735; v=1; b=rl1z0q1tWrOjSnBB2kO+elJqInZuZ2JcLUavP3Ke7FzAoB8qd9ZOA4ooUI/afElg oXkc0VEujLbaTPeFB21VBsy6tQSXxk+NUOAEy+3jSphCtPMsv6FqT4vlKEFiL27u jSFdhU5imPmul0ywASrUy3j9dADrV25Srn3FEt/EutYTKr2vH/cGGXC1SPDuMVoc SvG+aWUOBXzAnF2csWh9hpJoO53LSasC/mxJz67VC43J0EqE6iokvutP/74C+r7R 4yd9jG34HAArMtFToXaZAK2+FbDZQXuUkJvGl8yoginv+HGIt6BM6kbtRSy/VS1Y H2P1fbAnV/VDf9pKKv2ahA== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:20 +0900 Subject: [PATCH v2 04/29] 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: <20260513-input-v2-4-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=21764; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=qcM+X1d/U9So+Egar2UgSykshJ1YR5luTpTc88Elwyk=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyOqjjvek7VT02veq9fh8YHxR//Hl8dfr0ifonNV4s LNMXuNIRykLgxgXg6yYIktK0W5ujejaT4UJ8S0wc1iZQIYwcHEKwEQOSjEytM/UzLoziSncIVbt Ro3e9tRzt2PLfLL+zldt47bu2RJ3juF/6P/dpc/XSEpWy/j/F/zxNGMtw6noc6+Ul76bxvkvJj2 ODwA= 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: 1778669043874158500 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 3c3dfa7b59df..e76dd4b172aa 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); @@ -107,52 +112,94 @@ void qemu_remove_mouse_mode_change_notifier(Notifier = *notify); 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 f436bd13d912..c8985a58f993 100644 --- a/hw/arm/musicpal.c +++ b/hw/arm/musicpal.c @@ -1069,7 +1069,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 176796cbf62f..218f37f07400 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 9232dd7fdae9..5d155e3af072 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; @@ -226,7 +211,7 @@ static void qemu_input_event_trace(QemuConsole *src, Qe= muInputEvent *evt) switch (evt->type) { case INPUT_EVENT_KIND_KEY: key =3D &evt->key; - name =3D QKeyCode_str(key->key); + name =3D QKeyCode_str(qemu_input_linux_to_qcode(key->key)); trace_input_event_key_qcode(idx, name, key->down); break; case INPUT_EVENT_KIND_BTN: @@ -343,19 +328,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; } @@ -390,17 +362,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(); @@ -412,8 +391,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 1b8f71796e40..1504e27248f3 100644 --- a/ui/meson.build +++ b/ui/meson.build @@ -1,21 +1,35 @@ 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 Sat May 30 18:38:27 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 1778669154699290.77492983830484; Wed, 13 May 2026 03:45:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70v-0004Oh-5D; Wed, 13 May 2026 06:40:29 -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 1wN70P-00040H-0K; Wed, 13 May 2026 06:39:58 -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 1wN70M-0002Q6-IF; Wed, 13 May 2026 06:39:56 -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 64DAcPdT044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:55 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=aLM6N6GfPMXT/Dyyq93/Kd26hw7nsVW+P5nkMjY0fK4=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668735; v=1; b=GS185QR6pjVyi5cnpta3/qDr2LJV/0n/2sYe2e2kzhm0yNtVh6g3Rx6r21ixu+Dh Hvhb05x4kMU+tHoHtbMerw6PJgGa3TpA8uMsTHDRlbxX8qzHn7J4lSBrj+xaoB9T IPLQLgd5TqdMshI+r3ESHtMDErtuR0xn2VXDIfXPyhmBUJQ6LKmzgoLx95bePbp5 802PhcMFvZilR4UfvFxx5tcV+A49kaRXlDnyG6fLJL/WVkkf1vecuXg+L9I+PI5C znCZb42LooQaE9psoX3yjt4Jm0mOL2XL+lGNYjwEcGX8O1VI6mzOfahemiMvwqlS /vaR/zKLtgb4Oh94w4ykJw== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:21 +0900 Subject: [PATCH v2 05/29] ui/input: Prohibit sending KEY_RESERVED MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260513-input-v2-5-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=958; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=9/7ez5xuk9jdnoso/psewP+978HfdB0j7SVfWdhgZ1o=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyGrNlBd9nenr9HWuHinj1mL45+bUErJyc1j4z3dt/ /ftjgrsKGVhEONikBVTZEkp2s2tEV37qTAhvgVmDisTyBAGLk4BmEgIF8NfseIjXqqPwice6vNX 3+HyysO/IkH0kPHtzykMEZaTDBv1GRmufkjVe7ryiOs1/YMve7rbLH9ffHDe51Hpt5Ddp1awrA9 mBQA= 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: 1778669156567158500 xenfb and virtio-input no longer need key mapping because they operate on Linux key codes, but removing the key mapping code loses the ability to filter out KEY_RESERVED. Drop KEY_RESERVED at the common input event entry point so the logic is shared by both devices and no downstream input handler receives KEY_RESERVED accidentally. Signed-off-by: Akihiko Odaki --- ui/input.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui/input.c b/ui/input.c index 5d155e3af072..8ed225591de1 100644 --- a/ui/input.c +++ b/ui/input.c @@ -328,6 +328,10 @@ void qemu_input_event_send_impl(QemuConsole *src, Qemu= InputEvent *evt) =20 void qemu_input_event_send(QemuConsole *src, QemuInputEvent *evt) { + if (evt->type =3D=3D INPUT_EVENT_KIND_KEY && !evt->key.key) { + return; + } + if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) { return; } --=20 2.54.0 From nobody Sat May 30 18:38:27 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 1778668862008273.4174315888083; Wed, 13 May 2026 03:41:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN709-0003xU-5R; Wed, 13 May 2026 06:39: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 1wN6zy-0003oZ-Mk; Wed, 13 May 2026 06:39:30 -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 1wN6zv-0002M5-Hw; Wed, 13 May 2026 06:39:30 -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 64DAcPdU044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:55 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=Wa/39F+04wvk/3sw0LdWXu6e6UT6EMJxoHKpwqH3YnA=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668735; v=1; b=jV2wXUZ/ntOqoJkqlaM0T1VD/TAssgSkfB1AnmY8V+O29SvVaOeiTUig3Mx1fh9z vjH49dllhjJ51y1tz8I117n2/Ue8eRUW/f7+fzS4iZzUefFjr28B4HOMK1tqHoyp D50OGELyVmakF/wQ2+d0iE7vMz1YFLhQSn1wTsAvRsSG8w1rJ+51lwdtnewjn8Nb x+HsGC3lCSr1Fke/FWLGQXf0gt9AngfFALvE8nnUmDPclpmulhd4SdXv80RWWt1f I+ziitFEHyNd8mrPN3R6oLBxde5kfOdHEfn+OdasMamXOYblh9p47L0GunWrcq2A wNIecgpep7K8yTc23Ja22A== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:22 +0900 Subject: [PATCH v2 06/29] 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: <20260513-input-v2-6-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=4212; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=yBs2XkK8SdnlzUdhMyqUvaBx4FYfQGi2njirhdzzkbI=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyJq15/LXvlj6SMr8k63bdTP/D1PEdz5WESmW9FzMN Fv+XXlCRykLgxgXg6yYIktK0W5ujejaT4UJ8S0wc1iZQIYwcHEKwERCmxgZntc9nN7qHnlxqxPj Qwax8ieRMdqyb87fuTM/fq/E0UlWggz/y5zDT/3N9Mq/rvbR55FBboHrYfEnewNZI67suean83s HBwA= 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: 1778668864349158500 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 cfa940d4c666..691040f5948d 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -109,6 +109,8 @@ bool qemu_mouse_set(int index, Error **errp); =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 /* consoles */ diff --git a/ui/console.c b/ui/console.c index 6f6330d61f18..fd1038a22c0b 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 "ui/vgafont.h" #include "hw/core/qdev.h" @@ -302,36 +303,57 @@ void qemu_text_console_put_keysym(QemuTextConsole *s,= int keysym) qemu_text_console_handle_keysym(s, keysym); } =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 Sat May 30 18:38:27 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 1778668839371321.246191990296; Wed, 13 May 2026 03:40:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70h-0004IG-O2; Wed, 13 May 2026 06:40:17 -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 1wN70T-00041A-4r; Wed, 13 May 2026 06:40:04 -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 1wN70N-0002Qw-MO; Wed, 13 May 2026 06:39:59 -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 64DAcPdV044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:55 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=SjvIqgpgBFGFEIxg+SoWpC62iYtER4MBUNmqsWwxNXE=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668735; v=1; b=rN5iDsI8FmL5tjixT6jigwICcFKiFOFN3GfhY5FpjzkK6nHO9feskho7U4ajX37X k8nJY0pbMQFr+vxFxTyd1nBkvi23jz6HlBe1NRb67ddag1EHB3J4ks/NzQ2cV9SR 1KOPrID0zJbAM+QiZenxzWPo9kjVp5X249WbY8RlT22wQJE3oMYRIHb/eA6JNctL PkD0NszVap+/uOxRvy2Z5MbjHuw25h41Y4s/MW+qrSQp0Krm0tkRS1gw1hFROjuH KNnzjrEzIaLgAKPhVaU3yQpyGPbxlhwAonX0vDspP226pv+QEbSmRSG+bVl8AP7j ymNN3IxMHg/PoiJrnoRFCg== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:23 +0900 Subject: [PATCH v2 07/29] 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: <20260513-input-v2-7-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=qjgD1DspjovVSpZHwXtsnCOPBp0/5nPZrIK4nq+79Lw=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyJqbcfUWWekCFnk5FsvEpRsOn3+68VBW+ZqtD3nqu rRU3nd2lLIwiHExyIopsqQU7ebWiK79VJgQ3wIzh5UJZAgDF6cATKTfkuF/hZ5lyb7Ee99/Tluu 820i87sOYYd4/lm3dPQ360fMXfAkmuF/jNDfdpE/Rw8+rjntPZU5t/fSZLYDDf+59DjzekOWJ6V xAQA= 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: 1778668842504158500 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 b8e5c57b148c..24f4542f3121 100644 --- a/ui/dbus-console.c +++ b/ui/dbus-console.c @@ -343,7 +343,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 @@ -359,7 +359,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 2c61b601f781..757ee80fa6a6 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 6822c097be72..a448efab3202 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 56dd43d53ff2..4269b19d1489 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -1799,8 +1799,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) @@ -1907,7 +1910,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 98394cdc507c..ee53e7c72ed1 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -767,7 +767,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 @@ -889,34 +890,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 @@ -1023,7 +1052,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]; } @@ -1038,7 +1069,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 Sat May 30 18:38:27 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 1778668831515748.4268188637108; Wed, 13 May 2026 03:40:31 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN700-0003q0-RB; Wed, 13 May 2026 06:39:33 -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 1wN6zy-0003oD-7d; Wed, 13 May 2026 06:39:30 -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 1wN6zv-0002Py-8k; Wed, 13 May 2026 06:39:29 -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 64DAcPdW044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:55 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=Jme2qak9fem7HpSyVrF+VPDNbYZN4gemYhEUzDKqhcQ=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668736; v=1; b=CEK14OQxvDSl6LuCtMQuyZRUxX1vG2YJf7g0AUiUGON174g2HSjjlasAJFVSEd60 DhLI+8qyBkaVxGjdzwnOfuHVYZUwToGBZLWQnyMDpI6IYy7tiQ6jQFSXzW5GLgVg z2CHsdZtBgBbgbOFSasuadFn1dScikcqPyTIpsXsLgaIwlyAecqlWKacWtWsZz+/ 1MIGCVZ1l6HS7E2cRjy92FIcvEvWHXceTLe6itMc+lqC+KWLLzAY4whD/dgaAauc b07jUYXRpDItPaLHNNCtJX13Df8HpKPQ5og6hyTw6lb0hbIRuhuGppzOqZSpK9pS Z2VWRfvNJL/zwg8rSsHdYA== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:24 +0900 Subject: [PATCH v2 08/29] 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: <20260513-input-v2-8-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=3QyoWo2AYgietZaPQHCqWKFFehZaWLCy1MMurbof3XA=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyNrAM48P1H15IXpx2aFZdlurvjKUvF0ktu3GvM8OD AUHPVL1OkpZGMS4GGTFFFlSinZza0TXfipMiG+BmcPKBDKEgYtTACbiOYvhf7bsLaHtpWW3bCXs wzY36G74+oDb8H+w20tboRLmqZLanIwMO3n/Fr/YsVM9bPt3BZ+wL41aYu/dDRK+FD586Zt79tt dTgA= 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: 1778668835791158500 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 c8985a58f993..e2630243eb7f 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" @@ -1069,40 +1070,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 Sat May 30 18:38:27 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 1778669136796346.8514166912033; Wed, 13 May 2026 03:45:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70v-0004Ow-8Q; Wed, 13 May 2026 06:40:29 -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 1wN70W-00041T-2N; Wed, 13 May 2026 06:40:04 -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 1wN70R-0002VW-JT; Wed, 13 May 2026 06:40: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 64DAcPdX044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:56 +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=1778668736; v=1; b=IENMLS4g4HezFpdd9ImBlc/fT36I3s2vGqjdUUHyfR8BnGa/AhKKfGF4BMvI+6OF U1eMkmGpLvchHaFVIeCfYZkIjZ4eyXhTXFYO2ToSLEYbbnVRRHKR99iyupFenZZV fG8J7b/2i+oBiFVmgfVupuq5rNUtrShy9PWNqFNTJzEUmuy9x6sb6g7+kMJ+ytQi /D5a84guoG6jnFf7DZZ+dvaAOdllM736k6C1xvXxXuaXaPRw3jKZ7pklKbBE/drl NA4E+Bq4yDhTmVlzl1VBfbUKbsTOIo98BeKdP9mt/PZkDWFSOOufGGgzW1E0Z+6/ OqwTh4J8BNMJtlGqXR+0Cw== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:25 +0900 Subject: [PATCH v2 09/29] 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: <20260513-input-v2-9-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyLrOK2yLBMQM/gS1nXs4Q3qK6K0jc8qP/1hqnifo9 /+vSMPtjlIWBjEuBlkxRZaUot3cGtG1nwoT4ltg5rAygQxh4OIUgInoVjD8rzv35Pt9z/d138Ls Yku7XoVuLo4U2hcp++N5MmNltUL1Sob/tYtqbt3X6Hg7//TK0sl550KZVmk6PvjTUiairsBocEO HCQA= 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: 1778669138454158500 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 Sat May 30 18:38:27 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 1778669078190396.566064223441; Wed, 13 May 2026 03:44:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN705-0003vo-Pr; Wed, 13 May 2026 06:39:37 -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 1wN6zz-0003pD-Bs; Wed, 13 May 2026 06:39:31 -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 1wN6zv-0002P0-NE; Wed, 13 May 2026 06:39:31 -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 64DAcPdY044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:56 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=w+G4mYrT3E579hEsUmrs6jCM3wwxrAco3XtOrTTZDg4=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668736; v=1; b=pxfbA1V9MSpA+URvfP2D0sZR3oZPBGQtGyVjKql1G0Dv7Kjn7wYSigPL33726gNv G/tRjOEDpoWqQ+supKYbPtVM1wUztlGpPgE05EK8+c+i+UGn8gGGKrUgsvZ/2D4R vu1cf4fUvjorsrk0fS7A7Bh0IlJfF9I2/TQ4mV7/OhR4TDRFgbufA21I5Ps2U6N4 ctruCUzXQHJKkGtCC8WBGcw/1DAEnXoKCDj14v1N10FCMSthdP68ZKhVJFcktwjb xVLFDzGbZS4B9ok+jF4yrbTEYZtYk115DCyBequ4lczBYRvUPu7EQ9dbxfp2j+hV 2YEYIBF/vQg30ESvA1Sctw== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:26 +0900 Subject: [PATCH v2 10/29] 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: <20260513-input-v2-10-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=XcfBuuudisNZMFU+Lz64jMl2gKGv+YTeVpp7yLYFGCs=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyDpG48/zzm+ctJ2nvXZH5pt7Cu36a18bLTYzvjnre dWeec4rOkpZGMS4GGTFFFlSinZza0TXfipMiG+BmcPKBDKEgYtTACayIYWR4V7AR59Qg6uhUz5Z PNkvp7jp9G7nrFfv5Dm+L1zp9MCPP4/hf7mRyGbVadbhkvPm5K//Ldzz9F1u+GpuneyOdbuDzcI ZGQA= 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: 1778669079963158500 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 218f37f07400..ae302b217fe9 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 Sat May 30 18:38:27 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 1778668909018167.21221134895586; Wed, 13 May 2026 03:41:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70z-0004Xt-DC; Wed, 13 May 2026 06:40:33 -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 1wN70W-00041V-2v; Wed, 13 May 2026 06:40:04 -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 1wN70O-0002RG-6b; Wed, 13 May 2026 06:40: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 64DAcPdZ044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:56 +0900 (JST) (envelope-from odaki@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=1778668736; v=1; b=WgWTJZNHXy/UJQ1cp0Ud0o3j+q9u6En+dCrk98/Yy91QnoJTI3YjboxHZcmDJ5t5 fo0nOcdm57DSglwh5TYMrg7WpBSvaULWkHuR/IYqq2p5j59Uhk6JHPQzwf9HO2Cq g6fYNT3O37gz+H00R7c/P7S6o+I9c3pcSpEGUQAZvz0SmiMOB8MLNJKUABGAbnN+ oWHBAZ1pXVAgQXTNexmgeZWGFl0KZwEJoQjNpKaTS2Lil6eKTI0rDb0cqqrhR/iw 0WNLNV6E0+ftv/cOw8CtEBMsNr1qNLxXPFovBxuyY4Kw/meXblsjBRUY4Y4a9J9W noIplkJ4IqEhY44ORDubZQ== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:27 +0900 Subject: [PATCH v2 11/29] 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: <20260513-input-v2-11-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyPp+9l9KN3Seh699f+/hfrcSXv0Ny9NYfj8r1F6o9 SVy53vDjlIWBjEuBlkxRZaUot3cGtG1nwoT4ltg5rAygQxh4OIUgIn8m87wP7vb/HVkhMTM3uCO 9nl+r8+auhWXOmuJPZu9fTLjm8aEaYwMfdsC0yq+qigln07n5y438+lOdNmYeTPfzdJq03uu7zN 4AQ== 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, UPPERCASE_75_100=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: 1778668910666158500 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 Sat May 30 18:38:27 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 1778669024992467.91818346657897; Wed, 13 May 2026 03:43:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70w-0004SK-B9; Wed, 13 May 2026 06:40:30 -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 1wN70T-00041B-4t; Wed, 13 May 2026 06:40:04 -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 1wN70N-0002Qn-88; Wed, 13 May 2026 06:39:58 -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 64DAcPda044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:56 +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=1778668737; v=1; b=vCNxWvLDQB7VRjG7AGRYnv1kNGXTDei3BoRuKRHc2QOtgn8aE+1BLKU6jhKt/dBC V6vX6TFl7QTQQsfNttvdSa8YN8XTE9k9cCvzSB1pWa7zx05si5c411R+QffrztIG E+Gd2Am8NSgiBPhJqKSkf3lkzuZknR64YZyfFy7b5RQ9SyXdyRgioPekyMThpYT0 BeFFomMEUb4efcdBZhTPmilv96XS2tq1JQt06r4T12IBiK9Uq0iJtu0ihAMTNIuR tVr5fFgThSCA3Q/T2SVFhaKhjKrmyv+VI3k+pWGNLm5xTw91zqHzdlz9JTkt+tFr qsXJZcnnpx68Ud1OZHWIsA== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:28 +0900 Subject: [PATCH v2 12/29] 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: <20260513-input-v2-12-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyAYNccHpfJPOex+SVGH85CoQvtRZo9DsKv+zLRl33 +bFWJ/tKGVhEONikBVTZEkp2s2tEV37qTAhvgVmDisTyBAGLk4BmIj0SkaGv7xtGUuYBJdN650S 7x5YFfz2UtAtdpG83Cq7SEXbhElXGP6n7DG4wx11nYPh+Z83OlNjryppse/JNFib3MXiI3LhlRs HAA== 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: 1778669027624158500 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 Sat May 30 18:38:27 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 1778669141261589.2524561683707; Wed, 13 May 2026 03:45:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70y-0004WA-EF; Wed, 13 May 2026 06:40:32 -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 1wN70T-00040k-0T; Wed, 13 May 2026 06:40:04 -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 1wN70N-0002Qr-Dz; Wed, 13 May 2026 06:39:59 -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 64DAcPdb044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:57 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=np+DDHtPXccYUqkjVcTnB/XI0jqPO74kxFNXv7P7G5A=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668737; v=1; b=vT0JG0CpBPmnY9cdIzCwYXqXlPxp8WZkvD9sGKyKeGldZR0fPNHk5QFdQBh+fGVN F1VdUfZQ4SMFIIOsCzDOYJYWOeJWbibVoaqbgKrhu652I6kqZbU16stcpe+f50Wg H9fqO1IbQWMxXok/yD9Kpr5GNeZIOn3zcLGtD7Cr2LyTA9f8jhNhTPjiB2FOrNTY yOdT2NqrfIYwOUKXGVcpQxjtz4WlTehfYJyBN55dS2cWAwdSohengA7roziE5kDB 0D0RuFpAKdFwcTyL6AHmATqlU1iHn453AizjPdtV92V/E0b5c7jQTSSFoIStVlyE 3ubD2AdmmhCQmdziKB6z1A== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:29 +0900 Subject: [PATCH v2 13/29] 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: <20260513-input-v2-13-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=7874; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=Ae9vuWLzKV99hiDeipjG2FLc+ZAAXG2DeDzyFVZrokg=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyAbXjEe6yddUHupyKUZn8P9YVnZpj93Xc5f+hxsfe 3rCbMW1jlIWBjEuBlkxRZaUot3cGtG1nwoT4ltg5rAygQxh4OIUgInccWT4Z9Yunui6d53nnvh0 ttonapNPC2oYli2ROhnPL7et4Oj3WkaGO8fE71zZt1HgxeJJL3ZVVhZOjvZ98qf+4rGje87GPJa z4gEA 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: 1778669142532158500 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 | 51 +++++++++++++++++++++++++----------------------= ---- hw/input/trace-events | 2 +- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/hw/input/ps2.c b/hw/input/ps2.c index 93c3c7372054..f2523ff4bc78 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" @@ -123,20 +124,20 @@ static uint8_t translate_table[256] =3D { 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, }; =20 -static unsigned int ps2_modifier_bit(QKeyCode key) +static unsigned int ps2_modifier_bit(unsigned int 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 Sat May 30 18:38:27 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 1778668886991982.368310275309; Wed, 13 May 2026 03:41:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN702-0003sW-1c; Wed, 13 May 2026 06:39:34 -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 1wN6zy-0003oF-Cu; Wed, 13 May 2026 06:39:30 -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 1wN6zv-0002M0-Ir; Wed, 13 May 2026 06:39:30 -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 64DAcPdc044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:57 +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=1778668737; v=1; b=QkKtR7qX8AO9ItMseAHnIDDcoqAXaqeSr1rrrVXOLmd8T+w6uamHIfwn9jRWxhjC N1Kj2V25g+7JdpzSdccGxt2jmyEJHpLsQif0lWUOPN4ekZ/+rceEAzhAmzyOdLGE gAZBP2kOUbEI63+w4IqQ6PDyhlBywmg49uO3udq+7eqNbCdmdLbUbQ0qT7sdJ3Iz a/ZxeBNk/U3D2GOxrJETeJaxN3Hs/KMegUGiYwvdt9121pS8myczkdIFYcCsvovH VnVjGoWIU9mANfk5m2hnMaNENILa34lWp8lycrXR4ji4vWQrn5z9iyaWT5h1XviI VUKNRYJx7Aqk1vrNcDaxRw== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:30 +0900 Subject: [PATCH v2 14/29] 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: <20260513-input-v2-14-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyMabJvE6JcwWry/d85eLXly/ZnGR7d/Ye53f+HzmT V8VXfq4o5SFQYyLQVZMkSWlaDe3RnTtp8KE+BaYOaxMIEMYuDgFYCL/OxgZJl/3+e3UnV/DuXX7 6d8iK3W+lF+w25Jm5Ob7QLmnyafjBcP/oo36U5MPbF7pd0zB+123xa5iUaOt9jy8eX7bT6n26ez jAwA= 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: 1778668888495158500 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 Sat May 30 18:38:27 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 1778668996256160.35358322597494; Wed, 13 May 2026 03:43:16 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN72P-0007tJ-8x; Wed, 13 May 2026 06:42:03 -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 1wN725-0007bq-3Y; Wed, 13 May 2026 06:41:41 -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 1wN722-0003pV-W6; Wed, 13 May 2026 06:41:40 -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 64DAcPdd044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:57 +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=1778668737; v=1; b=bqjNUc1zuLft3jaenrHt4idaiDQVz6TDoRK2tNb3C0dWY+T0in+K8oojrc2rKacQ NtCfK/vAfq9FnBpEv6kyZtjQaRTQFhFmHKQloUoI6y0Mh7weWgU7FJttpIVB8ytM XSICwe0B23TS11clq/qMzDcyq13LBxp+JzHnByDueseJYMYYbTf68pEOTSdCHot+ ejQZwTpFY/kihTEEqdhuqPqoQ9LdlQMHuNixmy8Qz/hg8+YAqoOEPCgVJkgfTNLX qZdcZvRFQhJSqO27BKArxc93xTyWVfOk7zUvBwvRLsbpeYglZUndR3hC69AF9Gvt j2bQnJH6Yxt2sOAkBlgRJQ== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:31 +0900 Subject: [PATCH v2 15/29] 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: <20260513-input-v2-15-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyKbubQc4Zx7VXiC2leF/N/PyugdJvkb/ZVZFz2vwn zVBYMGrjlIWBjEuBlkxRZaUot3cGtG1nwoT4ltg5rAygQxh4OIUgIlM3cLIcHyN990vJ7QZl8qd /JX6YHJjou/M1JfBj+SLT+cy6u6y2MnIcPn6JjOttocb0jc58dowroyfEMhmLLTt1wOpabO0uS1 /sgEA 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: 1778668997464158500 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 Sat May 30 18:38:27 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 1778669136227950.4446191480022; Wed, 13 May 2026 03:45:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70x-0004UX-7Z; Wed, 13 May 2026 06:40:31 -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 1wN70T-00040p-4H; Wed, 13 May 2026 06:40:04 -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 1wN70P-0002Rn-M4; Wed, 13 May 2026 06:40:00 -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 64DAcPde044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:57 +0900 (JST) (envelope-from odaki@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=1778668738; v=1; b=Ru3LnwGvn/r8yrMIKMxL6ADcxPWqvAlwUbCpJoevR8PFan+VSOHkIk7LwHrd7NiR ODvK/JGvCk8MerUdDmcq7k9fmbAIroGw5dhUpDiat1pA5qkeChXjiP7GxXtK3g13 knds8Y7gOzXFxCXKJybF2QXo21FyOXDXhUGrFc5vMYbW7nPPXFY4MRtBuKcDS9iw YwyA+Ha1FXyGssPyJQJY3d2kh6HgXkm/F1jblnvye7kaukKFgzVuu2x5KaAVJAnY 91EGu7BnHykVPT+jRMQXj/ivD2+FTPKGCa5sfgdOB0dImt5GZAYrc/g3roegLAv+ BKpHRZNvE4yptXpP9LIlRg== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:32 +0900 Subject: [PATCH v2 16/29] replay: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260513-input-v2-16-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyGbdrVFxaYlhyXelZZ/9Slj7p4olc1PZuby1BdIP5 MWOtTV3lLIwiHExyIopsqQU7ebWiK79VJgQ3wIzh5UJZAgDF6cATCRrGsP/4IBFnutvXHHK909a 8fT3pq+nBG72BPRcr30T7qnx6Fq5N8M//WUcBXbrlrwobfh/jmvujMDJIiuOfHljuPjo7VcVFVY MjAA= 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: 1778669136762158500 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 Sat May 30 18:38:27 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 177866898539084.2536044054142; Wed, 13 May 2026 03:43:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70w-0004Sx-P4; Wed, 13 May 2026 06:40:30 -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 1wN70Y-00046Q-LD; Wed, 13 May 2026 06:40:06 -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 1wN70T-0002XE-AM; Wed, 13 May 2026 06:40: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 64DAcPdf044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:58 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=BXVlaUT2MXqSP0qtnJzwgJRdkUX29R76EWnNC2CWrfc=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668738; v=1; b=T3asul+NxdI0COVQ9b0H6y3c6WuAfn1rp6U/245mDCucjH4g137tn+Q+G9KMvJIV IGlF6f2s9wuCM/veSfr7S8q7psyeoLSYewjUYo7jW0CwBoyyVEWqirkpeNjml1DQ J2LVYglBtU+FSO7EgBLhdLnn+B42Q4gkXXcyAYwQor2vlbWPD5X3iKzwOVq4WDNQ 8dieqj2wk5dAhS7IkEdlHuEs1fhv7rHvbfNnrEcrXwMq+v76Lsf4NNWAsYfPdUI6 e5bKA1/jieArEC49qnjx6r9SOEJikeswvaQo/9OstE/TQhpUhIOOGeSk9mWss2Mh Rc4UVRe0/loX5pwLMlK75w== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:33 +0900 Subject: [PATCH v2 17/29] ui/cocoa: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260513-input-v2-17-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=/7fx+R/2c6RdPP5EAOi3qPa5j3wPa1CPCirPsentFpY=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyOYynyv7AncsmCr2/HX0TYefL6q9bFe5MqdXvA7vc vA0mbe6o5SFQYyLQVZMkSWlaDe3RnTtp8KE+BaYOaxMIEMYuDgFYCKOMxn+aZRLGmtnnEi7NEni 9PqjxR81FkZM0BevsVx56s60I3vuMDEy/LKpLXjumWDC03Fs8i32Qrmczd7bea/nhx99sja4N/k aBwA= 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: 1778668987323158500 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 ee53e7c72ed1..5c423f85814e 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" @@ -140,124 +141,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 @@ -265,13 +266,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 */ @@ -767,8 +768,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 @@ -848,7 +848,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 /* @@ -890,62 +890,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 @@ -954,34 +926,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; @@ -989,9 +961,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; @@ -1002,9 +974,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; @@ -1013,16 +985,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)) { @@ -1052,15 +1024,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 @@ -1069,9 +1039,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 Sat May 30 18:38:27 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 17786691372922.2981744764781524; Wed, 13 May 2026 03:45:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN711-0004bV-C8; Wed, 13 May 2026 06:40: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 1wN70X-00044E-NY; Wed, 13 May 2026 06:40:06 -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 1wN70V-0002YV-Of; Wed, 13 May 2026 06:40: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 64DAcPdg044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:58 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=EwTrorDyTXNOzZprZQApTr28BF5pYHegnRMRkjFARHE=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668738; v=1; b=FYLYMOwrUzUrd+9pLoC/5f4bbO7L4LLjQqez7Bmi57GEinQojWNa5vSGmDInscD4 D78btLaQ62FgL0xCtUKvH3iPQKIy/8VPXNN3a2vBK7wt+LuEU1hbQq/5M/lQPDJ+ fHm42aRWyx92ALzJ3yyI5qVnoW+xHQKJfoSe9MP+jWVmW+dTwygg2Pcli9GCk0+w TtuAFVjHJM8t2mYuG/Rw6MhOroJ6BNNqO6KVNMPapSs6IpaGVApRNb2LJ4IvQWIf 7Xf3oIaItgyIoUxgY2i0784yGH2MgdARfgIDp65yUzKjkpiTl923iyiKVSv6AyFj S2qhgm/RbhTDdEbjCBTsIg== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:34 +0900 Subject: [PATCH v2 18/29] ui/dbus: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260513-input-v2-18-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=gB8mTMZK4mduWPbSZb0FvUSTrDoOfUJgikz48+lTqJQ=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyJbGtVHfbsnO1DkfxXPWsWBFibpwP6/BsQ6/UtPka UnK2/g7SlkYxLgYZMUUWVKKdnNrRNd+KkyIb4GZw8oEMoSBi1MAJrLzFCPDa47/Df0cMcfkUt8L OyXF+Tebf5kbW5Z6vKVAbbf8zb0lDL+Yi5VPxBzutNp5LO/GzxSWNVp39kqcULJornu24W7bdl1 2AA== 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: 1778669138451158500 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 24f4542f3121..21eceb24362d 100644 --- a/ui/dbus-console.c +++ b/ui/dbus-console.c @@ -339,11 +339,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 @@ -355,11 +355,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 Sat May 30 18:38:27 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 1778668944951508.0134123989819; Wed, 13 May 2026 03:42:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70b-00046p-1F; Wed, 13 May 2026 06:40:09 -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 1wN70W-00041W-37; Wed, 13 May 2026 06:40:04 -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 1wN70R-0002VT-Ja; Wed, 13 May 2026 06:40: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 64DAcPdh044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:58 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=UtwWNoHakXDZlH8Rzx6fCPY6j3ptlEcoesi8q4S7WAQ=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668738; v=1; b=U49+5ho6llHKTX4kbHuZbYieTKzCHz3aPYddWOyq6fhe2fD7aUd1DLe7/6Db22aO C8ZQGaGhNndQZQ5fIdvkh/31FW4/qN2VnA9wCx2Or+5ngRN1+ZBG6TpqhiCpbXYq zLx+NpFH59Hu1T/9IZypYZZSsAGOA+D3jcpvmPcbpX+s3jo9O/E+4VWkq+xh1WEV FIz1qtMbg6uPEtSopeaQL2N8F+R92d/L7EQ5Y8tfPRnypv19dG+YEjkMAdzgxc0c Jg6UiPbtZEvCLJoLywCjdAGGn0eSu8ZQsbrosqqMwBWNm0yT7VW0VlRkygMeVwPO GEPhRghuQhqJVe0UxM2STg== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:35 +0900 Subject: [PATCH v2 19/29] ui/gtk: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260513-input-v2-19-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=eN5DQMZQnMOfimjnHTbCHgBxz0Xl/1fxGHHvgzb4How=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyNYC4wvRYe8Kf91JbLjwSvDEo3dx6/c+lH7Sms6YM PGW4gq+jlIWBjEuBlkxRZaUot3cGtG1nwoT4ltg5rAygQxh4OIUgImU+jD8L90UGesv+/T5xNcM E3oc9k11UJCR59Fe3l16qOmz8aaNagz/rE6wvuSdk+jP4fsgNLbk8Y+gaz+Xzd3W8sXKp0Jniex EbgA= 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: 1778668947349158500 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 757ee80fa6a6..beb3d2534257 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 Sat May 30 18:38:27 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 1778668985179744.9892788717079; Wed, 13 May 2026 03:43:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70e-0004Go-9U; Wed, 13 May 2026 06:40:12 -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 1wN70P-00040I-09; Wed, 13 May 2026 06:39:58 -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 1wN70M-0002Lx-Gy; Wed, 13 May 2026 06:39:56 -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 64DAcPdi044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:58 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=/WoU4lGhfUf+Gwfd7jBdTN2SQsh5aEl/Q6cpkMQSwyE=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668739; v=1; b=VHdfqrGAF2QfKayYJSIMj843aj67MY4rFgRyWgyBYMDpQPZv2bnnjK8FPXO7EqqR T4Wiry5mA44V30po9n/KQXDddIYNjaig+frXIu3fbuKZU+v5keuIlBMh/BV7hE6B UBs60aU8tglfdXOei0l4+BvbKFErhJUMJwCysrl5tb/hc0z0RItHYf3VxD+izX+o WUsmhR/KWCYM0SsXOTlNbwiBWizJcA3FPo51f+61qpvw7IFT+8Z0xXH/ILGF/44L C+Mfh54fz8A+jx8C1Nflvfan0pXEqqKIXrho1aL8oVi4iouaqogvaPcobBgvksHQ SZNCGlb5QaRqHY0/RrXvWQ== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:36 +0900 Subject: [PATCH v2 20/29] 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: <20260513-input-v2-20-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=S1Kp78IZinQdzXxZR0DnhehmbKKrJ9FGVU6iaznbTls=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyDaWJSc3ckRqXj++4XSV6sXLly+0pf4Pv1RjeWFCj +SzTWudOkpZGMS4GGTFFFlSinZza0TXfipMiG+BmcPKBDKEgYtTACZiYMLw35fr0BTVHHZnMy3t +Zdunby88/mdSW4TqxddSrRvzS5lj2BkWBJfvZfzXPy8U4t27rORb1T9sYKjjk3OVk7fV1NsytR ubgA= 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: 1778668985372158500 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 042f63cc5a18..4c2ff847131a 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 Sat May 30 18:38:27 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 1778669062606867.4897099051822; Wed, 13 May 2026 03:44:22 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN708-0003xT-9a; Wed, 13 May 2026 06:39: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 1wN6zz-0003pY-Hi; Wed, 13 May 2026 06:39:31 -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 1wN6zv-0002MA-Nn; Wed, 13 May 2026 06:39:31 -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 64DAcPdj044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:59 +0900 (JST) (envelope-from odaki@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=1778668739; v=1; b=YAG5hHcWJSjMAoa+G6fIaHwHjGGK75KK/tFYuZRh4FCi326sM1dXaJZgIQGORgLx oRZ/hz+/uO6FZNvCIUPmzLTt6YWdhQjr6v4S9uyknkStlBFmD0Pk4MCKjhtWuXmI ctM9J8oIF2sCO/3HttSvsG9zsk5dYa9wj6APQjSQ53YnfedmevdAKUowvs/j9Jo3 PkVf90RCYonVIHNWzzbT4xO9I+gEvDfhhpITBCBF4K0bQ/frptTOHaugYotqcWIz NVBJ8KYK1VAYtz0c47Be/hoo8NcKjSB8z6nri7p3Qqfo3MTy8pJzuvPfc8ZlXdJi 5lX3beWm7ouK7+Hh+bl/gQ== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:37 +0900 Subject: [PATCH v2 21/29] 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: <20260513-input-v2-21-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyLbKfaFy00XeOcjEWNdz950v1wiYkro9SXLS78c8U 6P8f6h0lLIwiHExyIopsqQU7ebWiK79VJgQ3wIzh5UJZAgDF6cATOSiKcNvFuVPgRqy6+uU3de/ iap5+f3IljXLpq1sMLi8U217Z+1de4bf7FKRr5NvJNpIrOEJ5H02pWrSz0MHZR//3TFvm6dx+PY iVgA= 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: 1778669063888158501 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 Sat May 30 18:38:27 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 1778668836597196.15658833054704; Wed, 13 May 2026 03:40:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN707-0003xK-Uf; Wed, 13 May 2026 06:39: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 1wN6zz-0003po-Nu; Wed, 13 May 2026 06:39:32 -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 1wN6zw-0002MB-1I; Wed, 13 May 2026 06:39:31 -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 64DAcPdk044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:59 +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=1778668739; v=1; b=hb+v35JJbdMAkhMg0FEjn7TBDb8oY8TiAg2E0cb+p6DoEeJaCjxJjOPp0v2Nv1N/ HZKaBlgOuk6RiryEw2xvb/0EDnpV5bMOiDyFtKLuOxH6M/XpuhbZTtlrVgMkTO3S wAVXheoMpOarPFAbFJLTjO63nI/jmdEyhbyLC4h7pNk/n0Q2NXnUKo2JIUCITayY 8tReKuLgmRJ6VRp1VR82Rb9I+QTDoeKVUfaY1yauA6Dzz6TETSZ1ARcx4Se1xNUk q9aQ2FJeuwTM+YzckWTg8yrXwvEWQNOCqZRXK52UICUTVKeNYqXTsupFmeiZp3Tx iQSNQy2irRU2co5AgP2pyQ== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:38 +0900 Subject: [PATCH v2 22/29] 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: <20260513-input-v2-22-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyPaCjCY/wSciT+KjCr16LH0+bAnZGT3zmP5+3SOnl /wQNTzbUcrCIMbFICumyJJStJtbI7r2U2FCfAvMHFYmkCEMXJwCMJGztQz/K81qFwtUpcwMONKx Vri85EdC6uOfikvjoy/8mbd3Surdwwz/697vuFtzc5dH1IoNBU6sXbs8Ivx2bpbsrxXccOXklsn PmQE= 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: 1778668840299158500 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 Sat May 30 18:38:27 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 1778668860492943.7475011096724; Wed, 13 May 2026 03:41:00 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN707-0003x4-He; Wed, 13 May 2026 06:39: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 1wN6zz-0003pE-CD; Wed, 13 May 2026 06:39:31 -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 1wN6zv-0002MJ-Kh; Wed, 13 May 2026 06:39:31 -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 64DAcPdl044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:59 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=mtv5CQiiL9+yXaZVzizyS5P1nD5trt4s3x8guX+CpgE=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668739; v=1; b=cP6s6/jKSB9z04JWkaKHIL6ktgTaVbqAyRqrv7OwxmCiqsU5y53Y+2mHFjgLvpzt N/+QGPWp0R2Fv6uQnH4NwlwZHizO7UsRjA4uAdS7W/91td7M85t6ex6+mtwP2p/a xbZnKnwtPGKSTfKsA82JbrUcq/YmuKGiyeSQ/s6IYRFZdxfCKe9PR4Ie2JqCdjWx ReC7zuV2TsKyyr+3fuMyME5x8E/sx+Y0YAZL6511tLbvuHakYCmoMDVSZqWsjPq+ 7+bPpEFECtMfT/xZl6KH397FTfpBmdmHQaPC/09Br8v5yd2k4BOUFFRg/Pq0YC22 NtcsMuDMjO8d/9ZwwqwKiA== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:39 +0900 Subject: [PATCH v2 23/29] ui/keymaps: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260513-input-v2-23-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=JSYEPF6QuhGlyghPcnd/kD7DgQn3AulpARBsJb4qeIk=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyI7sVwnrOCf/SfSaubdx5tS3m8v0FdaGZQhd5fXNk J3ss06no5SFQYyLQVZMkSWlaDe3RnTtp8KE+BaYOaxMIEMYuDgFYCICSxn+p0a+97M1mXPjvuSL lcKyt6N4vrkmMK0JfXF5x1kZsZUWzIwMexdpPssPT/J7vHJ38zNr5tsi9zNb+HZnHpp19O2kC0E feAE= 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: 1778668862309158500 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 a448efab3202..d145b5dd3a8c 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 Sat May 30 18:38:27 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 1778668975774205.22770434164897; Wed, 13 May 2026 03:42:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70e-0004Gw-B5; Wed, 13 May 2026 06:40:12 -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 1wN70S-00040i-Uz; Wed, 13 May 2026 06:40:04 -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 1wN70M-0002M3-H4; Wed, 13 May 2026 06:39:57 -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 64DAcPdm044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:38:59 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=BeDmdmF87mkmfVUY7YUFi3XjHsGOaDxEeosuECxjlQ0=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668739; v=1; b=YsO3N+xZyV8LKzkM4I0a8U9iR/9DSk91ARVezzYqJxoJimXZI/nyc/fWZk52vgWS 7xPx5/OufGcKA1Gffqnlyhtpyy0P9McNMLtVT1DSud0hCILbAxRU8O/EBI/bN2pE 29+78JS1st6v3i/g2O/H9k0KNOrKzc0NbmucRwK0r2lM6ow+AZqkXifoXWXegh2P EYOXn2a+IPIJQa00E1qOAIwND4jjTIkgHjcYnfpFmHvd1r7Ttb+YJZ1ub6sazOlw THfHP/b/uvwHsiqNDc3SnQLkumVfhc1V+7jJVFPWwLXSmjTxPWnKDv4ra8dTEK7I SMH/Tt4cDJgSJ0EWVCaBpA== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:40 +0900 Subject: [PATCH v2 24/29] ui/sdl2: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260513-input-v2-24-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=fh7G7Udb/bSnNJIhIlydE5nrkQNwRf80uhFto9rQzMc=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyM5bTYd/HbC56/1s5o4JJ0UX7CnKUNj/7r6ak9DOZ 7fbVSdt7ChlYRDjYpAVU2RJKdrNrRFd+6kwIb4FZg4rE8gQBi5OAZjIk7cMf7gzTENd4jXmszop 3a/k38QcxVQmWnCb13ia/TqVKz8YzjD8FT3wWmSOdHnmhI0rpQ3TzpTKLIy4GBJevyXn0dZXuod r2AE= 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: 1778668977224158500 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 1c0d96a92c39..20f6bd82bfe5 100644 --- a/ui/trace-events +++ b/ui/trace-events @@ -135,7 +135,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 Sat May 30 18:38:27 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 1778668927830602.5658281946445; Wed, 13 May 2026 03:42:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN701-0003qz-H9; Wed, 13 May 2026 06:39:33 -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 1wN6zy-0003oE-8G; Wed, 13 May 2026 06:39:30 -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 1wN6zv-0002Ly-JG; Wed, 13 May 2026 06:39:29 -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 64DAcPdn044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:39:00 +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=1778668740; v=1; b=JupKtK3uerSTBzxhTpnnAmPB98w4B8V3rLqm03VWEr72aN6TqFSJqpK0TjiP3mEr wVGrXt+tHdgn7r5GiknyE1XOjhQBzWFz38iTrzEW6FYR7J6jr2R3TyQ7YfWSlgOx dNMvxewOtDvgY5p7sr9pN5wIss9zv668zQSNZXiWU6c0uD6gL00kVH06EpCNSsoQ 5/EloJZ2YV4HRb0p+U2b7TgH4EEamGjN5l8ZPLLqjHwZlskUQFu1UF/17luH012L blUWdWHBHYYloAOcMOPqxtyUIzFOU+bYLlqyUGBJURWQwxN3yOaIaYPRVjyTx3XW Bpqiw3fjvjFlBKwTQREshg== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:41 +0900 Subject: [PATCH v2 25/29] ui/spice: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260513-input-v2-25-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyM43s1xd5pR8WrRGJWfqCjPt00xmGdP9r3Om/vwWt n2O5NEDHaUsDGJcDLJiiiwpRbu5NaJrPxUmxLfAzGFlAhnCwMUpABMxe8Twv9zg1rYvc1fwnnas vaB+ZL7iJ9ZJ2Y9ueWYuYI5zvmD62ISRYemjboW1N56f59QN3rvOX/nyOXemxyaeiQorvjiXnzT M4QAA 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: 1778668928899158500 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 Sat May 30 18:38:27 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 1778668837684836.6350260781088; Wed, 13 May 2026 03:40:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN703-0003t6-9A; Wed, 13 May 2026 06:39: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 1wN700-0003q1-5X; Wed, 13 May 2026 06:39:32 -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 1wN6zv-0002Mf-SA; Wed, 13 May 2026 06:39:31 -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 64DAcPdo044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:39:00 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=8soqAAF80Sr/QNu7vy2YY8c+Vx8TG6XRwo59Ykhi4vE=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668740; v=1; b=A3Dw8QeECpJ5707m7w7yKA5+hAigpIBXxu+J2l73XWy8bYxnFuEsXFE0pPuJ6bHd 8pZZgmMk1M9Svm3vfj4PpE6qjxPGGHH8okze6UuTLyNoTPOe8QFaJseF7ujOp3HJ L2LILXxk4Edr5Cf9R5OYOQ5z2hwMfeazzilPcbcWCcG+/XQf47hm1TqUTrxLmcWM DqNORdAHvyfzAEJkDbV8birRbTN+coxrAq4popcP4GyRxi1mahXvq2Dicp/cq+5K BPEVxSGheBwxhoG1qIK9q0l5gK/VRCdBQxg9I2s8fkT5GFPAkDSNOOK7ZJkx65JS kS8SKpKGsB3oz+ukEb/MOQ== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:42 +0900 Subject: [PATCH v2 26/29] ui/vnc: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260513-input-v2-26-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=3926; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=fVMHTWI13jVtYYp754ee7t/4i7+v9d4aNF/ntnvLwpw=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyK53b59vnvX0pukhtZJ2R2fLvHcrVT4uXerKdOtDb 6LLpmnGHaUsDGJcDLJiiiwpRbu5NaJrPxUmxLfAzGFlAhnCwMUpABPZ/ZSR4fjRfR61G3mr1r0I NLIr6vRJPioixdD0+tatUrOVXOL6ixl+Mq4wbzzw+VaLc5LMZNfFM/gr1eQPC5zP0FJcK2TeEDq JGwA= 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: 1778668840284158500 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 4269b19d1489..e14287ca68af 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/console.h" #include "ui/input.h" #include "crypto/hash.h" @@ -1797,13 +1798,10 @@ static void pointer_event(VncState *vs, int button_= mask, int x, int y) qemu_input_event_sync(); } =20 -static void press_key(VncState *vs, QKeyCode qcode) +static void press_key(VncState *vs, unsigned int lnx) { - qkbd_state_key_event(vs->vd->kbd, qemu_input_map_qcode_to_linux[qcode], - true); - - qkbd_state_key_event(vs->vd->kbd, qemu_input_map_qcode_to_linux[qcode], - false); + qkbd_state_key_event(vs->vd->kbd, lnx, true); + qkbd_state_key_event(vs->vd->kbd, lnx, false); } =20 static void vnc_led_state_change(VncState *vs) @@ -1844,15 +1842,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); + unsigned int 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) { qemu_console_unregister_listener(&vs->vd->dcl); qkbd_state_switch_console(vs->vd->kbd, con); @@ -1877,12 +1875,12 @@ static void do_key_event(VncState *vs, int down, 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); } } } @@ -1900,18 +1898,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 Sat May 30 18:38:27 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 1778669093968163.62062293836664; Wed, 13 May 2026 03:44:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70s-0004KQ-I4; Wed, 13 May 2026 06:40:28 -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 1wN70T-00040l-41; Wed, 13 May 2026 06:40:04 -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 1wN70M-0002MT-HJ; Wed, 13 May 2026 06:39:57 -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 64DAcPdp044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:39:00 +0900 (JST) (envelope-from odaki@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=1778668740; v=1; b=P01NLzRzzvogd8TC7cCmIkgRltpFT1xQ7Q6CTkL55ZJmzMiFpla7yteRqseZpuzo dos1VL2zDLgalmh21LTipFl3IosgQmS3wnuKWzfSWlCReOLuNixXZHp+jKoIfCwX uq2tuaI3DyhomGUmDokN3ciHe19++I9HLjggU7Po87xrI7w/IJ3n4g2YjDA4km6l KrGRb38iva0+uNqjuzF+O9grsu9+6/nOmupYgXW+zHs+ijaYuFA5KCcReLERqHVH YK6rR/DJm5D0LgezvseO3VkWUBYCz4sf0DP4VcyA9CKIe1ZKq4DMr70p2Ek5c4pU VeNn88+SVI09XX0bnthSLw== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:43 +0900 Subject: [PATCH v2 27/29] qemu-keymap: Use Linux key codes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260513-input-v2-27-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyO45gtd7fkffvbc5Ia1z1uGlvzpsDgTf/nYt+5z4k XtPIj787yhlYRDjYpAVU2RJKdrNrRFd+6kwIb4FZg4rE8gQBi5OAZjI7A8M/32OTpNPO6Fi7szE OLNvrhu/3qugmRJz/p1PlvrHcM7l7SOGPzwHs9JYmnl+2Hfb8lzPky1iDtc64vlbmrnr9KTrv11 jOQA= 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: 1778669096131158500 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 Sat May 30 18:38:27 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 1778669090271194.09222123888117; Wed, 13 May 2026 03:44:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70x-0004U2-4J; Wed, 13 May 2026 06:40:31 -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 1wN70S-00040h-Qg; Wed, 13 May 2026 06:40:04 -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 1wN70M-0002QS-Rp; Wed, 13 May 2026 06:39:57 -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 64DAcPdq044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:39:00 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=RyTCIvwVaozeLTAhpbHAq66Za8rIDYOF4QelkPaMxcQ=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668740; v=1; b=Q3I4olhyAMBayNLNuhohUxb8Tu7GY037MXW5+AF9/LyzlI6gmqJDh7elh0044AIm wBGZ/sQgOMwRFygVqI4QUaF5UuLuf/MZ7X04QtgWA5s0/LYBWU7ovSAejJPW+iYp bcQO4BOuELVcPdK6nQdFnPje9vaFejxioqcdu4chpyOP8cTbVNQI2YmUpc9Ro+Yl dUtBZ6tdkoflKC01tVFJcH68ub8etNsPfSB6BYvlpqIXzftcXgOqBWG4JGSPwvgp b3LBQZEoVI1+1JJynAsAc9XqM65Gns1aWwl13m8LTdPHQeYiE0gsQaQt4p6y8jLI KM7P0VnmIJld1iqh2GJp+w== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:44 +0900 Subject: [PATCH v2 28/29] 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: <20260513-input-v2-28-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=ThSU88la05KIjFwROp/cneKNiRlHnev55PgTZdXOqEg=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyJ7t1zs7Fu16Hb+R45t/mW9C7BrnTYFJduf3dqQbS z9+UuTQUcrCIMbFICumyJJStJtbI7r2U2FCfAvMHFYmkCEMXJwCMBFnbYa/QgHSUqv3OU44zrqt ua1Hc+qd6TPeSZROY3s7U+PG4gWZ0xgZFs7rrsqr3sT4n7u1Q3b52SixwgdZ3fqJmv9Y2BMNPFa wAwA= 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: 1778669092008158500 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 691040f5948d..a31c5a4995c6 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 fd1038a22c0b..e8c1a4c97906 100644 --- a/ui/console.c +++ b/ui/console.c @@ -328,12 +328,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 Sat May 30 18:38:27 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 1778668982229520.4027203060094; Wed, 13 May 2026 03:43:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wN70A-0003yp-V2; Wed, 13 May 2026 06:39: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 1wN6zy-0003oY-LT; Wed, 13 May 2026 06:39:30 -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 1wN6zv-0002NW-6W; Wed, 13 May 2026 06:39:30 -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 64DAcPdr044648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 13 May 2026 19:39:00 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) DKIM-Signature: a=rsa-sha256; bh=wzSy7BhBV3753cSZvpxQXc4+x4lapLEdwQ5W839IvrM=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Message-Id:To:Subject:Date; s=rs20250326; t=1778668741; v=1; b=rgY48oYYMkNv5I3456s0/8a7lBYZNznFLXbAHWKI1ugx5w4p+9NWNm8Xc0uTx50E i/ce11Qd46JIZE6Hnf932UDPS2i5G4HstyIf7xXwpTxlhvHPWTQvqFy1YeEIx2jl pDP6RuyLrK3IHWHuffwIXWoL8J6n7r26pVVPNiB6mGjC+pQyuty8pde8tf6PlUCC uoXGgN+QNsUK9+bqjrT2au5mfuD9GJyCt8jar+cm/yHkfJ3uSUDgBILUe83QtOfx UQr5WJ61or1uxiZanQCskJdSbelAMdHtFTkZsBIfq/xetk/k3HzxH5EhJJYdNOBW z11vol9x6hmDr23847Km9A== From: Akihiko Odaki Date: Wed, 13 May 2026 19:38:45 +0900 Subject: [PATCH v2 29/29] 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: <20260513-input-v2-29-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> References: <20260513-input-v2-0-b3cc0470308a@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20260513-input-v2-0-b3cc0470308a@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=10968; i=odaki@rsg.ci.i.u-tokyo.ac.jp; h=from:subject:message-id; bh=sRrToD8Du2Cra/tElMjYaRlW3gniuL0AU0Yg/Xk14Pw=; b=owGbwMvMwCWmMbc20y1CyJDxtFoSQxZLyN4lZbOlWYWk9hY870mXWvlK4JDcxFsRBbr7ilgqW TuPFDd0lLIwiHExyIopsqQU7ebWiK79VJgQ3wIzh5UJZAgDF6cATGRDKCPDVbGbjn5djxr13vRf Sni0UyJm48zm5E/BHK7pD2LbLB84M/wzZylcnGU48eHz390y5aqa982EH/mZZE98emTSkW3S17/ wAgA= 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: 1778668983300158500 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 e76dd4b172aa..ea2d944a7ed5 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 @@ -109,96 +104,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 8ed225591de1..c013cd9f7e04 100644 --- a/ui/input.c +++ b/ui/input.c @@ -365,14 +365,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) { @@ -396,15 +388,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 1504e27248f3..bb01f0728e28 100644 --- a/ui/meson.build +++ b/ui/meson.build @@ -1,34 +1,19 @@ 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