Blame SOURCES/0001-legacy-display-ensure-X-server-is-dead-when-respawni.patch

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