/* Mir socket for this server to talk to parent */
gchar *parent_socket;
-
- /* ID to use for Mir connection */
- gchar *id;
};
G_DEFINE_TYPE (MirServer, mir_server, DISPLAY_SERVER_TYPE);
server->priv->parent_socket = g_strdup (parent_socket);
}
-void
-mir_server_set_id (MirServer *server, const gchar *id)
-{
- g_return_if_fail (server != NULL);
- g_free (server->priv->id);
- server->priv->id = g_strdup (id);
-}
-
-const gchar *
-mir_server_get_id (MirServer *server)
-{
- g_return_val_if_fail (server != NULL, NULL);
- return server->priv->id;
-}
-
static const gchar *
mir_server_get_session_type (DisplayServer *server)
{
MirServer *server;
server = MIR_SERVER (display_server);
- if (server->priv->id)
- session_set_env (session, "MIR_SERVER_NAME", server->priv->id);
if (server->priv->parent_socket)
session_set_env (session, "MIR_SOCKET", server->priv->parent_socket);
if (server->priv->vt > 0)
static void
mir_server_disconnect_session (DisplayServer *display_server, Session *session)
{
- session_unset_env (session, "MIR_SERVER_NAME");
session_unset_env (session, "MIR_SOCKET");
session_unset_env (session, "MIR_SERVER_VT");
}
{
server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, MIR_SERVER_TYPE, MirServerPrivate);
server->priv->vt = -1;
- display_server_set_name (DISPLAY_SERVER (server), "mir");
}
static void
if (server->priv->vt > 0)
vt_unref (server->priv->vt);
- g_free (server->priv->id);
g_free (server->priv->parent_socket);
G_OBJECT_CLASS (mir_server_parent_class)->finalize (object);
void mir_server_set_parent_socket (MirServer *server, const gchar *parent_socket);
-void mir_server_set_id (MirServer *server, const gchar *id);
-
-const gchar *mir_server_get_id (MirServer *server);
-
G_END_DECLS
#endif /* MIR_SERVER_H_ */
/* Timeout when waiting for compositor to start */
guint compositor_timeout;
- /* Next Mir ID to use for a compositor client */
- gint next_id;
+ /* Next Mir ID to use for a Mir sessions, X server and greeters */
+ gint next_session_id;
+ gint next_x_server_id;
+ gint next_greeter_id;
/* TRUE if using VT switching fallback */
gboolean use_vt_switching;
{
gchar *id;
- id = g_strdup_printf ("%d", SEAT_UNITY (seat)->priv->next_id);
- SEAT_UNITY (seat)->priv->next_id++;
+ id = g_strdup_printf ("x-%d", SEAT_UNITY (seat)->priv->next_x_server_id);
+ SEAT_UNITY (seat)->priv->next_x_server_id++;
x_server_local_set_mir_id (x_server, id);
x_server_local_set_mir_socket (x_server, SEAT_UNITY (seat)->priv->mir_socket_filename);
g_free (id);
}
static DisplayServer *
-create_mir_server (Seat *seat, gboolean is_greeter)
+create_mir_server (Seat *seat)
{
MirServer *mir_server;
if (SEAT_UNITY (seat)->priv->use_vt_switching)
mir_server_set_vt (mir_server, vt_get_unused ());
- else
- {
- gchar *id;
-
- // If we're a greeter, mark our ID that way, so USC can treat it specially
- id = g_strdup_printf ("%s%d", is_greeter ? "greeter-" : "", SEAT_UNITY (seat)->priv->next_id);
- mir_server_set_id (mir_server, id);
- g_free (id);
-
- // Now set display name for logging and internal use
- id = g_strdup_printf ("mir-%d", SEAT_UNITY (seat)->priv->next_id);
- display_server_set_name (DISPLAY_SERVER (mir_server), id);
- g_free (id);
-
- SEAT_UNITY (seat)->priv->next_id++;
- }
return DISPLAY_SERVER (mir_server);
}
static DisplayServer *
-seat_unity_create_display_server (Seat *seat, const gchar *session_type, gboolean is_greeter)
+seat_unity_create_display_server (Seat *seat, const gchar *session_type)
{
if (strcmp (session_type, "x") == 0)
return create_x_server (seat);
else if (strcmp (session_type, "mir") == 0)
- return create_mir_server (seat, is_greeter);
+ return create_mir_server (seat);
else
{
l_warning (seat, "Can't create unsupported display server '%s'", session_type);
{
Greeter *greeter_session;
const gchar *xdg_seat;
+ gchar *id;
gint vt = -1;
greeter_session = SEAT_CLASS (seat_unity_parent_class)->create_greeter_session (seat);
l_debug (seat, "Setting XDG_SEAT=%s", xdg_seat);
session_set_env (SESSION (greeter_session), "XDG_SEAT", xdg_seat);
+ id = g_strdup_printf ("greeter-%d", SEAT_UNITY (seat)->priv->next_greeter_id);
+ SEAT_UNITY (seat)->priv->next_greeter_id++;
+ session_set_env (SESSION (greeter_session), "MIR_SERVER_NAME", id);
+ g_free (id);
+
if (!SEAT_UNITY (seat)->priv->use_vt_switching)
vt = SEAT_UNITY (seat)->priv->vt;
{
Session *session;
const gchar *xdg_seat;
+ gchar *id;
gint vt = -1;
session = SEAT_CLASS (seat_unity_parent_class)->create_session (seat);
l_debug (seat, "Setting XDG_SEAT=%s", xdg_seat);
session_set_env (session, "XDG_SEAT", xdg_seat);
+ id = g_strdup_printf ("session-%d", SEAT_UNITY (seat)->priv->next_session_id);
+ SEAT_UNITY (seat)->priv->next_session_id++;
+ session_set_env (session, "MIR_SERVER_NAME", id);
+ g_free (id);
+
if (!SEAT_UNITY (seat)->priv->use_vt_switching)
vt = SEAT_UNITY (seat)->priv->vt;
if (IS_X_SERVER_LOCAL (display_server))
id = x_server_local_get_mir_id (X_SERVER_LOCAL (display_server));
- else if (IS_MIR_SERVER (display_server))
- id = mir_server_get_id (MIR_SERVER (display_server));
+ else
+ id = session_get_env (session, "MIR_SERVER_NAME");
if (id)
{
if (IS_X_SERVER_LOCAL (display_server))
id = x_server_local_get_mir_id (X_SERVER_LOCAL (display_server));
- else if (IS_MIR_SERVER (display_server))
- id = mir_server_get_id (MIR_SERVER (display_server));
+ else
+ id = session_get_env (session, "MIR_SESSION_NAME");
if (id)
{
}
static DisplayServer *
-seat_xdmcp_session_create_display_server (Seat *seat, const gchar *session_type, gboolean is_greeter)
+seat_xdmcp_session_create_display_server (Seat *seat, const gchar *session_type)
{
XAuthority *authority;
gchar *host;
}
static DisplayServer *
-seat_xlocal_create_display_server (Seat *seat, const gchar *session_type, gboolean is_greeter)
+seat_xlocal_create_display_server (Seat *seat, const gchar *session_type)
{
if (strcmp (session_type, "x") != 0)
return NULL;
}
static DisplayServer *
-seat_xremote_create_display_server (Seat *seat, const gchar *session_type, gboolean is_greeter)
+seat_xremote_create_display_server (Seat *seat, const gchar *session_type)
{
XServerRemote *x_server;
const gchar *hostname;
}
static DisplayServer *
-seat_xvnc_create_display_server (Seat *seat, const gchar *session_type, gboolean is_greeter)
+seat_xvnc_create_display_server (Seat *seat, const gchar *session_type)
{
XServerXVNC *x_server;
const gchar *command = NULL;
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, const gchar *session_type, gboolean is_greeter);
+static DisplayServer *create_display_server (Seat *seat, const gchar *session_type);
static Greeter *create_greeter_session (Seat *seat);
static void start_session (Seat *seat, Session *session);
{
DisplayServer *display_server;
- display_server = create_display_server (seat, session_get_session_type (session), TRUE);
+ display_server = create_display_server (seat, session_get_session_type (session));
if (!display_server_start (display_server))
{
l_debug (seat, "Failed to start display server for greeter");
/* Otherwise start a new display server for this session */
else
{
- display_server = create_display_server (seat, session_get_session_type (session), FALSE);
+ display_server = create_display_server (seat, session_get_session_type (session));
session_set_display_server (session, display_server);
if (!display_server_start (display_server))
{
}
static DisplayServer *
-create_display_server (Seat *seat, const gchar *session_type, gboolean is_greeter)
+create_display_server (Seat *seat, const gchar *session_type)
{
DisplayServer *display_server;
l_debug (seat, "Creating display server of type %s", session_type);
- display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session_type, is_greeter);
+ display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session_type);
if (!display_server)
return NULL;
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
- display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)), TRUE);
+ display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)));
session_set_display_server (SESSION (greeter_session), display_server);
if (!display_server_start (display_server))
return FALSE;
if (seat->priv->session_to_activate)
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (session);
- display_server = create_display_server (seat, session_get_session_type (session), FALSE);
+ display_server = create_display_server (seat, session_get_session_type (session));
session_set_display_server (session, display_server);
display_server_start (display_server);
}
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
- display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)), TRUE);
+ display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)));
session_set_display_server (SESSION (greeter_session), display_server);
display_server_start (display_server);
}
if (!session)
return FALSE;
- display_server = create_display_server (seat, session_get_session_type (session), FALSE);
+ display_server = create_display_server (seat, session_get_session_type (session));
if (!display_server_start (display_server))
return FALSE;
if (!greeter_session)
return FALSE;
- display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)), TRUE);
+ display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)));
if (!display_server_start (display_server))
return FALSE;
if (!get_start_local_sessions (seat))
{
DisplayServer *display_server;
- display_server = create_display_server (seat, "x", FALSE); // FIXME: Not necessarily an X seat, but not sure what to put here
+ display_server = create_display_server (seat, "x"); // FIXME: Not necessarily an X seat, but not sure what to put here
return display_server_start (display_server);
}
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (session);
- display_server = create_display_server (seat, session_get_session_type (session), FALSE);
+ display_server = create_display_server (seat, session_get_session_type (session));
session_set_display_server (session, display_server);
if (!display_server || !display_server_start (display_server))
{
greeter_set_hint (greeter_session, "autologin-guest", "true");
}
- display_server = create_display_server (seat, session_get_session_type (session), TRUE);
+ display_server = create_display_server (seat, session_get_session_type (session));
session_set_display_server (session, display_server);
if (!display_server || !display_server_start (display_server))
{
{
DisplayServer *background_display_server;
- background_display_server = create_display_server (seat, session_get_session_type (background_session), FALSE);
+ background_display_server = create_display_server (seat, session_get_session_type (background_session));
session_set_display_server (background_session, background_display_server);
if (!display_server_start (background_display_server))
l_warning (seat, "Failed to start display server for background session");
gboolean (*get_start_local_sessions) (Seat *seat);
void (*setup)(Seat *seat);
gboolean (*start)(Seat *seat);
- DisplayServer *(*create_display_server) (Seat *seat, const gchar *session_type, gboolean is_greeter);
+ DisplayServer *(*create_display_server) (Seat *seat, const gchar *session_type);
gboolean (*display_server_supports_session_type) (Seat *seat, DisplayServer *display_server, const gchar *session_type);
Greeter *(*create_greeter_session) (Seat *seat);
Session *(*create_session) (Seat *seat);
session->priv->env = g_list_append (session->priv->env, entry);
}
+const gchar *
+session_get_env (Session *session, const gchar *name)
+{
+ GList *link;
+ gchar *entry;
+
+ link = find_env_entry (session, name);
+ if (!link)
+ return NULL;
+
+ entry = link->data;
+
+ return entry + strlen (name) + 1;
+}
+
void
session_unset_env (Session *session, const gchar *name)
{
void session_set_env (Session *session, const gchar *name, const gchar *value);
+const gchar *session_get_env (Session *session, const gchar *name);
+
void session_unset_env (Session *session, const gchar *name);
void session_set_argv (Session *session, gchar **argv);
#?*UNITY-SYSTEM-COMPOSITOR READY
# X server starts
-#?XSERVER-0 START MIR-ID=0
+#?XSERVER-0 START MIR-ID=x-0
# Daemon connects when X server is ready
#?*XSERVER-0 INDICATE-READY
#?SESSION-X-0 CONNECT-XSERVER
# System compositor switches to session
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=0
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=x-0
# Cleanup
#?*STOP-DAEMON
#?*UNITY-SYSTEM-COMPOSITOR READY
# X server starts
-#?XSERVER-0 START MIR-ID=0
+#?XSERVER-0 START MIR-ID=x-0
# Daemon connects when X server is ready
#?*XSERVER-0 INDICATE-READY
#?GREETER-X-0 CONNECTED-TO-DAEMON
# System compositor switches to greeter
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=0
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=x-0
# Cleanup
#?*STOP-DAEMON
#?*UNITY-SYSTEM-COMPOSITOR READY
# Greeter session
-#?XSERVER-0 START MIR-ID=0
+#?XSERVER-0 START MIR-ID=x-0
#?*XSERVER-0 INDICATE-READY
#?XSERVER-0 INDICATE-READY
#?XSERVER-0 ACCEPT-CONNECT
#?GREETER-X-0 CONNECTED-TO-DAEMON
# Background session
-#?XSERVER-1 START MIR-ID=1
+#?XSERVER-1 START MIR-ID=x-1
#?*XSERVER-1 INDICATE-READY
#?XSERVER-1 INDICATE-READY
#?XSERVER-1 ACCEPT-CONNECT
#?SESSION-X-1 CONNECT-XSERVER
# System compositor switches to greeter
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=0
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=x-0
# Switch to user without a session
#?*GREETER-X-0 AUTHENTICATE USERNAME=have-password1
# Switch to user with a session
#?*GREETER-X-0 AUTHENTICATE USERNAME=have-password2
#?GREETER-X-0 SHOW-PROMPT TEXT="Password:"
-#?UNITY-SYSTEM-COMPOSITOR SET-NEXT-SESSION ID=1
+#?UNITY-SYSTEM-COMPOSITOR SET-NEXT-SESSION ID=x-1
# Cleanup
#?*STOP-DAEMON
#?*UNITY-SYSTEM-COMPOSITOR READY
# X server starts
-#?XSERVER-0 START MIR-ID=0
+#?XSERVER-0 START MIR-ID=x-0
# Daemon connects when X server is ready
#?*XSERVER-0 INDICATE-READY
#?GREETER-X-0 CONNECTED-TO-DAEMON
# System compositor switches to greeter
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=0
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=x-0
# Log into account with a password
#?*GREETER-X-0 AUTHENTICATE USERNAME=have-password1
#?*UNITY-SYSTEM-COMPOSITOR READY
# Session starts
-#?SESSION-MIR-0 START XDG_SEAT=seat0 XDG_VTNR=7 DESKTOP_SESSION=mir USER=have-password1
+#?SESSION-MIR-session-0 START XDG_SEAT=seat0 XDG_VTNR=7 DESKTOP_SESSION=mir USER=have-password1
# System compositor switches to session
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=0
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=session-0
# Cleanup
#?*STOP-DAEMON
-#?SESSION-MIR-0 TERMINATE SIGNAL=15
+#?SESSION-MIR-session-0 TERMINATE SIGNAL=15
#?UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=15
#?RUNNER DAEMON-EXIT STATUS=0
#?*GREETER-MIR-greeter-0 START-SESSION
# Session starts
-#?SESSION-MIR-1 START XDG_SEAT=seat0 XDG_VTNR=7 DESKTOP_SESSION=mir USER=no-password1
+#?SESSION-MIR-session-0 START XDG_SEAT=seat0 XDG_VTNR=7 DESKTOP_SESSION=mir USER=no-password1
# System compositor switches to session
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=1
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=session-0
# Greeter stops
#?GREETER-MIR-greeter-0 TERMINATE SIGNAL=15
# Cleanup
#?*STOP-DAEMON
-#?SESSION-MIR-1 TERMINATE SIGNAL=15
+#?SESSION-MIR-session-0 TERMINATE SIGNAL=15
#?UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=15
#?RUNNER DAEMON-EXIT STATUS=0
#?*GREETER-MIR-greeter-0 START-SESSION
# X server starts
-#?XSERVER-0 START MIR-ID=1
+#?XSERVER-0 START MIR-ID=x-0
# Daemon connects when X server is ready
#?*XSERVER-0 INDICATE-READY
#?SESSION-X-0 CONNECT-XSERVER
# System compositor switches to session
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=1
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=x-0
# Greeter stops
#?GREETER-MIR-greeter-0 TERMINATE SIGNAL=15
#?*UNITY-SYSTEM-COMPOSITOR READY
# X server starts
-#?XSERVER-0 START MIR-ID=0
+#?XSERVER-0 START MIR-ID=x-0
# Daemon connects when X server is ready
#?*XSERVER-0 INDICATE-READY
#?GREETER-X-0 CONNECTED-TO-DAEMON
# System compositor switches to greeter
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=0
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=x-0
# Log into account
#?*GREETER-X-0 AUTHENTICATE USERNAME=no-password1
#?*GREETER-X-0 START-SESSION
# Session starts
-#?SESSION-MIR-1 START XDG_SEAT=seat0 XDG_VTNR=7 DESKTOP_SESSION=mir USER=no-password1
+#?SESSION-MIR-session-0 START XDG_SEAT=seat0 XDG_VTNR=7 DESKTOP_SESSION=mir USER=no-password1
# System compositor switches to session
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=1
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=session-0
# Greeter quits once session ready
#?GREETER-X-0 TERMINATE SIGNAL=15
# Cleanup
#?*STOP-DAEMON
-#?SESSION-MIR-1 TERMINATE SIGNAL=15
+#?SESSION-MIR-session-0 TERMINATE SIGNAL=15
#?UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=15
#?RUNNER DAEMON-EXIT STATUS=0
#?*UNITY-SYSTEM-COMPOSITOR READY
# X server starts
-#?XSERVER-0 START MIR-ID=0
+#?XSERVER-0 START MIR-ID=x-0
# Daemon connects when X server is ready
#?*XSERVER-0 INDICATE-READY
#?SESSION-X-0 CONNECT-XSERVER
# System compositor switches to session
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=0
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=x-0
# Cleanup
#?*STOP-DAEMON
#?*UNITY-SYSTEM-COMPOSITOR READY
# X server starts
-#?XSERVER-0 START MIR-ID=0
+#?XSERVER-0 START MIR-ID=x-0
# Daemon connects when X server is ready
#?*XSERVER-0 INDICATE-READY
#?SESSION-X-0 CONNECT-XSERVER
# System compositor switches to session
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=0
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=x-0
# Show the greeter
#?*SWITCH-TO-GREETER
#?RUNNER SWITCH-TO-GREETER
# New X server starts
-#?XSERVER-1 START MIR-ID=1
+#?XSERVER-1 START MIR-ID=x-1
# Daemon connects when X server is ready
#?*XSERVER-1 INDICATE-READY
#?GREETER-X-1 CONNECTED-TO-DAEMON
# System compositor switches to greeter
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=1
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=x-1
# Login
#?*GREETER-X-1 AUTHENTICATE USERNAME=have-password2
#?XSERVER-1 TERMINATE SIGNAL=15
# X server starts
-#?XSERVER-2 START MIR-ID=2
+#?XSERVER-2 START MIR-ID=x-2
#?*XSERVER-2 INDICATE-READY
#?XSERVER-2 INDICATE-READY
#?XSERVER-2 ACCEPT-CONNECT
#?GREETER-X-2 CONNECTED-TO-DAEMON
# System compositor switches to greeter
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=2
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=x-2
# Cleanup
#?*STOP-DAEMON
#?*UNITY-SYSTEM-COMPOSITOR READY
# X server starts
-#?XSERVER-0 START SEAT=seat1 MIR-ID=0
+#?XSERVER-0 START SEAT=seat1 MIR-ID=x-0
# Daemon connects when X server is ready
#?*XSERVER-0 INDICATE-READY
#?SESSION-X-0 CONNECT-XSERVER
# System compositor switches to session
-#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=0
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=x-0
# Cleanup
#?*STOP-DAEMON