on xenial help sign in
Fix focus on greeter and various other bugs
be42365Michael Terry
po/hu.po+46−45
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2016-06-17 01:22+0000\n"
10"POT-Creation-Date: 2016-06-17 01:22+0000\n"
11−"PO-Revision-Date: 2016-03-24 09:19+0000\n"
11+"PO-Revision-Date: 2016-06-20 07:28+0000\n"
12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
12"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-06-19 05:55+0000\n"
18+"X-Launchpad-Export-Date: 2016-06-21 05:59+0000\n"
19"X-Generator: Launchpad (build 18097)\n"
19"X-Generator: Launchpad (build 18097)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -121,163 +121,163 @@ msgstr "Újraindítás"
121
121
122#: qml/Components/KeyboardShortcutsOverlay.qml:41
122#: qml/Components/KeyboardShortcutsOverlay.qml:41
123msgid "Keyboard Shortcuts"
123msgid "Keyboard Shortcuts"
124−msgstr ""
124+msgstr "Gyorsbillentyűk"
125
125
126#: qml/Components/KeyboardShortcutsOverlay.qml:55
126#: qml/Components/KeyboardShortcutsOverlay.qml:55
127msgid "Unity 8"
127msgid "Unity 8"
128−msgstr ""
128+msgstr "Unity 8"
129
129
130#: qml/Components/KeyboardShortcutsOverlay.qml:62
130#: qml/Components/KeyboardShortcutsOverlay.qml:62
131msgid "PrtScr"
131msgid "PrtScr"
132−msgstr ""
132+msgstr "PrtScr"
133
133
134#: qml/Components/KeyboardShortcutsOverlay.qml:67
134#: qml/Components/KeyboardShortcutsOverlay.qml:67
135msgid "Takes a screenshot."
135msgid "Takes a screenshot."
136−msgstr ""
136+msgstr "Képernyő képkészítése."
137
137
138#: qml/Components/KeyboardShortcutsOverlay.qml:75
138#: qml/Components/KeyboardShortcutsOverlay.qml:75
139msgid "Alt + PrtScr"
139msgid "Alt + PrtScr"
140−msgstr ""
140+msgstr "Alt + PrtScr"
141
141
142#: qml/Components/KeyboardShortcutsOverlay.qml:80
142#: qml/Components/KeyboardShortcutsOverlay.qml:80
143msgid "Takes a screenshot of a window."
143msgid "Takes a screenshot of a window."
144−msgstr ""
144+msgstr "Képernyőkép készítése az ablakról."
145
145
146#: qml/Components/KeyboardShortcutsOverlay.qml:88
146#: qml/Components/KeyboardShortcutsOverlay.qml:88
147msgid "Super + Space"
147msgid "Super + Space"
148−msgstr ""
148+msgstr "Szuper + Szóköz"
149
149
150#: qml/Components/KeyboardShortcutsOverlay.qml:93
150#: qml/Components/KeyboardShortcutsOverlay.qml:93
151msgid "Switches to next keyboard layout."
151msgid "Switches to next keyboard layout."
152−msgstr ""
152+msgstr "A következő billentyűzetkiosztására váltás."
153
153
154#: qml/Components/KeyboardShortcutsOverlay.qml:101
154#: qml/Components/KeyboardShortcutsOverlay.qml:101
155msgid "Super + Shift + Space"
155msgid "Super + Shift + Space"
156−msgstr ""
156+msgstr "Szuper + Shift + Szóköz"
157
157
158#: qml/Components/KeyboardShortcutsOverlay.qml:106
158#: qml/Components/KeyboardShortcutsOverlay.qml:106
159msgid "Switches to previous keyboard layout."
159msgid "Switches to previous keyboard layout."
160−msgstr ""
160+msgstr "Az előző billentyűzetkiosztására váltás."
161
161
162#: qml/Components/KeyboardShortcutsOverlay.qml:118
162#: qml/Components/KeyboardShortcutsOverlay.qml:118
163msgid "Launcher"
163msgid "Launcher"
164−msgstr ""
164+msgstr "Indító"
165
165
166#: qml/Components/KeyboardShortcutsOverlay.qml:125
166#: qml/Components/KeyboardShortcutsOverlay.qml:125
167msgid "Super (Hold)"
167msgid "Super (Hold)"
168−msgstr ""
168+msgstr "Szuper (nyomva tartva)"
169
169
170#: qml/Components/KeyboardShortcutsOverlay.qml:130
170#: qml/Components/KeyboardShortcutsOverlay.qml:130
171msgid "Opens the launcher, displays shortcuts."
171msgid "Opens the launcher, displays shortcuts."
172−msgstr ""
172+msgstr "Indító megnyitása és gyorsindítók megjelenítése."
173
173
174#: qml/Components/KeyboardShortcutsOverlay.qml:138
174#: qml/Components/KeyboardShortcutsOverlay.qml:138
175msgid "Alt + F1"
175msgid "Alt + F1"
176−msgstr ""
176+msgstr "Alt + F1"
177
177
178#: qml/Components/KeyboardShortcutsOverlay.qml:143
178#: qml/Components/KeyboardShortcutsOverlay.qml:143
179msgid "Opens launcher keyboard navigation mode."
179msgid "Opens launcher keyboard navigation mode."
180−msgstr ""
180+msgstr "Indító megnyitása billentyűzettel navigáláshoz."
181
181
182#: qml/Components/KeyboardShortcutsOverlay.qml:151
182#: qml/Components/KeyboardShortcutsOverlay.qml:151
183msgid "Super + Tab"
183msgid "Super + Tab"
184−msgstr ""
184+msgstr "Super + Tab"
185
185
186#: qml/Components/KeyboardShortcutsOverlay.qml:156
186#: qml/Components/KeyboardShortcutsOverlay.qml:156
187msgid "Switches applications via the launcher."
187msgid "Switches applications via the launcher."
188−msgstr ""
188+msgstr "Alkalmazás váltás az indítóval"
189
189
190#: qml/Components/KeyboardShortcutsOverlay.qml:164
190#: qml/Components/KeyboardShortcutsOverlay.qml:164
191msgid "Super + 0 to 9"
191msgid "Super + 0 to 9"
192−msgstr ""
192+msgstr "Super + 0-9"
193
193
194#: qml/Components/KeyboardShortcutsOverlay.qml:169
194#: qml/Components/KeyboardShortcutsOverlay.qml:169
195msgid "Same as clicking on a launcher icon."
195msgid "Same as clicking on a launcher icon."
196−msgstr ""
196+msgstr "Az adott számú alkalmazás indítása."
197
197
198#: qml/Components/KeyboardShortcutsOverlay.qml:181
198#: qml/Components/KeyboardShortcutsOverlay.qml:181
199msgid "Scopes"
199msgid "Scopes"
200−msgstr ""
200+msgstr "Lencsék"
201
201
202#: qml/Components/KeyboardShortcutsOverlay.qml:188
202#: qml/Components/KeyboardShortcutsOverlay.qml:188
203msgid "Super (Tap)"
203msgid "Super (Tap)"
204−msgstr ""
204+msgstr "Super (Tap)"
205
205
206#: qml/Components/KeyboardShortcutsOverlay.qml:193
206#: qml/Components/KeyboardShortcutsOverlay.qml:193
207msgid "Opens the Scopes home."
207msgid "Opens the Scopes home."
208−msgstr ""
208+msgstr "Lencsék kezdőlapjának megnyitása"
209
209
210#: qml/Components/KeyboardShortcutsOverlay.qml:209
210#: qml/Components/KeyboardShortcutsOverlay.qml:209
211msgid "Switching"
211msgid "Switching"
212−msgstr ""
212+msgstr "Váltás"
213
213
214#: qml/Components/KeyboardShortcutsOverlay.qml:216
214#: qml/Components/KeyboardShortcutsOverlay.qml:216
215msgid "Alt + Tab"
215msgid "Alt + Tab"
216−msgstr ""
216+msgstr "Alt + Tab"
217
217
218#: qml/Components/KeyboardShortcutsOverlay.qml:221
218#: qml/Components/KeyboardShortcutsOverlay.qml:221
219msgid "Switches between applications."
219msgid "Switches between applications."
220−msgstr ""
220+msgstr "Váltás az alkalmazások között."
221
221
222#: qml/Components/KeyboardShortcutsOverlay.qml:229
222#: qml/Components/KeyboardShortcutsOverlay.qml:229
223msgid "Super + W"
223msgid "Super + W"
224−msgstr ""
224+msgstr "Super + W"
225
225
226#: qml/Components/KeyboardShortcutsOverlay.qml:234
226#: qml/Components/KeyboardShortcutsOverlay.qml:234
227msgid "Opens the desktop spread."
227msgid "Opens the desktop spread."
228−msgstr ""
228+msgstr "Az asztal ablakainak szétterítése."
229
229
230#: qml/Components/KeyboardShortcutsOverlay.qml:242
230#: qml/Components/KeyboardShortcutsOverlay.qml:242
231msgid "Cursor Left or Right"
231msgid "Cursor Left or Right"
232−msgstr ""
232+msgstr "Balra/jobbra nyíl"
233
233
234#: qml/Components/KeyboardShortcutsOverlay.qml:247
234#: qml/Components/KeyboardShortcutsOverlay.qml:247
235msgid "Moves the focus."
235msgid "Moves the focus."
236−msgstr ""
236+msgstr "Fókusz mozgatása."
237
237
238#: qml/Components/KeyboardShortcutsOverlay.qml:259
238#: qml/Components/KeyboardShortcutsOverlay.qml:259
239msgid "Windows"
239msgid "Windows"
240−msgstr ""
240+msgstr "Ablakok"
241
241
242#: qml/Components/KeyboardShortcutsOverlay.qml:266
242#: qml/Components/KeyboardShortcutsOverlay.qml:266
243msgid "Ctrl + Super + D"
243msgid "Ctrl + Super + D"
244−msgstr ""
244+msgstr "Ctrl + Szuper + D"
245
245
246#: qml/Components/KeyboardShortcutsOverlay.qml:271
246#: qml/Components/KeyboardShortcutsOverlay.qml:271
247msgid "Minimizes all windows."
247msgid "Minimizes all windows."
248−msgstr ""
248+msgstr "Minden ablak minimalizálása."
249
249
250#: qml/Components/KeyboardShortcutsOverlay.qml:279
250#: qml/Components/KeyboardShortcutsOverlay.qml:279
251msgid "Ctrl + Super + Up"
251msgid "Ctrl + Super + Up"
252−msgstr ""
252+msgstr "Ctrl + Szuper + Fel"
253
253
254#: qml/Components/KeyboardShortcutsOverlay.qml:284
254#: qml/Components/KeyboardShortcutsOverlay.qml:284
255msgid "Maximizes the current window."
255msgid "Maximizes the current window."
256−msgstr ""
256+msgstr "Aktuális ablak maximalizálása."
257
257
258#: qml/Components/KeyboardShortcutsOverlay.qml:292
258#: qml/Components/KeyboardShortcutsOverlay.qml:292
259msgid "Ctrl + Super + Down"
259msgid "Ctrl + Super + Down"
260−msgstr ""
260+msgstr "Ctrl + Szuper + Le"
261
261
262#: qml/Components/KeyboardShortcutsOverlay.qml:297
262#: qml/Components/KeyboardShortcutsOverlay.qml:297
263msgid "Minimizes or restores the current window."
263msgid "Minimizes or restores the current window."
264−msgstr ""
264+msgstr "Az aktuális ablak visszaállítása vagy minimalizálása."
265
265
266#: qml/Components/KeyboardShortcutsOverlay.qml:305
266#: qml/Components/KeyboardShortcutsOverlay.qml:305
267msgid "Ctrl + Super + Left or Right"
267msgid "Ctrl + Super + Left or Right"
268−msgstr ""
268+msgstr "Ctrl + Szuper + Bal vagy Jobb"
269
269
270#: qml/Components/KeyboardShortcutsOverlay.qml:310
270#: qml/Components/KeyboardShortcutsOverlay.qml:310
271msgid "Semi-maximizes the current window."
271msgid "Semi-maximizes the current window."
272−msgstr ""
272+msgstr "Az aktuális ablak balra vagy jobbra igazítása."
273
273
274#: qml/Components/KeyboardShortcutsOverlay.qml:318
274#: qml/Components/KeyboardShortcutsOverlay.qml:318
275msgid "Alt + F4"
275msgid "Alt + F4"
276−msgstr ""
276+msgstr "Alt + F4"
277
277
278#: qml/Components/KeyboardShortcutsOverlay.qml:323
278#: qml/Components/KeyboardShortcutsOverlay.qml:323
279msgid "Closes the current window."
279msgid "Closes the current window."
280−msgstr ""
280+msgstr "Az aktuális ablak bezárása."
281
281
282#: qml/Components/Lockscreen.qml:231
282#: qml/Components/Lockscreen.qml:231
283msgid "Return to Call"
283msgid "Return to Call"
@@ -438,7 +438,7 @@ msgstr "Újra"
438
438
439#: qml/Greeter/LoginList.qml:260
439#: qml/Greeter/LoginList.qml:260
440msgid "Log In"
440msgid "Log In"
441−msgstr ""
441+msgstr "Bejelentkezés"
442
442
443#: qml/Greeter/NarrowView.qml:54
443#: qml/Greeter/NarrowView.qml:54
444msgid "Sorry, incorrect passphrase."
444msgid "Sorry, incorrect passphrase."
@@ -597,7 +597,7 @@ msgstr "Hosszan csúsztasson balról a Ma lencse eléréséhez"
597
597
598#: qml/Tutorial/TutorialLeft.qml:47
598#: qml/Tutorial/TutorialLeft.qml:47
599msgid "Short swipe from the left edge to open the launcher"
599msgid "Short swipe from the left edge to open the launcher"
600−msgstr ""
600+msgstr "Balról röviden csúsztatva nyithatja meg az indítót"
601
601
602#: qml/Tutorial/TutorialRight.qml:55
602#: qml/Tutorial/TutorialRight.qml:55
603msgid "Push your mouse against the right edge to view your open apps"
603msgid "Push your mouse against the right edge to view your open apps"
@@ -606,11 +606,12 @@ msgstr ""
606
606
607#: qml/Tutorial/TutorialRight.qml:56
607#: qml/Tutorial/TutorialRight.qml:56
608msgid "Swipe from the right edge to view your open apps"
608msgid "Swipe from the right edge to view your open apps"
609−msgstr ""
609+msgstr "Jobbról csúsztatva tekintheti meg a nyitott alkalmazásokat"
610
610
611#: qml/Tutorial/TutorialTop.qml:53
611#: qml/Tutorial/TutorialTop.qml:53
612msgid "Swipe from the top edge to access notifications and quick settings"
612msgid "Swipe from the top edge to access notifications and quick settings"
613msgstr ""
613msgstr ""
614+"Fentről csúsztatva érheti el az értesítéseket és a gyors-beállításokat"
614
615
615#: qml/Wizard/Page.qml:54
616#: qml/Wizard/Page.qml:54
616msgctxt "Button: Go back one page in the Wizard"
617msgctxt "Button: Go back one page in the Wizard"
po/pt.po+47−45
@@ -8,14 +8,14 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2016-06-17 01:22+0000\n"
10"POT-Creation-Date: 2016-06-17 01:22+0000\n"
11−"PO-Revision-Date: 2016-02-18 01:11+0000\n"
11+"PO-Revision-Date: 2016-06-20 11:37+0000\n"
12"Last-Translator: Ivo Xavier <ivoxavier.8@gmail.com>\n"
12"Last-Translator: Ivo Xavier <ivoxavier.8@gmail.com>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-06-19 05:55+0000\n"
18+"X-Launchpad-Export-Date: 2016-06-21 05:59+0000\n"
19"X-Generator: Launchpad (build 18097)\n"
19"X-Generator: Launchpad (build 18097)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -125,163 +125,163 @@ msgstr "Reiniciar"
125
125
126#: qml/Components/KeyboardShortcutsOverlay.qml:41
126#: qml/Components/KeyboardShortcutsOverlay.qml:41
127msgid "Keyboard Shortcuts"
127msgid "Keyboard Shortcuts"
128−msgstr ""
128+msgstr "Atalhos do teclado"
129
129
130#: qml/Components/KeyboardShortcutsOverlay.qml:55
130#: qml/Components/KeyboardShortcutsOverlay.qml:55
131msgid "Unity 8"
131msgid "Unity 8"
132−msgstr ""
132+msgstr "Unity 8"
133
133
134#: qml/Components/KeyboardShortcutsOverlay.qml:62
134#: qml/Components/KeyboardShortcutsOverlay.qml:62
135msgid "PrtScr"
135msgid "PrtScr"
136−msgstr ""
136+msgstr "PrtScr"
137
137
138#: qml/Components/KeyboardShortcutsOverlay.qml:67
138#: qml/Components/KeyboardShortcutsOverlay.qml:67
139msgid "Takes a screenshot."
139msgid "Takes a screenshot."
140−msgstr ""
140+msgstr "Tira uma captura de ecrã."
141
141
142#: qml/Components/KeyboardShortcutsOverlay.qml:75
142#: qml/Components/KeyboardShortcutsOverlay.qml:75
143msgid "Alt + PrtScr"
143msgid "Alt + PrtScr"
144−msgstr ""
144+msgstr "Alt + PrtScr"
145
145
146#: qml/Components/KeyboardShortcutsOverlay.qml:80
146#: qml/Components/KeyboardShortcutsOverlay.qml:80
147msgid "Takes a screenshot of a window."
147msgid "Takes a screenshot of a window."
148−msgstr ""
148+msgstr "Tira uma captura de uma janela."
149
149
150#: qml/Components/KeyboardShortcutsOverlay.qml:88
150#: qml/Components/KeyboardShortcutsOverlay.qml:88
151msgid "Super + Space"
151msgid "Super + Space"
152−msgstr ""
152+msgstr "Super + Space"
153
153
154#: qml/Components/KeyboardShortcutsOverlay.qml:93
154#: qml/Components/KeyboardShortcutsOverlay.qml:93
155msgid "Switches to next keyboard layout."
155msgid "Switches to next keyboard layout."
156−msgstr ""
156+msgstr "Troca para o próximo layout do teclado."
157
157
158#: qml/Components/KeyboardShortcutsOverlay.qml:101
158#: qml/Components/KeyboardShortcutsOverlay.qml:101
159msgid "Super + Shift + Space"
159msgid "Super + Shift + Space"
160−msgstr ""
160+msgstr "Super + Shift + Space"
161
161
162#: qml/Components/KeyboardShortcutsOverlay.qml:106
162#: qml/Components/KeyboardShortcutsOverlay.qml:106
163msgid "Switches to previous keyboard layout."
163msgid "Switches to previous keyboard layout."
164−msgstr ""
164+msgstr "Troca para o anterior layout do teclado."
165
165
166#: qml/Components/KeyboardShortcutsOverlay.qml:118
166#: qml/Components/KeyboardShortcutsOverlay.qml:118
167msgid "Launcher"
167msgid "Launcher"
168−msgstr ""
168+msgstr "Launcher"
169
169
170#: qml/Components/KeyboardShortcutsOverlay.qml:125
170#: qml/Components/KeyboardShortcutsOverlay.qml:125
171msgid "Super (Hold)"
171msgid "Super (Hold)"
172−msgstr ""
172+msgstr "Super (Pressionar)"
173
173
174#: qml/Components/KeyboardShortcutsOverlay.qml:130
174#: qml/Components/KeyboardShortcutsOverlay.qml:130
175msgid "Opens the launcher, displays shortcuts."
175msgid "Opens the launcher, displays shortcuts."
176−msgstr ""
176+msgstr "Abre o Launcher, mostra os atalhos."
177
177
178#: qml/Components/KeyboardShortcutsOverlay.qml:138
178#: qml/Components/KeyboardShortcutsOverlay.qml:138
179msgid "Alt + F1"
179msgid "Alt + F1"
180−msgstr ""
180+msgstr "Alt + F1"
181
181
182#: qml/Components/KeyboardShortcutsOverlay.qml:143
182#: qml/Components/KeyboardShortcutsOverlay.qml:143
183msgid "Opens launcher keyboard navigation mode."
183msgid "Opens launcher keyboard navigation mode."
184−msgstr ""
184+msgstr "Abre o teclado do modo de navegação do Launcher."
185
185
186#: qml/Components/KeyboardShortcutsOverlay.qml:151
186#: qml/Components/KeyboardShortcutsOverlay.qml:151
187msgid "Super + Tab"
187msgid "Super + Tab"
188−msgstr ""
188+msgstr "Super + Tab"
189
189
190#: qml/Components/KeyboardShortcutsOverlay.qml:156
190#: qml/Components/KeyboardShortcutsOverlay.qml:156
191msgid "Switches applications via the launcher."
191msgid "Switches applications via the launcher."
192−msgstr ""
192+msgstr "Trocas de aplicações através do Launcher."
193
193
194#: qml/Components/KeyboardShortcutsOverlay.qml:164
194#: qml/Components/KeyboardShortcutsOverlay.qml:164
195msgid "Super + 0 to 9"
195msgid "Super + 0 to 9"
196−msgstr ""
196+msgstr "Super + 0 a 9"
197
197
198#: qml/Components/KeyboardShortcutsOverlay.qml:169
198#: qml/Components/KeyboardShortcutsOverlay.qml:169
199msgid "Same as clicking on a launcher icon."
199msgid "Same as clicking on a launcher icon."
200−msgstr ""
200+msgstr "O mesmo que clicar no ícone do Launcher."
201
201
202#: qml/Components/KeyboardShortcutsOverlay.qml:181
202#: qml/Components/KeyboardShortcutsOverlay.qml:181
203msgid "Scopes"
203msgid "Scopes"
204−msgstr ""
204+msgstr "Scopes"
205
205
206#: qml/Components/KeyboardShortcutsOverlay.qml:188
206#: qml/Components/KeyboardShortcutsOverlay.qml:188
207msgid "Super (Tap)"
207msgid "Super (Tap)"
208−msgstr ""
208+msgstr "Super (Toque)"
209
209
210#: qml/Components/KeyboardShortcutsOverlay.qml:193
210#: qml/Components/KeyboardShortcutsOverlay.qml:193
211msgid "Opens the Scopes home."
211msgid "Opens the Scopes home."
212−msgstr ""
212+msgstr "Abre a home Scopes."
213
213
214#: qml/Components/KeyboardShortcutsOverlay.qml:209
214#: qml/Components/KeyboardShortcutsOverlay.qml:209
215msgid "Switching"
215msgid "Switching"
216−msgstr ""
216+msgstr "Trocar"
217
217
218#: qml/Components/KeyboardShortcutsOverlay.qml:216
218#: qml/Components/KeyboardShortcutsOverlay.qml:216
219msgid "Alt + Tab"
219msgid "Alt + Tab"
220−msgstr ""
220+msgstr "Alt + Tab"
221
221
222#: qml/Components/KeyboardShortcutsOverlay.qml:221
222#: qml/Components/KeyboardShortcutsOverlay.qml:221
223msgid "Switches between applications."
223msgid "Switches between applications."
224−msgstr ""
224+msgstr "Alternar entre apps."
225
225
226#: qml/Components/KeyboardShortcutsOverlay.qml:229
226#: qml/Components/KeyboardShortcutsOverlay.qml:229
227msgid "Super + W"
227msgid "Super + W"
228−msgstr ""
228+msgstr "Super + W"
229
229
230#: qml/Components/KeyboardShortcutsOverlay.qml:234
230#: qml/Components/KeyboardShortcutsOverlay.qml:234
231msgid "Opens the desktop spread."
231msgid "Opens the desktop spread."
232−msgstr ""
232+msgstr "Abre o espalhamento do desktop."
233
233
234#: qml/Components/KeyboardShortcutsOverlay.qml:242
234#: qml/Components/KeyboardShortcutsOverlay.qml:242
235msgid "Cursor Left or Right"
235msgid "Cursor Left or Right"
236−msgstr ""
236+msgstr "Cursor esquerdo ou direito"
237
237
238#: qml/Components/KeyboardShortcutsOverlay.qml:247
238#: qml/Components/KeyboardShortcutsOverlay.qml:247
239msgid "Moves the focus."
239msgid "Moves the focus."
240−msgstr ""
240+msgstr "Move o foco."
241
241
242#: qml/Components/KeyboardShortcutsOverlay.qml:259
242#: qml/Components/KeyboardShortcutsOverlay.qml:259
243msgid "Windows"
243msgid "Windows"
244−msgstr ""
244+msgstr "Janelas"
245
245
246#: qml/Components/KeyboardShortcutsOverlay.qml:266
246#: qml/Components/KeyboardShortcutsOverlay.qml:266
247msgid "Ctrl + Super + D"
247msgid "Ctrl + Super + D"
248−msgstr ""
248+msgstr "Ctrl + Super + D"
249
249
250#: qml/Components/KeyboardShortcutsOverlay.qml:271
250#: qml/Components/KeyboardShortcutsOverlay.qml:271
251msgid "Minimizes all windows."
251msgid "Minimizes all windows."
252−msgstr ""
252+msgstr "Minimiza todas as janelas."
253
253
254#: qml/Components/KeyboardShortcutsOverlay.qml:279
254#: qml/Components/KeyboardShortcutsOverlay.qml:279
255msgid "Ctrl + Super + Up"
255msgid "Ctrl + Super + Up"
256−msgstr ""
256+msgstr "Ctrl + Super + Up"
257
257
258#: qml/Components/KeyboardShortcutsOverlay.qml:284
258#: qml/Components/KeyboardShortcutsOverlay.qml:284
259msgid "Maximizes the current window."
259msgid "Maximizes the current window."
260−msgstr ""
260+msgstr "Maximiza a janela atual."
261
261
262#: qml/Components/KeyboardShortcutsOverlay.qml:292
262#: qml/Components/KeyboardShortcutsOverlay.qml:292
263msgid "Ctrl + Super + Down"
263msgid "Ctrl + Super + Down"
264−msgstr ""
264+msgstr "Ctrl + Super + Down"
265
265
266#: qml/Components/KeyboardShortcutsOverlay.qml:297
266#: qml/Components/KeyboardShortcutsOverlay.qml:297
267msgid "Minimizes or restores the current window."
267msgid "Minimizes or restores the current window."
268−msgstr ""
268+msgstr "Minimiza ou restaura a janela atual."
269
269
270#: qml/Components/KeyboardShortcutsOverlay.qml:305
270#: qml/Components/KeyboardShortcutsOverlay.qml:305
271msgid "Ctrl + Super + Left or Right"
271msgid "Ctrl + Super + Left or Right"
272−msgstr ""
272+msgstr "Ctrl + Super + Esquerdo ou Direito"
273
273
274#: qml/Components/KeyboardShortcutsOverlay.qml:310
274#: qml/Components/KeyboardShortcutsOverlay.qml:310
275msgid "Semi-maximizes the current window."
275msgid "Semi-maximizes the current window."
276−msgstr ""
276+msgstr "Semi-maximiza a janela atual."
277
277
278#: qml/Components/KeyboardShortcutsOverlay.qml:318
278#: qml/Components/KeyboardShortcutsOverlay.qml:318
279msgid "Alt + F4"
279msgid "Alt + F4"
280−msgstr ""
280+msgstr "Alt + F4"
281
281
282#: qml/Components/KeyboardShortcutsOverlay.qml:323
282#: qml/Components/KeyboardShortcutsOverlay.qml:323
283msgid "Closes the current window."
283msgid "Closes the current window."
284−msgstr ""
284+msgstr "Fecha a janela atual."
285
285
286#: qml/Components/Lockscreen.qml:231
286#: qml/Components/Lockscreen.qml:231
287msgid "Return to Call"
287msgid "Return to Call"
@@ -441,7 +441,7 @@ msgstr "Tentar novamente"
441
441
442#: qml/Greeter/LoginList.qml:260
442#: qml/Greeter/LoginList.qml:260
443msgid "Log In"
443msgid "Log In"
444−msgstr ""
444+msgstr "Iniciar a sessão"
445
445
446#: qml/Greeter/NarrowView.qml:54
446#: qml/Greeter/NarrowView.qml:54
447msgid "Sorry, incorrect passphrase."
447msgid "Sorry, incorrect passphrase."
@@ -599,7 +599,7 @@ msgstr "Deslize longo da margem esquerda para abrir a scope Hoje"
599
599
600#: qml/Tutorial/TutorialLeft.qml:47
600#: qml/Tutorial/TutorialLeft.qml:47
601msgid "Short swipe from the left edge to open the launcher"
601msgid "Short swipe from the left edge to open the launcher"
602−msgstr ""
602+msgstr "Deslize curto da margem esquerda para abrir o Launcher."
603
603
604#: qml/Tutorial/TutorialRight.qml:55
604#: qml/Tutorial/TutorialRight.qml:55
605msgid "Push your mouse against the right edge to view your open apps"
605msgid "Push your mouse against the right edge to view your open apps"
@@ -607,11 +607,13 @@ msgstr "Deslize o rato contra para a margem direita para ver as apps abertas"
607
607
608#: qml/Tutorial/TutorialRight.qml:56
608#: qml/Tutorial/TutorialRight.qml:56
609msgid "Swipe from the right edge to view your open apps"
609msgid "Swipe from the right edge to view your open apps"
610−msgstr ""
610+msgstr "Deslize da margem direita para ver as apps abertas."
611
611
612#: qml/Tutorial/TutorialTop.qml:53
612#: qml/Tutorial/TutorialTop.qml:53
613msgid "Swipe from the top edge to access notifications and quick settings"
613msgid "Swipe from the top edge to access notifications and quick settings"
614msgstr ""
614msgstr ""
615+"Deslize da margem superior para aceder às notificações e às definições "
616+"rápidas."
615
617
616#: qml/Wizard/Page.qml:54
618#: qml/Wizard/Page.qml:54
617msgctxt "Button: Go back one page in the Wizard"
619msgctxt "Button: Go back one page in the Wizard"
qml/Greeter/Greeter.qml+27−24
@@ -150,35 +150,40 @@ Showable {
150 return -1;
150 return -1;
151 }
151 }
152
152
153− function selectUser(uid, reset) {
153+ function selectUser(index, reset) {
154− if (uid < 0)
154+ if (index < 0 || index >= LightDMService.users.count)
155 return;
155 return;
156 d.waiting = true;
156 d.waiting = true;
157 if (reset) {
157 if (reset) {
158 loader.item.reset();
158 loader.item.reset();
159 }
159 }
160− currentIndex = uid;
160+ currentIndex = index;
161− var user = LightDMService.users.data(uid, LightDMService.userRoles.NameRole);
161+ var user = LightDMService.users.data(index, LightDMService.userRoles.NameRole);
162 AccountsService.user = user;
162 AccountsService.user = user;
163 LauncherModel.setUser(user);
163 LauncherModel.setUser(user);
164 LightDMService.greeter.authenticate(user); // always resets auth state
164 LightDMService.greeter.authenticate(user); // always resets auth state
165 }
165 }
166
166
167+ function hideView() {
168+ if (loader.item) {
169+ loader.item.enabled = false; // drop OSK and prevent interaction
170+ loader.item.hide();
171+ }
172+ }
173+
167 function login() {
174 function login() {
168− enabled = false;
175+ d.waiting = true;
169 if (LightDMService.greeter.startSessionSync()) {
176 if (LightDMService.greeter.startSessionSync()) {
170 sessionStarted();
177 sessionStarted();
171− if (loader.item) {
178+ hideView();
172− loader.item.notifyAuthenticationSucceeded();
173− }
174 } else if (loader.item) {
179 } else if (loader.item) {
175 loader.item.notifyAuthenticationFailed();
180 loader.item.notifyAuthenticationFailed();
176 }
181 }
177− enabled = true;
182+ d.waiting = false;
178 }
183 }
179
184
180 function startUnlock(toTheRight) {
185 function startUnlock(toTheRight) {
181− if (loader.item) {
186+ if (loader.item && !d.waiting) {
182 return loader.item.tryToUnlock(toTheRight);
187 return loader.item.tryToUnlock(toTheRight);
183 } else {
188 } else {
184 return false;
189 return false;
@@ -186,10 +191,8 @@ Showable {
186 }
191 }
187
192
188 function checkForcedUnlock(hideNow) {
193 function checkForcedUnlock(hideNow) {
189− if (forcedUnlock && shown && loader.item) {
194+ if (forcedUnlock && shown) {
190− // pretend we were just authenticated
195+ hideView();
191− loader.item.notifyAuthenticationSucceeded();
192− loader.item.hide();
193 if (hideNow) {
196 if (hideNow) {
194 root.hideNow(); // skip hide animation
197 root.hideNow(); // skip hide animation
195 }
198 }
@@ -299,7 +302,7 @@ Showable {
299
302
300 onLoaded: {
303 onLoaded: {
301 root.lockedApp = "";
304 root.lockedApp = "";
302− root.forceActiveFocus();
305+ item.forceActiveFocus();
303 d.selectUser(d.currentIndex, true);
306 d.selectUser(d.currentIndex, true);
304 LightDMService.infographic.readyForDataChange();
307 LightDMService.infographic.readyForDataChange();
305 }
308 }
@@ -309,13 +312,11 @@ Showable {
309 onSelected: {
312 onSelected: {
310 d.selectUser(index, true);
313 d.selectUser(index, true);
311 }
314 }
312− onPromptlessLogin: d.login();
313 onResponded: {
315 onResponded: {
314 if (root.locked) {
316 if (root.locked) {
315 LightDMService.greeter.respond(response);
317 LightDMService.greeter.respond(response);
316 } else {
318 } else {
317 d.login();
319 d.login();
318− loader.item.hide();
319 }
320 }
320 }
321 }
321 onTease: root.tease()
322 onTease: root.tease()
@@ -363,6 +364,12 @@ Showable {
363 value: root.locked
364 value: root.locked
364 }
365 }
365
366
367+ Binding {
368+ target: loader.item
369+ property: "waiting"
370+ value: d.waiting
371+ }
372+
366 Binding {
373 Binding {
367 target: loader.item
374 target: loader.item
368 property: "alphanumeric"
375 property: "alphanumeric"
@@ -393,10 +400,7 @@ Showable {
393
400
394 onShowGreeter: root.forceShow()
401 onShowGreeter: root.forceShow()
395
402
396− onHideGreeter: {
403+ onHideGreeter: d.login()
397− d.login();
398− loader.item.hide();
399− }
400
404
401 onShowMessage: {
405 onShowMessage: {
402 // inefficient, but we only rarely deal with messages
406 // inefficient, but we only rarely deal with messages
@@ -414,11 +418,11 @@ Showable {
414 }
418 }
415
419
416 onShowPrompt: {
420 onShowPrompt: {
417− d.waiting = false;
418−
419 if (loader.item) {
421 if (loader.item) {
420 loader.item.showPrompt(text, isSecret, isDefaultPrompt);
422 loader.item.showPrompt(text, isSecret, isDefaultPrompt);
421 }
423 }
424+
425+ d.waiting = false;
422 }
426 }
423
427
424 onAuthenticationComplete: {
428 onAuthenticationComplete: {
@@ -428,7 +432,6 @@ Showable {
428 AccountsService.failedLogins = 0;
432 AccountsService.failedLogins = 0;
429 if (!LightDMService.greeter.promptless) {
433 if (!LightDMService.greeter.promptless) {
430 d.login();
434 d.login();
431− loader.item.hide();
432 }
435 }
433 } else {
436 } else {
434 if (!LightDMService.greeter.promptless) {
437 if (!LightDMService.greeter.promptless) {
qml/Greeter/GreeterPrompt.qml+60−11
@@ -16,6 +16,7 @@
16
16
17import QtQuick 2.4
17import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19+import "../Components"
19
20
20FocusScope {
21FocusScope {
21 id: root
22 id: root
@@ -33,6 +34,7 @@ FocusScope {
33
34
34 function reset() {
35 function reset() {
35 passwordInput.text = "";
36 passwordInput.text = "";
37+ fakeLabel.text = "";
36 d.enabled = true;
38 d.enabled = true;
37 }
39 }
38
40
@@ -62,10 +64,14 @@ FocusScope {
62 objectName: "promptButton"
64 objectName: "promptButton"
63 anchors.fill: parent
65 anchors.fill: parent
64 visible: !root.isPrompt
66 visible: !root.isPrompt
65− enabled: d.enabled
66 focus: visible
67 focus: visible
67
68
69+ onClicked: {
70+ if (d.enabled) {
71+ d.enabled = false;
68− onClicked: root.clicked()
72+ root.clicked();
73+ }
74+ }
69
75
70 Label {
76 Label {
71 anchors.centerIn: parent
77 anchors.centerIn: parent
@@ -79,10 +85,22 @@ FocusScope {
79 objectName: "promptField"
85 objectName: "promptField"
80 anchors.fill: parent
86 anchors.fill: parent
81 visible: root.isPrompt
87 visible: root.isPrompt
82− enabled: d.enabled
88+ opacity: fakeLabel.visible ? 0 : 1
83− focus: visible
89+
90+ // Oddly, a simple "focus: visible" does not stick -- the binding
91+ // gets lost when switching between buttons and prompts. But this
92+ // explicit binding does work.
93+ Binding on focus {
94+ value: passwordInput.visible
95+ }
96+
97+ validator: RegExpValidator {
98+ regExp: root.isAlphanumeric ? /^.*$/ : /^\d{4}$/
99+ }
84
100
101+ inputMethodHints: Qt.ImhSensitiveData | Qt.ImhNoPredictiveText |
102+ Qt.ImhMultiLine | // so OSK doesn't close on Enter
85− inputMethodHints: root.isAlphanumeric ? Qt.ImhNone : Qt.ImhDigitsOnly
103+ (root.isAlphanumeric ? Qt.ImhNone : Qt.ImhDigitsOnly)
86 echoMode: root.isSecret ? TextInput.Password : TextInput.Normal
104 echoMode: root.isSecret ? TextInput.Password : TextInput.Normal
87 hasClearButton: false
105 hasClearButton: false
88
106
@@ -107,17 +125,32 @@ FocusScope {
107 width: units.gu(3)
125 width: units.gu(3)
108 color: d.textColor
126 color: d.textColor
109 visible: root.isSecret && false // TODO: detect when caps lock is on
127 visible: root.isSecret && false // TODO: detect when caps lock is on
128+ readonly property real visibleWidth: visible ? width + passwordInput.frameSpacing : 0
110 }
129 }
111 ]
130 ]
112
131
132+ onTextChanged: {
133+ if (!isAlphanumeric && text.length >= 4) {
134+ // hard limit of 4 for passcodes right now
135+ respond();
136+ }
137+ }
138+
113 onAccepted: {
139 onAccepted: {
114− if (!enabled)
140+ if (d.enabled)
115− return;
141+ respond();
142+ }
143+
144+ function respond() {
116 d.enabled = false;
145 d.enabled = false;
146+ fakeLabel.text = displayText;
117 root.responded(text);
147 root.responded(text);
118 }
148 }
119
149
120− Keys.onEscapePressed: root.canceled()
150+ Keys.onEscapePressed: {
151+ root.canceled();
152+ event.accepted = true;
153+ }
121
154
122 // We use our own custom placeholder label instead of the standard
155 // We use our own custom placeholder label instead of the standard
123 // TextField one because the standard one hardcodes baseText as the
156 // TextField one because the standard one hardcodes baseText as the
@@ -129,9 +162,7 @@ FocusScope {
129 right: parent.right
162 right: parent.right
130 verticalCenter: parent.verticalCenter
163 verticalCenter: parent.verticalCenter
131 leftMargin: units.gu(1.5)
164 leftMargin: units.gu(1.5)
132− rightMargin: anchors.leftMargin +
165+ rightMargin: anchors.leftMargin + capsIcon.visibleWidth
133− (capsIcon.visible ? capsIcon.width + passwordInput.frameSpacing
134− : 0)
135 }
166 }
136 text: root.text
167 text: root.text
137 visible: passwordInput.text == "" && !passwordInput.inputMethodComposing
168 visible: passwordInput.text == "" && !passwordInput.inputMethodComposing
@@ -139,4 +170,22 @@ FocusScope {
139 elide: Text.ElideRight
170 elide: Text.ElideRight
140 }
171 }
141 }
172 }
173+
174+ // Have a fake label that covers the text field after the user presses
175+ // enter. What we *really* want is a disabled mode that doesn't lose
176+ // focus. Because our goal here is simply to keep the OSK up while
177+ // we wait for PAM to get back to us, and while waiting, we don't want
178+ // the user to be able to edit the field (simply because it would look
179+ // weird if we allowed that). But until we have such a disabled mode,
180+ // we'll fake it by covering the real text field with a label.
181+ FadingLabel {
182+ id: fakeLabel
183+ anchors.verticalCenter: parent.verticalCenter
184+ anchors.left: parent.left
185+ anchors.right: parent.right
186+ anchors.leftMargin: passwordInput.frameSpacing * 2
187+ anchors.rightMargin: passwordInput.frameSpacing * 2 + capsIcon.visibleWidth
188+ color: d.drawColor
189+ visible: root.isPrompt && !d.enabled
190+ }
142}
191}
qml/Greeter/LoginList.qml+27−16
@@ -21,11 +21,13 @@ import "../Components"
21
21
22StyledItem {
22StyledItem {
23 id: root
23 id: root
24+ focus: true
24
25
25 property alias model: userList.model
26 property alias model: userList.model
26 property bool alphanumeric: true
27 property bool alphanumeric: true
27 property int currentIndex
28 property int currentIndex
28 property bool locked
29 property bool locked
30+ property bool waiting
29
31
30 readonly property int numAboveBelow: 4
32 readonly property int numAboveBelow: 4
31 readonly property int cellHeight: units.gu(5)
33 readonly property int cellHeight: units.gu(5)
@@ -36,7 +38,6 @@ StyledItem {
36
38
37 signal selected(int index)
39 signal selected(int index)
38 signal responded(string response)
40 signal responded(string response)
39− signal promptlessLogin()
40
41
41 function tryToUnlock() {
42 function tryToUnlock() {
42 if (wasPrompted) {
43 if (wasPrompted) {
@@ -45,7 +46,6 @@ StyledItem {
45 if (root.locked) {
46 if (root.locked) {
46 root.selected(currentIndex);
47 root.selected(currentIndex);
47 } else {
48 } else {
48− promptlessLogin();
49 root.responded("");
49 root.responded("");
50 }
50 }
51 }
51 }
@@ -60,20 +60,18 @@ StyledItem {
60 }
60 }
61
61
62 function showPrompt(text, isSecret, isDefaultPrompt) {
62 function showPrompt(text, isSecret, isDefaultPrompt) {
63+ passwordInput.text = isDefaultPrompt ? alphanumeric ? i18n.tr("Passphrase")
64+ : i18n.tr("Passcode")
63− d.promptText = text;
65+ : text;
64− passwordInput.reset();
66+ passwordInput.isPrompt = true;
65 passwordInput.isSecret = isSecret;
67 passwordInput.isSecret = isSecret;
66− if (wasPrompted) // stay in text field if second prompt
68+ passwordInput.reset();
67− passwordInput.focus = true;
68 wasPrompted = true;
69 wasPrompted = true;
69 }
70 }
70
71
71 function showError() {
72 function showError() {
72 wrongPasswordAnimation.start();
73 wrongPasswordAnimation.start();
73 root.resetAuthentication();
74 root.resetAuthentication();
74− if (wasPrompted) {
75− passwordInput.focus = true;
76− }
77 }
75 }
78
76
79 function reset() {
77 function reset() {
@@ -83,15 +81,33 @@ StyledItem {
83 QtObject {
81 QtObject {
84 id: d
82 id: d
85
83
86− property string promptText
84+ function checkIfPromptless() {
85+ if (!waiting && !wasPrompted) {
86+ passwordInput.isPrompt = false;
87+ passwordInput.text = root.locked ? i18n.tr("Retry")
88+ : i18n.tr("Log In")
89+ }
90+ }
87 }
91 }
88
92
93+ onWaitingChanged: d.checkIfPromptless()
94+ onLockedChanged: d.checkIfPromptless()
95+
89 theme: ThemeSettings {
96 theme: ThemeSettings {
90 name: "Ubuntu.Components.Themes.Ambiance"
97 name: "Ubuntu.Components.Themes.Ambiance"
91 }
98 }
92
99
100+ Keys.onUpPressed: {
101+ selected(currentIndex - 1);
102+ event.accepted = true;
103+ }
104+ Keys.onDownPressed: {
105+ selected(currentIndex + 1);
106+ event.accepted = true;
107+ }
93 Keys.onEscapePressed: {
108 Keys.onEscapePressed: {
94 selected(currentIndex);
109 selected(currentIndex);
110+ event.accepted = true;
95 }
111 }
96
112
97 onCurrentIndexChanged: {
113 onCurrentIndexChanged: {
@@ -137,6 +153,7 @@ StyledItem {
137 highlightRangeMode: ListView.StrictlyEnforceRange
153 highlightRangeMode: ListView.StrictlyEnforceRange
138 highlightMoveDuration: root.moveDuration
154 highlightMoveDuration: root.moveDuration
139 flickDeceleration: 10000
155 flickDeceleration: 10000
156+ interactive: count > 1
140
157
141 readonly property bool movingInternally: moveTimer.running || userList.moving
158 readonly property bool movingInternally: moveTimer.running || userList.moving
142 onMovingInternallyChanged: {
159 onMovingInternallyChanged: {
@@ -254,13 +271,8 @@ StyledItem {
254 width: highlightItem.width - anchors.margins * 2
271 width: highlightItem.width - anchors.margins * 2
255 opacity: userList.movingInternally ? 0 : 1
272 opacity: userList.movingInternally ? 0 : 1
256
273
257− isPrompt: root.wasPrompted
258 isAlphanumeric: root.alphanumeric
274 isAlphanumeric: root.alphanumeric
259
275
260− text: root.wasPrompted ? d.promptText
261− : (root.locked ? i18n.tr("Retry")
262− : i18n.tr("Log In"))
263−
264 onClicked: root.tryToUnlock()
276 onClicked: root.tryToUnlock()
265 onResponded: root.responded(text)
277 onResponded: root.responded(text)
266 onCanceled: root.selected(currentIndex)
278 onCanceled: root.selected(currentIndex)
@@ -280,7 +292,6 @@ StyledItem {
280 return;
292 return;
281 }
293 }
282 infoLabel.text = "";
294 infoLabel.text = "";
283− d.promptText = "";
284 passwordInput.reset();
295 passwordInput.reset();
285 root.wasPrompted = false;
296 root.wasPrompted = false;
286 }
297 }
qml/Greeter/NarrowView.qml+2−4
@@ -31,6 +31,7 @@ FocusScope {
31 property bool alphanumeric
31 property bool alphanumeric
32 property var userModel // unused
32 property var userModel // unused
33 property alias infographicModel: coverPage.infographicModel
33 property alias infographicModel: coverPage.infographicModel
34+ property bool waiting
34 readonly property bool fullyShown: coverPage.showProgress === 1 || lockscreen.shown
35 readonly property bool fullyShown: coverPage.showProgress === 1 || lockscreen.shown
35 readonly property bool required: coverPage.required || lockscreen.required
36 readonly property bool required: coverPage.required || lockscreen.required
36 readonly property bool animating: coverPage.showAnimation.running || coverPage.hideAnimation.running
37 readonly property bool animating: coverPage.showAnimation.running || coverPage.hideAnimation.running
@@ -65,10 +66,6 @@ FocusScope {
65 coverPage.hide();
66 coverPage.hide();
66 }
67 }
67
68
68− function notifyAuthenticationSucceeded() {
69− lockscreen.hide();
70− }
71−
72 function notifyAuthenticationFailed() {
69 function notifyAuthenticationFailed() {
73 lockscreen.clear(true);
70 lockscreen.clear(true);
74 }
71 }
@@ -156,6 +153,7 @@ FocusScope {
156 height: parent.height
153 height: parent.height
157 width: parent.width
154 width: parent.width
158 background: root.background
155 background: root.background
156+ draggable: !root.waiting
159 onTease: root.tease()
157 onTease: root.tease()
160 onClicked: hide()
158 onClicked: hide()
161
159
qml/Greeter/WideView.qml+4−7
@@ -19,6 +19,7 @@ import Ubuntu.Components 1.3
19
19
20FocusScope {
20FocusScope {
21 id: root
21 id: root
22+ focus: true
22
23
23 property alias dragHandleLeftMargin: coverPage.dragHandleLeftMargin
24 property alias dragHandleLeftMargin: coverPage.dragHandleLeftMargin
24 property alias launcherOffset: coverPage.launcherOffset
25 property alias launcherOffset: coverPage.launcherOffset
@@ -30,6 +31,7 @@ FocusScope {
30 property alias alphanumeric: loginList.alphanumeric
31 property alias alphanumeric: loginList.alphanumeric
31 property alias userModel: loginList.model
32 property alias userModel: loginList.model
32 property alias infographicModel: coverPage.infographicModel
33 property alias infographicModel: coverPage.infographicModel
34+ property bool waiting
33 readonly property bool fullyShown: coverPage.showProgress === 1
35 readonly property bool fullyShown: coverPage.showProgress === 1
34 readonly property bool required: coverPage.required
36 readonly property bool required: coverPage.required
35 readonly property bool animating: coverPage.showAnimation.running || coverPage.hideAnimation.running
37 readonly property bool animating: coverPage.showAnimation.running || coverPage.hideAnimation.running
@@ -37,7 +39,6 @@ FocusScope {
37 // so that it can be replaced in tests with a mock object
39 // so that it can be replaced in tests with a mock object
38 property var inputMethod: Qt.inputMethod
40 property var inputMethod: Qt.inputMethod
39
41
40− signal promptlessLogin()
41 signal selected(int index)
42 signal selected(int index)
42 signal responded(string response)
43 signal responded(string response)
43 signal tease()
44 signal tease()
@@ -59,10 +60,6 @@ FocusScope {
59 coverPage.hide();
60 coverPage.hide();
60 }
61 }
61
62
62− function notifyAuthenticationSucceeded() {
63− // Nothing needed
64− }
65−
66 function notifyAuthenticationFailed() {
63 function notifyAuthenticationFailed() {
67 loginList.showError();
64 loginList.showError();
68 }
65 }
@@ -98,7 +95,7 @@ FocusScope {
98 objectName: "coverPage"
95 objectName: "coverPage"
99 height: parent.height
96 height: parent.height
100 width: parent.width
97 width: parent.width
101− draggable: !root.locked
98+ draggable: !root.locked && !root.waiting
102
99
103 infographics {
100 infographics {
104 height: 0.75 * parent.height
101 height: 0.75 * parent.height
@@ -128,8 +125,8 @@ FocusScope {
128 Behavior on height { UbuntuNumberAnimation {} }
125 Behavior on height { UbuntuNumberAnimation {} }
129
126
130 locked: root.locked
127 locked: root.locked
128+ waiting: root.waiting
131
129
132− onPromptlessLogin: root.promptlessLogin()
133 onSelected: root.selected(index)
130 onSelected: root.selected(index)
134 onResponded: root.responded(response)
131 onResponded: root.responded(response)
135 }
132 }
qml/Shell.qml+5−3
@@ -137,9 +137,9 @@ StyledItem {
137 // For autopilot consumption
137 // For autopilot consumption
138 readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
138 readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
139
139
140− // Disable everything while greeter is waiting, so that the user can't swipe
140+ // Note when greeter is waiting on PAM, so that we can disable edges until
141− // the greeter or launcher until we know whether the session is locked.
141+ // we know which user data to show and whether the session is locked.
142− enabled: greeter && !greeter.waiting
142+ readonly property bool waitingOnGreeter: greeter && greeter.waiting
143
143
144 property real edgeSize: units.gu(settings.edgeDragWidth)
144 property real edgeSize: units.gu(settings.edgeDragWidth)
145
145
@@ -525,6 +525,7 @@ StyledItem {
525 available: tutorial.panelEnabled
525 available: tutorial.panelEnabled
526 && ((!greeter || !greeter.locked) || AccountsService.enableIndicatorsWhileLocked)
526 && ((!greeter || !greeter.locked) || AccountsService.enableIndicatorsWhileLocked)
527 && (!greeter || !greeter.hasLockedApp)
527 && (!greeter || !greeter.hasLockedApp)
528+ && !shell.waitingOnGreeter
528 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
529 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
529
530
530 minimizedPanelHeight: units.gu(3)
531 minimizedPanelHeight: units.gu(3)
@@ -575,6 +576,7 @@ StyledItem {
575 available: tutorial.launcherEnabled
576 available: tutorial.launcherEnabled
576 && (!greeter.locked || AccountsService.enableLauncherWhileLocked)
577 && (!greeter.locked || AccountsService.enableLauncherWhileLocked)
577 && !greeter.hasLockedApp
578 && !greeter.hasLockedApp
579+ && !shell.waitingOnGreeter
578 inverted: shell.usageScenario !== "desktop"
580 inverted: shell.usageScenario !== "desktop"
579 superPressed: physicalKeysMapper.superPressed
581 superPressed: physicalKeysMapper.superPressed
580 superTabPressed: physicalKeysMapper.superTabPressed
582 superTabPressed: physicalKeysMapper.superTabPressed
tests/qmltests/Greeter/TestView.qml−6
@@ -42,13 +42,11 @@ Item {
42 signal responded(string response)
42 signal responded(string response)
43 signal tease()
43 signal tease()
44 signal emergencyCall()
44 signal emergencyCall()
45− signal promptlessLogin()
46
45
47 signal _showMessageCalled(string html)
46 signal _showMessageCalled(string html)
48 signal _showPromptCalled(string text, bool isSecret, bool isDefaultPrompt)
47 signal _showPromptCalled(string text, bool isSecret, bool isDefaultPrompt)
49 signal _showLastChanceCalled()
48 signal _showLastChanceCalled()
50 signal _hideCalled()
49 signal _hideCalled()
51− signal _notifyAuthenticationSucceededCalled()
52 signal _notifyAuthenticationFailedCalled()
50 signal _notifyAuthenticationFailedCalled()
53 signal _resetCalled()
51 signal _resetCalled()
54 signal _tryToUnlockCalled(bool toTheRight)
52 signal _tryToUnlockCalled(bool toTheRight)
@@ -71,10 +69,6 @@ Item {
71 _fullyShown = false;
69 _fullyShown = false;
72 }
70 }
73
71
74− function notifyAuthenticationSucceeded() {
75− _notifyAuthenticationSucceededCalled();
76− }
77−
78 function notifyAuthenticationFailed() {
72 function notifyAuthenticationFailed() {
79 _notifyAuthenticationFailedCalled();
73 _notifyAuthenticationFailedCalled();
80 }
74 }
tests/qmltests/Greeter/tst_Greeter.qml−8
@@ -113,12 +113,6 @@ Item {
113 signalName: "_hideCalled"
113 signalName: "_hideCalled"
114 }
114 }
115
115
116− SignalSpy {
117− id: viewAuthenticationSucceededSpy
118− target: testCase.view
119− signalName: "_notifyAuthenticationSucceededCalled"
120− }
121−
122 SignalSpy {
116 SignalSpy {
123 id: viewAuthenticationFailedSpy
117 id: viewAuthenticationFailedSpy
124 target: testCase.view
118 target: testCase.view
@@ -149,7 +143,6 @@ Item {
149 viewShowPromptSpy.clear();
143 viewShowPromptSpy.clear();
150 viewShowLastChanceSpy.clear();
144 viewShowLastChanceSpy.clear();
151 viewHideSpy.clear();
145 viewHideSpy.clear();
152− viewAuthenticationSucceededSpy.clear();
153 viewAuthenticationFailedSpy.clear();
146 viewAuthenticationFailedSpy.clear();
154 viewResetSpy.clear();
147 viewResetSpy.clear();
155 viewTryToUnlockSpy.clear();
148 viewTryToUnlockSpy.clear();
@@ -196,7 +189,6 @@ Item {
196
189
197 function verifyLoggedIn() {
190 function verifyLoggedIn() {
198 tryCompare(sessionStartedSpy, "count", 1);
191 tryCompare(sessionStartedSpy, "count", 1);
199− verify(viewAuthenticationSucceededSpy.count > 0);
200 compare(LightDM.Greeter.authenticated, true);
192 compare(LightDM.Greeter.authenticated, true);
201 compare(greeter.shown, false);
193 compare(greeter.shown, false);
202 }
194 }
tests/qmltests/Greeter/tst_NarrowView.qml+2−14
@@ -125,20 +125,8 @@ Item {
125 }
125 }
126 Row {
126 Row {
127 Button {
127 Button {
128− text: "Authenticated"
128+ text: "Auth Failed"
129− onClicked: {
130− if (successCheckBox.checked) {
131− loader.item.notifyAuthenticationSucceeded();
132− } else {
133− loader.item.notifyAuthenticationFailed();
129+ onClicked: loader.item.notifyAuthenticationFailed()
134− }
135− }
136− }
137− CheckBox {
138− id: successCheckBox
139− }
140− Label {
141− text: "success"
142 }
130 }
143 }
131 }
144 Row {
132 Row {
tests/qmltests/Greeter/tst_WideView.qml+92−26
@@ -63,7 +63,8 @@ StyledItem {
63 }
63 }
64
64
65 onSelected: {
65 onSelected: {
66+ if (index >= 0)
66− currentIndexField.text = index;
67+ currentIndexField.text = index;
67 }
68 }
68
69
69 QtObject {
70 QtObject {
@@ -167,20 +168,8 @@ StyledItem {
167 }
168 }
168 Row {
169 Row {
169 Button {
170 Button {
170− text: "Authenticated"
171+ text: "Auth Failed"
171− onClicked: {
172− if (successCheckBox.checked) {
173− loader.item.notifyAuthenticationSucceeded();
174− } else {
175− loader.item.notifyAuthenticationFailed();
172+ onClicked: loader.item.notifyAuthenticationFailed()
176− }
177− }
178− }
179− CheckBox {
180− id: successCheckBox
181− }
182− Label {
183− text: "success"
184 }
173 }
185 }
174 }
186 Row {
175 Row {
@@ -392,7 +381,7 @@ StyledItem {
392
381
393 function test_respondedWithPassword() {
382 function test_respondedWithPassword() {
394 view.locked = true;
383 view.locked = true;
395− view.showPrompt("Prompt", true, true);
384+ view.showPrompt("Prompt", true, false);
396 var passwordInput = findChild(view, "passwordInput");
385 var passwordInput = findChild(view, "passwordInput");
397 compare(passwordInput.text, "Prompt");
386 compare(passwordInput.text, "Prompt");
398 verify(passwordInput.isSecret);
387 verify(passwordInput.isSecret);
@@ -454,13 +443,13 @@ StyledItem {
454 view.showPrompt("Prompt", true, true);
443 view.showPrompt("Prompt", true, true);
455 var promptField = findChild(view, "promptField");
444 var promptField = findChild(view, "promptField");
456 tap(promptField);
445 tap(promptField);
457− compare(promptField.focus, true);
446+ verify(promptField.activeFocus);
458− compare(promptField.enabled, true);
447+ compare(promptField.opacity, 1);
459
448
460 typeString("password");
449 typeString("password");
461 keyClick(Qt.Key_Enter);
450 keyClick(Qt.Key_Enter);
462− compare(promptField.focus, true);
451+ verify(promptField.activeFocus);
463− compare(promptField.enabled, false);
452+ compare(promptField.opacity, 0); // hidden by fakeLabel
464
453
465 compare(selectedSpy.count, 0);
454 compare(selectedSpy.count, 0);
466 keyClick(Qt.Key_Escape);
455 keyClick(Qt.Key_Escape);
@@ -468,8 +457,8 @@ StyledItem {
468 compare(selectedSpy.signalArguments[0][0], 1);
457 compare(selectedSpy.signalArguments[0][0], 1);
469
458
470 view.reset();
459 view.reset();
471− compare(promptField.focus, false);
460+ verify(promptField.activeFocus);
472− compare(promptField.enabled, true);
461+ compare(promptField.opacity, 1);
473 }
462 }
474
463
475 function test_unicode() {
464 function test_unicode() {
@@ -489,6 +478,7 @@ StyledItem {
489 compare(selectedSpy.signalArguments[0][0], 0);
478 compare(selectedSpy.signalArguments[0][0], 0);
490 selectedSpy.clear();
479 selectedSpy.clear();
491
480
481+ view.reset();
492 view.locked = false;
482 view.locked = false;
493 compare(passwordInput.text, "Log In");
483 compare(passwordInput.text, "Log In");
494 tap(passwordInput);
484 tap(passwordInput);
@@ -518,13 +508,89 @@ StyledItem {
518 tryCompare(loginList, "height", view.height);
508 tryCompare(loginList, "height", view.height);
519 }
509 }
520
510
521− function test_alphanumeric() {
511+ function test_passphrase() {
522− var passwordInput = findChild(view, "passwordInput");
512+ var promptField = findChild(view, "promptField");
513+ view.showPrompt("", true, true);
523
514
524 verify(view.alphanumeric);
515 verify(view.alphanumeric);
525− verify(passwordInput.isAlphanumeric);
516+ compare(promptField.inputMethodHints & Qt.ImhDigitsOnly, 0);
517+
518+ keyClick(Qt.Key_D);
519+ compare(promptField.text, "d");
520+ }
521+
522+ function test_passcode() {
523+ var promptField = findChild(view, "promptField");
524+ view.showPrompt("", true, true);
525+
526 view.alphanumeric = false;
526 view.alphanumeric = false;
527− verify(!passwordInput.isAlphanumeric);
527+ compare(promptField.inputMethodHints & Qt.ImhDigitsOnly, Qt.ImhDigitsOnly);
528+
529+ keyClick(Qt.Key_D);
530+ compare(promptField.text, "");
531+
532+ keyClick(Qt.Key_0);
533+ keyClick(Qt.Key_0);
534+ keyClick(Qt.Key_0);
535+ keyClick(Qt.Key_0);
536+ compare(promptField.text, "0000");
537+
538+ compare(respondedSpy.count, 1);
539+ compare(respondedSpy.signalArguments[0][0], "0000");
540+
541+ compare(promptField.opacity, 0);
542+ }
543+
544+ function test_loginListMovement_data() {
545+ return [
546+ {tag: "up", key: Qt.Key_Up, result: -1},
547+ {tag: "down", key: Qt.Key_Down, result: 1},
548+ ]
549+ }
550+
551+ function test_loginListMovement(data) {
552+ keyClick(data.key);
553+ compare(selectedSpy.count, 1);
554+ compare(selectedSpy.signalArguments[0][0], data.result);
555+ }
556+
557+ function test_focusStaysActive() {
558+ var promptField = findChild(view, "promptField");
559+ var promptButton = findChild(view, "promptButton");
560+
561+ verify(promptButton.activeFocus);
562+ keyClick(Qt.Key_Enter);
563+ compare(selectedSpy.count, 0);
564+ compare(respondedSpy.count, 1);
565+ compare(respondedSpy.signalArguments[0][0], "");
566+ verify(promptButton.activeFocus);
567+ keyClick(Qt.Key_Enter);
568+ compare(respondedSpy.count, 1);
569+
570+ view.showPrompt("", true, true);
571+ verify(promptField.activeFocus);
572+ keyClick(Qt.Key_D);
573+ keyClick(Qt.Key_Enter);
574+ compare(selectedSpy.count, 0);
575+ compare(respondedSpy.count, 2);
576+ compare(respondedSpy.signalArguments[1][0], "d");
577+ verify(promptField.activeFocus);
578+ keyClick(Qt.Key_Enter);
579+ compare(respondedSpy.count, 2);
580+
581+ view.reset();
582+ view.locked = true;
583+ verify(promptButton.activeFocus);
584+ keyClick(Qt.Key_Enter);
585+ compare(respondedSpy.count, 2);
586+ compare(selectedSpy.count, 1);
587+ compare(selectedSpy.signalArguments[0][0], 0);
588+ verify(promptButton.activeFocus);
589+ keyClick(Qt.Key_Enter);
590+ compare(selectedSpy.count, 1);
591+
592+ view.showPrompt("", true, true);
593+ verify(promptField.activeFocus);
528 }
594 }
529 }
595 }
530}
596}
tests/qmltests/Tutorial/tst_Tutorial.qml+1−1
@@ -296,7 +296,7 @@ Rectangle {
296 }
296 }
297
297
298 function prepareShell() {
298 function prepareShell() {
299− tryCompare(shell, "enabled", true); // enabled by greeter when ready
299+ tryCompare(shell, "waitingOnGreeter", false); // reset by greeter when ready
300
300
301 WindowStateStorage.clear();
301 WindowStateStorage.clear();
302 SurfaceManager.inputMethodSurface.setState(Mir.MinimizedState);
302 SurfaceManager.inputMethodSurface.setState(Mir.MinimizedState);
tests/qmltests/tst_OrientedShell.qml+2−2
@@ -493,7 +493,7 @@ Rectangle {
493 }
493 }
494
494
495 function cleanup() {
495 function cleanup() {
496− tryCompare(shell, "enabled", true); // make sure greeter didn't leave us in disabled state
496+ tryCompare(shell, "waitingOnGreeter", false); // make sure greeter didn't leave us in disabled state
497 shell = null;
497 shell = null;
498 topLevelSurfaceList = null;
498 topLevelSurfaceList = null;
499
499
@@ -1574,7 +1574,7 @@ Rectangle {
1574 var stageLoader = findChild(shell, "applicationsDisplayLoader");
1574 var stageLoader = findChild(shell, "applicationsDisplayLoader");
1575 verify(stageLoader);
1575 verify(stageLoader);
1576
1576
1577− tryCompare(shell, "enabled", true); // enabled by greeter when ready
1577+ tryCompare(shell, "waitingOnGreeter", false); // reset by greeter when ready
1578
1578
1579 waitUntilShellIsInOrientation(root.physicalOrientation0);
1579 waitUntilShellIsInOrientation(root.physicalOrientation0);
1580
1580
tests/qmltests/tst_Shell.qml+3−3
@@ -429,7 +429,7 @@ Rectangle {
429 function cleanup() {
429 function cleanup() {
430 waitForRendering(shell);
430 waitForRendering(shell);
431 mouseEmulation.checked = true;
431 mouseEmulation.checked = true;
432− tryCompare(shell, "enabled", true); // make sure greeter didn't leave us in disabled state
432+ tryCompare(shell, "waitingOnGreeter", false); // make sure greeter didn't leave us in disabled state
433 tearDown();
433 tearDown();
434 WindowStateStorage.clear();
434 WindowStateStorage.clear();
435 }
435 }
@@ -439,7 +439,7 @@ Rectangle {
439 shellLoader.active = true;
439 shellLoader.active = true;
440 tryCompare(shellLoader, "status", Loader.Ready);
440 tryCompare(shellLoader, "status", Loader.Ready);
441 removeTimeConstraintsFromSwipeAreas(shellLoader.item);
441 removeTimeConstraintsFromSwipeAreas(shellLoader.item);
442− tryCompare(shell, "enabled", true); // enabled by greeter when ready
442+ tryCompare(shell, "waitingOnGreeter", false); // reset by greeter when ready
443
443
444 sessionSpy.target = findChild(shell, "greeter")
444 sessionSpy.target = findChild(shell, "greeter")
445 dashCommunicatorSpy.target = findInvisibleChild(shell, "dashCommunicator");
445 dashCommunicatorSpy.target = findInvisibleChild(shell, "dashCommunicator");
@@ -791,7 +791,7 @@ Rectangle {
791 tryCompare(userlist, "currentIndex", next)
791 tryCompare(userlist, "currentIndex", next)
792 tryCompare(userlist, "movingInternally", false)
792 tryCompare(userlist, "movingInternally", false)
793 }
793 }
794− tryCompare(shell, "enabled", true); // wait for PAM to settle
794+ tryCompare(shell, "waitingOnGreeter", false); // wait for PAM to settle
795 }
795 }
796
796
797 function selectUser(name) {
797 function selectUser(name) {
tests/qmltests/tst_ShellWithPin.qml+6−4
@@ -150,7 +150,7 @@ Item {
150 property Item shell: shellLoader.status === Loader.Ready ? shellLoader.item : null
150 property Item shell: shellLoader.status === Loader.Ready ? shellLoader.item : null
151
151
152 function init() {
152 function init() {
153− tryCompare(shell, "enabled", true); // will be enabled when greeter is all ready
153+ tryCompare(shell, "waitingOnGreeter", false); // will be set when greeter is all ready
154 var greeter = findChild(shell, "greeter");
154 var greeter = findChild(shell, "greeter");
155 sessionSpy.target = greeter;
155 sessionSpy.target = greeter;
156 swipeAwayGreeter(true);
156 swipeAwayGreeter(true);
@@ -165,7 +165,7 @@ Item {
165 }
165 }
166
166
167 function cleanup() {
167 function cleanup() {
168− tryCompare(shell, "enabled", true); // make sure greeter didn't leave us in disabled state
168+ tryCompare(shell, "waitingOnGreeter", false); // make sure greeter didn't leave us in disabled state
169
169
170 shellLoader.itemDestroyed = false
170 shellLoader.itemDestroyed = false
171
171
@@ -533,10 +533,12 @@ Item {
533
533
534 // Confirm that we start disabled
534 // Confirm that we start disabled
535 compare(promptSpy.count, 0);
535 compare(promptSpy.count, 0);
536− verify(!shell.enabled);
536+ verify(shell.waitingOnGreeter);
537+ var coverPageDragHandle = findChild(shell, "coverPageDragHandle");
538+ verify(!coverPageDragHandle.enabled);
537
539
538 // And that we only become enabled once the lockscreen is up
540 // And that we only become enabled once the lockscreen is up
539− tryCompare(shell, "enabled", true);
541+ tryCompare(shell, "waitingOnGreeter", false);
540 verify(promptSpy.count > 0);
542 verify(promptSpy.count > 0);
541 var lockscreen = findChild(shell, "lockscreen");
543 var lockscreen = findChild(shell, "lockscreen");
542 verify(lockscreen.shown);
544 verify(lockscreen.shown);