Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions data/compositor.gschema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,6 @@
<summary>Last selected user</summary>
<description></description>
</key>
<key type="s" name="last-session-type">
<default>''</default>
<summary>Last selected session type</summary>
<description></description>
</key>
</schema>

<schema path="/io/elementary/greeter-compositor/keybindings/" id="io.elementary.greeter-compositor.keybindings">
Expand Down
72 changes: 15 additions & 57 deletions src/Application.vala
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,21 @@
*/

public class Greeter.Application : Gtk.Application {
public unowned string default_session_type {
get {
if (lightdm_greeter.default_session_hint != null) {
return lightdm_greeter.default_session_hint;
}

unowned var sessions = LightDM.get_sessions ();
if (sessions.length () > 0) {
sessions.first ().data.key;
}

return "";
}
}

private LightDM.Greeter lightdm_greeter;

public Application () {
Expand Down Expand Up @@ -68,69 +83,12 @@ public class Greeter.Application : Gtk.Application {
gtk_settings.gtk_application_prefer_dark_theme = settings_portal.prefers_color_scheme == 1;
});

var settings = new GLib.Settings ("io.elementary.greeter");

lightdm_greeter = new LightDM.Greeter ();
try {
lightdm_greeter.connect_to_daemon_sync ();
} catch (Error e) {
critical ("LightDM couldn't connect to daemon: %s", e.message);
}

unowned var sessions = LightDM.get_sessions ();

var selected_session = "";
if (settings.get_string ("last-session-type") != "") {
selected_session = settings.get_string ("last-session-type");
} else if (lightdm_greeter.default_session_hint != null) {
selected_session = lightdm_greeter.default_session_hint;
} else if (sessions.length () > 0) {
selected_session = sessions.first ().data.key;
}

var select_session_action = new GLib.SimpleAction.stateful ("select-session", GLib.VariantType.STRING, selected_session);
var vardict = new GLib.VariantDict ();
var has_pantheon_x11_session = false;
sessions.foreach ((session) => {
vardict.insert_value (session.name, new GLib.Variant.string (session.key));
if (session.key == "pantheon") {
has_pantheon_x11_session = true;
}
});
select_session_action.set_state_hint (vardict.end ());

select_session_action.activate.connect ((param) => {
if (!select_session_action.get_state ().equal (param)) {
select_session_action.set_state (param);
}
});

add_action (select_session_action);

if (has_pantheon_x11_session) {
var a11y_settings = new GLib.Settings ("org.gnome.desktop.a11y.applications");
a11y_settings.changed.connect ((key) => {
if (key != "screen-keyboard-enabled" && key != "screen-reader-enabled") {
return;
}

if (!a11y_settings.get_boolean (key)) {
return;
}

if (select_session_action.get_state ().get_string () != "pantheon-wayland") {
return;
}

select_session_action.set_state (new Variant.string ("pantheon"));

var notification = new Notification (_("Classic session automatically selected"));
notification.set_body (_("Accessibility features may be unavailable in the Secure session"));
notification.set_icon (new ThemedIcon ("preferences-desktop-accessibility"));

send_notification ("session-type", notification);
});
}
}

public override void activate () {
Expand Down
86 changes: 86 additions & 0 deletions src/Cards/BaseCard.vala
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,102 @@ public abstract class Greeter.BaseCard : Gtk.Bin {

protected const int ERROR_SHAKE_DURATION = 450;

/*
* Unique identifier of the card.
* User card uses User + uid
* Manual card -- "manual"
* Guest card -- "guest"
*/
public string card_identifier { protected get; construct; }
public string selected_session { private get; construct; }

public bool connecting { get; set; default = false; }
public bool need_password { get; set; default = false; }
public bool use_fingerprint { get; set; default = false; }

public unowned string selected_session_type {
get {
return select_session_action.state.get_string ();
}
}

protected SimpleAction select_session_action;

private static bool has_pantheon_x11_session;
private static GLib.Settings a11y_settings;
private static bool sent_x11_a11y_notification = false;

static construct {
LightDM.get_sessions ().foreach ((session) => {
if (session.key == "pantheon") {
has_pantheon_x11_session = true;
}
});

a11y_settings = new GLib.Settings ("org.gnome.desktop.a11y.applications");
}

protected BaseCard (string card_identifier, string selected_session) {
Object (card_identifier: card_identifier, selected_session: selected_session);
}

construct {
select_session_action = new GLib.SimpleAction.stateful ("select-session", GLib.VariantType.STRING, selected_session);
var vardict = new GLib.VariantDict ();
LightDM.get_sessions ().foreach ((session) => vardict.insert_value (session.name, new GLib.Variant.string (session.key)));
select_session_action.set_state_hint (vardict.end ());

var action_group = new SimpleActionGroup ();
action_group.add_action (select_session_action);
insert_action_group (card_identifier, action_group);

select_session_action.change_state.connect ((value) => {
select_session_action.set_state (value);

if (value.get_string () != "pantheon") {
sent_x11_a11y_notification = false;
}
});

if (has_pantheon_x11_session) {
a11y_settings.changed.connect ((key) => {
if (key != "screen-keyboard-enabled" && key != "screen-reader-enabled") {
return;
}

if (!a11y_settings.get_boolean (key)) {
return;
}

if (select_session_action.state.get_string () != "pantheon-wayland") {
return;
}

select_session_action.set_state (new Variant.string ("pantheon"));
send_x11_a11y_notification ();
});
}

halign = CENTER;
valign = CENTER;
width_request = 350;
}

private static void send_x11_a11y_notification () {
// Avoid sending notification for every card
if (sent_x11_a11y_notification) {
return;
}

sent_x11_a11y_notification = true;

var notification = new Notification (_("Classic session automatically selected"));
notification.set_body (_("Accessibility features may be unavailable in the Secure session"));
notification.set_icon (new ThemedIcon ("preferences-desktop-accessibility"));

GLib.Application.get_default ().send_notification ("session-type", notification);
}

public override bool focus (Gtk.DirectionType direction) {
if (direction == LEFT) {
go_left ();
Expand Down
9 changes: 8 additions & 1 deletion src/Cards/ManualCard.vala
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,13 @@ public class Greeter.ManualCard : Greeter.BaseCard {
private Gtk.Entry username_entry;
private Gtk.Box main_box;

public ManualCard () {
Object (
card_identifier: "manual",
selected_session: ((Greeter.Application) GLib.Application.get_default ()).default_session_type
);
}

construct {
width_request = 350;

Expand All @@ -35,7 +42,7 @@ public class Greeter.ManualCard : Greeter.BaseCard {

var caps_lock_revealer = new Greeter.CapsLockRevealer ();

var session_button = new Greeter.SessionButton ();
var session_button = new Greeter.SessionButton (card_identifier, select_session_action);

var form_grid = new Gtk.Grid () {
column_spacing = 6,
Expand Down
12 changes: 9 additions & 3 deletions src/Cards/UserCard.vala
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,13 @@ public class Greeter.UserCard : Greeter.BaseCard {
private SelectionCheck logged_in;

public UserCard (LightDM.User lightdm_user) {
Object (lightdm_user: lightdm_user);
unowned var default_session = ((Greeter.Application) GLib.Application.get_default ()).default_session_type;

Object (
lightdm_user: lightdm_user,
card_identifier: "User%u".printf ((uint) lightdm_user.uid),
selected_session: lightdm_user.session ?? default_session
);
}

construct {
Expand All @@ -46,7 +52,7 @@ public class Greeter.UserCard : Greeter.BaseCard {
bind_property ("use-fingerprint", fingerprint_image, "no-show-all", SYNC_CREATE | INVERT_BOOLEAN);
bind_property ("use-fingerprint", fingerprint_image, "visible", SYNC_CREATE);

var password_session_button = new Greeter.SessionButton () {
var password_session_button = new Greeter.SessionButton (card_identifier, select_session_action) {
vexpand = true
};
lightdm_user.bind_property ("is-locked", password_session_button, "sensitive", SYNC_CREATE | INVERT_BOOLEAN);
Expand All @@ -64,7 +70,7 @@ public class Greeter.UserCard : Greeter.BaseCard {
login_button.get_style_context ().add_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION);
bind_property ("connecting", login_button, "sensitive", INVERT_BOOLEAN);

var login_button_session_button = new Greeter.SessionButton () {
var login_button_session_button = new Greeter.SessionButton (card_identifier, select_session_action) {
vexpand = true
};
lightdm_user.bind_property ("is-locked", login_button_session_button, "sensitive", SYNC_CREATE | INVERT_BOOLEAN);
Expand Down
3 changes: 1 addition & 2 deletions src/MainWindow.vala
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ public class Greeter.MainWindow : Gtk.ApplicationWindow {

if (lightdm_greeter.is_authenticated) {
try {
unowned var session = application.get_action_state ("select-session").get_string ();
unowned var session = current_card.selected_session_type;

// If the greeter is running on the install medium, check if the Installer has signalled
// that it wants the greeter to launch the live (demo) session by means of touching a file
Expand All @@ -311,7 +311,6 @@ public class Greeter.MainWindow : Gtk.ApplicationWindow {
}
}

gsettings.set_string ("last-session-type", session);
lightdm_greeter.start_session_sync (session);

return;
Expand Down
10 changes: 5 additions & 5 deletions src/Widgets/SessionButton.vala
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@
*/

public class Greeter.SessionButton : Gtk.Bin {
construct {
public SessionButton (string action_group_prefix, Action select_session_action) {
var menu = new GLib.Menu ();
unowned var application = (Gtk.Application) GLib.Application.get_default ();
var hint = application.get_action_state_hint ("select-session");
var iter = hint.iterator ();

var iter = select_session_action.get_state_hint ().iterator ();
GLib.Variant? val = null;
string? key = null;
while (iter.next ("{sv}", out key, out val)) {
menu.append (key, Action.print_detailed_name ("app.select-session", val));
var action_name = "%s.%s".printf (action_group_prefix, select_session_action.name);
menu.append (key, Action.print_detailed_name (action_name, val));
}

var menu_button = new Gtk.MenuButton () {
Expand Down