From 6f62469760cfe8b4c798135bba1d9ccaa7f4b0d2 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 12 Jul 2017 10:26:37 -0400 Subject: [PATCH] legacy-display: ensure X server is dead when respawning If the user logs out we may detect the session dying before we detect the X server dying. If that happens, then we currently don't wait for the X server to exit before starting a new X server. This commit makes sure to explicitly kill the X server and wait for its death before proceeding. --- daemon/gdm-legacy-display.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/daemon/gdm-legacy-display.c b/daemon/gdm-legacy-display.c index 9c999232..46990ccc 100644 --- a/daemon/gdm-legacy-display.c +++ b/daemon/gdm-legacy-display.c @@ -236,51 +236,72 @@ gdm_legacy_display_manage (GdmDisplay *display) "server (your graphical environment) " "due to an internal error. " "Please contact your system administrator " "or check your syslog to diagnose. " "In the meantime this display will be " "disabled. Please restart GDM when " "the problem is corrected.")); gdm_display_unmanage (GDM_DISPLAY (self)); } g_debug ("GdmDisplay: Started X server"); } static void gdm_legacy_display_class_init (GdmLegacyDisplayClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GdmDisplayClass *display_class = GDM_DISPLAY_CLASS (klass); object_class->constructor = gdm_legacy_display_constructor; object_class->finalize = gdm_legacy_display_finalize; display_class->prepare = gdm_legacy_display_prepare; display_class->manage = gdm_legacy_display_manage; g_type_class_add_private (klass, sizeof (GdmLegacyDisplayPrivate)); } static void +on_display_status_changed (GdmLegacyDisplay *self) +{ + int status; + + status = gdm_display_get_status (self); + + switch (status) { + case GDM_DISPLAY_UNMANAGED: + if (self->priv->server != NULL) + gdm_server_stop (self->priv->server); + break; + default: + break; + } +} + +static void gdm_legacy_display_init (GdmLegacyDisplay *legacy_display) { legacy_display->priv = GDM_LEGACY_DISPLAY_GET_PRIVATE (legacy_display); + + g_signal_connect (legacy_display, "notify::status", + G_CALLBACK (on_display_status_changed), + NULL); } GdmDisplay * gdm_legacy_display_new (int display_number) { GObject *object; char *x11_display; x11_display = g_strdup_printf (":%d", display_number); object = g_object_new (GDM_TYPE_LEGACY_DISPLAY, "x11-display-number", display_number, "x11-display-name", x11_display, NULL); g_free (x11_display); return GDM_DISPLAY (object); } -- 2.13.0