summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Lane <iain@orangesquash.org.uk>2018-01-08 14:23:52 +0000
committerIain Lane <iainl@gnome.org>2018-07-17 09:36:37 +0100
commit70e0b65c183c4a0dc426d7b77bd13821464c1f95 (patch)
tree33456fb78743c1326fc082fcde8e68cfbe86dbda
parent68f00f397f36402d1d61226c0617f6044a8118d1 (diff)
downloadgnome-shell-wip/laney/systemd-user.tar.gz
endSessionDialog, loginManager: Get the session ID from logind if XDG_SESSION_ID unsetwip/laney/systemd-user
If we're started by systemd, we won't be in the user's display session. However, this is still the session that will get locked & unlocked. Ask logind what the 'display' or 'greeter' session is, and watch for the Unlock signal for that session to know when to unlock.
-rw-r--r--js/misc/loginManager.js40
-rw-r--r--js/ui/endSessionDialog.js9
2 files changed, 46 insertions, 3 deletions
diff --git a/js/misc/loginManager.js b/js/misc/loginManager.js
index 4eb0686aa..ccda382ff 100644
--- a/js/misc/loginManager.js
+++ b/js/misc/loginManager.js
@@ -40,14 +40,24 @@ const SystemdLoginSessionIface = '<node> \
<signal name="Lock" /> \
<signal name="Unlock" /> \
<property name="Active" type="b" access="read" /> \
+<property name="Class" type="s" access="read" /> \
+<property name="Id" type="s" access="read" /> \
<method name="SetLockedHint"> \
<arg type="b" direction="in"/> \
</method> \
</interface> \
</node>';
+const SystemdLoginUserIface = '<node> \
+<interface name="org.freedesktop.login1.User"> \
+<property name="Display" type="(so)" access="read" /> \
+<property name="Sessions" type="a(so)" access="read" /> \
+</interface> \
+</node>';
+
const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface);
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface);
+const SystemdLoginUser = Gio.DBusProxy.makeProxyWrapper(SystemdLoginUserIface);
function haveSystemd() {
return GLib.access("/run/systemd/seats", 0) >= 0;
@@ -109,6 +119,9 @@ var LoginManagerSystemd = new Lang.Class({
this._proxy = new SystemdLoginManager(Gio.DBus.system,
'org.freedesktop.login1',
'/org/freedesktop/login1');
+ this._userProxy = new SystemdLoginUser(Gio.DBus.system,
+ 'org.freedesktop.login1',
+ '/org/freedesktop/login1/user/self');
this._proxy.connectSignal('PrepareForSleep',
this._prepareForSleep.bind(this));
},
@@ -121,8 +134,31 @@ var LoginManagerSystemd = new Lang.Class({
let sessionId = GLib.getenv('XDG_SESSION_ID');
if (!sessionId) {
- log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session.');
- return;
+ log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session. Asking logind directly.');
+ let [session, objectPath] = this._userProxy.Display;
+ if (session) {
+ log(`Will monitor session ${session}`);
+ sessionId = session;
+ } else {
+ log('Failed to find "Display" session; are we the greeter?');
+
+ for (let [session, objectPath] of this._userProxy.Sessions) {
+ let sessionProxy = new SystemdLoginSession(Gio.DBus.system,
+ 'org.freedesktop.login1',
+ objectPath);
+ log(`Considering ${session}, class=${sessionProxy.Class}`);
+ if (sessionProxy.Class == 'greeter') {
+ log(`Yes, will monitor session ${session}`);
+ sessionId = session;
+ break;
+ }
+ }
+
+ if (!sessionId) {
+ log('No, failed to get session from logind.');
+ return;
+ }
+ }
}
this._proxy.GetSessionRemote(sessionId, (result, error) => {
diff --git a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js
index 7d18d0b79..5491fbb19 100644
--- a/js/ui/endSessionDialog.js
+++ b/js/ui/endSessionDialog.js
@@ -697,7 +697,14 @@ var EndSessionDialog = new Lang.Class({
if (proxy.State == 'closing')
continue;
- if (proxy.Id == GLib.getenv('XDG_SESSION_ID'))
+ let sessionId = GLib.getenv('XDG_SESSION_ID');
+ if (!sessionId)
+ this._loginManager.getCurrentSessionProxy(currentSessionProxy => {
+ sessionId = currentSessionProxy.Id;
+ log(`endSessionDialog: No XDG_SESSION_ID, fetched from logind: ${sessionId}`);
+ });
+
+ if (proxy.Id == sessionId)
continue;
let session = { user: this._userManager.get_user(userName),