diff --git a/js/misc/loginManager.js b/js/misc/loginManager.js index fd10c6853..6d9316a24 100644 --- a/js/misc/loginManager.js +++ b/js/misc/loginManager.js @@ -5,6 +5,7 @@ const Gio = imports.gi.Gio; const Lang = imports.lang; const Mainloop = imports.mainloop; const Shell = imports.gi.Shell; +const Signals = imports.signals; const SystemdLoginManagerIface = @@ -25,6 +26,16 @@ const SystemdLoginManagerIface = + + + + + + + + + + ; const SystemdLoginSessionIface = @@ -86,6 +97,8 @@ const LoginManagerSystemd = new Lang.Class({ this._proxy = new SystemdLoginManager(Gio.DBus.system, 'org.freedesktop.login1', '/org/freedesktop/login1'); + this._proxy.connectSignal('PrepareForSleep', + Lang.bind(this, this._prepareForSleep)); }, // Having this function is a bit of a hack since the Systemd and ConsoleKit @@ -139,8 +152,33 @@ const LoginManagerSystemd = new Lang.Class({ suspend: function() { this._proxy.SuspendRemote(true); + }, + + inhibit: function(reason, callback) { + let inVariant = GLib.Variant.new('(ssss)', + ['sleep', + 'GNOME Shell', + reason, + 'delay']); + this._proxy.call_with_unix_fd_list('Inhibit', inVariant, 0, -1, null, null, + Lang.bind(this, function(proxy, result) { + let fd = -1; + try { + let [outVariant, fdList] = proxy.call_with_unix_fd_list_finish(result); + fd = fdList.steal_fds(outVariant.deep_unpack())[0]; + callback(new Gio.UnixInputStream({ fd: fd })); + } catch(e) { + logError(e, "Error getting systemd inhibitor"); + callback(null); + } + })); + }, + + _prepareForSleep: function(proxy, sender, [aboutToSuspend]) { + this.emit('prepare-for-sleep', aboutToSuspend); } }); +Signals.addSignalMethods(LoginManagerSystemd.prototype); const LoginManagerConsoleKit = new Lang.Class({ Name: 'LoginManagerConsoleKit', @@ -196,5 +234,12 @@ const LoginManagerConsoleKit = new Lang.Class({ }, suspend: function() { + this.emit('prepare-for-sleep', true); + this.emit('prepare-for-sleep', false); + }, + + inhibit: function(reason, callback) { + callback(null); } }); +Signals.addSignalMethods(LoginManagerConsoleKit.prototype);