diff --git a/lib/mks-device-private.h b/lib/mks-device-private.h index 4099f13..601c2a3 100644 --- a/lib/mks-device-private.h +++ b/lib/mks-device-private.h @@ -23,12 +23,14 @@ #include "mks-device.h" #include "mks-qemu.h" +#include "mks-session.h" G_BEGIN_DECLS struct _MksDevice { GObject parent_instance; + MksSession *session; MksQemuObject *object; char *name; }; @@ -42,6 +44,7 @@ struct _MksDeviceClass }; gpointer _mks_device_new (GType device_type, + MksSession *session, MksQemuObject *object); void _mks_device_set_name (MksDevice *self, const char *name); diff --git a/lib/mks-device.c b/lib/mks-device.c index 79946cc..1025c44 100644 --- a/lib/mks-device.c +++ b/lib/mks-device.c @@ -48,6 +48,7 @@ mks_device_dispose (GObject *object) { MksDevice *self = (MksDevice *)object; + g_clear_weak_pointer (&self->session); g_clear_pointer (&self->name, g_free); g_clear_object (&self->object); @@ -116,17 +117,20 @@ _mks_device_set_name (MksDevice *self, gpointer _mks_device_new (GType device_type, + MksSession *session, MksQemuObject *object) { g_autoptr(MksDevice) self = NULL; g_return_val_if_fail (g_type_is_a (device_type, MKS_TYPE_DEVICE), NULL); g_return_val_if_fail (device_type != MKS_TYPE_DEVICE, NULL); + g_return_val_if_fail (MKS_IS_SESSION (session), NULL); g_return_val_if_fail (MKS_QEMU_IS_OBJECT (object), NULL); if (!(self = g_object_new (device_type, NULL))) return NULL; + g_set_weak_pointer (&self->session, session); self->object = g_object_ref (object); if (!MKS_DEVICE_GET_CLASS (self)->setup (self, object)) diff --git a/lib/mks-screen.c b/lib/mks-screen.c index c4b2757..05d3c1c 100644 --- a/lib/mks-screen.c +++ b/lib/mks-screen.c @@ -178,9 +178,9 @@ mks_screen_setup (MksDevice *device, if (MKS_QEMU_IS_CONSOLE (iface)) mks_screen_set_console (self, MKS_QEMU_CONSOLE (iface)); else if (MKS_QEMU_IS_KEYBOARD (iface)) - self->keyboard = _mks_device_new (MKS_TYPE_KEYBOARD, object); + self->keyboard = _mks_device_new (MKS_TYPE_KEYBOARD, device->session, object); else if (MKS_QEMU_IS_MOUSE (iface)) - self->mouse = _mks_device_new (MKS_TYPE_MOUSE, object); + self->mouse = _mks_device_new (MKS_TYPE_MOUSE, device->session, object); } return self->console != NULL && diff --git a/lib/mks-session.c b/lib/mks-session.c index acf5758..8e8a5a4 100644 --- a/lib/mks-session.c +++ b/lib/mks-session.c @@ -225,7 +225,7 @@ mks_session_object_manager_object_added_cb (MksSession *self, if (MKS_QEMU_IS_VM (iface)) mks_session_set_vm (self, object, MKS_QEMU_VM (iface)); else if (MKS_QEMU_IS_CONSOLE (iface)) - mks_session_add_device (self, _mks_device_new (MKS_TYPE_SCREEN, object)); + mks_session_add_device (self, _mks_device_new (MKS_TYPE_SCREEN, self, object)); } }