polkitAgent: Use a timeout for resetting the dialog
Since polkit takes a few milliseconds from initiating the session to emitting the "request" signal, don't introduce visual distraction by hiding the password entry and showing it again a few ms later. So start a timeout of 200 ms when we destroy a session and if no session request (i.e. a request for a password-authentication) happened during this timeout, hide the password entry. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/788
This commit is contained in:
parent
5c7a701a68
commit
d5eafbad87
@ -15,6 +15,8 @@ var DIALOG_ICON_SIZE = 48;
|
||||
|
||||
var WORK_SPINNER_ICON_SIZE = 16;
|
||||
|
||||
const DELAYED_RESET_TIMEOUT = 200;
|
||||
|
||||
var AuthenticationDialog = GObject.registerClass({
|
||||
Signals: { 'done': { param_types: [GObject.TYPE_BOOLEAN] } }
|
||||
}, class AuthenticationDialog extends ModalDialog.ModalDialog {
|
||||
@ -160,7 +162,8 @@ var AuthenticationDialog = GObject.registerClass({
|
||||
}
|
||||
|
||||
performAuthentication() {
|
||||
this._destroySession();
|
||||
this._destroySession(DELAYED_RESET_TIMEOUT);
|
||||
|
||||
this._session = new PolkitAgent.Session({ identity: this._identityToAuth,
|
||||
cookie: this._cookie });
|
||||
this._sessionCompletedId = this._session.connect('completed', this._onSessionCompleted.bind(this));
|
||||
@ -253,6 +256,11 @@ var AuthenticationDialog = GObject.registerClass({
|
||||
}
|
||||
|
||||
_onSessionRequest(session, request, echoOn) {
|
||||
if (this._sessionRequestTimeoutId) {
|
||||
GLib.source_remove(this._sessionRequestTimeoutId);
|
||||
this._sessionRequestTimeoutId = 0;
|
||||
}
|
||||
|
||||
// Cheap localization trick
|
||||
if (request == 'Password:' || request == 'Password: ')
|
||||
this._passwordLabel.set_text(_("Password:"));
|
||||
@ -292,7 +300,7 @@ var AuthenticationDialog = GObject.registerClass({
|
||||
this._ensureOpen();
|
||||
}
|
||||
|
||||
_destroySession() {
|
||||
_destroySession(delay = 0) {
|
||||
if (this._session) {
|
||||
if (!this._completed)
|
||||
this._session.cancel();
|
||||
@ -305,9 +313,23 @@ var AuthenticationDialog = GObject.registerClass({
|
||||
this._session = null;
|
||||
}
|
||||
|
||||
this._passwordBox.hide();
|
||||
this._cancelButton.grab_key_focus();
|
||||
this._okButton.reactive = false;
|
||||
if (this._sessionRequestTimeoutId) {
|
||||
GLib.source_remove(this._sessionRequestTimeoutId);
|
||||
this._sessionRequestTimeoutId = 0;
|
||||
}
|
||||
|
||||
let resetDialog = () => {
|
||||
this._passwordBox.hide();
|
||||
this._cancelButton.grab_key_focus();
|
||||
this._okButton.reactive = false;
|
||||
};
|
||||
|
||||
if (delay) {
|
||||
this._sessionRequestTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, delay, resetDialog);
|
||||
GLib.Source.set_name_by_id(this._sessionRequestTimeoutId, '[gnome-shell] this._sessionRequestTimeoutId');
|
||||
} else {
|
||||
resetDialog();
|
||||
}
|
||||
}
|
||||
|
||||
_onUserChanged() {
|
||||
@ -332,7 +354,10 @@ var AuthenticationDialog = GObject.registerClass({
|
||||
_onDialogClosed() {
|
||||
if (this._sessionUpdatedId)
|
||||
Main.sessionMode.disconnect(this._sessionUpdatedId);
|
||||
this._sessionUpdatedId = 0;
|
||||
|
||||
if (this._sessionRequestTimeoutId)
|
||||
GLib.source_remove(this._sessionRequestTimeoutId);
|
||||
this._sessionRequestTimeoutId = 0;
|
||||
|
||||
if (this._user) {
|
||||
this._user.disconnect(this._userLoadedId);
|
||||
|
Loading…
Reference in New Issue
Block a user