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:
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user