summaryrefslogtreecommitdiff
path: root/src/xserver.c
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2011-07-16 17:34:25 +1000
committerRobert Ancell <robert.ancell@canonical.com>2011-07-16 17:34:25 +1000
commit4451f024416b1a29c7466447715c1dd0c47bfe81 (patch)
tree77691550a05b319aeb2436ff0c49569217213787 /src/xserver.c
parentceed298ba93f1798f4c38e80163dbdaff0de7e5a (diff)
downloadlightdm-4451f024416b1a29c7466447715c1dd0c47bfe81.tar.gz
Reimplement Plymouth support
Diffstat (limited to 'src/xserver.c')
-rw-r--r--src/xserver.c69
1 files changed, 48 insertions, 21 deletions
diff --git a/src/xserver.c b/src/xserver.c
index 4dadc202..b143f1c2 100644
--- a/src/xserver.c
+++ b/src/xserver.c
@@ -23,6 +23,7 @@
#include "xserver.h"
#include "configuration.h"
#include "vt.h"
+#include "plymouth.h"
enum {
READY,
@@ -71,9 +72,9 @@ struct XServerPrivate
/* VT to run on */
gint vt;
-
- /* TRUE to disable setting the root window */
- gboolean no_root;
+
+ /* TRUE if replacing Plymouth */
+ gboolean replacing_plymouth;
/* Display number */
gint display_number;
@@ -109,6 +110,16 @@ xserver_release_display_number (guint number)
display_numbers = g_list_remove (display_numbers, GINT_TO_POINTER (number));
}
+static void
+stopped_cb (XServer *server)
+{
+ if (server->priv->replacing_plymouth)
+ {
+ g_debug ("Stopping Plymouth, X server failed to start");
+ plymouth_quit (FALSE);
+ }
+}
+
XServer *
xserver_new (const gchar *config_section, XServerType type, const gchar *hostname, gint display_number)
{
@@ -129,7 +140,27 @@ xserver_new (const gchar *config_section, XServerType type, const gchar *hostnam
self->priv->config_file = config_get_string (config_get_instance (), "Defaults", "xserver-config");
if (!self->priv->config_file)
self->priv->config_file = config_get_string (config_get_instance (), config_section, "xserver-config");
-
+
+ if (type != XSERVER_TYPE_REMOTE)
+ {
+ /* Replace Plymouth if it is running */
+ if (plymouth_get_is_active () && plymouth_has_active_vt ())
+ {
+ gint active_vt = vt_get_active ();
+ if (active_vt >= vt_get_min ())
+ {
+ g_debug ("X server %s will replace Plymouth", xserver_get_address (self));
+ self->priv->vt = active_vt;
+ plymouth_deactivate ();
+ g_signal_connect (self, "stopped", G_CALLBACK (stopped_cb), NULL);
+ }
+ else
+ g_debug ("Plymouth is running on VT %d, but this is less than the configured minimum of %d so not replacing it", active_vt, vt_get_min ());
+ }
+ if (self->priv->vt < 0)
+ self->priv->vt = vt_get_unused ();
+ }
+
return self;
}
@@ -343,13 +374,6 @@ xserver_get_authorization (XServer *server)
return server->priv->authorization;
}
-void
-xserver_set_vt (XServer *server, gint vt)
-{
- g_return_if_fail (server != NULL);
- server->priv->vt = vt;
-}
-
gint
xserver_get_vt (XServer *server)
{
@@ -357,13 +381,6 @@ xserver_get_vt (XServer *server)
return server->priv->vt;
}
-void
-xserver_set_no_root (XServer *server, gboolean no_root)
-{
- g_return_if_fail (server != NULL);
- server->priv->no_root = no_root;
-}
-
static gboolean
xserver_connect (XServer *server)
{
@@ -433,9 +450,9 @@ xserver_start (XServer *server)
g_return_val_if_fail (server != NULL, FALSE);
//g_return_val_if_fail (server->priv->pid == 0, FALSE);
-
+
server->priv->ready = FALSE;
-
+
/* Check if we can connect to the remote server */
if (server->priv->type == XSERVER_TYPE_REMOTE)
{
@@ -453,6 +470,7 @@ xserver_start (XServer *server)
if (!absolute_command)
{
g_debug ("Can't launch X server %s, not found in path", server->priv->command);
+ stopped_cb (server);
return FALSE;
}
command = g_string_new (absolute_command);
@@ -499,7 +517,7 @@ xserver_start (XServer *server)
if (server->priv->vt >= 0)
g_string_append_printf (command, " vt%d", server->priv->vt);
- if (server->priv->no_root)
+ if (server->priv->replacing_plymouth)
g_string_append (command, " -background none");
g_debug ("Launching X Server");
@@ -532,6 +550,9 @@ xserver_start (XServer *server)
g_debug ("Waiting for ready signal from X server :%d", server->priv->display_number);
g_clear_error (&error);
+ if (!result)
+ stopped_cb (server);
+
return result;
}
@@ -613,6 +634,12 @@ xserver_got_signal (ChildProcess *process, int signum)
xserver_connect (server);
+ if (server->priv->replacing_plymouth)
+ {
+ g_debug ("Stopping Plymouth, X server is ready");
+ plymouth_quit (TRUE);
+ }
+
g_signal_emit (server, signals[READY], 0);
}
}