diff --git a/js/ui/main.js b/js/ui/main.js
index 2dc152f63..790dd808f 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -65,6 +65,7 @@ let recorder = null;
let sessionMode = null;
let shellDBusService = null;
let shellMountOpDBusService = null;
+let screenSaverDBus = null;
let modalCount = 0;
let modalActorFocusStack = [];
let uiGroup = null;
@@ -215,6 +216,7 @@ function start() {
magnifier = new Magnifier.Magnifier();
statusIconDispatcher = new StatusIconDispatcher.StatusIconDispatcher();
screenShield = new ScreenShield.ScreenShield();
+ screenSaverDBus = new ShellDBus.ScreenSaverDBus();
panel = new Panel.Panel();
wm = new WindowManager.WindowManager();
messageTray = new MessageTray.MessageTray();
diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js
index 661818ed8..53a6523c2 100644
--- a/js/ui/shellDBus.js
+++ b/js/ui/shellDBus.js
@@ -50,6 +50,20 @@ const GnomeShellIface =
;
+const ScreenSaverIface =
+
+
+
+
+
+
+
+
+
+
+
+;
+
const GnomeShell = new Lang.Class({
Name: 'GnomeShellDBus',
@@ -319,3 +333,33 @@ const GnomeShellExtensions = new Lang.Class({
GLib.Variant.new('(sis)', [newState.uuid, newState.state, newState.error]));
}
});
+
+const ScreenSaverDBus = new Lang.Class({
+ Name: 'ScreenSaverDBus',
+
+ _init: function() {
+ this.parent();
+
+ Main.screenShield.connect('lock-status-changed', Lang.bind(this, function(shield, locked) {
+ this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [locked]));
+ }));
+
+ this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this);
+ this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver');
+ },
+
+ Lock: function() {
+ Main.screenShield.lock(true);
+ },
+
+ SetActive: function(active) {
+ if (active)
+ Main.screenShield.lock(true);
+ else
+ Main.screenShield.unlock();
+ },
+
+ GetActive: function() {
+ return Main.screenShield.locked;
+ }
+});
diff --git a/src/main.c b/src/main.c
index ad4fb3ac5..c4d2d28c3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -34,6 +34,7 @@ extern GType gnome_shell_plugin_get_type (void);
#define SHELL_DBUS_SERVICE "org.gnome.Shell"
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
+#define SCREENSAVER_DBUS_SERVICE "org.gnome.ScreenSaver"
#define OVERRIDES_SCHEMA "org.gnome.shell.overrides"
@@ -152,6 +153,8 @@ shell_dbus_init (gboolean replace)
MAGNIFIER_DBUS_SERVICE, FALSE,
/* ...and the org.freedesktop.Notifications service. */
"org.freedesktop.Notifications", FALSE,
+ /* ...and the org.gnome.ScreenSaver service. */
+ SCREENSAVER_DBUS_SERVICE, FALSE,
NULL);
/* ...and the on-screen keyboard service */
shell_dbus_acquire_name (bus,