From 0950e339c9121ed2c63ad7bf12ff3ff4c1d71afb Mon Sep 17 00:00:00 2001 From: lenemter Date: Sat, 8 Nov 2025 13:09:53 +0300 Subject: [PATCH 1/4] Remove accountservice dependency --- src/Cards/UserCard.vala | 108 ++++++++------------------- src/meson.build | 3 +- vapi/accountsservice.vapi | 149 -------------------------------------- 3 files changed, 31 insertions(+), 229 deletions(-) delete mode 100644 vapi/accountsservice.vapi diff --git a/src/Cards/UserCard.vala b/src/Cards/UserCard.vala index 710282db3..c4f8c5c57 100644 --- a/src/Cards/UserCard.vala +++ b/src/Cards/UserCard.vala @@ -14,7 +14,6 @@ public class Greeter.UserCard : Greeter.BaseCard { public bool show_input { get; set; default = false; } public bool is_24h { get; set; default = true; } - private Act.User act_user; private Pantheon.AccountsService greeter_act; private Pantheon.SettingsDaemon.AccountsService settings_act; @@ -26,8 +25,6 @@ public class Greeter.UserCard : Greeter.BaseCard { private SelectionCheck logged_in; - private bool needs_settings_set = false; - public UserCard (LightDM.User lightdm_user) { Object (lightdm_user: lightdm_user); } @@ -36,6 +33,7 @@ public class Greeter.UserCard : Greeter.BaseCard { need_password = true; var username_label = new Gtk.Label (lightdm_user.display_name) { + sensitive = !lightdm_user.is_locked, hexpand = true, margin_top = 24, margin_bottom = 12, @@ -45,34 +43,14 @@ public class Greeter.UserCard : Greeter.BaseCard { username_label.get_style_context ().add_class (Granite.STYLE_CLASS_H2_LABEL); password_entry = new Greeter.PasswordEntry (); + bind_property ("connecting", password_entry, "sensitive", INVERT_BOOLEAN); - bind_property ( - "connecting", - password_entry, - "sensitive", - INVERT_BOOLEAN - ); - - var fingerprint_image = new Gtk.Image.from_icon_name ( - "fingerprint-symbolic", - BUTTON - ); - - bind_property ( - "use-fingerprint", - fingerprint_image, - "no-show-all", - INVERT_BOOLEAN | SYNC_CREATE - ); - - bind_property ( - "use-fingerprint", - fingerprint_image, - "visible", - SYNC_CREATE - ); + var fingerprint_image = new Gtk.Image.from_icon_name ("fingerprint-symbolic", BUTTON); + 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 () { + sensitive = !lightdm_user.is_locked, vexpand = true }; @@ -90,6 +68,7 @@ public class Greeter.UserCard : Greeter.BaseCard { bind_property ("connecting", login_button, "sensitive", INVERT_BOOLEAN); var login_button_session_button = new Greeter.SessionButton () { + sensitive = !lightdm_user.is_locked, vexpand = true }; @@ -121,13 +100,7 @@ public class Greeter.UserCard : Greeter.BaseCard { transition_type = SLIDE_DOWN, child = login_stack }; - - bind_property ( - "show-input", - form_revealer, - "reveal-child", - SYNC_CREATE - ); + bind_property ("show-input", form_revealer, "reveal-child", SYNC_CREATE); main_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0) { margin_bottom = 48 @@ -181,13 +154,7 @@ public class Greeter.UserCard : Greeter.BaseCard { child = card_overlay; - act_user = Act.UserManager.get_default ().get_user (lightdm_user.name); - act_user.bind_property ("locked", username_label, "sensitive", INVERT_BOOLEAN); - act_user.bind_property ("locked", password_session_button, "visible", INVERT_BOOLEAN); - act_user.bind_property ("locked", login_button_session_button, "visible", INVERT_BOOLEAN); - act_user.notify["is-loaded"].connect (on_act_user_loaded); - - on_act_user_loaded (); + connect_to_dbus_interfaces (); card_overlay.focus.connect ((direction) => { if (direction == LEFT) { @@ -284,42 +251,32 @@ public class Greeter.UserCard : Greeter.BaseCard { } } - private void on_act_user_loaded () { - if (!act_user.is_loaded) { - return; - } - - unowned string? act_path = act_user.get_object_path (); - if (act_path != null) { - try { - greeter_act = Bus.get_proxy_sync ( - SYSTEM, - "org.freedesktop.Accounts", - act_path, - GET_INVALIDATED_PROPERTIES - ); - - settings_act = Bus.get_proxy_sync ( - SYSTEM, - "org.freedesktop.Accounts", - act_path, - GET_INVALIDATED_PROPERTIES - ); - - is_24h = greeter_act.time_format != "12h"; - } catch (Error e) { - critical (e.message); - } + private void connect_to_dbus_interfaces () { + var account_path = "/org/freedesktop/Accounts/User%d".printf ((int )lightdm_user.uid); + try { + greeter_act = Bus.get_proxy_sync ( + SYSTEM, + "org.freedesktop.Accounts", + account_path, + GET_INVALIDATED_PROPERTIES + ); + + settings_act = Bus.get_proxy_sync ( + SYSTEM, + "org.freedesktop.Accounts", + account_path, + GET_INVALIDATED_PROPERTIES + ); + + is_24h = greeter_act.time_format != "12h"; + } catch (Error e) { + critical (e.message); } set_background_image (); set_check_style (); - if (needs_settings_set) { - set_settings (); - } - - if (act_user.locked) { + if (lightdm_user.is_locked) { login_stack.visible_child_name = "disabled"; } else { if (need_password) { @@ -352,11 +309,6 @@ public class Greeter.UserCard : Greeter.BaseCard { } public void set_settings () { - if (!act_user.is_loaded) { - needs_settings_set = true; - return; - } - set_keyboard_layouts (); set_mouse_touchpad_settings (); set_interface_settings (); diff --git a/src/meson.build b/src/meson.build index 7d196b8b2..600a0838f 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,4 +1,3 @@ -actservice_dep = dependency('accountsservice') gobject_dep = dependency('gobject-2.0') glib_dep = dependency('glib-2.0') gdk_wl_dep = dependency('gdk-wayland-3.0') @@ -32,7 +31,7 @@ executable( 'Widgets/PasswordEntry.vala', 'Widgets/SessionButton.vala', config_header, - dependencies: [ actservice_dep, gobject_dep, glib_dep, gdk_wl_dep, gdk_x11_dep, gtk_dep, granite_dep, hdy_dep, lightdm_dep, m_dep, pantheon_desktop_shell_dep, wl_client_dep, x11_dep ], + dependencies: [ gobject_dep, glib_dep, gdk_wl_dep, gdk_x11_dep, gtk_dep, granite_dep, hdy_dep, lightdm_dep, m_dep, pantheon_desktop_shell_dep, wl_client_dep, x11_dep ], install : true, install_dir: install_path ) diff --git a/vapi/accountsservice.vapi b/vapi/accountsservice.vapi deleted file mode 100644 index 4053cfbf9..000000000 --- a/vapi/accountsservice.vapi +++ /dev/null @@ -1,149 +0,0 @@ -/* accountsservice.vapi generated by vapigen, do not modify. */ - -[CCode (cprefix = "Act", gir_namespace = "AccountsService", gir_version = "1.0", lower_case_cprefix = "act_")] -namespace Act { - [CCode (cheader_filename = "act/act.h", type_id = "act_user_get_type ()")] - public class User : GLib.Object { - [CCode (has_construct_function = false)] - protected User (); - public int collate (Act.User user2); - public Act.UserAccountType get_account_type (); - public bool get_automatic_login (); - public unowned string get_email (); - public unowned string get_formats_locale (); - public unowned string get_home_dir (); - public unowned string get_icon_file (); - public unowned GLib.Variant get_input_sources (); - public unowned string get_language (); - public unowned string get_location (); - public bool get_locked (); - public int get_login_frequency (); - public unowned GLib.Variant get_login_history (); - public int64 get_login_time (); - public uint get_num_sessions (); - public uint get_num_sessions_anywhere (); - public unowned string get_object_path (); - public unowned string get_password_hint (); - public Act.UserPasswordMode get_password_mode (); - public unowned string get_primary_session_id (); - public unowned string get_real_name (); - public unowned string get_shell (); - public uint get_uid (); - public unowned string get_user_name (); - public unowned string get_x_session (); - public bool is_local_account (); - public bool is_logged_in (); - public bool is_logged_in_anywhere (); - public bool is_nonexistent (); - public bool is_system_account (); - public void set_account_type (Act.UserAccountType account_type); - public void set_automatic_login (bool enabled); - public void set_email (string email); - public void set_formats_locale (string formats_locale); - public void set_icon_file (string icon_file); - public void set_input_sources (GLib.Variant sources); - public void set_language (string language); - public void set_location (string location); - public void set_locked (bool locked); - public void set_password (string password, string hint); - public void set_password_hint (string hint); - public void set_password_mode (Act.UserPasswordMode password_mode); - public void set_real_name (string real_name); - public void set_user_name (string user_name); - public void set_x_session (string x_session); - public int account_type { get; } - public bool automatic_login { get; } - [NoAccessorMethod] - public string background_file { owned get; } - public string email { get; } - public string formats_locale { get; } - [NoAccessorMethod] - public string home_directory { owned get; } - public string icon_file { get; } - public GLib.Variant input_sources { get; } - [NoAccessorMethod] - public bool is_loaded { get; } - public string language { get; } - [NoAccessorMethod] - public bool local_account { get; } - public string location { get; } - public bool locked { get; } - public int login_frequency { get; } - public GLib.Variant login_history { get; } - public int64 login_time { get; } - [NoAccessorMethod] - public bool nonexistent { get; } - public string password_hint { get; } - public int password_mode { get; } - public string real_name { get; } - public string shell { get; } - [NoAccessorMethod] - public bool system_account { get; } - public int uid { get; } - public string user_name { get; } - public string x_session { get; } - [NoAccessorMethod] - public bool xhas_messages { get; } - [CCode (array_length = false, array_null_terminated = true)] - [NoAccessorMethod] - public string[] xkeyboard_layouts { owned get; } - public signal void changed (); - public signal void sessions_changed (); - } - [CCode (cheader_filename = "act/act.h", type_id = "act_user_manager_get_type ()")] - public class UserManager : GLib.Object { - [CCode (has_construct_function = false)] - protected UserManager (); - public bool activate_user_session (Act.User user); - public Act.User cache_user (string username) throws GLib.Error; - [Version (since = "0.6.27")] - public async Act.User cache_user_async (string username, GLib.Cancellable? cancellable) throws GLib.Error; - public bool can_switch (); - public Act.User create_user (string username, string fullname, Act.UserAccountType accounttype) throws GLib.Error; - [Version (since = "0.6.27")] - public async Act.User create_user_async (string username, string fullname, Act.UserAccountType accounttype, GLib.Cancellable? cancellable) throws GLib.Error; - public bool delete_user (Act.User user, bool remove_files) throws GLib.Error; - [Version (since = "0.6.27")] - public async bool delete_user_async (Act.User user, bool remove_files, GLib.Cancellable? cancellable) throws GLib.Error; - public static unowned Act.UserManager get_default (); - public unowned Act.User get_user (string username); - public unowned Act.User get_user_by_id (uint id); - public bool goto_login_session (); - public GLib.SList list_users (); - public bool no_service (); - public bool uncache_user (string username) throws GLib.Error; - public async bool uncache_user_async (string username, GLib.Cancellable? cancellable) throws GLib.Error; - [NoAccessorMethod] - public void* exclude_usernames_list { get; set; } - [NoAccessorMethod] - public bool has_multiple_users { get; } - [NoAccessorMethod] - public void* include_usernames_list { get; set; } - [NoAccessorMethod] - public bool is_loaded { get; } - public virtual signal void user_added (Act.User user); - public virtual signal void user_changed (Act.User user); - public virtual signal void user_is_logged_in_changed (Act.User user); - public virtual signal void user_removed (Act.User user); - } - [CCode (cheader_filename = "act/act.h", cprefix = "ACT_USER_ACCOUNT_TYPE_", type_id = "act_user_account_type_get_type ()")] - public enum UserAccountType { - STANDARD, - ADMINISTRATOR - } - [CCode (cheader_filename = "act/act.h", cprefix = "ACT_USER_PASSWORD_MODE_", type_id = "act_user_password_mode_get_type ()")] - public enum UserPasswordMode { - REGULAR, - SET_AT_LOGIN, - NONE - } - [CCode (cheader_filename = "act/act.h", cprefix = "ACT_USER_MANAGER_ERROR_")] - public errordomain UserManagerError { - FAILED, - USER_EXISTS, - USER_DOES_NOT_EXIST, - PERMISSION_DENIED, - NOT_SUPPORTED; - public static GLib.Quark quark (); - } -} From cce19cc3443b2ed6659745d41b6694b8a2efea1a Mon Sep 17 00:00:00 2001 From: lenemter Date: Sat, 8 Nov 2025 15:08:56 +0300 Subject: [PATCH 2/4] Use binds just in case --- src/Cards/UserCard.vala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Cards/UserCard.vala b/src/Cards/UserCard.vala index c4f8c5c57..3820f7fd9 100644 --- a/src/Cards/UserCard.vala +++ b/src/Cards/UserCard.vala @@ -33,7 +33,6 @@ public class Greeter.UserCard : Greeter.BaseCard { need_password = true; var username_label = new Gtk.Label (lightdm_user.display_name) { - sensitive = !lightdm_user.is_locked, hexpand = true, margin_top = 24, margin_bottom = 12, @@ -41,6 +40,7 @@ public class Greeter.UserCard : Greeter.BaseCard { margin_end = 24, }; username_label.get_style_context ().add_class (Granite.STYLE_CLASS_H2_LABEL); + lightdm_user.bind_property ("is-locked", username_label, "sensitive", SYNC_CREATE | INVERT_BOOLEAN); password_entry = new Greeter.PasswordEntry (); bind_property ("connecting", password_entry, "sensitive", INVERT_BOOLEAN); @@ -50,9 +50,9 @@ public class Greeter.UserCard : Greeter.BaseCard { bind_property ("use-fingerprint", fingerprint_image, "visible", SYNC_CREATE); var password_session_button = new Greeter.SessionButton () { - sensitive = !lightdm_user.is_locked, vexpand = true }; + lightdm_user.bind_property ("is-locked", password_session_button, "sensitive", SYNC_CREATE | INVERT_BOOLEAN); var password_grid = new Gtk.Grid () { column_spacing = 6, @@ -68,9 +68,9 @@ public class Greeter.UserCard : Greeter.BaseCard { bind_property ("connecting", login_button, "sensitive", INVERT_BOOLEAN); var login_button_session_button = new Greeter.SessionButton () { - sensitive = !lightdm_user.is_locked, vexpand = true }; + lightdm_user.bind_property ("is-locked", login_button_session_button, "sensitive", SYNC_CREATE | INVERT_BOOLEAN); var login_box = new Gtk.Box (HORIZONTAL, 6); login_box.add (login_button); From ed61c46de05108e7f8415a7b0662d81e104dc5cb Mon Sep 17 00:00:00 2001 From: lenemter Date: Sat, 8 Nov 2025 18:37:48 +0300 Subject: [PATCH 3/4] Require lightdm 1.30.0 --- src/meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meson.build b/src/meson.build index 600a0838f..4b5059d65 100644 --- a/src/meson.build +++ b/src/meson.build @@ -6,7 +6,7 @@ gnome_desktop_dep = dependency('gnome-desktop-3.0') gtk_dep = dependency('gtk+-3.0') granite_dep = dependency('granite', version: '>= 5.5.0') hdy_dep = dependency('libhandy-1', version: '>= 1.1.90') -lightdm_dep = dependency('liblightdm-gobject-1') +lightdm_dep = dependency('liblightdm-gobject-1', version: '>= 1.30.0') m_dep = meson.get_compiler('c').find_library('m') wl_client_dep = dependency('wayland-client') x11_dep = dependency('x11') From fefa4f0c34ba0ae9754ab548d57f3919ff6a1b65 Mon Sep 17 00:00:00 2001 From: lenemter Date: Sat, 8 Nov 2025 18:41:02 +0300 Subject: [PATCH 4/4] Update README and CI --- .github/workflows/main.yml | 6 +++--- README.md | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0a76fe3cb..e0b393291 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,7 +31,7 @@ jobs: - name: Install Dependencies run: | apt update - apt install -y desktop-file-utils libaccountsservice-dev libgdk-pixbuf2.0-dev libgnome-desktop-3-dev libgranite-dev libgtk-3-dev libhandy-1-dev liblightdm-gobject-1-dev ${{ matrix.mutter_pkg }} libx11-dev meson valac + apt install -y desktop-file-utils libgdk-pixbuf2.0-dev libgnome-desktop-3-dev libgranite-dev libgtk-3-dev libhandy-1-dev liblightdm-gobject-1-dev ${{ matrix.mutter_pkg }} libx11-dev meson valac - name: Build env: DESTDIR: out @@ -49,7 +49,7 @@ jobs: - uses: actions/checkout@v5 - name: Install Dependencies run: | - dnf install -y desktop-file-utils accountsservice-devel gdk-pixbuf2-devel gnome-desktop3-devel granite-devel gtk3-devel libhandy-devel lightdm-gobject-devel mutter-devel libX11-devel meson valac + dnf install -y desktop-file-utils gdk-pixbuf2-devel gnome-desktop3-devel granite-devel gtk3-devel libhandy-devel lightdm-gobject-devel mutter-devel libX11-devel meson valac - name: Build env: DESTDIR: out @@ -68,7 +68,7 @@ jobs: run: | zypper addrepo https://download.opensuse.org/repositories/X11:Pantheon/15.6/X11:Pantheon.repo zypper --gpg-auto-import-keys refresh - zypper --non-interactive install tar git desktop-file-utils accountsservice-devel gdk-pixbuf-devel libgnome-desktop-3-devel granite6-devel gtk3-devel libhandy-devel lightdm-gobject-devel mutter-devel meson vala gcc + zypper --non-interactive install tar git desktop-file-utils gdk-pixbuf-devel libgnome-desktop-3-devel granite6-devel gtk3-devel libhandy-devel lightdm-gobject-devel mutter-devel meson vala gcc - uses: actions/checkout@v5 - name: Build env: diff --git a/README.md b/README.md index 58ae3c390..42691d486 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,11 @@ You'll need the following dependencies: * gnome-settings-daemon >= 3.27 -* libaccountsservice-dev * libgdk-pixbuf2.0-dev * libgranite-dev >= 5.5.0 * libgtk-3-dev * libhandy-1-dev >= 0.90.0 -* liblightdm-gobject-1-dev +* liblightdm-gobject-1-dev >= 1.30.0 * libmutter-13-dev * libx11-dev * meson