@samitouri / QOSamiQemu / commits / ac5fd852ba

hw/i386/vmmouse: convert to QemuInputHandler API

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 <marcandre.lureau@redhat.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com>

Marc-André Lureau committed Jun 8, 2026 at 13:05 UTC ac5fd852ba15de9858463eb6857a4aa205f449f6
2 files changed +85 -32
hw/i386/trace-events
+1 -1
@@ -134,7 +134,7 @@ port92_write(uint8_t val) "port92: write 0x%02x"
134
135 # vmmouse.c
136 vmmouse_get_status(void) ""
137 -vmmouse_mouse_event(int x, int y, int dz, int buttons_state) "event: x=%d y=%d dz=%d state=%d"
137 +vmmouse_queue_event(int x, int y, int dz, int buttons_state) "event: x=%d y=%d dz=%d state=%d"
138 vmmouse_init(void) ""
139 vmmouse_read_id(void) ""
140 vmmouse_request_relative(void) ""
hw/i386/vmmouse.c
+84 -31
@@ -68,7 +68,10 @@ struct VMMouseState {
68 uint16_t nb_queue;
69 uint16_t status;
70 uint8_t absolute;
71 - QEMUPutMouseEntry *entry;
71 + QemuInputHandlerState *hs;
72 + int axis[INPUT_AXIS__MAX];
73 + int dz;
74 + bool btns[INPUT_BUTTON__MAX];
75 ISAKBDState *i8042;
76 };
77
@@ -99,39 +102,78 @@ static uint32_t vmmouse_get_status(VMMouseState *s)
102 return (s->status << 16) | s->nb_queue;
103 }
104
102 -static void vmmouse_mouse_event(void *opaque, int x, int y, int dz, int buttons_state)
105 +static void vmmouse_input_event(DeviceState *dev, QemuConsole *src,
106 + QemuInputEvent *evt)
107 {
104 - VMMouseState *s = opaque;
108 + VMMouseState *s = VMMOUSE(dev);
109 +
110 + switch (evt->type) {
111 + case INPUT_EVENT_KIND_BTN:
112 + if (evt->btn.down) {
113 + if (evt->btn.button == INPUT_BUTTON_WHEEL_UP) {
114 + s->dz--;
115 + } else if (evt->btn.button == INPUT_BUTTON_WHEEL_DOWN) {
116 + s->dz++;
117 + }
118 + }
119 + s->btns[evt->btn.button] = evt->btn.down;
120 + break;
121 + case INPUT_EVENT_KIND_ABS:
122 + if (evt->abs.axis == INPUT_AXIS_X) {
123 + s->axis[INPUT_AXIS_X] =
124 + qemu_input_scale_axis(evt->abs.value,
125 + INPUT_EVENT_ABS_MIN, INPUT_EVENT_ABS_MAX,
126 + VMMOUSE_MIN_X, VMMOUSE_MAX_X);
127 + } else if (evt->abs.axis == INPUT_AXIS_Y) {
128 + s->axis[INPUT_AXIS_Y] =
129 + qemu_input_scale_axis(evt->abs.value,
130 + INPUT_EVENT_ABS_MIN, INPUT_EVENT_ABS_MAX,
131 + VMMOUSE_MIN_Y, VMMOUSE_MAX_Y);
132 + }
133 + break;
134 + case INPUT_EVENT_KIND_REL:
135 + s->axis[evt->rel.axis] += evt->rel.value;
136 + break;
137 + default:
138 + break;
139 + }
140 +}
141 +
142 +static void vmmouse_input_sync(DeviceState *dev)
143 +{
144 + VMMouseState *s = VMMOUSE(dev);
145 int buttons = 0;
146
107 - if (s->nb_queue > (VMMOUSE_QUEUE_SIZE - 4))
147 + if (s->nb_queue > (VMMOUSE_QUEUE_SIZE - 4)) {
148 return;
149 + }
150
110 - trace_vmmouse_mouse_event(x, y, dz, buttons_state);
111 -
112 - if ((buttons_state & MOUSE_EVENT_LBUTTON))
151 + if (s->btns[INPUT_BUTTON_LEFT]) {
152 buttons |= VMMOUSE_LEFT_BUTTON;
114 - if ((buttons_state & MOUSE_EVENT_RBUTTON))
153 + }
154 + if (s->btns[INPUT_BUTTON_RIGHT]) {
155 buttons |= VMMOUSE_RIGHT_BUTTON;
116 - if ((buttons_state & MOUSE_EVENT_MBUTTON))
156 + }
157 + if (s->btns[INPUT_BUTTON_MIDDLE]) {
158 buttons |= VMMOUSE_MIDDLE_BUTTON;
118 -
119 - if (s->absolute) {
120 - x = qemu_input_scale_axis(x,
121 - INPUT_EVENT_ABS_MIN, INPUT_EVENT_ABS_MAX,
122 - VMMOUSE_MIN_X, VMMOUSE_MAX_X);
123 - y = qemu_input_scale_axis(y,
124 - INPUT_EVENT_ABS_MIN, INPUT_EVENT_ABS_MAX,
125 - VMMOUSE_MIN_Y, VMMOUSE_MAX_Y);
126 - } else{
127 - /* add for guest vmmouse driver to judge this is a relative packet. */
159 + }
160 + if (!s->absolute) {
161 buttons |= VMMOUSE_RELATIVE_PACKET;
162 }
163
164 + trace_vmmouse_queue_event(s->axis[INPUT_AXIS_X], s->axis[INPUT_AXIS_Y],
165 + s->dz, buttons);
166 +
167 s->queue[s->nb_queue++] = buttons;
132 - s->queue[s->nb_queue++] = x;
133 - s->queue[s->nb_queue++] = y;
134 - s->queue[s->nb_queue++] = dz;
168 + s->queue[s->nb_queue++] = s->axis[INPUT_AXIS_X];
169 + s->queue[s->nb_queue++] = s->axis[INPUT_AXIS_Y];
170 + s->queue[s->nb_queue++] = s->dz;
171 + s->dz = 0;
172 +
173 + if (!s->absolute) {
174 + s->axis[INPUT_AXIS_X] = 0;
175 + s->axis[INPUT_AXIS_Y] = 0;
176 + }
177
178 /* need to still generate PS2 events to notify driver to
179 read from queue */
@@ -140,14 +182,25 @@ static void vmmouse_mouse_event(void *opaque, int x, int y, int dz, int buttons_
182
183 static void vmmouse_remove_handler(VMMouseState *s)
184 {
143 - if (s->entry) {
144 - qemu_remove_mouse_event_handler(s->entry);
145 - s->entry = NULL;
146 - }
185 + g_clear_pointer(&s->hs, qemu_input_handler_unregister);
186 }
187
188 static void vmmouse_update_handler(VMMouseState *s, int absolute)
189 {
190 + static const QemuInputHandler vmmouse_abs_handler = {
191 + .name = "vmmouse",
192 + .mask = INPUT_EVENT_MASK_BTN | INPUT_EVENT_MASK_ABS,
193 + .event = vmmouse_input_event,
194 + .sync = vmmouse_input_sync,
195 + };
196 +
197 + static const QemuInputHandler vmmouse_rel_handler = {
198 + .name = "vmmouse",
199 + .mask = INPUT_EVENT_MASK_BTN | INPUT_EVENT_MASK_REL,
200 + .event = vmmouse_input_event,
201 + .sync = vmmouse_input_sync,
202 + };
203 +
204 if (s->status != 0) {
205 return;
206 }
@@ -155,11 +208,11 @@ static void vmmouse_update_handler(VMMouseState *s, int absolute)
208 s->absolute = absolute;
209 vmmouse_remove_handler(s);
210 }
158 - if (s->entry == NULL) {
159 - s->entry = qemu_add_mouse_event_handler(vmmouse_mouse_event,
160 - s, s->absolute,
161 - "vmmouse");
162 - qemu_activate_mouse_event_handler(s->entry);
211 + if (s->hs == NULL) {
212 + const QemuInputHandler *h = s->absolute ?
213 + &vmmouse_abs_handler : &vmmouse_rel_handler;
214 + s->hs = qemu_input_handler_register(DEVICE(s), h);
215 + qemu_input_handler_activate(s->hs);
216 }
217 }
218