diff --git a/js/gdm/util.js b/js/gdm/util.js index 1f2d9b03e..a4e744c63 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -13,6 +13,7 @@ const Batch = imports.gdm.batch; const Fprint = imports.gdm.fingerprint; const Main = imports.ui.main; const Params = imports.misc.params; +const ShellEntry = imports.ui.shellEntry; const Tweener = imports.ui.tweener; const UserWidget = imports.ui.userWidget; @@ -498,6 +499,7 @@ const AuthPrompt = new Lang.Class({ x_align: St.Align.START }); this._entry = new St.Entry({ style_class: 'login-dialog-prompt-entry', can_focus: true }); + ShellEntry.addContextMenu(this._entry, { isPassword: true }); this._entryTextChangedId = 0; this._entryActivateId = 0; this.actor.add(this._entry, @@ -607,6 +609,7 @@ const AuthPrompt = new Lang.Class({ setPasswordChar: function(passwordChar) { this._entry.clutter_text.set_password_char(passwordChar); + this._entry.menu.isPassword = passwordChar != ''; }, setQuestion: function(question) { diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js index f09a09b05..284972c53 100644 --- a/js/ui/unlockDialog.js +++ b/js/ui/unlockDialog.js @@ -1,6 +1,7 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- const AccountsService = imports.gi.AccountsService; +const Atk = imports.gi.Atk; const Clutter = imports.gi.Clutter; const Gdm = imports.gi.Gdm; const Gio = imports.gi.Gio; @@ -12,10 +13,9 @@ const Signals = imports.signals; const Shell = imports.gi.Shell; const St = imports.gi.St; +const Layout = imports.ui.layout; const Main = imports.ui.main; -const ModalDialog = imports.ui.modalDialog; const Panel = imports.ui.panel; -const ShellEntry = imports.ui.shellEntry; const Tweener = imports.ui.tweener; const UserWidget = imports.ui.userWidget; @@ -28,21 +28,20 @@ const IDLE_TIMEOUT = 2 * 60; const UnlockDialog = new Lang.Class({ Name: 'UnlockDialog', - Extends: ModalDialog.ModalDialog, _init: function(parentActor) { - this.parent({ shellReactive: true, - styleClass: 'login-dialog', - keybindingMode: Shell.KeyBindingMode.UNLOCK_SCREEN, - parentActor: parentActor - }); + this.actor = new St.Widget({ accessible_role: Atk.Role.WINDOW, + style_class: 'login-dialog', + visible: false }); + + this.actor.add_constraint(new Layout.MonitorConstraint({ primary: true })); + parentActor.add_child(this.actor); this._userManager = AccountsService.UserManager.get_default(); this._userName = GLib.get_user_name(); this._user = this._userManager.get_user(this._userName); this._failCounter = 0; - this._firstQuestion = true; this._greeterClient = new Gdm.Client(); this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient, { reauthenticationOnly: true }); @@ -57,62 +56,21 @@ const UnlockDialog = new Lang.Class({ this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint)); this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint)); - this._userWidget = new UserWidget.UserWidget(this._user); - this.contentLayout.add_actor(this._userWidget.actor); + this._promptBox = new St.BoxLayout({ vertical: true }); + this.actor.add_child(this._promptBox); + this._promptBox.add_constraint(new Clutter.AlignConstraint({ source: this.actor, + align_axis: Clutter.AlignAxis.BOTH, + factor: 0.5 })); - this._promptLayout = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout', - vertical: true }); - - this._promptLabel = new St.Label({ style_class: 'login-dialog-prompt-label' }); - this._promptLayout.add(this._promptLabel, - { x_align: St.Align.START }); - - this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry', - can_focus: true }); - this._promptEntry.clutter_text.connect('activate', Lang.bind(this, this._doUnlock)); - this._promptEntry.clutter_text.set_password_char('\u25cf'); - ShellEntry.addContextMenu(this._promptEntry, { isPassword: true }); - this.setInitialKeyFocus(this._promptEntry); - this._promptEntry.clutter_text.connect('text-changed', Lang.bind(this, function() { - this._updateOkButtonSensitivity(this._promptEntry.text.length > 0); - })); - - this._promptLayout.add(this._promptEntry, - { expand: true, - x_fill: true }); - - this.contentLayout.add_actor(this._promptLayout); - - this._promptMessage = new St.Label({ visible: false }); - this.contentLayout.add(this._promptMessage, { x_fill: true }); - - this._promptLoginHint = new St.Label({ style_class: 'login-dialog-prompt-login-hint' }); - this._promptLoginHint.hide(); - this.contentLayout.add_actor(this._promptLoginHint); + this._authPrompt = new GdmUtil.AuthPrompt({ style_class: 'login-dialog-prompt-layout', + vertical: true }); + this._authPrompt.setUser(this._user); + this._authPrompt.setPasswordChar('\u25cf'); + this._authPrompt.resetButtons(_("Cancel"), _("Unlock")); + this._authPrompt.connect('cancel', Lang.bind(this, this._escape)); + this._promptBox.add_child(this._authPrompt.actor); this.allowCancel = false; - this.buttonLayout.visible = true; - this.addButton({ label: _("Cancel"), - action: Lang.bind(this, this._escape), - key: Clutter.KEY_Escape }, - { expand: true, - x_fill: false, - y_fill: false, - x_align: St.Align.START, - y_align: St.Align.MIDDLE }); - this.placeSpinner({ expand: false, - x_fill: false, - y_fill: false, - x_align: St.Align.END, - y_align: St.Align.MIDDLE }); - this._okButton = this.addButton({ label: _("Unlock"), - action: Lang.bind(this, this._doUnlock), - default: true }, - { expand: false, - x_fill: false, - y_fill: false, - x_align: St.Align.END, - y_align: St.Align.MIDDLE }); let screenSaverSettings = new Gio.Settings({ schema: 'org.gnome.desktop.screensaver' }); if (screenSaverSettings.get_boolean('user-switch-enabled')) { @@ -125,9 +83,7 @@ const UnlockDialog = new Lang.Class({ x_align: St.Align.START, x_fill: true }); this._otherUserButton.connect('clicked', Lang.bind(this, this._otherUserClicked)); - this.dialogLayout.add(this._otherUserButton, - { x_align: St.Align.START, - x_fill: false }); + this._promptBox.add_child(this._otherUserButton); } else { this._otherUserButton = null; } @@ -137,80 +93,49 @@ const UnlockDialog = new Lang.Class({ let batch = new Batch.Hold(); this._userVerifier.begin(this._userName, batch); - Main.ctrlAltTabManager.addGroup(this.dialogLayout, _("Unlock Window"), 'dialog-password-symbolic'); + Main.ctrlAltTabManager.addGroup(this.actor, _("Unlock Window"), 'dialog-password-symbolic'); this._idleMonitor = new GnomeDesktop.IdleMonitor(); this._idleWatchId = this._idleMonitor.add_idle_watch(IDLE_TIMEOUT * 1000, Lang.bind(this, this._escape)); }, _updateSensitivity: function(sensitive) { - this._promptEntry.reactive = sensitive; - this._promptEntry.clutter_text.editable = sensitive; - this._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0); + this._authPrompt.updateSensitivity(sensitive); + if (this._otherUserButton) { this._otherUserButton.reactive = sensitive; this._otherUserButton.can_focus = sensitive; } }, - _updateOkButtonSensitivity: function(sensitive) { - this._okButton.reactive = sensitive; - this._okButton.can_focus = sensitive; - }, - _showMessage: function(userVerifier, message, styleClass) { - if (message) { - this._promptMessage.text = message; - this._promptMessage.styleClass = styleClass; - GdmUtil.fadeInActor(this._promptMessage); - } else { - GdmUtil.fadeOutActor(this._promptMessage); - } + this._authPrompt.setMessage(message, styleClass); }, _onAskQuestion: function(verifier, serviceName, question, passwordChar) { - if (this._firstQuestion && this._firstQuestionAnswer) { - this._userVerifier.answerQuery(serviceName, this._firstQuestionAnswer); - this._firstQuestionAnswer = null; - this._firstQuestion = false; - return; - } - - this._promptLabel.text = question; - - if (!this._firstQuestion) - this._promptEntry.text = ''; - else - this._firstQuestion = false; - - this._promptEntry.clutter_text.set_password_char(passwordChar); - this._promptEntry.menu.isPassword = passwordChar != ''; - this._currentQuery = serviceName; + + this._authPrompt.setPasswordChar(passwordChar); + this._authPrompt.setQuestion(question); + + let signalId = this._authPrompt.connect('next', Lang.bind(this, function() { + this._authPrompt.disconnect(signalId); + this._doUnlock(); + })); + this._updateSensitivity(true); - this.setWorking(false); + this._authPrompt.stopSpinning(); }, _showLoginHint: function(verifier, message) { - this._promptLoginHint.set_text(message) - GdmUtil.fadeInActor(this._promptLoginHint); + this._authPrompt.setHint(message); }, _hideLoginHint: function() { - GdmUtil.fadeOutActor(this._promptLoginHint); + this._authPrompt.setHint(null); }, _doUnlock: function() { - if (this._firstQuestion) { - // we haven't received a query yet, so stash the answer - // and make ourself non-reactive - // the actual reply to GDM will be sent as soon as asked - this._firstQuestionAnswer = this._promptEntry.text; - this._updateSensitivity(false); - this.setWorking(true); - return; - } - if (!this._currentQuery) return; @@ -218,13 +143,16 @@ const UnlockDialog = new Lang.Class({ this._currentQuery = null; this._updateSensitivity(false); - this.setWorking(true); + this._authPrompt.startSpinning(); - this._userVerifier.answerQuery(query, this._promptEntry.text); + this._userVerifier.answerQuery(query, this._authPrompt.getAnswer()); }, _finishUnlock: function() { this._userVerifier.clear(); + this._authPrompt.clear(); + this._authPrompt.stopSpinning(); + this._updateSensitivity(true); this.emit('unlocked'); }, @@ -253,12 +181,10 @@ const UnlockDialog = new Lang.Class({ this._firstQuestion = true; this._userVerified = false; - this._promptEntry.text = ''; - this._promptEntry.clutter_text.set_password_char('\u25cf'); - this._promptEntry.menu.isPassword = true; + this._authPrompt.clear(); this._updateSensitivity(false); - this.setWorking(false); + this._authPrompt.stopSpinning(); }, _escape: function() { @@ -282,8 +208,6 @@ const UnlockDialog = new Lang.Class({ this._idleMonitor.remove_watch(this._idleWatchId); this._idleWatchId = 0; } - - this.parent(); }, cancel: function() { @@ -293,6 +217,29 @@ const UnlockDialog = new Lang.Class({ }, addCharacter: function(unichar) { - this._promptEntry.clutter_text.insert_unichar(unichar); + this._authPrompt.addCharacter(unichar); }, + + open: function(timestamp) { + this.actor.show(); + + if (this._isModal) + return true; + + if (!Main.pushModal(this.actor, { timestamp: timestamp, + keybindingMode: Shell.KeyBindingMode.UNLOCK_SCREEN })) + return false; + + this._isModal = true; + + return true; + }, + + popModal: function(timestamp) { + if (this._isModal) { + Main.popModal(this.actor, timestamp); + this._isModal = false; + } + } }); +Signals.addSignalMethods(UnlockDialog.prototype);