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