diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js index 05a62ffb8..3fff8c401 100644 --- a/js/ui/unlockDialog.js +++ b/js/ui/unlockDialog.js @@ -445,34 +445,8 @@ var UnlockDialog = GObject.registerClass({ stack.add_child(this._clock); this._showClock(); - this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY); - this._authPrompt.connect('failed', this._fail.bind(this)); - this._authPrompt.connect('cancelled', this._fail.bind(this)); - this._authPrompt.connect('reset', this._onReset.bind(this)); - this._authPrompt.setPasswordChar('\u25cf'); - this._authPrompt.nextButton.label = _("Unlock"); - - this._promptBox.add_child(this._authPrompt); - this.allowCancel = false; - let screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' }); - if (screenSaverSettings.get_boolean('user-switch-enabled')) { - let otherUserLabel = new St.Label({ text: _("Log in as another user"), - style_class: 'login-dialog-not-listed-label' }); - this._otherUserButton = new St.Button({ style_class: 'login-dialog-not-listed-button', - can_focus: true, - child: otherUserLabel, - reactive: true }); - this._otherUserButton.connect('clicked', this._otherUserClicked.bind(this)); - this._promptBox.add_child(this._otherUserButton); - } else { - this._otherUserButton = null; - } - - this._authPrompt.reset(); - this._updateSensitivity(true); - Main.ctrlAltTabManager.addGroup(this, _("Unlock Window"), 'dialog-password-symbolic'); // Notifications @@ -554,6 +528,53 @@ var UnlockDialog = GObject.registerClass({ this._createBackground(i); } + _ensureAuthPrompt() { + if (this._authPrompt) + return; + + this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY); + this._authPrompt.connect('failed', this._fail.bind(this)); + this._authPrompt.connect('cancelled', this._fail.bind(this)); + this._authPrompt.connect('reset', this._onReset.bind(this)); + this._authPrompt.setPasswordChar('\u25cf'); + this._authPrompt.nextButton.label = _("Unlock"); + + this._promptBox.add_child(this._authPrompt); + + let screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' }); + if (screenSaverSettings.get_boolean('user-switch-enabled')) { + let otherUserLabel = new St.Label({ + text: _("Log in as another user"), + style_class: 'login-dialog-not-listed-label', + }); + this._otherUserButton = new St.Button({ + style_class: 'login-dialog-not-listed-button', + can_focus: true, + child: otherUserLabel, + reactive: true, + }); + this._otherUserButton.connect('clicked', this._otherUserClicked.bind(this)); + this._promptBox.add_child(this._otherUserButton); + } else { + this._otherUserButton = null; + } + + this._authPrompt.reset(); + this._updateSensitivity(true); + } + + _maybeDestroyAuthPrompt() { + this.grab_key_focus(); + + if (this._authPrompt) { + this._authPrompt.destroy(); + this._authPrompt = null; + + this._otherUserButton.destroy(); + this._otherUserButton = null; + } + } + _updateSensitivity(sensitive) { this._authPrompt.updateSensitivity(sensitive); @@ -574,7 +595,10 @@ var UnlockDialog = GObject.registerClass({ opacity: 0, duration: 300, mode: Clutter.AnimationMode.EASE_OUT_QUAD, - onComplete: () => this._promptBox.hide(), + onComplete: () => { + this._promptBox.hide(); + this._maybeDestroyAuthPrompt(); + }, }); this._clock.ease({ @@ -585,6 +609,8 @@ var UnlockDialog = GObject.registerClass({ } _showPrompt() { + this._ensureAuthPrompt(); + if (this._activePage == this._promptBox) return; @@ -654,6 +680,7 @@ var UnlockDialog = GObject.registerClass({ } cancel() { + this._ensureAuthPrompt(); this._authPrompt.cancel(); } @@ -663,6 +690,7 @@ var UnlockDialog = GObject.registerClass({ } finish(onComplete) { + this._ensureAuthPrompt(); this._authPrompt.finish(onComplete); }