On 2026/06/11 18:03, Marc-André Lureau wrote:
Add dbus_cleanup() to unparent the D-Bus display object, ensuring
proper teardown before user_creatable_cleanup() runs.
Signed-off-by: Marc-André Lureau <[email protected]>
---
ui/dbus-console.c | 3 +++
ui/dbus.c | 13 +++++++++++++
2 files changed, 16 insertions(+)
diff --git a/ui/dbus-console.c b/ui/dbus-console.c
index 742bf9639a4..63d21493101 100644
--- a/ui/dbus-console.c
+++ b/ui/dbus-console.c
@@ -152,6 +152,9 @@ dbus_display_console_dispose(GObject *object)
DBusDisplayConsole *ddc = DBUS_DISPLAY_CONSOLE(object);
qemu_console_unregister_listener(&ddc->dcl);
+ if (ddc->dcl.con) {
+ qemu_console_set_display_gl_ctx(ddc->dcl.con, NULL);
Somewhat weird, but theoretically this may clear a console GL context
registered by another display. Below is an example I let an LLM generate
(not tested):
qemu-system-x86_64 \
-machine q35 \
-device virtio-vga-gl \
-display dbus,p2p=yes,gl=off \
-spice unix=on,addr=/tmp/qemu-spice.sock,disable-ticketing=on,gl=on
+ }
qemu_remove_mouse_mode_change_notifier(&ddc->mouse_mode_notifier);
g_clear_pointer(&ddc->kbd_leds_updated, qemu_remove_led_event_handler);
g_clear_object(&ddc->iface_touch);
diff --git a/ui/dbus.c b/ui/dbus.c
index e02a94df2f3..b23cb44c535 100644
--- a/ui/dbus.c
+++ b/ui/dbus.c
@@ -615,10 +615,23 @@ static const TypeInfo dbus_display_info = {
}
};
+static void
+dbus_cleanup(void)
+{
+ Object *o;
+
+ o = object_resolve_path_component(object_get_objects_root(),
+ "dbus-display");
+ if (o) {
+ object_unparent(o);
+ }
+}
+
static QemuDisplay qemu_display_dbus = {
.type = DISPLAY_TYPE_DBUS,
.early_init = early_dbus_init,
.init = dbus_init,
+ .cleanup = dbus_cleanup,
.vc = "vc",
};