]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/x-server.c
Load all users only when really needed
[sojka/lightdm.git] / src / x-server.c
index 3b25ef9adc25b7504fe8cf732ff59fbc56407797..1073841e28d42012222248415fa2c97800147336 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2010-2011 Robert Ancell.
  * Author: Robert Ancell <robert.ancell@canonical.com>
- * 
+ *
  * This program is free software: you can redistribute it and/or modify it under
  * the terms of the GNU General Public License as published by the Free Software
  * Foundation, either version 3 of the License, or (at your option) any later
 #include "configuration.h"
 
 struct XServerPrivate
-{  
+{
     /* Host running the server */
     gchar *hostname;
 
-    /* Display number */
-    guint number;
-
     /* Cached server address */
     gchar *address;
 
@@ -53,20 +50,11 @@ x_server_get_hostname (XServer *server)
     return server->priv->hostname;
 }
 
-void
-x_server_set_display_number (XServer *server, guint number)
-{
-    g_return_if_fail (server != NULL);
-    server->priv->number = number;
-    g_free (server->priv->address);
-    server->priv->address = NULL;
-}
-
 guint
 x_server_get_display_number (XServer *server)
 {
     g_return_val_if_fail (server != NULL, 0);
-    return server->priv->number;
+    return X_SERVER_GET_CLASS (server)->get_display_number (server);
 }
 
 const gchar *
@@ -77,10 +65,10 @@ x_server_get_address (XServer *server)
     if (!server->priv->address)
     {
         if (server->priv->hostname)
-            server->priv->address = g_strdup_printf("%s:%d", server->priv->hostname, server->priv->number);
+            server->priv->address = g_strdup_printf("%s:%d", server->priv->hostname, x_server_get_display_number (server));
         else
-            server->priv->address = g_strdup_printf(":%d", server->priv->number);
-    }  
+            server->priv->address = g_strdup_printf(":%d", x_server_get_display_number (server));
+    }
 
     return server->priv->address;
 }
@@ -90,12 +78,9 @@ x_server_set_authority (XServer *server, XAuthority *authority)
 {
     g_return_if_fail (server != NULL);
 
-    if (server->priv->authority)
-        g_object_unref (server->priv->authority);
+    g_clear_object (&server->priv->authority);
     if (authority)
         server->priv->authority = g_object_ref (authority);
-    else
-        server->priv->authority = NULL;
 }
 
 XAuthority *
@@ -132,12 +117,12 @@ x_server_start (DisplayServer *display_server)
         auth = &a;
     }
 
-    /* Open connection */  
-    g_debug ("Connecting to XServer %s", x_server_get_address (server));
+    /* Open connection */
+    l_debug (server, "Connecting to XServer %s", x_server_get_address (server));
     server->priv->connection = xcb_connect_to_display_with_auth_info (x_server_get_address (server), auth, NULL);
     if (xcb_connection_has_error (server->priv->connection))
     {
-        g_debug ("Error connecting to XServer %s", x_server_get_address (server));
+        l_debug (server, "Error connecting to XServer %s", x_server_get_address (server));
         return FALSE;
     }
 
@@ -149,6 +134,8 @@ x_server_connect_session (DisplayServer *display_server, Session *session)
 {
     gint vt;
 
+    session_set_env (session, "XDG_SESSION_TYPE", "x11");
+
     display_server = session_get_display_server (session);
 
     vt = display_server_get_vt (display_server);
@@ -164,9 +151,10 @@ x_server_connect_session (DisplayServer *display_server, Session *session)
         session_set_env (session, "XDG_VTNR", t);
         g_free (t);
     }
+    else
+        l_debug (session, "Not setting XDG_VTNR");
 
     session_set_env (session, "DISPLAY", x_server_get_address (X_SERVER (display_server)));
-    session_set_tty (session, x_server_get_address (X_SERVER (display_server)));
     session_set_xdisplay (session, x_server_get_address (X_SERVER (display_server)));
     session_set_remote_host_name (session, x_server_get_hostname (X_SERVER (display_server)));
     session_set_x_authority (session,
@@ -177,8 +165,15 @@ x_server_connect_session (DisplayServer *display_server, Session *session)
 static void
 x_server_disconnect_session (DisplayServer *display_server, Session *session)
 {
-    session_set_tty (session, NULL);
-    session_unset_env (session, "XDG_VTNR");
+    gint vt;
+
+    session_unset_env (session, "XDG_SESSION_TYPE");
+    vt = display_server_get_vt (display_server);
+    if (vt > 0)
+    {
+        session_set_tty (session, NULL);
+        session_unset_env (session, "XDG_VTNR");
+    }
     session_unset_env (session, "DISPLAY");
     session_set_xdisplay (session, NULL);
     session_set_remote_host_name (session, NULL);
@@ -194,14 +189,11 @@ x_server_init (XServer *server)
 static void
 x_server_finalize (GObject *object)
 {
-    XServer *self;
-
-    self = X_SERVER (object);
+    XServer *self = X_SERVER (object);
 
     g_free (self->priv->hostname);
     g_free (self->priv->address);
-    if (self->priv->authority)
-        g_object_unref (self->priv->authority);
+    g_clear_object (&self->priv->authority);
     if (self->priv->connection)
         xcb_disconnect (self->priv->connection);
 
@@ -214,7 +206,7 @@ x_server_class_init (XServerClass *klass)
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
     DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
 
-    display_server_class->get_session_type = x_server_get_session_type;    
+    display_server_class->get_session_type = x_server_get_session_type;
     display_server_class->get_can_share = x_server_get_can_share;
     display_server_class->start = x_server_start;
     display_server_class->connect_session = x_server_connect_session;