]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/seat.c
Rename xlocal seat to local - it supports Mir and Wayland as well as X. The xlocal...
[sojka/lightdm.git] / src / seat.c
index 77fcb83a8b25513e2f7ea14f6130d433d20a201d..facf7ef9416c05f7592ad3b684fbae17556d5e22 100644 (file)
@@ -78,23 +78,32 @@ G_DEFINE_TYPE_WITH_CODE (Seat, seat, G_TYPE_OBJECT,
 
 typedef struct
 {
-    const gchar *name;
+    gchar *name;
     GType type;
 } SeatModule;
 static GHashTable *seat_modules = NULL;
 
 // FIXME: Make a get_display_server() that re-uses display servers if supported
 static DisplayServer *create_display_server (Seat *seat, Session *session);
+static gboolean start_display_server (Seat *seat, DisplayServer *display_server);
 static GreeterSession *create_greeter_session (Seat *seat);
 static void start_session (Seat *seat, Session *session);
 
+static void
+free_seat_module (gpointer data)
+{
+    SeatModule *module = data;
+    g_free (module->name);
+    g_free (module);
+}
+
 void
 seat_register_module (const gchar *name, GType type)
 {
     SeatModule *module;
 
     if (!seat_modules)
-        seat_modules = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+        seat_modules = g_hash_table_new_full (g_str_hash, g_str_equal, free_seat_module, NULL);
 
     g_debug ("Registered seat module %s", name);
 
@@ -285,7 +294,7 @@ seat_get_next_session (Seat *seat)
  * Obtains the active session which lightdm expects to be active.
  *
  * This function is different from seat_get_active_session() in that the
- * later (in the case of xlocal seats) dynamically finds the session that is
+ * later (in the case of local seats) dynamically finds the session that is
  * really active (based on the active VT), whereas this function returns the
  * session that lightdm activated last by itself, which may not be the actual
  * active session (i.e. VT changes).
@@ -588,7 +597,7 @@ switch_to_greeter_from_failed_session (Seat *seat, Session *session)
 
             display_server = create_display_server (seat, session);
             session_set_display_server (session, display_server);
-            if (!display_server_start (display_server))
+            if (!start_display_server (seat, display_server))
             {
                 l_debug (seat, "Failed to start display server for greeter");
                 seat_stop (seat);
@@ -858,24 +867,11 @@ session_stopped_cb (Session *session, Seat *seat)
     }
 
     /* Stop the display server if no-longer required */
-    if (display_server && !display_server_get_is_stopping (display_server))
+    if (display_server && !display_server_get_is_stopping (display_server) &&
+        !SEAT_GET_CLASS (seat)->display_server_is_used (seat, display_server))
     {
-        GList *link;
-        int n_sessions = 0;
-
-        for (link = seat->priv->sessions; link; link = link->next)
-        {
-            Session *s = link->data;
-            if (s == session)
-                continue;
-            if (session_get_display_server (s) == display_server)
-                n_sessions++;
-        }
-        if (n_sessions == 0)
-        {
-            l_debug (seat, "Stopping display server, no sessions require it");
-            display_server_stop (display_server);
-        }
+        l_debug (seat, "Stopping display server, no sessions require it");
+        display_server_stop (display_server);
     }
 
     g_signal_emit (seat, signals[SESSION_REMOVED], 0, session);
@@ -1274,7 +1270,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
     {
         display_server = create_display_server (seat, session);
         session_set_display_server (session, display_server);
-        if (!display_server_start (display_server))
+        if (!start_display_server (seat, display_server))
         {
             l_debug (seat, "Failed to start display server for new session");
             return FALSE;
@@ -1383,7 +1379,10 @@ find_session_for_display_server (Seat *seat, DisplayServer *display_server)
     for (link = seat->priv->sessions; link; link = link->next)
     {
         Session *session = link->data;
-        if (session_get_display_server (session) == display_server && !session_get_is_stopping (session))
+
+        if (session_get_display_server (session) == display_server &&
+            !session_get_is_stopping (session) &&
+            !session_get_is_run (session))
             return session;
     }
 
@@ -1440,13 +1439,29 @@ create_display_server (Seat *seat, Session *session)
     if (!display_server)
         return NULL;
 
-    seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server);
-    g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (display_server_ready_cb), seat);
-    g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (display_server_stopped_cb), seat);
+    /* Remember this display server */
+    if (!g_list_find (seat->priv->display_servers, display_server)) 
+    {
+        seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server);
+        g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (display_server_ready_cb), seat);
+        g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (display_server_stopped_cb), seat);
+    }
 
     return display_server;
 }
 
+static gboolean
+start_display_server (Seat *seat, DisplayServer *display_server)
+{
+    if (display_server_get_is_ready (display_server))
+    {
+        display_server_ready_cb (display_server, seat);
+        return TRUE;
+    }
+    else
+        return display_server_start (display_server);
+}
+
 gboolean
 seat_switch_to_greeter (Seat *seat)
 {
@@ -1477,7 +1492,7 @@ seat_switch_to_greeter (Seat *seat)
     display_server = create_display_server (seat, SESSION (greeter_session));
     session_set_display_server (SESSION (greeter_session), display_server);
 
-    return display_server_start (display_server);
+    return start_display_server (seat, display_server);
 }
 
 static void
@@ -1508,7 +1523,7 @@ switch_authentication_complete_cb (Session *session, Seat *seat)
             seat->priv->session_to_activate = g_object_ref (session);
             display_server = create_display_server (seat, session);
             session_set_display_server (session, display_server);
-            display_server_start (display_server);
+            start_display_server (seat, display_server);
         }
 
         return;
@@ -1548,7 +1563,7 @@ switch_authentication_complete_cb (Session *session, Seat *seat)
 
         display_server = create_display_server (seat, SESSION (greeter_session));
         session_set_display_server (SESSION (greeter_session), display_server);
-        display_server_start (display_server);
+        start_display_server (seat, display_server);
     }
 }
 
@@ -1624,7 +1639,7 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name)
     session_set_pam_service (session, seat_get_string_property (seat, "pam-autologin-service"));
     session_set_display_server (session, display_server);
 
-    return display_server_start (display_server);
+    return start_display_server (seat, display_server);
 }
 
 gboolean
@@ -1700,7 +1715,7 @@ seat_lock (Seat *seat, const gchar *username)
             return TRUE;
         }
         else
-            return display_server_start (display_server);
+            return start_display_server (seat, display_server);
     }
 }
 
@@ -1773,7 +1788,7 @@ seat_real_start (Seat *seat)
 
             display_server = create_display_server (seat, session);
             session_set_display_server (session, display_server);
-            if (!display_server || !display_server_start (display_server))
+            if (!display_server || !start_display_server (seat, display_server))
             {
                 l_debug (seat, "Can't create display server for automatic login");
                 session_stop (session);
@@ -1803,7 +1818,7 @@ seat_real_start (Seat *seat)
 
         display_server = create_display_server (seat, session);
         session_set_display_server (session, display_server);
-        if (!display_server || !display_server_start (display_server))
+        if (!display_server || !start_display_server (seat, display_server))
         {
             l_debug (seat, "Can't create display server for greeter");
             session_stop (session);
@@ -1827,13 +1842,37 @@ seat_real_start (Seat *seat)
 
         background_display_server = create_display_server (seat, background_session);
         session_set_display_server (background_session, background_display_server);
-        if (!display_server_start (background_display_server))
+        if (!start_display_server (seat, background_display_server))
             l_warning (seat, "Failed to start display server for background session");
     }
 
     return TRUE;
 }
 
+static DisplayServer *
+seat_real_create_display_server (Seat *seat, Session *session)
+{
+    return NULL;
+}
+
+static gboolean
+seat_real_display_server_is_used (Seat *seat, DisplayServer *display_server)
+{
+    GList *link;
+
+    for (link = seat->priv->sessions; link; link = link->next)
+    {
+        Session *session = link->data;
+        DisplayServer *d;
+
+        d = session_get_display_server (session);
+        if (d == display_server || display_server_get_parent (d) == display_server)
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
 static GreeterSession *
 seat_real_create_greeter_session (Seat *seat)
 {
@@ -1944,6 +1983,8 @@ seat_class_init (SeatClass *klass)
 
     klass->setup = seat_real_setup;
     klass->start = seat_real_start;
+    klass->create_display_server = seat_real_create_display_server;
+    klass->display_server_is_used = seat_real_display_server_is_used;  
     klass->create_greeter_session = seat_real_create_greeter_session;
     klass->create_session = seat_real_create_session;
     klass->set_active_session = seat_real_set_active_session;