From 22392d132830c0c3a71c1ef65634fe5f508be263 Mon Sep 17 00:00:00 2001 From: Iain Lane Date: Mon, 8 Jan 2018 14:23:52 +0000 Subject: [PATCH] loginManager: Get the session ID from logind if XDG_SESSION_ID unset 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. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/137 --- js/misc/loginManager.js | 40 +++++++++++++++++++++++++++++++++++++-- js/ui/endSessionDialog.js | 9 ++++++++- 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 = ' \ \ \ \ + \ + \ \ \ \ \ '; +const SystemdLoginUserIface = ' \ + \ + \ + \ + \ +'; + 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),