summaryrefslogtreecommitdiff
path: root/daemon/gdm-simple-slave.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/gdm-simple-slave.c')
-rw-r--r--daemon/gdm-simple-slave.c91
1 files changed, 90 insertions, 1 deletions
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index fc8649c5..dd19ced2 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -93,6 +93,7 @@ struct GdmSimpleSlavePrivate
#ifdef HAVE_LOGINDEVPERM
gboolean use_logindevperm;
#endif
+ guint plymouth_is_running : 1;
};
enum {
@@ -1204,6 +1205,72 @@ on_start_session_later (GdmGreeterServer *session,
slave->priv->start_session_when_ready = FALSE;
}
+static gboolean
+plymouth_is_running (void)
+{
+ int status;
+ gboolean res;
+ GError *error;
+
+ error = NULL;
+ res = g_spawn_command_line_sync ("/bin/plymouth --ping",
+ NULL, NULL, &status, &error);
+ if (! res) {
+ g_debug ("Could not ping plymouth: %s", error->message);
+ g_error_free (error);
+ return FALSE;
+ }
+
+ return WIFEXITED (status) && WEXITSTATUS (status) == 0;
+}
+
+static void
+plymouth_prepare_for_transition (GdmSimpleSlave *slave)
+{
+ gboolean res;
+ GError *error;
+
+ error = NULL;
+ res = g_spawn_command_line_sync ("/bin/plymouth deactivate",
+ NULL, NULL, NULL, &error);
+ if (! res) {
+ g_warning ("Could not deactivate plymouth: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+static void
+plymouth_quit_with_transition (GdmSimpleSlave *slave)
+{
+ gboolean res;
+ GError *error;
+
+ error = NULL;
+ res = g_spawn_command_line_sync ("/bin/plymouth quit --retain-splash",
+ NULL, NULL, NULL, &error);
+ if (! res) {
+ g_warning ("Could not quit plymouth: %s", error->message);
+ g_error_free (error);
+ }
+ slave->priv->plymouth_is_running = FALSE;
+}
+
+static void
+plymouth_quit_without_transition (GdmSimpleSlave *slave)
+{
+ gboolean res;
+ GError *error;
+
+ error = NULL;
+ res = g_spawn_command_line_sync ("/bin/plymouth quit",
+ NULL, NULL, NULL, &error);
+ if (! res) {
+ g_warning ("Could not quit plymouth: %s", error->message);
+ g_error_free (error);
+ }
+ slave->priv->plymouth_is_running = FALSE;
+}
+
static void
setup_server (GdmSimpleSlave *slave)
{
@@ -1223,6 +1290,10 @@ setup_server (GdmSimpleSlave *slave)
*/
gdm_slave_save_root_windows (GDM_SLAVE (slave));
+ /* Plymouth is waiting for the go-ahead to exit */
+ if (slave->priv->plymouth_is_running) {
+ plymouth_quit_with_transition (slave);
+ }
}
static void
@@ -1426,6 +1497,10 @@ on_server_exited (GdmServer *server,
g_debug ("GdmSimpleSlave: server exited with code %d\n", exit_code);
gdm_slave_stopped (GDM_SLAVE (slave));
+
+ if (slave->priv->plymouth_is_running) {
+ plymouth_quit_without_transition (slave);
+ }
}
static void
@@ -1438,6 +1513,10 @@ on_server_died (GdmServer *server,
g_strsignal (signal_number));
gdm_slave_stopped (GDM_SLAVE (slave));
+
+ if (slave->priv->plymouth_is_running) {
+ plymouth_quit_without_transition (slave);
+ }
}
static gboolean
@@ -1484,7 +1563,14 @@ gdm_simple_slave_run (GdmSimpleSlave *slave)
G_CALLBACK (on_server_ready),
slave);
- res = gdm_server_start (slave->priv->server);
+ slave->priv->plymouth_is_running = plymouth_is_running ();
+
+ if (slave->priv->plymouth_is_running) {
+ plymouth_prepare_for_transition (slave);
+ res = gdm_server_start_on_active_vt (slave->priv->server);
+ } else {
+ res = gdm_server_start (slave->priv->server);
+ }
if (! res) {
g_warning (_("Could not start the X "
"server (your graphical environment) "
@@ -1494,6 +1580,9 @@ gdm_simple_slave_run (GdmSimpleSlave *slave)
"In the meantime this display will be "
"disabled. Please restart GDM when "
"the problem is corrected."));
+ if (slave->priv->plymouth_is_running) {
+ plymouth_quit_without_transition (slave);
+ }
exit (1);
}