ui/dbus: tear down clipboard callbacks on display finalize

The clipboard D-Bus teardown path currently runs when the peer
disappears, but not when DBusDisplay itself is finalized.

That leaves pending clipboard requests and signal handlers associated
with the clipboard proxy active past display teardown.

Add an explicit clipboard fini hook and invoke it from
dbus_display_finalize() so the clipboard teardown also runs during
display destruction.

bixes: ff1a5810f6 ("ui/dbus: add clipboard interface")
Signed-off-by: GuoHan Zhao <zhaoguohan@kylinos.cn>
Message-ID: <20260330091310.42868-1-zhaoguohan@kylinos.cn>
[ Marc-André - Move clipobard finalization to the function]
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
GuoHan Zhao
2026-03-30 17:13:10 +08:00
committed by Marc-André Lureau
parent 2151a67eb6
commit e5ef268596
3 changed files with 18 additions and 2 deletions
+16
View File
@@ -191,6 +191,7 @@ static void
dbus_clipboard_unregister_proxy(DBusDisplay *dpy)
{
const char *name = NULL;
GDBusConnection *connection = NULL;
int i;
for (i = 0; i < G_N_ELEMENTS(dpy->clipboard_request); ++i) {
@@ -201,6 +202,13 @@ dbus_clipboard_unregister_proxy(DBusDisplay *dpy)
return;
}
connection = g_dbus_proxy_get_connection(
G_DBUS_PROXY(dpy->clipboard_proxy));
if (connection) {
g_signal_handlers_disconnect_by_data(connection, dpy);
}
g_signal_handlers_disconnect_by_data(dpy->clipboard_proxy, dpy);
name = g_dbus_proxy_get_name(G_DBUS_PROXY(dpy->clipboard_proxy));
trace_dbus_clipboard_unregister(name);
g_clear_object(&dpy->clipboard_proxy);
@@ -425,6 +433,14 @@ dbus_clipboard_request(
return DBUS_METHOD_INVOCATION_HANDLED;
}
void
dbus_clipboard_fini(DBusDisplay *dpy)
{
dbus_clipboard_unregister_proxy(dpy);
qemu_clipboard_peer_unregister(&dpy->clipboard_peer);
g_clear_object(&dpy->clipboard);
}
void
dbus_clipboard_init(DBusDisplay *dpy)
{
+1 -2
View File
@@ -145,8 +145,7 @@ dbus_display_finalize(Object *o)
dbus_display_notifier_remove(&dd->notifier);
}
qemu_clipboard_peer_unregister(&dd->clipboard_peer);
g_clear_object(&dd->clipboard);
dbus_clipboard_fini(dd);
g_clear_object(&dd->server);
g_clear_pointer(&dd->consoles, g_ptr_array_unref);
+1
View File
@@ -150,5 +150,6 @@ void dbus_display_notify(DBusDisplayEvent *event);
void dbus_chardev_init(DBusDisplay *dpy);
void dbus_clipboard_init(DBusDisplay *dpy);
void dbus_clipboard_fini(DBusDisplay *dpy);
#endif /* UI_DBUS_H */