[gnome-shell] loginManager: Add inhibitor API
- From: Florian MÃllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] loginManager: Add inhibitor API
- Date: Wed, 6 Feb 2013 00:03:31 +0000 (UTC)
commit 8747c0c58d415977286ae5d3952068766837757b
Author: Florian MÃllner <fmuellner gnome org>
Date: Tue Oct 23 14:35:49 2012 +0200
loginManager: Add inhibitor API
If screen locking is enabled, the screen shield should drop down
on suspend. Currently this is achieved by either explicitly locking
the screen (when selecting "Suspend" from the user menu) or by
relying on g-s-d delaying the suspension enough time for the shield
to get into place (lid close, power button).
Systemd inhibitors offer a safer way to ensure that the screen is
locked before going to sleep, so add a small abstraction for them
in the loginManager - with inhibitors being a systemd-only feature,
the ConsoleKit path only has a dummy implementation.
https://bugzilla.gnome.org/show_bug.cgi?id=686482
js/misc/loginManager.js | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 45 insertions(+), 0 deletions(-)
---
diff --git a/js/misc/loginManager.js b/js/misc/loginManager.js
index fd10c68..6d9316a 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 = <interface name='org.freedesktop.login1.Manager'>
<method name='PowerOff'>
@@ -25,6 +26,16 @@ const SystemdLoginManagerIface = <interface name='org.freedesktop.login1.Manager
<method name='CanSuspend'>
<arg type='s' direction='out'/>
</method>
+<method name='Inhibit'>
+ <arg type='s' direction='in'/>
+ <arg type='s' direction='in'/>
+ <arg type='s' direction='in'/>
+ <arg type='s' direction='in'/>
+ <arg type='h' direction='out'/>
+</method>
+<signal name='PrepareForSleep'>
+ <arg type='b' direction='out'/>
+</signal>
</interface>;
const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session'>
@@ -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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]