on xenial help sign in
Support the lightdm manual-login hint
commit3182a1debfb4003170decbfd60b98886089f15d4 authorMichael Terry <mike@mterry.name> dateMon 9 Jan 2017, 14:11 (10 years ago) parentd12d603
8 files changed+139−9
plugins/LightDM/Greeter.cpp+14 plugins/LightDM/Greeter.h+2 plugins/LightDM/UsersModel.cpp+59−5 plugins/LightDM/UsersModel.h+5 qml/Greeter/LoginList.qml+4−1 tests/mocks/liblightdm/MockController.cpp+28 tests/mocks/liblightdm/MockController.h+12 tests/mocks/liblightdm/MockGreeter.cpp+15−3
plugins/LightDM/Greeter.cpp+14
@@ -114,6 +114,18 @@ bool Greeter::hasGuestAccount() const
114114 return d->m_greeter->hasGuestAccountHint();
115115}
116116
117+bool Greeter::showManualLoginHint() const
118+{
119+ Q_D(const Greeter);
120+ return d->m_greeter->showManualLoginHint();
121+}
122+
123+bool Greeter::hideUsersHint() const
124+{
125+ Q_D(const Greeter);
126+ return d->m_greeter->hideUsersHint();
127+}
128+
117129void Greeter::authenticate(const QString &username)
118130{
119131 Q_D(Greeter);
@@ -125,6 +137,8 @@ void Greeter::authenticate(const QString &username)
125137
126138 if (username == QStringLiteral("*guest")) {
127139 d->m_greeter->authenticateAsGuest();
140+ } else if (username == QStringLiteral("*other")) {
141+ d->m_greeter->authenticate(nullptr);
128142 } else {
129143 d->m_greeter->authenticate(username);
130144 }
plugins/LightDM/Greeter.h+2
@@ -50,6 +50,8 @@ public:
5050 bool promptless() const;
5151 QString selectUser() const;
5252 bool hasGuestAccount() const;
53+ bool showManualLoginHint() const;
54+ bool hideUsersHint() const;
5355
5456public Q_SLOTS:
5557 void authenticate(const QString &username=QString());
plugins/LightDM/UsersModel.cpp+59−5
@@ -63,24 +63,70 @@ QVariant MangleModel::data(const QModelIndex &index, int role) const
6363
6464UsersModel::UsersModel(QObject* parent)
6565 : UnitySortFilterProxyModelQML(parent)
66+ , m_showManual(false)
6667{
67− setModel(new MangleModel(this));
68+ if (!Greeter::instance()->hideUsersHint()) {
69+ setModel(new MangleModel(this));
70+ }
6871 setSortCaseSensitivity(Qt::CaseInsensitive);
6972 setSortLocaleAware(true);
7073 setSortRole(QLightDM::UsersModel::RealNameRole);
7174 sort(0);
75+
76+ connect(this, &UnitySortFilterProxyModelQML::countChanged,
77+ this, &UsersModel::updateShowManual);
78+ updateShowManual();
79+}
80+
81+void UsersModel::updateShowManual()
82+{
83+ // Show manual login if we are asked to OR if no other entry exists
84+ bool showManual = Greeter::instance()->showManualLoginHint() ||
85+ (QSortFilterProxyModel::rowCount() == 0 &&
86+ !Greeter::instance()->hasGuestAccount());
87+
88+ if (m_showManual != showManual) {
89+ int row = QSortFilterProxyModel::rowCount();
90+ if (showManual)
91+ beginInsertRows(QModelIndex(), row, row);
92+ else
93+ beginRemoveRows(QModelIndex(), row, row);
94+
95+ m_showManual = showManual;
96+
97+ if (showManual)
98+ endInsertRows();
99+ else
100+ endRemoveRows();
101+ }
102+}
103+
104+int UsersModel::manualRow() const
105+{
106+ if (!m_showManual)
107+ return -1;
108+
109+ return QSortFilterProxyModel::rowCount();
72110}
73111
74112int UsersModel::guestRow() const
75113{
76− return Greeter::instance()->hasGuestAccount() ?
77− UnitySortFilterProxyModelQML::rowCount() : -1;
114+ if (!Greeter::instance()->hasGuestAccount())
115+ return -1;
116+
117+ int row = QSortFilterProxyModel::rowCount();
118+ if (m_showManual)
119+ row++;
120+
121+ return row;
78122}
79123
80124int UsersModel::rowCount(const QModelIndex &parent) const
81125{
82126 auto count = UnitySortFilterProxyModelQML::rowCount(parent);
83127
128+ if (m_showManual && !parent.isValid())
129+ count++;
84130 if (Greeter::instance()->hasGuestAccount() && !parent.isValid())
85131 count++;
86132
@@ -89,7 +135,7 @@ int UsersModel::rowCount(const QModelIndex &parent) const
89135
90136QModelIndex UsersModel::index(int row, int column, const QModelIndex &parent) const
91137{
92− if (row == guestRow() && !parent.isValid()) {
138+ if ((row == manualRow() || row == guestRow()) && !parent.isValid()) {
93139 return createIndex(row, column);
94140 } else {
95141 return UnitySortFilterProxyModelQML::index(row, column, parent);
@@ -98,7 +144,15 @@ QModelIndex UsersModel::index(int row, int column, const QModelIndex &parent) co
98144
99145QVariant UsersModel::data(const QModelIndex &index, int role) const
100146{
101− if (index.row() == guestRow() && index.column() == 0) {
147+ if (index.row() == manualRow() && index.column() == 0) {
148+ switch (role) {
149+ case QLightDM::UsersModel::NameRole: return QStringLiteral("*other");
150+ case QLightDM::UsersModel::RealNameRole: return gettext("Login");
151+ case QLightDM::UsersModel::LoggedInRole: return false;
152+ case QLightDM::UsersModel::SessionRole: return Greeter::instance()->defaultSessionHint();
153+ default: return QVariant();
154+ }
155+ } else if (index.row() == guestRow() && index.column() == 0) {
102156 switch (role) {
103157 case QLightDM::UsersModel::NameRole: return QStringLiteral("*guest");
104158 case QLightDM::UsersModel::RealNameRole: return gettext("Guest Session");
plugins/LightDM/UsersModel.h+5
@@ -35,5 +35,10 @@ public:
3535 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
3636
3737private:
38+ int manualRow() const;
3839 int guestRow() const;
40+
41+ void updateShowManual();
42+
43+ bool m_showManual;
3944};
qml/Greeter/LoginList.qml+4−1
@@ -203,7 +203,10 @@ StyledItem {
203203 // Add an offset to bottomMargin for any items below the highlight
204204 bottomMargin: -(units.gu(4) + (parent.belowHighlight ? parent.belowOffset : 0))
205205 }
206− text: realName
206+ text: userList.currentIndex === index
207+ && name === "*other"
208+ && LightDM.Greeter.authenticationUser !== ""
209+ ? LightDM.Greeter.authenticationUser : realName
207210 color: userList.currentIndex !== index ? theme.palette.normal.raised
208211 : theme.palette.normal.raisedText
209212
tests/mocks/liblightdm/MockController.cpp+28
@@ -67,6 +67,8 @@ void MockController::reset()
6767 setUserMode(userMode);
6868 setSessionMode("full");
6969 setNumSessions(numFullSessions());
70+ setShowManualLoginHint(false);
71+ setHideUsersHint(false);
7072}
7173
7274QString MockController::selectUserHint() const
@@ -108,6 +110,32 @@ void MockController::setHasGuestAccountHint(bool hasGuestAccountHint)
108110 }
109111}
110112
113+bool MockController::showManualLoginHint() const
114+{
115+ return m_showManualLoginHint;
116+}
117+
118+void MockController::setShowManualLoginHint(bool showManualLoginHint)
119+{
120+ if (m_showManualLoginHint != showManualLoginHint) {
121+ m_showManualLoginHint = showManualLoginHint;
122+ Q_EMIT showManualLoginHintChanged();
123+ }
124+}
125+
126+bool MockController::hideUsersHint() const
127+{
128+ return m_hideUsersHint;
129+}
130+
131+void MockController::setHideUsersHint(bool hideUsersHint)
132+{
133+ if (m_hideUsersHint != hideUsersHint) {
134+ m_hideUsersHint = hideUsersHint;
135+ Q_EMIT hideUsersHintChanged();
136+ }
137+}
138+
111139QString MockController::userMode() const
112140{
113141 return m_userMode;
tests/mocks/liblightdm/MockController.h+12
@@ -29,6 +29,8 @@ class Q_DECL_EXPORT MockController : public QObject
2929 Q_PROPERTY(QString selectUserHint READ selectUserHint WRITE setSelectUserHint NOTIFY selectUserHintChanged)
3030 Q_PROPERTY(bool selectGuestHint READ selectGuestHint WRITE setSelectGuestHint NOTIFY selectGuestHintChanged)
3131 Q_PROPERTY(bool hasGuestAccountHint READ hasGuestAccountHint WRITE setHasGuestAccountHint NOTIFY hasGuestAccountHintChanged)
32+ Q_PROPERTY(bool showManualLoginHint READ showManualLoginHint WRITE setShowManualLoginHint NOTIFY showManualLoginHintChanged)
33+ Q_PROPERTY(bool hideUsersHint READ hideUsersHint WRITE setHideUsersHint NOTIFY hideUsersHintChanged)
3234
3335 // single, single-pin, single-passphrase, full
3436 Q_PROPERTY(QString userMode READ userMode WRITE setUserMode NOTIFY userModeChanged)
@@ -54,6 +56,12 @@ public:
5456 bool hasGuestAccountHint() const;
5557 void setHasGuestAccountHint(bool hasGuestAccountHint);
5658
59+ bool showManualLoginHint() const;
60+ void setShowManualLoginHint(bool showManualLoginHint);
61+
62+ bool hideUsersHint() const;
63+ void setHideUsersHint(bool hideUsersHint);
64+
5765 QString userMode() const;
5866 void setUserMode(const QString &userMode);
5967
@@ -76,6 +84,8 @@ Q_SIGNALS:
7684 void selectUserHintChanged();
7785 void selectGuestHintChanged();
7886 void hasGuestAccountHintChanged();
87+ void showManualLoginHintChanged();
88+ void hideUsersHintChanged();
7989 void userModeChanged();
8090 void sessionModeChanged();
8191 void numSessionsChanged();
@@ -86,6 +96,8 @@ private:
8696 QString m_selectUserHint;
8797 bool m_selectGuestHint;
8898 bool m_hasGuestAccountHint;
99+ bool m_showManualLoginHint;
100+ bool m_hideUsersHint;
89101 QString m_userMode;
90102 QString m_sessionMode;
91103 QList<SessionItem> m_fullSessions;
tests/mocks/liblightdm/MockGreeter.cpp+15−3
@@ -67,17 +67,17 @@ QString Greeter::defaultSessionHint() const
6767
6868bool Greeter::hideUsersHint() const
6969{
70− return false;
70+ return MockController::instance()->hideUsersHint();
7171}
7272
7373bool Greeter::showManualLoginHint() const
7474{
75− return true;
75+ return MockController::instance()->showManualLoginHint();
7676}
7777
7878bool Greeter::showRemoteLoginHint() const
7979{
80− return true;
80+ return false;
8181}
8282
8383QString Greeter::selectUserHint() const
@@ -141,6 +141,11 @@ void Greeter::handleAuthenticate()
141141{
142142 Q_D(Greeter);
143143
144+ if (d->authenticationUser.isEmpty()) {
145+ Q_EMIT showPrompt("Username: ", Greeter::PromptTypeQuestion);
146+ return;
147+ }
148+
144149 // Send out any messages we need to
145150 if (d->authenticationUser == "info-prompt")
146151 Q_EMIT showMessage("Welcome to Unity Greeter", Greeter::MessageTypeInfo);
@@ -219,6 +224,13 @@ void Greeter::respond(const QString &response)
219224{
220225 Q_D(Greeter);
221226
227+ if (d->authenticationUser.isEmpty()) {
228+ // A manual login, our first question was which username
229+ d->authenticationUser = response;
230+ handleAuthenticate();
231+ return;
232+ }
233+
222234 if (d->authenticationUser == "no-response")
223235 return;
224236 else if (d->authenticationUser == "two-factor") {