From 1c3e7330f368e1574d71df6b137677a295eb740d Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Sun, 28 Oct 2012 12:26:21 +0100 Subject: [PATCH] ScreenShield: don't rely on gnome-session to hide the lightbox If we lock before the user becomes active again, gnome-session will never change presence from IDLE, and thus we'll never hide the lightbox. Instead, install our own idle monitor. https://bugzilla.gnome.org/show_bug.cgi?id=687020 --- js/ui/screenShield.js | 66 +++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js index 52c7dcc75..6dcd188fa 100644 --- a/js/ui/screenShield.js +++ b/js/ui/screenShield.js @@ -436,6 +436,8 @@ const ScreenShield = new Lang.Class({ { inhibitEvents: true, fadeInTime: STANDARD_FADE_TIME, fadeFactor: 1 }); + + this.idleMonitor = new GnomeDesktop.IdleMonitor(); }, _onLockScreenKeyRelease: function(actor, event) { @@ -545,35 +547,43 @@ const ScreenShield = new Lang.Class({ }, _onStatusChanged: function(status) { - if (status == GnomeSession.PresenceStatus.IDLE) { - if (this._dialog) { - this._dialog.cancel(); - if (!this._isGreeter) { - this._dialog = null; + if (status != GnomeSession.PresenceStatus.IDLE) + return; + + if (this._dialog) { + this._dialog.cancel(); + if (!this._isGreeter) { + this._dialog = null; + } + } + + if (!this._isModal) { + Main.pushModal(this.actor); + this._isModal = true; + } + + if (!this._isActive) { + this._lightbox.show(); + + if (this._activationTime == 0) + this._activationTime = GLib.get_monotonic_time(); + + this._becameActiveId = this.idleMonitor.connect('became-active', Lang.bind(this, function() { + this.idleMonitor.disconnect(this._becameActiveId); + + let lightboxWasShown = this._lightbox.shown; + this._lightbox.hide(); + + let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY); + if (shouldLock || this._isLocked) { + this.lock(false); + } else if (this._isActive) { + this.unlock(); } - } + })); - if (!this._isModal) { - Main.pushModal(this.actor); - this._isModal = true; - } - - if (!this._isActive) { - this._lightbox.show(); - - if (this._activationTime == 0) - this._activationTime = GLib.get_monotonic_time(); - } - } else { - let lightboxWasShown = this._lightbox.shown; - this._lightbox.hide(); - - let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY); - if (shouldLock || this._isActive) { - this.lock(false); - } else if (this._isModal) { - this.unlock(); - } + this._isActive = true; + this.emit('lock-status-changed'); } }, @@ -830,6 +840,7 @@ const ScreenShield = new Lang.Class({ this._activationTime = 0; this._isActive = false; + this._isLocked = false; this.emit('lock-status-changed'); }, @@ -854,6 +865,7 @@ const ScreenShield = new Lang.Class({ this._resetLockScreen(animate, animate); this._isActive = true; + this._isLocked = true; this.emit('lock-status-changed'); }, });