From 11965324938bc99e1507682b6f9db1eeaef1eeeb Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 13 Apr 2021 10:59:49 -0400 Subject: [PATCH] loginDialog: Allow timed login with disabled user list At the moment the timed login feature is implemented in the user list. If there's no user list, we don't show the indicator anywhere and don't proceed with timed login. This commit allows timed login to work when the user list is disabled. It accomplishes this by putting the timed login indicator on the auth prompt in that scenario. Part-of: --- .../widgets/_login-dialog.scss | 5 +++ js/gdm/authPrompt.js | 43 ++++++++++++++++++- js/gdm/loginDialog.js | 23 +++++++++- 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/data/theme/gnome-shell-sass/widgets/_login-dialog.scss b/data/theme/gnome-shell-sass/widgets/_login-dialog.scss index d6608fc30..1789beca9 100644 --- a/data/theme/gnome-shell-sass/widgets/_login-dialog.scss +++ b/data/theme/gnome-shell-sass/widgets/_login-dialog.scss @@ -151,6 +151,11 @@ padding-top: 16px; } +.login-dialog-timed-login-indicator { + height: 2px; + background-color: darken($fg_color,40%); +} + .login-dialog-prompt-layout { padding-top: 24px; padding-bottom: 12px; diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js index d2c9a1659..de777450e 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js @@ -1,7 +1,7 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- /* exported AuthPrompt */ -const { Clutter, GObject, Pango, Shell, St } = imports.gi; +const { Clutter, GLib, GObject, Pango, Shell, St } = imports.gi; const Animation = imports.ui.animation; const Batch = imports.gdm.batch; @@ -170,6 +170,13 @@ var AuthPrompt = GObject.registerClass({ this._mainBox.add_child(this._entry); this._entry.grab_key_focus(); + this._timedLoginIndicator = new St.Bin({ + style_class: 'login-dialog-timed-login-indicator', + scale_x: 0, + }); + + this.add_child(this._timedLoginIndicator); + [this._textEntry, this._passwordEntry].forEach(entry => { entry.clutter_text.connect('text-changed', () => { if (!this._userVerifier.hasPendingMessages) @@ -198,6 +205,40 @@ var AuthPrompt = GObject.registerClass({ this._defaultButtonWell.add_child(this._spinner); } + showTimedLoginIndicator(time) { + let hold = new Batch.Hold(); + + this.hideTimedLoginIndicator(); + + const startTime = GLib.get_monotonic_time(); + + this._timedLoginTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 33, + () => { + const currentTime = GLib.get_monotonic_time(); + const elapsedTime = (currentTime - startTime) / GLib.USEC_PER_SEC; + this._timedLoginIndicator.scale_x = elapsedTime / time; + if (elapsedTime >= time) { + this._timedLoginTimeoutId = 0; + hold.release(); + return GLib.SOURCE_REMOVE; + } + + return GLib.SOURCE_CONTINUE; + }); + + GLib.Source.set_name_by_id(this._timedLoginTimeoutId, '[gnome-shell] this._timedLoginTimeoutId'); + + return hold; + } + + hideTimedLoginIndicator() { + if (this._timedLoginTimeoutId) { + GLib.source_remove(this._timedLoginTimeoutId); + this._timedLoginTimeoutId = 0; + } + this._timedLoginIndicator.scale_x = 0.; + } + _activateNext(shouldSpin) { this.verificationStatus = AuthPromptStatus.VERIFICATION_IN_PROGRESS; this.updateSensitivity(false); diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js index cbc23c56d..d2a82b43d 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -762,6 +762,9 @@ var LoginDialog = GObject.registerClass({ if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) this._authPrompt.reset(); + + if (this._disableUserList && this._timedLoginUserListHold) + this._timedLoginUserListHold.release(); } } @@ -1049,16 +1052,29 @@ var LoginDialog = GObject.registerClass({ let animationTime; let tasks = [ - () => this._waitForItemForUser(userName), + () => { + if (this._disableUserList) + return; + + this._timedLoginUserListHold = this._waitForItemForUser(userName); + }, () => { - loginItem = this._userList.getItemFromUserName(userName); + this._timedLoginUserListHold = null; + + if (this._disableUserList) + loginItem = this._authPrompt; + else + loginItem = this._userList.getItemFromUserName(userName); // If there is an animation running on the item, reset it. loginItem.hideTimedLoginIndicator(); }, () => { + if (this._disableUserList) + return; + // If we're just starting out, start on the right item. if (!this._userManager.is_loaded) this._userList.jumpToItem(loginItem); @@ -1080,6 +1096,9 @@ var LoginDialog = GObject.registerClass({ }, () => { + if (this._disableUserList) + return; + // If idle timeout is done, make sure the timed login indicator is shown if (delay > _TIMED_LOGIN_IDLE_THRESHOLD && this._authPrompt.visible)