]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Stop Mir servers from being shared
authorRobert Ancell <robert.ancell@canonical.com>
Thu, 25 Jul 2013 22:12:51 +0000 (10:12 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Thu, 25 Jul 2013 22:12:51 +0000 (10:12 +1200)
src/display-server.c
src/display-server.h
src/mir-server.c
src/seat.c
src/x-server-local.c
src/x-server-xvnc.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 93fdf8dbb221619cc30d36a2c21e024e2c8815cc..926e20e713b31109331c11c94f1d2d119f7445e1 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);
@@ -53,6 +54,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 ee8657722647ad41afcfff286fabc35970cc1cd7..5c315b361a23ba8c20bcd5183704eff5e1d0ff48 100644 (file)
@@ -88,12 +88,6 @@ mir_server_local_get_vt (DisplayServer *server)
     return MIR_SERVER (server)->priv->vt;
 }
 
-static gboolean
-mir_server_start (DisplayServer *display_server)
-{
-    return DISPLAY_SERVER_CLASS (mir_server_parent_class)->start (display_server);
-}
-
 static void
 mir_server_setup_session (DisplayServer *display_server, Session *session)
 {
@@ -142,7 +136,6 @@ mir_server_class_init (MirServerClass *klass)
     DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
 
     display_server_class->get_vt = mir_server_local_get_vt;
-    display_server_class->start = mir_server_start;
     display_server_class->setup_session = mir_server_setup_session;
     object_class->finalize = mir_server_finalize;
 
index e7ba1fe36eb517344f8d4d216026047c5f634408..71e363af1d90cfe754968978df5bbf29aee1669b 100644 (file)
@@ -378,7 +378,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 (seat->priv->share_display_server && display_server_get_can_share (session_get_display_server (session)))
         session_set_display_server (SESSION (greeter_session), session_get_display_server (session));
     else
     {
@@ -519,7 +519,9 @@ 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) &&
+        seat->priv->share_display_server &&
+        display_server_get_can_share (display_server) &&
         greeter_get_start_session (GREETER (session)))
     {
         GList *link;
@@ -916,7 +918,7 @@ 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)
+    if (seat->priv->share_display_server && display_server_get_can_share (session_get_display_server (SESSION (greeter))))
     {
         /* Run on the same display server after the greeter has stopped */
         session_set_display_server (session, session_get_display_server (SESSION (greeter)));
@@ -932,11 +934,10 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
         DisplayServer *display_server;
 
         display_server = create_display_server (seat, session_get_session_type (session));
+        session_set_display_server (session, display_server);
         if (!display_server_start (display_server))
             return FALSE;
 
-        session_set_display_server (session, display_server);
-
         return TRUE;
     }
 }
index ae3481c3bbb972b7950410ab36a70e0d4ab095aa..239b7c57a87cf6ca06eb61787b583f5fb2f68a97 100644 (file)
@@ -279,6 +279,12 @@ x_server_local_set_mir_socket (XServerLocal *server, const gchar *socket)
     server->priv->mir_socket = g_strdup (socket);
 }
 
+static gboolean
+x_server_local_get_can_share (DisplayServer *server)
+{
+    return TRUE;
+}
+
 static gint
 x_server_local_get_vt (DisplayServer *server)
 {
@@ -580,6 +586,7 @@ x_server_local_class_init (XServerLocalClass *klass)
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
     DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
 
+    display_server_class->get_can_share = x_server_local_get_can_share;
     display_server_class->get_vt = x_server_local_get_vt;
     display_server_class->start = x_server_local_start;
     display_server_class->stop = x_server_local_stop;
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;