$(WARN_CFLAGS) \
-DCONFIG_DIR=\"$(sysconfdir)/lightdm\" \
-DXSESSIONS_DIR=\"$(datadir)/xsessions\" \
- -DREMOTE_SESSIONS_DIR=\"$(pkgdatadir)/remote-sessions\"
+ -DREMOTE_SESSIONS_DIR=\"$(pkgdatadir)/remote-sessions\" \
+ -DMIR_SESSIONS_DIR=\"$(datadir)/mir-sessions\"
mainheader_HEADERS = lightdm.h
mainheaderdir=$(includedir)/lightdm-gobject-1
GREETER_MESSAGE_START_SESSION,
GREETER_MESSAGE_CANCEL_AUTHENTICATION,
GREETER_MESSAGE_SET_LANGUAGE,
- GREETER_MESSAGE_AUTHENTICATE_REMOTE
+ GREETER_MESSAGE_AUTHENTICATE_REMOTE,
+ GREETER_MESSAGE_START_MIR_SESSION
} GreeterMessage;
/* Messages from the server to the greeter */
return return_code == 0;
}
+/**
+ * lightdm_greeter_start_mir_session_sync:
+ * @greeter: A #LightDMGreeter
+ * @session: (allow-none): The Mir session to log into or #NULL to use the default.
+ * @error: return location for a #GError, or %NULL
+ *
+ * Start a session for the authenticated user.
+ *
+ * Return value: TRUE if the session was started.
+ **/
+gboolean
+lightdm_greeter_start_mir_session_sync (LightDMGreeter *greeter, const gchar *session, GError **error)
+{
+ LightDMGreeterPrivate *priv;
+ guint8 message[MAX_MESSAGE_LENGTH];
+ guint8 *response;
+ gsize response_length, offset = 0;
+ guint32 id, return_code = 1;
+
+ g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
+
+ priv = GET_PRIVATE (greeter);
+
+ g_return_val_if_fail (priv->connected, FALSE);
+ g_return_val_if_fail (priv->is_authenticated, FALSE);
+
+ if (session)
+ g_debug ("Starting Mir session %s", session);
+ else
+ g_debug ("Starting default Mir session");
+
+ write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_START_MIR_SESSION, string_length (session), &offset);
+ write_string (message, MAX_MESSAGE_LENGTH, session, &offset);
+ write_message (greeter, message, offset);
+
+ response = read_message (greeter, &response_length, TRUE);
+ if (!response)
+ return FALSE;
+
+ offset = 0;
+ id = read_int (response, response_length, &offset);
+ read_int (response, response_length, &offset);
+ if (id == SERVER_MESSAGE_SESSION_RESULT)
+ return_code = read_int (response, response_length, &offset);
+ else
+ g_warning ("Expected SESSION_RESULT message, got %d", id);
+
+ g_free (response);
+
+ return return_code == 0;
+}
+
static void
lightdm_greeter_init (LightDMGreeter *greeter)
{
gboolean lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *session, GError **error);
+gboolean lightdm_greeter_start_mir_session_sync (LightDMGreeter *greeter, const gchar *session, GError **error);
+
G_END_DECLS
#endif /* LIGHTDM_GREETER_H_ */
GList *lightdm_get_remote_sessions (void);
+GList *lightdm_get_mir_sessions (void);
+
const gchar *lightdm_session_get_key (LightDMSession *session);
const gchar *lightdm_session_get_name (LightDMSession *session);
static gboolean have_sessions = FALSE;
static GList *local_sessions = NULL;
static GList *remote_sessions = NULL;
+static GList *mir_sessions = NULL;
static gint
compare_session (gconstpointer a, gconstpointer b)
gchar *config_path = NULL;
gchar *xsessions_dir;
gchar *remote_sessions_dir;
+ gchar *mir_sessions_dir;
gboolean result;
GError *error = NULL;
xsessions_dir = g_strdup (XSESSIONS_DIR);
remote_sessions_dir = g_strdup (REMOTE_SESSIONS_DIR);
+ mir_sessions_dir = g_strdup (MIR_SESSIONS_DIR);
/* Use session directory from configuration */
/* FIXME: This should be sent in the greeter connection */
g_free (remote_sessions_dir);
remote_sessions_dir = value;
}
+
+ value = g_key_file_get_string (config_key_file, "LightDM", "mir-sessions-directory", NULL);
+ if (value)
+ {
+ g_free (mir_sessions_dir);
+ mir_sessions_dir = value;
+ }
}
g_key_file_free (config_key_file);
g_free (config_path);
local_sessions = load_sessions (xsessions_dir);
remote_sessions = load_sessions (remote_sessions_dir);
+ mir_sessions = load_sessions (mir_sessions_dir);
g_free (xsessions_dir);
g_free (remote_sessions_dir);
return remote_sessions;
}
+/**
+ * lightdm_get_mir_sessions:
+ *
+ * Get the available Mir sessions.
+ *
+ * Return value: (element-type LightDMSession) (transfer none): A list of #LightDMSession
+ **/
+GList *
+lightdm_get_mir_sessions (void)
+{
+ update_sessions ();
+ return mir_sessions;
+}
+
/**
* lightdm_session_get_key:
* @session: A #LightDMSession
enum SessionType {
LocalSessions,
- RemoteSessions
+ RemoteSessions,
+ MirSessions
};
explicit SessionsModel(QObject *parent = 0); /** Deprecated. Loads local sessions*/
case SessionsModel::RemoteSessions:
ldmSessions = lightdm_get_remote_sessions();
break;
+ case SessionsModel::MirSessions:
+ ldmSessions = lightdm_get_mir_sessions();
+ break;
case SessionsModel::LocalSessions:
/* Fall through*/
default:
GREETER_MESSAGE_START_SESSION,
GREETER_MESSAGE_CANCEL_AUTHENTICATION,
GREETER_MESSAGE_SET_LANGUAGE,
- GREETER_MESSAGE_AUTHENTICATE_REMOTE
+ GREETER_MESSAGE_AUTHENTICATE_REMOTE,
+ GREETER_MESSAGE_START_MIR_SESSION
} GreeterMessage;
/* Messages from the server to the greeter */
}
static void
-handle_start_session (Greeter *greeter, const gchar *session)
+handle_start_session (Greeter *greeter, SessionType session_type, const gchar *session)
{
gboolean result;
guint8 message[MAX_MESSAGE_LENGTH];
gsize offset = 0;
- SessionType session_type = SESSION_TYPE_LOCAL;
if (strcmp (session, "") == 0)
session = NULL;
break;
case GREETER_MESSAGE_START_SESSION:
session_name = read_string (greeter, &offset);
- handle_start_session (greeter, session_name);
+ handle_start_session (greeter, SESSION_TYPE_LOCAL, session_name);
+ g_free (session_name);
+ break;
+ case GREETER_MESSAGE_START_MIR_SESSION:
+ session_name = read_string (greeter, &offset);
+ handle_start_session (greeter, SESSION_TYPE_MIR, session_name);
g_free (session_name);
break;
case GREETER_MESSAGE_SET_LANGUAGE:
typedef enum
{
SESSION_TYPE_LOCAL,
- SESSION_TYPE_REMOTE
+ SESSION_TYPE_REMOTE,
+ SESSION_TYPE_MIR
} SessionType;
#define XDG_SESSION_CLASS_USER "user"
int fd, open_max;
display = getenv ("DISPLAY");
- if (display == NULL)
+ if (display == NULL)
session_id = g_strdup ("SESSION-?");
else if (display[0] == ':')
session_id = g_strdup_printf ("SESSION-X-%s", display + 1);