Skip to content

Commit 87c8ab4

Browse files
danirabbitlenemter
andauthored
Create Login1Manager (#144)
Co-authored-by: Leo <lenemter@gmail.com>
1 parent f3f2376 commit 87c8ab4

6 files changed

Lines changed: 77 additions & 82 deletions

File tree

po/POTFILES

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ src/DBus/LockInterface.vala
55
src/DBus/SeatInterface.vala
66
src/DBus/SensorProxy.vala
77
src/DBus/SessionInterface.vala
8-
src/DBus/SystemInterface.vala
98
src/DBus/UserInterface.vala
109
src/Services/UserManager.vala
1110
src/Widgets/AvatarButton.vala

src/DBus/Login1Manager.vala

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* SPDX-License-Identifier: GPL-3.0-or-later
3+
* SPDX-FileCopyrightText: 2024-2026 elementary, Inc. (https://elementary.io)
4+
*/
5+
6+
public class QuickSettings.Login1Manager : Object {
7+
public struct UserInfo {
8+
uint32 uid;
9+
string user_name;
10+
ObjectPath? user_object;
11+
}
12+
13+
[DBus (name = "org.freedesktop.login1.Manager")]
14+
public interface Login1ManagerInterface : Object {
15+
public abstract void suspend (bool interactive) throws GLib.Error;
16+
public abstract void reboot (bool interactive) throws GLib.Error;
17+
public abstract void power_off (bool interactive) throws GLib.Error;
18+
public abstract void reboot_with_flags (uint64 flags) throws GLib.Error;
19+
public abstract void power_off_with_flags (uint64 flags) throws GLib.Error;
20+
21+
public abstract UserInfo[] list_users () throws GLib.Error;
22+
public abstract string can_suspend () throws GLib.Error;
23+
}
24+
25+
public Login1ManagerInterface proxy { get; private set; }
26+
27+
private static GLib.Once<Login1Manager> instance;
28+
public static unowned Login1Manager get_default () {
29+
return instance.once (() => new Login1Manager ());
30+
}
31+
32+
private Login1Manager () {}
33+
34+
construct {
35+
try {
36+
proxy = Bus.get_proxy_sync<Login1ManagerInterface> (
37+
SYSTEM,
38+
"org.freedesktop.login1",
39+
"/org/freedesktop/login1"
40+
);
41+
} catch (Error e) {
42+
critical (e.message);
43+
}
44+
}
45+
}

src/DBus/SystemInterface.vala

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/Services/UserManager.vala

Lines changed: 22 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -21,44 +21,35 @@ public enum UserState {
2121
}
2222

2323
public class QuickSettings.UserManager : Object {
24-
private const string LOGIN_IFACE = "org.freedesktop.login1";
25-
private const string LOGIN_PATH = "/org/freedesktop/login1";
26-
27-
private static string active_user_real_name;
28-
private static SystemInterface? login_proxy;
29-
30-
private static async void init_login_proxy () {
31-
try {
32-
login_proxy = yield Bus.get_proxy (BusType.SYSTEM, LOGIN_IFACE, LOGIN_PATH, DBusProxyFlags.NONE);
33-
} catch (IOError e) {
34-
critical ("Failed to create login1 dbus proxy: %s", e.message);
35-
}
36-
}
24+
private static string? active_user_real_name;
3725

3826
public static async UserState get_user_state (uid_t uuid) {
39-
if (login_proxy == null) {
40-
yield init_login_proxy ();
41-
}
42-
4327
try {
44-
UserInfo[] users = login_proxy.list_users ();
28+
var users = Login1Manager.get_default ().proxy.list_users ();
4529
if (users == null) {
4630
return UserState.OFFLINE;
4731
}
4832

49-
foreach (UserInfo user in users) {
50-
if (((uid_t) user.uid) == uuid) {
51-
if (user.user_object == null) {
52-
return UserState.OFFLINE;
53-
}
54-
UserInterface? user_interface = yield Bus.get_proxy (BusType.SYSTEM, LOGIN_IFACE, user.user_object, DBusProxyFlags.NONE);
55-
if (user_interface == null) {
56-
return UserState.OFFLINE;
57-
}
58-
return UserState.to_enum (user_interface.state);
33+
foreach (var user in users) {
34+
if (((uid_t) user.uid) != uuid) {
35+
continue;
36+
}
37+
38+
if (user.user_object == null) {
39+
return UserState.OFFLINE;
40+
}
41+
42+
var user_interface = yield Bus.get_proxy<UserInterface> (
43+
SYSTEM,
44+
"org.freedesktop.login1",
45+
user.user_object
46+
);
47+
if (user_interface == null) {
48+
return UserState.OFFLINE;
5949
}
60-
}
6150

51+
return UserState.to_enum (user_interface.state);
52+
}
6253
} catch (GLib.Error e) {
6354
critical ("Failed to get user state: %s", e.message);
6455
}
@@ -67,13 +58,9 @@ public class QuickSettings.UserManager : Object {
6758
}
6859

6960
public static async UserState get_guest_state () {
70-
if (login_proxy == null) {
71-
return UserState.OFFLINE;
72-
}
73-
7461
try {
75-
UserInfo[] users = login_proxy.list_users ();
76-
foreach (UserInfo user in users) {
62+
var users = Login1Manager.get_default ().proxy.list_users ();
63+
foreach (var user in users) {
7764
var state = yield get_user_state (user.uid);
7865
if (user.user_name.has_prefix ("guest-")
7966
&& state == UserState.ACTIVE) {

src/Widgets/SessionBox.vala

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ public class QuickSettings.SessionBox : Gtk.Box {
88

99
private EndSessionDialog? current_dialog = null;
1010
private Gtk.Popover? popover;
11-
private SystemInterface system_interface;
1211

1312
public SessionBox (Wingpanel.IndicatorManager.ServerType server_type) {
1413
Object (server_type: server_type);
@@ -69,18 +68,14 @@ public class QuickSettings.SessionBox : Gtk.Box {
6968
show_dialog (EndSessionDialogType.RESTART);
7069
});
7170

72-
setup_system_interface.begin ((obj, res) => {
73-
system_interface = setup_system_interface.end (res);
74-
75-
suspend_button.clicked.connect (() => {
76-
popover.popdown ();
71+
suspend_button.clicked.connect (() => {
72+
popover.popdown ();
7773

78-
try {
79-
system_interface.suspend (true);
80-
} catch (GLib.Error e) {
81-
critical ("Unable to suspend: %s", e.message);
82-
}
83-
});
74+
try {
75+
Login1Manager.get_default ().proxy.suspend (true);
76+
} catch (GLib.Error e) {
77+
critical ("Unable to suspend: %s", e.message);
78+
}
8479
});
8580

8681
var keybinding_settings = new Settings ("org.gnome.settings-daemon.plugins.media-keys");
@@ -111,15 +106,6 @@ public class QuickSettings.SessionBox : Gtk.Box {
111106
});
112107
}
113108

114-
private async SystemInterface? setup_system_interface () {
115-
try {
116-
return yield Bus.get_proxy (BusType.SYSTEM, "org.freedesktop.login1", "/org/freedesktop/login1");
117-
} catch (IOError e) {
118-
critical ("Unable to connect to the login interface: %s", e.message);
119-
return null;
120-
}
121-
}
122-
123109
private async LockInterface? setup_lock_interface () {
124110
try {
125111
return yield Bus.get_proxy (BusType.SESSION, "org.gnome.ScreenSaver", "/org/gnome/ScreenSaver");
@@ -162,7 +148,7 @@ public class QuickSettings.SessionBox : Gtk.Box {
162148
try {
163149
// See https://www.freedesktop.org/software/systemd/man/latest/org.freedesktop.login1.html for flags values
164150
// #define SD_LOGIND_ROOT_CHECK_INHIBITORS (UINT64_C(1) << 0) == 1
165-
system_interface.power_off_with_flags (1);
151+
Login1Manager.get_default ().proxy.power_off_with_flags (1);
166152
} catch (Error e) {
167153
warning ("Unable to shutdown: %s", e.message);
168154
}
@@ -172,7 +158,7 @@ public class QuickSettings.SessionBox : Gtk.Box {
172158
try {
173159
// See https://www.freedesktop.org/software/systemd/man/latest/org.freedesktop.login1.html for flags values
174160
// #define SD_LOGIND_KEXEC_REBOOT (UINT64_C(1) << 1) == 2
175-
system_interface.reboot_with_flags (2);
161+
Login1Manager.get_default ().proxy.reboot_with_flags (2);
176162
} catch (Error e) {
177163
warning ("Unable to reboot: %s", e.message);
178164
}

src/meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ sources = [
1212
'PopoverWidget.vala',
1313
'DBus' / 'EndSessionDialogServer.vala',
1414
'DBus' / 'LockInterface.vala',
15+
'DBus' / 'Login1Manager.vala',
1516
'DBus' / 'SeatInterface.vala',
1617
'DBus' / 'SensorProxy.vala',
1718
'DBus' / 'SessionInterface.vala',
18-
'DBus' / 'SystemInterface.vala',
1919
'DBus' / 'UserInterface.vala',
2020
'Services' / 'UserManager.vala',
2121
'Widgets' / 'AvatarButton.vala',

0 commit comments

Comments
 (0)