summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2013-07-16 07:31:22 -0400
committerRay Strode <rstrode@redhat.com>2013-07-16 14:13:05 -0400
commitb19cef9dd53210a7c2f2f73cd25248408fbf6821 (patch)
treed17072b3986a7c73f7a7678525ee898774a23e0a
parent2d4473c35a99ba732cf539dcec948b9206975f49 (diff)
downloadgnome-shell-wip/login-unlock-merge.tar.gz
unlockDialog: Use GdmUtil.AuthPrompt instead of ModalDialogwip/login-unlock-merge
commit ea02380c1524c28e6538ffedb789a12c298742ab made the login screen stop using ModalDialog. It makes sense for the unlock code to also stop using ModalDialog, too (for similar reasons). Now that the login screen's auth prompt code has been separated out, the unlock dialog can use it to get the buttons and spinners etc, that it was previously getting from ModalDialog. This commit drops the ModalDialog usage in the unlock dialog, and makes the unlock dialog use GdmUtil.AuthPrompt instead.
-rw-r--r--js/gdm/util.js3
-rw-r--r--js/ui/unlockDialog.js185
2 files changed, 69 insertions, 119 deletions
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._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._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._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;
+ this._currentQuery = serviceName;
- if (!this._firstQuestion)
- this._promptEntry.text = '';
- else
- this._firstQuestion = false;
+ this._authPrompt.setPasswordChar(passwordChar);
+ this._authPrompt.setQuestion(question);
- this._promptEntry.clutter_text.set_password_char(passwordChar);
- this._promptEntry.menu.isPassword = passwordChar != '';
+ let signalId = this._authPrompt.connect('next', Lang.bind(this, function() {
+ this._authPrompt.disconnect(signalId);
+ this._doUnlock();
+ }));
- this._currentQuery = serviceName;
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);