From 0ba05b29b9a2420d3e6c0c3cfb2a623aaac9ab2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Fri, 7 Mar 2014 16:04:01 +0100 Subject: [PATCH] loginDialog: Defer loading user list until needed Loading the user list can be expensive, for instance when there is a large number of users and/or their avatars have to be fetched over the network. In case the user list is disabled anyway, there is no point in doing that work just to hide it, so stop doing that. https://bugzilla.gnome.org/show_bug.cgi?id=725905 --- js/gdm/loginDialog.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js index 080237cfb..6e3cb97e3 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js @@ -469,6 +469,17 @@ const LoginDialog = new Lang.Class({ this._sessionMenuButton.actor.show(); this._authPrompt.addActorToDefaultButtonWell(this._sessionMenuButton.actor); + this._disableUserList = undefined; + this._userListLoaded = false; + + // If the user list is enabled, it should take key focus; make sure the + // screen shield is initialized first to prevent it from stealing the + // focus later + Main.layoutManager.connect('startup-complete', + Lang.bind(this, this._updateDisableUserList)); + }, + + _ensureUserListLoaded: function() { if (!this._userManager.is_loaded) this._userManagerLoadedId = this._userManager.connect('notify::is-loaded', Lang.bind(this, function() { @@ -480,8 +491,7 @@ const LoginDialog = new Lang.Class({ })); else GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, this._loadUserList)); - - }, + }, _updateDisableUserList: function() { let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY); @@ -801,6 +811,7 @@ const LoginDialog = new Lang.Class({ }, _showUserList: function() { + this._ensureUserListLoaded(); this._authPrompt.hide(); this._sessionMenuButton.close(); this._setUserListExpanded(true); @@ -844,14 +855,17 @@ const LoginDialog = new Lang.Class({ }, _loadUserList: function() { + if (this._userListLoaded) + return GLib.SOURCE_REMOVE; + + this._userListLoaded = true; + let users = this._userManager.list_users(); for (let i = 0; i < users.length; i++) { this._userList.addUser(users[i]); } - this._updateDisableUserList(); - this._userManager.connect('user-added', Lang.bind(this, function(userManager, user) { this._userList.addUser(user);