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