]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Allow display servers to not be able to share sessions
authorRobert Ancell <robert.ancell@canonical.com>
Fri, 26 Jul 2013 01:23:50 +0000 (13:23 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Fri, 26 Jul 2013 01:23:50 +0000 (13:23 +1200)
src/display-server.c
src/display-server.h
src/seat.c
src/x-server-xvnc.c
src/x-server.c

index fd9dac4f94c5ad623ce2443d687c64c81f71fbcb..987ed3c1ac8d9f7457b0635c021a559dfa427f0d 100644 (file)
@@ -49,6 +49,18 @@ display_server_get_name (DisplayServer *server)
     return server->priv->name;
 }
 
+gboolean
+display_server_get_can_share (DisplayServer *server)
+{
+    return DISPLAY_SERVER_GET_CLASS (server)->get_can_share (server);
+}
+
+static gboolean
+display_server_real_get_can_share (DisplayServer *server)
+{
+    return FALSE;
+}
+
 gint
 display_server_get_vt (DisplayServer *server)
 {
@@ -120,6 +132,7 @@ display_server_init (DisplayServer *server)
 static void
 display_server_class_init (DisplayServerClass *klass)
 {
+    klass->get_can_share = display_server_real_get_can_share;
     klass->get_vt = display_server_real_get_vt;
     klass->start = display_server_real_start;
     klass->setup_session = display_server_real_setup_session;
index d8551067f97a1d0b91cfa6cae8bbbcf28faca8f5..baebeff0897c4387b2d1182ae5d5f626a9bb4cb7 100644 (file)
@@ -40,6 +40,7 @@ typedef struct
     void (*ready)(DisplayServer *server);
     void (*stopped)(DisplayServer *server);
 
+    gboolean (*get_can_share)(DisplayServer *server);
     gint (*get_vt)(DisplayServer *server);
     gboolean (*start)(DisplayServer *server);
     void (*setup_session)(DisplayServer *server, Session *session);
@@ -52,6 +53,8 @@ void display_server_set_name (DisplayServer *server, const gchar *name);
 
 const gchar *display_server_get_name (DisplayServer *server);
 
+gboolean display_server_get_can_share (DisplayServer *server);
+
 gint display_server_get_vt (DisplayServer *server);
 
 gboolean display_server_start (DisplayServer *server);
index 5efbc178b7dae3d967707305d264cbb6ddfaedce..56aa0b04978b624988b977b49ab828c7ee406bb9 100644 (file)
@@ -364,6 +364,12 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat)
     g_object_unref (display_server);
 }
 
+static gboolean
+can_share_display_server (Seat *seat, DisplayServer *display_server)
+{
+    return seat->priv->share_display_server && display_server_get_can_share (display_server);
+}
+
 static void
 switch_to_greeter_from_failed_session (Seat *seat, Session *session)
 {
@@ -378,7 +384,7 @@ switch_to_greeter_from_failed_session (Seat *seat, Session *session)
         g_object_unref (seat->priv->session_to_activate);
     seat->priv->session_to_activate = g_object_ref (greeter_session);
 
-    if (seat->priv->share_display_server)
+    if (can_share_display_server (seat, session_get_display_server (session)))
         session_set_display_server (SESSION (greeter_session), session_get_display_server (session));
     else
     {
@@ -519,7 +525,8 @@ session_stopped_cb (Session *session, Seat *seat)
     }
 
     /* If this is the greeter session then re-use this display server */
-    if (IS_GREETER (session) && seat->priv->share_display_server &&
+    if (IS_GREETER (session) &&
+        can_share_display_server (seat, display_server) &&
         greeter_get_start_session (GREETER (session)))
     {
         GList *link;
@@ -839,6 +846,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
     User *user;
     gchar *sessions_dir = NULL;
     gchar **argv;
+    DisplayServer *display_server;
 
     /* Get the session to use */
     if (greeter_get_guest_authenticated (greeter))
@@ -913,10 +921,11 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
     }
 
     /* If can re-use the display server, stop the greeter first */
-    if (seat->priv->share_display_server)
+    display_server = session_get_display_server (SESSION (greeter));
+    if (can_share_display_server (seat, display_server))
     {
         /* Run on the same display server after the greeter has stopped */
-        session_set_display_server (session, session_get_display_server (SESSION (greeter)));
+        session_set_display_server (session, display_server);
 
         g_debug ("Stopping greeter");
         session_stop (SESSION (greeter));
@@ -926,8 +935,6 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
     /* Otherwise start a new display server for this session */
     else
     {
-        DisplayServer *display_server;
-
         display_server = create_display_server (seat);
         if (!display_server_start (display_server))
             return FALSE;
index 9ee47ba95565939486c6e980fdbb44abcb8bb2f2..3595ddefe15bdeae24cb8c4fa3bfa8676699a7b2 100644 (file)
@@ -188,6 +188,12 @@ stopped_cb (Process *process, XServerXVNC *server)
     DISPLAY_SERVER_CLASS (x_server_xvnc_parent_class)->stop (DISPLAY_SERVER (server));
 }
 
+static gboolean
+x_server_xvnc_get_can_share (DisplayServer *server)
+{
+    return TRUE;
+}
+
 static gboolean
 x_server_xvnc_start (DisplayServer *display_server)
 {
@@ -319,6 +325,7 @@ x_server_xvnc_class_init (XServerXVNCClass *klass)
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
     DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
 
+    display_server_class->get_can_share = x_server_xvnc_get_can_share;
     display_server_class->start = x_server_xvnc_start;
     display_server_class->stop = x_server_xvnc_stop;
     object_class->finalize = x_server_xvnc_finalize;
index 8bc14dc4868ad125d82acbfb7a9d25f46bcd2eac..23bf0a0f586e3f20fc30e332d4fa916275847060 100644 (file)
@@ -105,6 +105,12 @@ x_server_get_authority (XServer *server)
     return server->priv->authority;
 }
 
+static gboolean
+x_server_get_can_share (DisplayServer *server)
+{
+    return TRUE;
+}
+
 static gboolean
 x_server_start (DisplayServer *display_server)
 {
@@ -191,6 +197,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_can_share = x_server_get_can_share;
     display_server_class->start = x_server_start;
     display_server_class->setup_session = x_server_setup_session;
     object_class->finalize = x_server_finalize;