diff options
author | Giovanni Campagna <gcampagna@src.gnome.org> | 2012-07-07 15:18:51 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2012-07-17 03:29:07 -0400 |
commit | 95f80ee5bdd9c1e31a153e137756a8a2e43c5c35 (patch) | |
tree | 79db400b28b52fb50597c15743a799c3c0a04671 | |
parent | a4b7eeb5fbab5a02e62d9e87ea14e60b939e83ea (diff) | |
download | gdm-95f80ee5bdd9c1e31a153e137756a8a2e43c5c35.tar.gz |
daemon: Finish display if its slave dies
If a slave goes away for whatever reason, we need to
make sure we clean up the display associated with it.
This commit changes the display code to watch its associated
slave on the bus and automatically finish if the slave goes away.
-rw-r--r-- | daemon/gdm-display.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c index cc8b433c..4e45379b 100644 --- a/daemon/gdm-display.c +++ b/daemon/gdm-display.c @@ -70,6 +70,7 @@ struct GdmDisplayPrivate GdmSlaveProxy *slave_proxy; char *slave_bus_name; + int slave_name_id; GDBusConnection *connection; GdmDisplayAccessFile *user_access_file; @@ -94,6 +95,7 @@ enum { static void gdm_display_class_init (GdmDisplayClass *klass); static void gdm_display_init (GdmDisplay *display); static void gdm_display_finalize (GObject *object); +static void queue_finish (GdmDisplay *display); G_DEFINE_ABSTRACT_TYPE (GdmDisplay, gdm_display, G_TYPE_OBJECT) @@ -279,6 +281,14 @@ gdm_display_add_user_authorization (GdmDisplay *display, return ret; } +static void +on_name_vanished (GDBusConnection *connection, + const char *name, + gpointer user_data) +{ + queue_finish (GDM_DISPLAY (user_data)); +} + static gboolean gdm_display_real_set_slave_bus_name (GdmDisplay *display, const char *name, @@ -287,6 +297,17 @@ gdm_display_real_set_slave_bus_name (GdmDisplay *display, g_free (display->priv->slave_bus_name); display->priv->slave_bus_name = g_strdup (name); + if (display->priv->slave_name_id > 0) { + g_bus_unwatch_name (display->priv->slave_name_id); + } + + g_bus_watch_name_on_connection (display->priv->connection, + name, + G_BUS_NAME_WATCHER_FLAGS_NONE, + NULL, /* name appeared */ + on_name_vanished, + g_object_ref (display), + NULL); return TRUE; } @@ -1270,6 +1291,11 @@ gdm_display_dispose (GObject *object) display->priv->access_file = NULL; } + if (display->priv->slave_name_id > 0) { + g_bus_unwatch_name (display->priv->slave_name_id); + display->priv->slave_name_id = 0; + } + G_OBJECT_CLASS (gdm_display_parent_class)->dispose (object); } @@ -1403,6 +1429,7 @@ gdm_display_finalize (GObject *object) g_free (display->priv->x11_display_name); g_free (display->priv->x11_cookie); g_free (display->priv->slave_command); + g_free (display->priv->slave_bus_name); g_clear_object (&display->priv->display_skeleton); g_clear_object (&display->priv->object_skeleton); |