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
>
>

Reply via email to