|
|
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 |
|