diff --git a/src/Cards/BaseCard.vala b/src/Cards/BaseCard.vala index 973c0e88..ffbf8ddd 100644 --- a/src/Cards/BaseCard.vala +++ b/src/Cards/BaseCard.vala @@ -1,12 +1,13 @@ /* * SPDX-License-Identifier: GPL-2.0-or-later - * SPDX-FileCopyrightText: 2018-2025 elementary, Inc. (https://elementary.io) + * SPDX-FileCopyrightText: 2018-2026 elementary, Inc. (https://elementary.io) * * Authors: Corentin Noël */ public abstract class Greeter.BaseCard : Granite.Bin { - public signal void do_connect (string? credential = null); + public signal void start_authentication (string username); + public signal void provide_credential (string credential); public signal void go_left (); public signal void go_right (); @@ -34,5 +35,8 @@ public abstract class Greeter.BaseCard : Granite.Bin { return base.focus (direction); } + public virtual void on_selected () {} + public virtual void on_deselected () {} + public abstract void wrong_credentials (); } diff --git a/src/Cards/ManualCard.vala b/src/Cards/ManualCard.vala index 97340d98..4c1bd329 100644 --- a/src/Cards/ManualCard.vala +++ b/src/Cards/ManualCard.vala @@ -1,11 +1,9 @@ /* - * Copyright 2018-2023 elementary, Inc. (https://elementary.io) + * Copyright 2018-2026 elementary, Inc. (https://elementary.io) * SPDX-License-Identifier: GPL-2.0-or-later */ public class Greeter.ManualCard : Greeter.BaseCard { - public signal void do_connect_username (string username); - private Greeter.PasswordEntry password_entry; private Gtk.Entry username_entry; private Gtk.Box main_box; @@ -68,7 +66,7 @@ public class Greeter.ManualCard : Greeter.BaseCard { var focus_controller = new Gtk.EventControllerFocus (); focus_controller.leave.connect (() => { if (username_entry.text != "") { - do_connect_username (username_entry.text); + start_authentication (username_entry.text); } }); username_entry.add_controller (focus_controller); @@ -82,7 +80,7 @@ public class Greeter.ManualCard : Greeter.BaseCard { } connecting = true; - do_connect (password_entry.text); + provide_credential (password_entry.text); } public override void wrong_credentials () { diff --git a/src/Cards/UserCard.vala b/src/Cards/UserCard.vala index 5f1b491e..a9ee7b2f 100644 --- a/src/Cards/UserCard.vala +++ b/src/Cards/UserCard.vala @@ -11,7 +11,6 @@ public class Greeter.UserCard : Greeter.BaseCard { * and lacks some fields from Act.User such as `password_mode`. */ public Act.User user { get; construct; } - public bool show_input { get; set; default = false; } public bool is_24h { get; set; default = true; } private Pantheon.AccountsService greeter_act; @@ -95,11 +94,9 @@ public class Greeter.UserCard : Greeter.BaseCard { form_revealer = new Gtk.Revealer () { margin_bottom = 12, - reveal_child = true, transition_type = SLIDE_DOWN, child = login_stack }; - bind_property ("show-input", form_revealer, "reveal-child", SYNC_CREATE); main_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0) { margin_bottom = 48, @@ -109,8 +106,6 @@ public class Greeter.UserCard : Greeter.BaseCard { main_box.append (form_revealer); main_box.add_css_class (Granite.CssClass.CARD); - update_collapsed_class (); - var avatar = new Adw.Avatar (64, user.real_name, true) { margin_top = 6, margin_bottom = 6, @@ -148,6 +143,8 @@ public class Greeter.UserCard : Greeter.BaseCard { child = card_overlay; + on_deselected (); + user.changed.connect (update_is_locked_ui); notify["need-password"].connect (update_is_locked_ui); update_is_locked_ui (); @@ -155,8 +152,6 @@ public class Greeter.UserCard : Greeter.BaseCard { user.sessions_changed.connect (on_sessions_changed); on_sessions_changed (); - notify["show-input"].connect (update_collapsed_class); - password_entry.activate.connect (on_login); login_button.clicked.connect (on_login); @@ -315,22 +310,10 @@ public class Greeter.UserCard : Greeter.BaseCard { } connecting = true; - if (need_password) { - do_connect (password_entry.text); - } else { - do_connect (); - } + provide_credential (need_password ? password_entry.text : ""); } - private void update_collapsed_class () { - if (show_input) { - main_box.remove_css_class ("collapsed"); - } else { - main_box.add_css_class ("collapsed"); - } - } - - public void set_settings () { + private void set_settings () { set_keyboard_layouts (); set_mouse_touchpad_settings (); set_interface_settings (); @@ -484,6 +467,21 @@ public class Greeter.UserCard : Greeter.BaseCard { SettingsPortal.get_default ().prefers_color_scheme = greeter_act.prefers_color_scheme; } + public override void on_selected () { + form_revealer.reveal_child = true; + main_box.remove_css_class ("collapsed"); + + set_settings (); + grab_focus (); + + start_authentication (user.user_name); + } + + public override void on_deselected () { + form_revealer.reveal_child = false; + main_box.add_css_class ("collapsed"); + } + public override void wrong_credentials () { password_entry.add_css_class (Granite.CssClass.ERROR); main_box.add_css_class ("shake"); diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 03501f2b..cfa92263 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -87,26 +87,12 @@ public class Greeter.MainWindow : Gtk.ApplicationWindow { child = main_box; manual_login_button.toggled.connect (() => { - if (manual_login_button.active) { - if (lightdm_greeter.in_authentication) { - try { - lightdm_greeter.cancel_authentication (); - } catch (Error e) { - critical (e.message); - } - } + cancel_authentication (); + if (manual_login_button.active) { manual_login_stack.visible_child = manual_card; current_card = manual_card; } else { - if (lightdm_greeter.in_authentication) { - try { - lightdm_greeter.cancel_authentication (); - } catch (Error e) { - critical (e.message); - } - } - manual_login_stack.visible_child = carousel; current_card = user_cards.peek_nth (current_user_card_index); @@ -142,8 +128,8 @@ public class Greeter.MainWindow : Gtk.ApplicationWindow { user_manager.notify["is-loaded"].connect (() => load_users.begin (show_greeter_window)); } - manual_card.do_connect_username.connect (do_connect_username); - manual_card.do_connect.connect (do_connect); + manual_card.start_authentication.connect (do_connect_username); + manual_card.provide_credential.connect (do_connect); var key_controller = new Gtk.EventControllerKey () { propagation_phase = CAPTURE @@ -364,9 +350,7 @@ public class Greeter.MainWindow : Gtk.ApplicationWindow { }); if (!user_selected) { - unowned var user_card = user_cards.peek_head (); - user_card.show_input = true; - carousel.scroll_to (user_card, true); + carousel.scroll_to (user_cards.peek_head (), true); } } else { datetime_revealer.reveal_child = false; @@ -400,15 +384,7 @@ public class Greeter.MainWindow : Gtk.ApplicationWindow { var user_card = new Greeter.UserCard (user); var click_gesture = new Gtk.GestureClick (); - click_gesture.pressed.connect ((gesture, n_press, x, y) => { - assert (gesture.widget is UserCard); - - var _user_card = (UserCard) gesture.widget; - if (!_user_card.show_input) { - carousel.scroll_to (_user_card, true); - _user_card.grab_focus (); - } - }); + click_gesture.pressed.connect ((gesture, n_press, x, y) => carousel.scroll_to (gesture.widget, true)); user_card.add_controller (click_gesture); user_card.go_left.connect (() => { @@ -426,7 +402,8 @@ public class Greeter.MainWindow : Gtk.ApplicationWindow { } }); - user_card.do_connect.connect (do_connect); + user_card.start_authentication.connect (do_connect_username); + user_card.provide_credential.connect (do_connect); carousel.append (user_card); @@ -435,28 +412,24 @@ public class Greeter.MainWindow : Gtk.ApplicationWindow { } private void handle_page_changed (uint index) { - if (index == current_user_card_index) { - return; - } + cancel_authentication (); unowned var user_card = user_cards.peek_nth (index); if (user_card == null) { return; } - if (current_card != null && current_card is UserCard) { - ((UserCard) current_card).show_input = false; - } + current_card?.on_deselected (); current_user_card_index = (int) index; current_card = user_card; datetime_widget.is_24h = user_card.is_24h; - user_card.set_settings (); - user_card.show_input = true; - user_card.grab_focus (); + user_card.on_selected (); + } + private void cancel_authentication () { if (lightdm_greeter.in_authentication) { try { lightdm_greeter.cancel_authentication (); @@ -464,22 +437,10 @@ public class Greeter.MainWindow : Gtk.ApplicationWindow { critical (e.message); } } - - try { - lightdm_greeter.authenticate (user_card.user.user_name); - } catch (Error e) { - critical (e.message); - } } private void do_connect_username (string username) { - if (lightdm_greeter.in_authentication) { - try { - lightdm_greeter.cancel_authentication (); - } catch (Error e) { - critical (e.message); - } - } + cancel_authentication (); try { lightdm_greeter.authenticate (username); @@ -488,17 +449,14 @@ public class Greeter.MainWindow : Gtk.ApplicationWindow { } } - private void do_connect (string? credential) { - if (credential != null) { - try { - lightdm_greeter.respond (credential); - } catch (Error e) { - critical (e.message); - } + private void do_connect (string credential) { + try { + lightdm_greeter.respond (credential); + } catch (Error e) { + critical (e.message); } carousel.interactive = false; - carousel.scroll_to (current_card, true); } private void go_previous () {