remote-desktop: Close sessions on prepare-shutdown

When finalizing, the MetaDisplay instance will already be gone, so to be
able to gracefully tear down the clipboard integration, make sure to
close sessions before the display is closed, i.e. on prepare-shutdown.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1853>
This commit is contained in:
Jonas Ådahl 2021-05-05 14:22:18 +02:00 committed by Marge Bot
parent b03ccfff4d
commit 4a057535e7

View File

@ -249,18 +249,32 @@ meta_remote_desktop_constructed (GObject *object)
NULL); NULL);
} }
static void
on_prepare_shutdown (MetaBackend *backend,
MetaRemoteDesktop *remote_desktop)
{
GHashTableIter iter;
gpointer value;
g_hash_table_iter_init (&iter, remote_desktop->sessions);
while (g_hash_table_iter_next (&iter, NULL, &value))
{
MetaRemoteDesktopSession *session = value;
g_hash_table_iter_steal (&iter);
meta_remote_desktop_session_close (session);
}
}
static void static void
meta_remote_desktop_finalize (GObject *object) meta_remote_desktop_finalize (GObject *object)
{ {
MetaRemoteDesktop *remote_desktop = META_REMOTE_DESKTOP (object); MetaRemoteDesktop *remote_desktop = META_REMOTE_DESKTOP (object);
GList *sessions;
if (remote_desktop->dbus_name_id != 0) if (remote_desktop->dbus_name_id != 0)
g_bus_unown_name (remote_desktop->dbus_name_id); g_bus_unown_name (remote_desktop->dbus_name_id);
sessions = g_list_copy (g_hash_table_get_values (remote_desktop->sessions)); g_assert (g_hash_table_size (remote_desktop->sessions) == 0);
g_list_free_full (sessions,
(GDestroyNotify) meta_remote_desktop_session_close);
g_hash_table_destroy (remote_desktop->sessions); g_hash_table_destroy (remote_desktop->sessions);
G_OBJECT_CLASS (meta_remote_desktop_parent_class)->finalize (object); G_OBJECT_CLASS (meta_remote_desktop_parent_class)->finalize (object);
@ -276,6 +290,10 @@ meta_remote_desktop_new (MetaBackend *backend,
remote_desktop->backend = backend; remote_desktop->backend = backend;
remote_desktop->session_watcher = session_watcher; remote_desktop->session_watcher = session_watcher;
g_signal_connect (backend, "prepare-shutdown",
G_CALLBACK (on_prepare_shutdown),
remote_desktop);
return remote_desktop; return remote_desktop;
} }