[gnome-shell] ScreenShield: don't rely on gnome-session to hide the lightbox



commit 1c3e7330f368e1574d71df6b137677a295eb740d
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Sun Oct 28 12:26:21 2012 +0100

    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 |   60 +++++++++++++++++++++++++++++-------------------
 1 files changed, 36 insertions(+), 24 deletions(-)
---
diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
index 52c7dcc..6dcd188 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._isModal) {
-                Main.pushModal(this.actor);
-                this._isModal = true;
+        if (this._dialog) {
+            this._dialog.cancel();
+            if (!this._isGreeter) {
+                this._dialog = null;
             }
+        }
 
-            if (!this._isActive) {
-                this._lightbox.show();
+        if (!this._isModal) {
+            Main.pushModal(this.actor);
+            this._isModal = true;
+        }
 
-                if (this._activationTime == 0)
-                    this._activationTime = GLib.get_monotonic_time();
-            }
-        } else {
-            let lightboxWasShown = this._lightbox.shown;
-            this._lightbox.hide();
+        if (!this._isActive) {
+            this._lightbox.show();
 
-            let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY);
-            if (shouldLock || this._isActive) {
-                this.lock(false);
-            } else if (this._isModal) {
-                this.unlock();
-            }
+            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();
+                }
+            }));
+
+            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');
     },
 });



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]