Hi
On Wed, Jun 10, 2026 at 2:58 PM Marc-André Lureau
<[email protected]> wrote:
>
> Replace the legacy QEMUPutMouseEvent callback with a proper
> QemuInputHandler registration. This eliminates one of the two
> remaining users of the legacy input adapter in ui/input-legacy.c.
>
> Signed-off-by: Marc-André Lureau <[email protected]>
One of the 2 patches missing ack/review in this series,
thanks
> ---
> hw/i386/vmmouse.c | 115
> +++++++++++++++++++++++++++++++++++++--------------
> hw/i386/trace-events | 2 +-
> 2 files changed, 85 insertions(+), 32 deletions(-)
>
> diff --git a/hw/i386/vmmouse.c b/hw/i386/vmmouse.c
> index d54adb34a88..e289bce8e2e 100644
> --- a/hw/i386/vmmouse.c
> +++ b/hw/i386/vmmouse.c
> @@ -68,7 +68,10 @@ struct VMMouseState {
> uint16_t nb_queue;
> uint16_t status;
> uint8_t absolute;
> - QEMUPutMouseEntry *entry;
> + QemuInputHandlerState *hs;
> + int axis[INPUT_AXIS__MAX];
> + int dz;
> + bool btns[INPUT_BUTTON__MAX];
> ISAKBDState *i8042;
> };
>
> @@ -99,39 +102,78 @@ static uint32_t vmmouse_get_status(VMMouseState *s)
> return (s->status << 16) | s->nb_queue;
> }
>
> -static void vmmouse_mouse_event(void *opaque, int x, int y, int dz, int
> buttons_state)
> +static void vmmouse_input_event(DeviceState *dev, QemuConsole *src,
> + QemuInputEvent *evt)
> {
> - VMMouseState *s = opaque;
> + VMMouseState *s = VMMOUSE(dev);
> +
> + switch (evt->type) {
> + case INPUT_EVENT_KIND_BTN:
> + if (evt->btn.down) {
> + if (evt->btn.button == INPUT_BUTTON_WHEEL_UP) {
> + s->dz--;
> + } else if (evt->btn.button == INPUT_BUTTON_WHEEL_DOWN) {
> + s->dz++;
> + }
> + }
> + s->btns[evt->btn.button] = evt->btn.down;
> + break;
> + case INPUT_EVENT_KIND_ABS:
> + if (evt->abs.axis == INPUT_AXIS_X) {
> + s->axis[INPUT_AXIS_X] =
> + qemu_input_scale_axis(evt->abs.value,
> + INPUT_EVENT_ABS_MIN,
> INPUT_EVENT_ABS_MAX,
> + VMMOUSE_MIN_X, VMMOUSE_MAX_X);
> + } else if (evt->abs.axis == INPUT_AXIS_Y) {
> + s->axis[INPUT_AXIS_Y] =
> + qemu_input_scale_axis(evt->abs.value,
> + INPUT_EVENT_ABS_MIN,
> INPUT_EVENT_ABS_MAX,
> + VMMOUSE_MIN_Y, VMMOUSE_MAX_Y);
> + }
> + break;
> + case INPUT_EVENT_KIND_REL:
> + s->axis[evt->rel.axis] += evt->rel.value;
> + break;
> + default:
> + break;
> + }
> +}
> +
> +static void vmmouse_input_sync(DeviceState *dev)
> +{
> + VMMouseState *s = VMMOUSE(dev);
> int buttons = 0;
>
> - if (s->nb_queue > (VMMOUSE_QUEUE_SIZE - 4))
> + if (s->nb_queue > (VMMOUSE_QUEUE_SIZE - 4)) {
> return;
> + }
>
> - trace_vmmouse_mouse_event(x, y, dz, buttons_state);
> -
> - if ((buttons_state & MOUSE_EVENT_LBUTTON))
> + if (s->btns[INPUT_BUTTON_LEFT]) {
> buttons |= VMMOUSE_LEFT_BUTTON;
> - if ((buttons_state & MOUSE_EVENT_RBUTTON))
> + }
> + if (s->btns[INPUT_BUTTON_RIGHT]) {
> buttons |= VMMOUSE_RIGHT_BUTTON;
> - if ((buttons_state & MOUSE_EVENT_MBUTTON))
> + }
> + if (s->btns[INPUT_BUTTON_MIDDLE]) {
> buttons |= VMMOUSE_MIDDLE_BUTTON;
> -
> - if (s->absolute) {
> - x = qemu_input_scale_axis(x,
> - INPUT_EVENT_ABS_MIN, INPUT_EVENT_ABS_MAX,
> - VMMOUSE_MIN_X, VMMOUSE_MAX_X);
> - y = qemu_input_scale_axis(y,
> - INPUT_EVENT_ABS_MIN, INPUT_EVENT_ABS_MAX,
> - VMMOUSE_MIN_Y, VMMOUSE_MAX_Y);
> - } else{
> - /* add for guest vmmouse driver to judge this is a relative packet.
> */
> + }
> + if (!s->absolute) {
> buttons |= VMMOUSE_RELATIVE_PACKET;
> }
>
> + trace_vmmouse_queue_event(s->axis[INPUT_AXIS_X], s->axis[INPUT_AXIS_Y],
> + s->dz, buttons);
> +
> s->queue[s->nb_queue++] = buttons;
> - s->queue[s->nb_queue++] = x;
> - s->queue[s->nb_queue++] = y;
> - s->queue[s->nb_queue++] = dz;
> + s->queue[s->nb_queue++] = s->axis[INPUT_AXIS_X];
> + s->queue[s->nb_queue++] = s->axis[INPUT_AXIS_Y];
> + s->queue[s->nb_queue++] = s->dz;
> + s->dz = 0;
> +
> + if (!s->absolute) {
> + s->axis[INPUT_AXIS_X] = 0;
> + s->axis[INPUT_AXIS_Y] = 0;
> + }
>
> /* need to still generate PS2 events to notify driver to
> read from queue */
> @@ -140,14 +182,25 @@ static void vmmouse_mouse_event(void *opaque, int x,
> int y, int dz, int buttons_
>
> static void vmmouse_remove_handler(VMMouseState *s)
> {
> - if (s->entry) {
> - qemu_remove_mouse_event_handler(s->entry);
> - s->entry = NULL;
> - }
> + g_clear_pointer(&s->hs, qemu_input_handler_unregister);
> }
>
> static void vmmouse_update_handler(VMMouseState *s, int absolute)
> {
> + static const QemuInputHandler vmmouse_abs_handler = {
> + .name = "vmmouse",
> + .mask = INPUT_EVENT_MASK_BTN | INPUT_EVENT_MASK_ABS,
> + .event = vmmouse_input_event,
> + .sync = vmmouse_input_sync,
> + };
> +
> + static const QemuInputHandler vmmouse_rel_handler = {
> + .name = "vmmouse",
> + .mask = INPUT_EVENT_MASK_BTN | INPUT_EVENT_MASK_REL,
> + .event = vmmouse_input_event,
> + .sync = vmmouse_input_sync,
> + };
> +
> if (s->status != 0) {
> return;
> }
> @@ -155,11 +208,11 @@ static void vmmouse_update_handler(VMMouseState *s, int
> absolute)
> s->absolute = absolute;
> vmmouse_remove_handler(s);
> }
> - if (s->entry == NULL) {
> - s->entry = qemu_add_mouse_event_handler(vmmouse_mouse_event,
> - s, s->absolute,
> - "vmmouse");
> - qemu_activate_mouse_event_handler(s->entry);
> + if (s->hs == NULL) {
> + const QemuInputHandler *h = s->absolute ?
> + &vmmouse_abs_handler : &vmmouse_rel_handler;
> + s->hs = qemu_input_handler_register(DEVICE(s), h);
> + qemu_input_handler_activate(s->hs);
> }
> }
>
> diff --git a/hw/i386/trace-events b/hw/i386/trace-events
> index 5fa5e93b68d..1920212332a 100644
> --- a/hw/i386/trace-events
> +++ b/hw/i386/trace-events
> @@ -133,7 +133,7 @@ port92_write(uint8_t val) "port92: write 0x%02x"
>
> # vmmouse.c
> vmmouse_get_status(void) ""
> -vmmouse_mouse_event(int x, int y, int dz, int buttons_state) "event: x=%d
> y=%d dz=%d state=%d"
> +vmmouse_queue_event(int x, int y, int dz, int buttons_state) "event: x=%d
> y=%d dz=%d state=%d"
> vmmouse_init(void) ""
> vmmouse_read_id(void) ""
> vmmouse_request_relative(void) ""
>
> --
> 2.54.0
>
>