Re: [PATCH RFC 02/28] ui/input: Remove QAPI wrappers from QemuInputEvent

2026-05-09 Thread Akihiko Odaki

On 2026/05/10 15:01, [email protected] wrote:

On Sat, 09 May 2026 19:34:14 +0900, Akihiko Odaki 
 wrote:

Hi,



diff --git a/ui/input.c b/ui/input.c
index 52ab7beb942..a3ced08429e 100644
--- a/ui/input.c
+++ b/ui/input.c
@@ -159,16 +159,55 @@ void qmp_input_send_event(const char *device,
[ ... skip 30 lines ... ]
+g_assert_not_reached();
+}
+
+evt.key.key.type = KEY_VALUE_KIND_QCODE;
+evt.key.key.u.qcode.data = code;
+evt.key.key = *qapi->u.key.data->key;


You are overwriting the QCODE/code with this assignment. Swap the lines?



I will remove evt.key.key = *qapi->u.key.data->key. It is likely to be 
an artifact of rebase.


Regards,
Akihiko Odaki



Re: [PATCH RFC 02/28] ui/input: Remove QAPI wrappers from QemuInputEvent

2026-05-09 Thread marcandre . lureau
On Sat, 09 May 2026 19:34:14 +0900, Akihiko Odaki 
 wrote:

Hi,

>
> diff --git a/ui/input.c b/ui/input.c
> index 52ab7beb942..a3ced08429e 100644
> --- a/ui/input.c
> +++ b/ui/input.c
> @@ -159,16 +159,55 @@ void qmp_input_send_event(const char *device,
> [ ... skip 30 lines ... ]
> +g_assert_not_reached();
> +}
> +
> +evt.key.key.type = KEY_VALUE_KIND_QCODE;
> +evt.key.key.u.qcode.data = code;
> +evt.key.key = *qapi->u.key.data->key;

You are overwriting the QCODE/code with this assignment. Swap the lines?

-- 
Marc-André Lureau 




[PATCH RFC 02/28] ui/input: Remove QAPI wrappers from QemuInputEvent

2026-05-09 Thread Akihiko Odaki
QAPI represents union members with wrapper structs and pointer
indirections. They are useful at the QMP boundary, but unnecessary for
QEMU's internal input events and make handlers more verbose.

Define QemuInputEvent as a plain internal tagged union and convert input
handlers, queues, and replay code to access payloads directly.

Signed-off-by: Akihiko Odaki 
---
 include/qemu/typedefs.h  |   2 +-
 include/ui/input.h   |  16 
 chardev/msmouse.c|  10 +--
 chardev/wctablet.c   |   8 +-
 hw/arm/musicpal.c|  11 ++-
 hw/char/escc.c   |  32 +++
 hw/display/xenfb.c   |  32 +++
 hw/input/adb-kbd.c   |   4 +-
 hw/input/adb-mouse.c |  20 ++---
 hw/input/hid.c   |  36 
 hw/input/ps2.c   |  67 +++
 hw/input/stellaris_gamepad.c |   9 +-
 hw/input/virtio-input-hid.c  |  53 +---
 hw/m68k/next-kbd.c   |   9 +-
 replay/replay-events.c   |   2 +-
 replay/replay-input.c| 101 +-
 ui/input-legacy.c|  23 ++---
 ui/input.c   | 197 ---
 ui/vdagent.c |  18 ++--
 19 files changed, 305 insertions(+), 345 deletions(-)

diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
index 8bd1f3c0f0ea..5580e1fc4aba 100644
--- a/include/qemu/typedefs.h
+++ b/include/qemu/typedefs.h
@@ -93,7 +93,7 @@ typedef struct QBool QBool;
 typedef struct QDict QDict;
 typedef struct QEMUBH QEMUBH;
 typedef struct QemuConsole QemuConsole;
-typedef struct InputEvent QemuInputEvent;
+typedef struct QemuInputEvent QemuInputEvent;
 typedef struct QEMUCursor QEMUCursor;
 typedef struct QEMUFile QEMUFile;
 typedef struct QemuMutex QemuMutex;
diff --git a/include/ui/input.h b/include/ui/input.h
index 1f6487a3d376..bcca0f886f84 100644
--- a/include/ui/input.h
+++ b/include/ui/input.h
@@ -18,6 +18,22 @@
 typedef struct QemuInputHandler QemuInputHandler;
 typedef struct QemuInputHandlerState QemuInputHandlerState;
 
+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, 
QemuConsole *src,
 QemuInputEvent *evt)
 {
 MouseChardev *mouse = MOUSE_CHARDEV(dev);
-InputMoveEvent *move;
-InputBtnEvent *btn;
 
 /* Ignore events if serial mouse powered down. */
 if (!MSMOUSE_PWR(mouse->tiocm)) {
@@ -135,14 +133,12 @@ static void msmouse_input_event(DeviceState *dev, 
QemuConsole *src,
 
 switch (evt->type) {
 case INPUT_EVENT_KIND_REL:
-move = evt->u.rel.data;
-mouse->axis[move->axis] += move->value;
+mouse->axis[evt->rel.axis] += evt->rel.value;
 break;
 
 case INPUT_EVENT_KIND_BTN:
-btn = evt->u.btn.data;
-mouse->btns[btn->button] = btn->down;
-mouse->btnc[btn->button] = true;
+mouse->btns[evt->btn.button] = evt->btn.down;
+mouse->btnc[evt->btn.button] = true;
 break;
 
 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, 
QemuConsole *src,
  QemuInputEvent *evt)
 {
 TabletChardev *tablet = (TabletChardev *)dev;
-InputMoveEvent *move;
-InputBtnEvent *btn;
 
 switch (evt->type) {
 case INPUT_EVENT_KIND_ABS:
-move = evt->u.abs.data;
-tablet->axis[move->axis] = move->value;
+tablet->axis[evt->abs.axis] = evt->abs.value;
 break;
 
 case INPUT_EVENT_KIND_BTN:
-btn = evt->u.btn.data;
-tablet->btns[btn->button] = btn->down;
+tablet->btns[evt->btn.button] = evt->btn.down;
 break;
 
 default:
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 19c12715378b..b9a2295e75d2 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1068,8 +1068,7 @@ static void musicpal_key_event(DeviceState *dev, 
QemuConsole *src,
QemuInputEvent *evt)
 {
 musicpal_key_state *s = MUSICPAL_KEY(dev);
-InputKeyEvent *key = evt->u.key.data;
-int qcode = qemu_input_key_value_to_qcode(key->key);
+int qcode = qemu_input_key_value_to_qcode(&evt->key.key);
 uint32_t