92 lines
3.6 KiB
JavaScript
92 lines
3.6 KiB
JavaScript
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
|
|
const Clutter = imports.gi.Clutter;
|
|
const Gio = imports.gi.Gio;
|
|
const Lang = imports.lang;
|
|
const Meta = imports.gi.Meta;
|
|
const St = imports.gi.St;
|
|
|
|
const GnomeSession = imports.misc.gnomeSession;
|
|
const Lightbox = imports.ui.lightbox;
|
|
const LoginDialog = imports.gdm.loginDialog;
|
|
const Main = imports.ui.main;
|
|
|
|
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
|
|
const LOCK_ENABLED_KEY = 'lock-enabled';
|
|
|
|
/**
|
|
* To test screen shield, make sure to kill gnome-screensaver.
|
|
*
|
|
* If you are setting org.gnome.desktop.session.idle-delay directly in dconf,
|
|
* rather than through System Settings, you also need to set
|
|
* org.gnome.settings-daemon.plugins.power.sleep-display-ac and
|
|
* org.gnome.settings-daemon.plugins.power.sleep-display-battery to the same value.
|
|
* This will ensure that the screen blanks at the right time when it fades out.
|
|
* https://bugzilla.gnome.org/show_bug.cgi?id=668703 explains the dependance.
|
|
*/
|
|
const ScreenShield = new Lang.Class({
|
|
Name: 'ScreenShield',
|
|
|
|
_init: function() {
|
|
this._presence = new GnomeSession.Presence(Lang.bind(this, function(proxy, error) {
|
|
this._onStatusChanged(proxy.status);
|
|
}));
|
|
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
|
|
this._onStatusChanged(status);
|
|
}));
|
|
|
|
this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
|
|
|
|
this._group = new St.Widget({ x: 0,
|
|
y: 0 });
|
|
Main.uiGroup.add_actor(this._group);
|
|
let constraint = new Clutter.BindConstraint({ source: global.stage,
|
|
coordinate: Clutter.BindCoordinate.POSITION | Clutter.BindCoordinate.SIZE });
|
|
this._group.add_constraint(constraint);
|
|
this._group.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
|
|
this._group.connect('button-press-event', Lang.bind(this, this._onButtonPressEvent));
|
|
this._lightbox = new Lightbox.Lightbox(this._group,
|
|
{ inhibitEvents: true, fadeInTime: 10, fadeFactor: 1 });
|
|
this._background = Meta.BackgroundActor.new_for_screen(global.screen);
|
|
this._background.hide();
|
|
Main.uiGroup.add_actor(this._background);
|
|
},
|
|
|
|
_onStatusChanged: function(status) {
|
|
log ("in _onStatusChanged");
|
|
if (status == GnomeSession.PresenceStatus.IDLE) {
|
|
log("session gone idle");
|
|
this._group.reactive = true;
|
|
Main.pushModal(this._group);
|
|
this._lightbox.show();
|
|
} else {
|
|
let lightboxWasShown = this._lightbox.shown;
|
|
log("this._lightbox.shown " + this._lightbox.shown);
|
|
this._lightbox.hide();
|
|
if (lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY)) {
|
|
this._background.show();
|
|
this._background.raise_top();
|
|
} else {
|
|
this._popModal();
|
|
}
|
|
}
|
|
},
|
|
|
|
_popModal: function() {
|
|
this._group.reactive = false;
|
|
if (Main.isInModalStack(this._group))
|
|
Main.popModal(this._group);
|
|
this._background.hide();
|
|
},
|
|
|
|
_onKeyPressEvent: function(object, keyPressEvent) {
|
|
log("in _onKeyPressEvent - lock is enabled: " + this._settings.get_boolean(LOCK_ENABLED_KEY));
|
|
this._popModal();
|
|
},
|
|
|
|
_onButtonPressEvent: function(object, buttonPressEvent) {
|
|
log("in _onButtonPressEvent - lock is enabled: " + this._settings.get_boolean(LOCK_ENABLED_KEY));
|
|
this._popModal();
|
|
},
|
|
});
|