Track the input handled state, and dispose it on unrealize.
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Signed-off-by: Marc-André Lureau <[email protected]>
---
include/hw/input/ps2.h | 2 ++
hw/input/ps2.c | 24 ++++++++++++++++++++++--
2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/include/hw/input/ps2.h b/include/hw/input/ps2.h
index 058db3e0890..d0c532a38f2 100644
--- a/include/hw/input/ps2.h
+++ b/include/hw/input/ps2.h
@@ -26,6 +26,7 @@
#define HW_PS2_H
#include "hw/core/sysbus.h"
+#include "ui/input.h"
#define PS2_MOUSE_BUTTON_LEFT 0x01
#define PS2_MOUSE_BUTTON_RIGHT 0x02
@@ -59,6 +60,7 @@ struct PS2State {
PS2Queue queue;
int32_t write_cmd;
qemu_irq irq;
+ QemuInputHandlerState *hs;
};
#define TYPE_PS2_DEVICE "ps2-device"
diff --git a/hw/input/ps2.c b/hw/input/ps2.c
index f2523ff4bc7..97df7a9a43e 100644
--- a/hw/input/ps2.c
+++ b/hw/input/ps2.c
@@ -1233,7 +1233,16 @@ static const QemuInputHandler ps2_keyboard_handler = {
static void ps2_kbd_realize(DeviceState *dev, Error **errp)
{
- qemu_input_handler_register(dev, &ps2_keyboard_handler);
+ PS2State *s = PS2_DEVICE(dev);
+
+ s->hs = qemu_input_handler_register(dev, &ps2_keyboard_handler);
+}
+
+static void ps2_kbd_unrealize(DeviceState *dev)
+{
+ PS2State *s = PS2_DEVICE(dev);
+
+ g_clear_pointer(&s->hs, qemu_input_handler_unregister);
}
static const QemuInputHandler ps2_mouse_handler = {
@@ -1245,7 +1254,16 @@ static const QemuInputHandler ps2_mouse_handler = {
static void ps2_mouse_realize(DeviceState *dev, Error **errp)
{
- qemu_input_handler_register(dev, &ps2_mouse_handler);
+ PS2State *s = PS2_DEVICE(dev);
+
+ s->hs = qemu_input_handler_register(dev, &ps2_mouse_handler);
+}
+
+static void ps2_mouse_unrealize(DeviceState *dev)
+{
+ PS2State *s = PS2_DEVICE(dev);
+
+ g_clear_pointer(&s->hs, qemu_input_handler_unregister);
}
static void ps2_kbd_class_init(ObjectClass *klass, const void *data)
@@ -1255,6 +1273,7 @@ static void ps2_kbd_class_init(ObjectClass *klass, const
void *data)
PS2DeviceClass *ps2dc = PS2_DEVICE_CLASS(klass);
dc->realize = ps2_kbd_realize;
+ dc->unrealize = ps2_kbd_unrealize;
resettable_class_set_parent_phases(rc, NULL, ps2_kbd_reset_hold, NULL,
&ps2dc->parent_phases);
dc->vmsd = &vmstate_ps2_keyboard;
@@ -1274,6 +1293,7 @@ static void ps2_mouse_class_init(ObjectClass *klass,
const void *data)
PS2DeviceClass *ps2dc = PS2_DEVICE_CLASS(klass);
dc->realize = ps2_mouse_realize;
+ dc->unrealize = ps2_mouse_unrealize;
resettable_class_set_parent_phases(rc, NULL, ps2_mouse_reset_hold, NULL,
&ps2dc->parent_phases);
dc->vmsd = &vmstate_ps2_mouse;
--
2.54.0