Skip to content
Snippets Groups Projects
Commit d8119761 authored by Arnaud Ferraris's avatar Arnaud Ferraris
Browse files

greetd: save and restore previously started session

This commit adds the ability to save the session ID into a file every
time a session is successfully started. This file is read on startup so
this session can be selected by default.

Requirement: a `/var/lib/phog` folder must exist and be writeable by
whatever user `greetd` runs as.
parent dc832906
No related branches found
No related tags found
No related merge requests found
......@@ -29,6 +29,8 @@
#define WAYLAND_SESSION_FOLDER "/usr/share/wayland-sessions"
#define X11_SESSION_FOLDER "/usr/share/xsessions"
#define LAST_SESSION_FILE "/var/lib/phog/last-session"
/**
* SECTION:lockscreen
* @short_description: The main lock screen
......@@ -57,6 +59,8 @@ typedef struct _PhogGreetd
GListStore *available_sessions;
GHashTable *available_users;
gchar *last_session;
} PhogGreetd;
G_DEFINE_TYPE (PhogGreetd, phog_greetd, G_TYPE_OBJECT)
......@@ -156,6 +160,9 @@ greetd_init_sessions_list (PhogGreetd *self)
greetd_list_sessions_in_folder (self, WAYLAND_SESSION_FOLDER, "wayland");
greetd_list_sessions_in_folder (self, X11_SESSION_FOLDER, "x11");
if (g_file_get_contents(LAST_SESSION_FILE, &self->last_session, NULL, NULL))
self->last_session = g_strstrip(self->last_session);
}
static void
......@@ -371,6 +378,15 @@ phog_greetd_get_available_sessions (PhogGreetd *self)
return self->available_sessions;
}
guint
phog_greetd_get_last_session_idx (PhogGreetd *self)
{
g_return_val_if_fail(PHOG_IS_GREETD (self), G_MAXUINT);
g_return_val_if_fail(self->last_session, G_MAXUINT);
return session_get_position(self, self->last_session);
}
gboolean
phog_greetd_create_session (PhogGreetd *self, const gchar * user, GError **error)
{
......@@ -393,12 +409,13 @@ phog_greetd_authenticate (PhogGreetd *self, const gchar *password, GError **erro
}
gboolean
phog_greetd_start_session (PhogGreetd *self, gint session_id, GError **error)
phog_greetd_start_session (PhogGreetd *self, gint session_pos, GError **error)
{
g_autoptr(JsonBuilder) builder = greetd_json_builder_new ("start_session");
PhogGreetdSession *session =
PHOG_GREETD_SESSION (g_list_model_get_object (G_LIST_MODEL (self->available_sessions),
session_id));
session_pos));
const gchar *session_id = phog_greetd_session_get_id (session);
gchar *str;
json_builder_set_member_name (builder, "cmd");
......@@ -418,17 +435,22 @@ phog_greetd_start_session (PhogGreetd *self, gint session_id, GError **error)
phog_greetd_session_get_desktop_names (session));
json_builder_add_string_value (builder, str);
g_free (str);
str = g_strdup_printf ("XDG_SESSION_DESKTOP=%s",
phog_greetd_session_get_id (session));
str = g_strdup_printf ("XDG_SESSION_DESKTOP=%s", session_id);
json_builder_add_string_value (builder, str);
g_free (str);
str = g_strdup_printf ("GDMSESSION=%s",
phog_greetd_session_get_id (session));
str = g_strdup_printf ("GDMSESSION=%s", session_id);
json_builder_add_string_value (builder, str);
g_free (str);
json_builder_end_array (builder);
return greetd_json_builder_end (self, builder, error);
if (!greetd_json_builder_end (self, builder, error))
return FALSE;
g_free (self->last_session);
self->last_session = g_strdup (session_id);
g_file_set_contents(LAST_SESSION_FILE, self->last_session, strlen (self->last_session), NULL);
return TRUE;
}
gboolean
......
......@@ -23,6 +23,7 @@ GObject *phog_greetd_new (void);
GHashTable *phog_greetd_get_available_users (PhogGreetd *self);
GListStore *phog_greetd_get_available_sessions (PhogGreetd *self);
guint phog_greetd_get_last_session_idx (PhogGreetd *self);
gboolean phog_greetd_create_session (PhogGreetd *self, const gchar * user, GError **error);
gboolean phog_greetd_authenticate (PhogGreetd *self, const gchar * password, GError **error);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment