[gnome-shell] Consolidate creation of login and unlock dialog in the screenshield



commit a28d639c3b407a73f2f013e77e34da97dda33349
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Sat May 26 17:04:25 2012 +0200

    Consolidate creation of login and unlock dialog in the screenshield
    
    The design calls for the curtain to appear in the gdm greeter too.
    Implement this by having the screenshield manage the login dialog
    (delegating its creation to SessionMode).
    
    https://bugzilla.gnome.org/show_bug.cgi?id=619955

 data/Makefile.am      |    1 -
 js/gdm/loginDialog.js |   11 ++++--
 js/ui/main.js         |   16 +++++++--
 js/ui/screenShield.js |   89 +++++++++++++++++++++++++++++++++----------------
 js/ui/sessionMode.js  |   13 +++++++-
 js/ui/unlockDialog.js |    6 +++-
 6 files changed, 96 insertions(+), 40 deletions(-)
---
diff --git a/data/Makefile.am b/data/Makefile.am
index b00bb3b..7a80948 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -34,7 +34,6 @@ dist_theme_DATA =				\
 	theme/dash-placeholder.svg		\
 	theme/filter-selected-ltr.svg		\
 	theme/filter-selected-rtl.svg		\
-	theme/gdm.css				\
 	theme/gnome-shell.css			\
 	theme/panel-button-border.svg		\
 	theme/panel-button-highlight-narrow.svg	\
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
index d2e5738..06bbfcb 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -646,8 +646,11 @@ const LoginDialog = new Lang.Class({
     Name: 'LoginDialog',
     Extends: ModalDialog.ModalDialog,
 
-    _init: function() {
-        this.parent({ shellReactive: true, styleClass: 'login-dialog' });
+    _init: function(parentActor) {
+        this.parent({ shellReactive: true,
+                      styleClass: 'login-dialog',
+                      parentActor: parentActor
+                    });
         this.connect('destroy',
                      Lang.bind(this, this._onDestroy));
         this.connect('opened',
@@ -858,7 +861,7 @@ const LoginDialog = new Lang.Class({
         GdmUtil.fadeOutActor(this._promptFingerprintMessage);
     }
 
-    _onCancel: function() {
+    cancel: function() {
         this._userVerifier.cancel();
     },
 
@@ -901,7 +904,7 @@ const LoginDialog = new Lang.Class({
     _showPrompt: function() {
         let hold = new Batch.Hold();
 
-        let buttons = [{ action: Lang.bind(this, this._onCancel),
+        let buttons = [{ action: Lang.bind(this, this.cancel),
                          label: _("Cancel"),
                          key: Clutter.Escape },
                        { action: Lang.bind(this, function() {
diff --git a/js/ui/main.js b/js/ui/main.js
index ee999dd..319fb7b 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -36,6 +36,7 @@ const SessionMode = imports.ui.sessionMode;
 const ShellDBus = imports.ui.shellDBus;
 const ShellMountOperation = imports.ui.shellMountOperation;
 const TelepathyClient = imports.ui.telepathyClient;
+const UnlockDialog = imports.ui.unlockDialog;
 const WindowManager = imports.ui.windowManager;
 const Magnifier = imports.ui.magnifier;
 const XdndHandler = imports.ui.xdndHandler;
@@ -94,14 +95,21 @@ function createUserSession() {
 }
 
 function createGDMSession() {
+    screenShield.showDialog();
+}
+
+function createGDMLoginDialog(parentActor) {
     // We do this this here instead of at the top to prevent GDM
     // related code from getting loaded in normal user sessions
     const LoginDialog = imports.gdm.loginDialog;
 
-    let loginDialog = new LoginDialog.LoginDialog();
-    loginDialog.connect('loaded', function() {
-                            loginDialog.open();
-                        });
+    let loginDialog = new LoginDialog.LoginDialog(parentActor);
+    return [loginDialog, true];
+}
+
+function createSessionUnlockDialog(parentActor) {
+    let dialog = new UnlockDialog.UnlockDialog(parentActor);
+    return [dialog, false];
 }
 
 function createInitialSetupSession() {
diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
index e852f32..e69cc7f 100644
--- a/js/ui/screenShield.js
+++ b/js/ui/screenShield.js
@@ -9,7 +9,6 @@ const St = imports.gi.St;
 
 const GnomeSession = imports.misc.gnomeSession;
 const Lightbox = imports.ui.lightbox;
-const UnlockDialog = imports.ui.unlockDialog;
 const Main = imports.ui.main;
 const Tweener = imports.ui.tweener;
 
@@ -97,7 +96,7 @@ const ScreenShield = new Lang.Class({
 
     _onLockScreenKeyRelease: function(actor, event) {
         if (event.get_key_symbol() == Clutter.KEY_Escape) {
-            this._showUnlockDialog();
+            this._showUnlockDialog(true);
             return true;
         }
 
@@ -124,7 +123,7 @@ const ScreenShield = new Lang.Class({
     _onDragEnd: function(action, actor, eventX, eventY, modifiers) {
         if (this._lockScreenGroup.y < -(ARROW_DRAG_TRESHOLD * global.stage.height)) {
             // Complete motion automatically
-            this._showUnlockDialog();
+            this._showUnlockDialog(true);
         } else {
             // restore the lock screen to its original place
             // try to use the same speed as the normal animation
@@ -146,7 +145,9 @@ const ScreenShield = new Lang.Class({
         if (status == GnomeSession.PresenceStatus.IDLE) {
             if (this._dialog) {
                 this._dialog.cancel();
-                this._dialog = null;
+                if (!this._keepDialog) {
+                    this._dialog = null;
+                }
             }
 
             if (!this._isModal) {
@@ -169,32 +170,54 @@ const ScreenShield = new Lang.Class({
         }
     },
 
-    _showUnlockDialog: function() {
-        if (this._dialog)
-            return;
+    showDialog: function() {
+        this.lock();
+        this._showUnlockDialog(false);
+    },
 
-        // Tween the lock screen out of screen
-        // try to use the same speed regardless of original position
-        let h = global.stage.height;
-        let time = CURTAIN_SLIDE_TIME * (h + this._lockScreenGroup.y) / h;
-        Tweener.removeTweens(this._lockScreenGroup);
-        Tweener.addTween(this._lockScreenGroup,
-                         { y: -h,
-                           time: time,
-                           transition: 'linear',
-                           onComplete: Lang.bind(this, this._hideLockScreen),
-                         });
-
-        this._dialog = new UnlockDialog.UnlockDialog();
-        this._dialog.connect('failed', Lang.bind(this, this._onUnlockFailed));
-        this._dialog.connect('unlocked', Lang.bind(this, this._onUnlockSucceded));
-
-        if (!this._dialog.open(global.get_current_time())) {
-            log('Could not open unlock dialog: failed to acquire grab');
-
-            // and then? best we can do is to autounlock, although that's potentially
-            // a security issue
-            this._onUnlockSucceded();
+    _showUnlockDialog: function(animate) {
+        if (animate) {
+            // Tween the lock screen out of screen
+            // try to use the same speed regardless of original position
+            let h = global.stage.height;
+            let time = CURTAIN_SLIDE_TIME * (h + this._lockScreenGroup.y) / h;
+            Tweener.removeTweens(this._lockScreenGroup);
+            Tweener.addTween(this._lockScreenGroup,
+                             { y: -h,
+                               time: time,
+                               transition: 'linear',
+                               onComplete: Lang.bind(this, this._hideLockScreen),
+                             });
+        } else {
+            this._hideLockScreen();
+        }
+
+        if (!this._dialog) {
+            [this._dialog, this._keepDialog] = Main.sessionMode.createUnlockDialog(this._lockDialogGroup);
+            if (!this._dialog) {
+                // This session mode has no locking capabilities
+                this.unlock();
+                return;
+            }
+
+            this._dialog.connect('loaded', Lang.bind(this, function() {
+                if (!this._dialog.open()) {
+                    log('Could not open login dialog: failed to acquire grab');
+                    this.unlock();
+                }
+            }));
+
+            this._dialog.connect('failed', Lang.bind(this, this._onUnlockFailed));
+            this._dialog.connect('unlocked', Lang.bind(this, this._onUnlockSucceded));
+        }
+
+        if (this._keepDialog) {
+            // Notify the other components that even though we are showing the
+            // screenshield, we're not in a locked state
+            // (this happens for the gdm greeter)
+
+            this._isLocked = false;
+            this.emit('lock-status-changed', false);
         }
     },
 
@@ -227,6 +250,14 @@ const ScreenShield = new Lang.Class({
     },
 
     unlock: function() {
+        if (this._keepDialog) {
+            // The dialog must be kept alive,
+            // so immediately go back to it
+            // This will also reset _isLocked
+            this._showUnlockDialog(false);
+            return;
+        }
+
         if (this._dialog) {
             this._dialog.destroy();
             this._dialog = null;
diff --git a/js/ui/sessionMode.js b/js/ui/sessionMode.js
index dff6c84..1cc4ec3 100644
--- a/js/ui/sessionMode.js
+++ b/js/ui/sessionMode.js
@@ -39,6 +39,7 @@ const _modes = {
              hasRunDialog: false,
              hasWorkspaces: false,
              createSession: Main.createGDMSession,
+             createUnlockDialog: Main.createGDMLoginDialog,
              extraStylesheet: null,
              statusArea: {
                  order: [
@@ -86,6 +87,7 @@ const _modes = {
               hasRunDialog: true,
               hasWorkspaces: true,
               createSession: Main.createUserSession,
+              createUnlockDialog: Main.createSessionUnlockDialog,
               extraStylesheet: null,
               statusArea: {
                   order: [
@@ -113,6 +115,8 @@ const SessionMode = new Lang.Class({
 
         this._createSession = params.createSession;
         delete params.createSession;
+        this._createUnlockDialog = params.createUnlockDialog;
+        delete params.createUnlockDialog;
 
         Lang.copyProperties(params, this);
     },
@@ -120,5 +124,12 @@ const SessionMode = new Lang.Class({
     createSession: function() {
         if (this._createSession)
             this._createSession();
-    }
+    },
+
+    createUnlockDialog: function() {
+        if (this._createUnlockDialog)
+            return this._createUnlockDialog.apply(this, arguments);
+        else
+            return null;
+    },
 });
diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js
index 8e4a245..2b3eb37 100644
--- a/js/ui/unlockDialog.js
+++ b/js/ui/unlockDialog.js
@@ -7,7 +7,6 @@ const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const Gtk = imports.gi.Gtk;
 const Lang = imports.lang;
-const Mainloop = imports.mainloop;
 const Signals = imports.signals;
 const Shell = imports.gi.Shell;
 const St = imports.gi.St;
@@ -152,6 +151,11 @@ const UnlockDialog = new Lang.Class({
 
         this._updateOkButton(false);
         this._reset();
+
+        GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
+            this.emit('loaded');
+            return false;
+        }));
     },
 
     _updateOkButton: function(sensitive) {



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