on xenial help sign in
Merge
8daf35fAlbert Astals Cid
CMakeLists.txt+1−1
@@ -57,7 +57,7 @@ find_package(Qt5DBus 5.4 REQUIRED)
57find_package(Qt5Concurrent 5.4 REQUIRED)
57find_package(Qt5Concurrent 5.4 REQUIRED)
58find_package(Qt5Sql 5.4 REQUIRED)
58find_package(Qt5Sql 5.4 REQUIRED)
59
59
60−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=14)
60+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=15)
61pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
61pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
62pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
62pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
63pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
63pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
debian/bileto_pre_release_hooknew file+5
@@ -0,0 +1,5 @@
1+#!/bin/sh
2+
3+set -eux
4+
5+sh ./po/update-unity-pot
debian/changelog+16
@@ -1,3 +1,19 @@
1+unity8 (8.12+16.04.20160421.1-0ubuntu1) xenial; urgency=medium
2+
3+ [ Daniel d'Andrada ]
4+ * Refactor keymap switching code
5+ * Surface-based window management
6+ * Use Item.grabToImage() instead of qtmir's ApplicationScreenshot
7+ provider
8+
9+ [ Michael Zanetti ]
10+ * Fixes for programmatically closing Applications
11+
12+ [ Robert Bruce Park ]
13+ * Use new bileto_pre_release_hook
14+
15+ -- Gerry Boland <ci-train-bot@canonical.com> Thu, 21 Apr 2016 13:48:02 +0000
16+
1unity8 (8.12+16.04.20160414.1-0ubuntu1) xenial; urgency=medium
17unity8 (8.12+16.04.20160414.1-0ubuntu1) xenial; urgency=medium
2
18
3 [ Michael Terry ]
19 [ Michael Terry ]
debian/control+2−2
@@ -133,7 +133,7 @@ Depends: qml-module-qtquick-layouts,
133 qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
133 qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
134 qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
134 qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
135 ubuntu-thumbnailer-impl-0,
135 ubuntu-thumbnailer-impl-0,
136− unity-application-impl-14,
136+ unity-application-impl-15,
137 unity-notifications-impl-3,
137 unity-notifications-impl-3,
138 unity-plugin-scopes | unity-scopes-impl,
138 unity-plugin-scopes | unity-scopes-impl,
139 unity-scopes-impl-12,
139 unity-scopes-impl-12,
@@ -179,7 +179,7 @@ Pre-Depends: ${misc:Pre-Depends},
179Depends: ${misc:Depends},
179Depends: ${misc:Depends},
180 ${shlibs:Depends},
180 ${shlibs:Depends},
181Provides: unity-application-impl,
181Provides: unity-application-impl,
182− unity-application-impl-14,
182+ unity-application-impl-15,
183Replaces: unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1)
183Replaces: unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1)
184Description: Fake environment for running Unity 8 shell
184Description: Fake environment for running Unity 8 shell
185 Provides fake implementations of some QML modules used by Unity 8 shell
185 Provides fake implementations of some QML modules used by Unity 8 shell
debian/rules−8
@@ -36,11 +36,3 @@ override_dh_makeshlibs:
36# libMockLightDM-qml.so links against liblightdm-qt5-2.so which doesn't exist
36# libMockLightDM-qml.so links against liblightdm-qt5-2.so which doesn't exist
37override_dh_shlibdeps:
37override_dh_shlibdeps:
38 dh_shlibdeps -XlibMockLightDM-qml.so
38 dh_shlibdeps -XlibMockLightDM-qml.so
39−
40−override_dh_auto_clean:
41− dh_auto_clean
42− # only run under "CI Train"
43− if [ -n "$(SILONAME)" -a -x /usr/bin/bzr ]; then \
44− ./po/update-unity-pot; \
45− bzr commit --message "Update translation template" po/unity8.pot; \
46− fi
debian/unity8-private.install+1
@@ -14,6 +14,7 @@ usr/lib/*/unity8/qml/Ubuntu
14usr/lib/*/unity8/qml/Unity
14usr/lib/*/unity8/qml/Unity
15usr/lib/*/unity8/qml/UInput
15usr/lib/*/unity8/qml/UInput
16usr/lib/*/unity8/qml/Utils
16usr/lib/*/unity8/qml/Utils
17+usr/lib/*/unity8/qml/WindowManager
17usr/lib/*/unity8/qml/Wizard
18usr/lib/*/unity8/qml/Wizard
18usr/share/accountsservice/interfaces
19usr/share/accountsservice/interfaces
19usr/share/dbus-1/interfaces
20usr/share/dbus-1/interfaces
plugins/CMakeLists.txt+1
@@ -25,4 +25,5 @@ add_subdirectory(Ubuntu)
25add_subdirectory(UInput)
25add_subdirectory(UInput)
26add_subdirectory(Unity)
26add_subdirectory(Unity)
27add_subdirectory(Utils)
27add_subdirectory(Utils)
28+add_subdirectory(WindowManager)
28add_subdirectory(Wizard)
29add_subdirectory(Wizard)
plugins/WindowManager/CMakeLists.txtnew file+13
@@ -0,0 +1,13 @@
1+set(WINDOWMANAGER_SRC
2+ TopLevelSurfaceList.cpp
3+ WindowManagerPlugin.cpp
4+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
5+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
6+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
7+ )
8+
9+add_library(windowmanager-qml SHARED ${WINDOWMANAGER_SRC})
10+
11+qt5_use_modules(windowmanager-qml Qml Quick Gui)
12+
13+add_unity8_plugin(WindowManager 0.1 WindowManager TARGETS windowmanager-qml)
plugins/WindowManager/TopLevelSurfaceList.cppnew file+486
@@ -0,0 +1,486 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "TopLevelSurfaceList.h"
18+
19+// unity-api
20+#include <unity/shell/application/ApplicationInfoInterface.h>
21+#include <unity/shell/application/MirSurfaceInterface.h>
22+#include <unity/shell/application/MirSurfaceListInterface.h>
23+
24+#include <QMetaObject>
25+
26+Q_LOGGING_CATEGORY(UNITY_TOPSURFACELIST, "unity.topsurfacelist", QtDebugMsg)
27+
28+#define DEBUG_MSG qCDebug(UNITY_TOPSURFACELIST).nospace().noquote() << __func__
29+
30+using namespace unity::shell::application;
31+
32+TopLevelSurfaceList::TopLevelSurfaceList(QObject *parent) :
33+ QAbstractListModel(parent)
34+{
35+ DEBUG_MSG << "()";
36+}
37+
38+TopLevelSurfaceList::~TopLevelSurfaceList()
39+{
40+ DEBUG_MSG << "()";
41+}
42+
43+int TopLevelSurfaceList::rowCount(const QModelIndex &parent) const
44+{
45+ return !parent.isValid() ? m_surfaceList.size() : 0;
46+}
47+
48+QVariant TopLevelSurfaceList::data(const QModelIndex& index, int role) const
49+{
50+ if (index.row() < 0 || index.row() >= m_surfaceList.size())
51+ return QVariant();
52+
53+ if (role == SurfaceRole) {
54+ MirSurfaceInterface *surface = m_surfaceList.at(index.row()).surface;
55+ return QVariant::fromValue(surface);
56+ } else if (role == ApplicationRole) {
57+ return QVariant::fromValue(m_surfaceList.at(index.row()).application);
58+ } else if (role == IdRole) {
59+ return QVariant::fromValue(m_surfaceList.at(index.row()).id);
60+ } else {
61+ return QVariant();
62+ }
63+}
64+
65+void TopLevelSurfaceList::raise(MirSurfaceInterface *surface)
66+{
67+ if (!surface)
68+ return;
69+
70+ DEBUG_MSG << "(MirSurface[" << (void*)surface << "])";
71+
72+ int i = indexOf(surface);
73+ if (i != -1) {
74+ raiseId(m_surfaceList.at(i).id);
75+ }
76+}
77+
78+void TopLevelSurfaceList::appendPlaceholder(ApplicationInfoInterface *application)
79+{
80+ DEBUG_MSG << "(" << application->appId() << ")";
81+
82+ appendSurfaceHelper(nullptr, application);
83+}
84+
85+void TopLevelSurfaceList::appendSurface(MirSurfaceInterface *surface, ApplicationInfoInterface *application)
86+{
87+ Q_ASSERT(surface != nullptr);
88+
89+ bool filledPlaceholder = false;
90+ for (int i = 0; i < m_surfaceList.count() && !filledPlaceholder; ++i) {
91+ ModelEntry &entry = m_surfaceList[i];
92+ if (entry.application == application && entry.surface == nullptr) {
93+ entry.surface = surface;
94+ connectSurface(surface);
95+ DEBUG_MSG << " appId=" << application->appId() << " surface=" << surface
96+ << ", filling out placeholder. after: " << toString();
97+ Q_EMIT dataChanged(index(i) /* topLeft */, index(i) /* bottomRight */, QVector<int>() << SurfaceRole);
98+ filledPlaceholder = true;
99+ }
100+ }
101+
102+ if (!filledPlaceholder) {
103+ DEBUG_MSG << " appId=" << application->appId() << " surface=" << surface << ", adding new row";
104+ appendSurfaceHelper(surface, application);
105+ }
106+}
107+
108+void TopLevelSurfaceList::appendSurfaceHelper(MirSurfaceInterface *surface, ApplicationInfoInterface *application)
109+{
110+ if (m_modelState == IdleState) {
111+ m_modelState = InsertingState;
112+ beginInsertRows(QModelIndex(), m_surfaceList.size() /*first*/, m_surfaceList.size() /*last*/);
113+ } else {
114+ Q_ASSERT(m_modelState == ResettingState);
115+ // No point in signaling anything if we're resetting the whole model
116+ }
117+
118+ int id = generateId();
119+ m_surfaceList.append(ModelEntry(surface, application, id));
120+ if (surface) {
121+ connectSurface(surface);
122+ }
123+
124+ if (m_modelState == InsertingState) {
125+ endInsertRows();
126+ Q_EMIT countChanged();
127+ Q_EMIT listChanged();
128+ m_modelState = IdleState;
129+ }
130+
131+ DEBUG_MSG << " after " << toString();
132+}
133+
134+void TopLevelSurfaceList::connectSurface(MirSurfaceInterface *surface)
135+{
136+ connect(surface, &MirSurfaceInterface::focusedChanged, this, [this, surface](bool focused){
137+ if (focused) {
138+ this->raise(surface);
139+ }
140+ });
141+ connect(surface, &MirSurfaceInterface::liveChanged, this, [this, surface](bool live){
142+ if (!live) {
143+ onSurfaceDied(surface);
144+ }
145+ });
146+ connect(surface, &QObject::destroyed, this, [this, surface](){ this->onSurfaceDestroyed(surface); });
147+}
148+
149+void TopLevelSurfaceList::onSurfaceDied(MirSurfaceInterface *surface)
150+{
151+ int i = indexOf(surface);
152+ if (i == -1) {
153+ return;
154+ }
155+
156+ auto application = m_surfaceList[i].application;
157+
158+ // can't be starting if it already has a surface
159+ Q_ASSERT(application->state() != ApplicationInfoInterface::Starting);
160+
161+ if (application->state() == ApplicationInfoInterface::Running) {
162+ m_surfaceList[i].removeOnceSurfaceDestroyed = true;
163+ } else {
164+ // assume it got killed by the out-of-memory daemon.
165+ //
166+ // So leave entry in the model and only remove its surface, so shell can display a screenshot
167+ // in its place.
168+ m_surfaceList[i].removeOnceSurfaceDestroyed = false;
169+ }
170+}
171+
172+void TopLevelSurfaceList::onSurfaceDestroyed(MirSurfaceInterface *surface)
173+{
174+ int i = indexOf(surface);
175+ if (i == -1) {
176+ return;
177+ }
178+
179+ if (m_surfaceList[i].removeOnceSurfaceDestroyed) {
180+ removeAt(i);
181+ } else {
182+ m_surfaceList[i].surface = nullptr;
183+ Q_EMIT dataChanged(index(i) /* topLeft */, index(i) /* bottomRight */, QVector<int>() << SurfaceRole);
184+ DEBUG_MSG << " Removed surface from entry. After: " << toString();
185+ }
186+}
187+
188+void TopLevelSurfaceList::removeAt(int index)
189+{
190+ if (m_modelState == IdleState) {
191+ beginRemoveRows(QModelIndex(), index, index);
192+ m_modelState = RemovingState;
193+ } else {
194+ Q_ASSERT(m_modelState == ResettingState);
195+ // No point in signaling anything if we're resetting the whole model
196+ }
197+
198+ m_surfaceList.removeAt(index);
199+
200+ if (m_modelState == RemovingState) {
201+ endRemoveRows();
202+ Q_EMIT countChanged();
203+ Q_EMIT listChanged();
204+ m_modelState = IdleState;
205+ }
206+
207+ DEBUG_MSG << " after " << toString();
208+}
209+
210+int TopLevelSurfaceList::indexOf(MirSurfaceInterface *surface)
211+{
212+ for (int i = 0; i < m_surfaceList.count(); ++i) {
213+ if (m_surfaceList.at(i).surface == surface) {
214+ return i;
215+ }
216+ }
217+ return -1;
218+}
219+
220+void TopLevelSurfaceList::move(int from, int to)
221+{
222+ if (from == to) return;
223+ DEBUG_MSG << " from=" << from << " to=" << to;
224+
225+ if (from >= 0 && from < m_surfaceList.size() && to >= 0 && to < m_surfaceList.size()) {
226+ QModelIndex parent;
227+ /* When moving an item down, the destination index needs to be incremented
228+ by one, as explained in the documentation:
229+ http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html#beginMoveRows */
230+
231+ Q_ASSERT(m_modelState == IdleState);
232+ m_modelState = MovingState;
233+
234+ beginMoveRows(parent, from, from, parent, to + (to > from ? 1 : 0));
235+ m_surfaceList.move(from, to);
236+ endMoveRows();
237+ Q_EMIT listChanged();
238+
239+ m_modelState = IdleState;
240+
241+ DEBUG_MSG << " after " << toString();
242+ }
243+}
244+
245+MirSurfaceInterface *TopLevelSurfaceList::surfaceAt(int index) const
246+{
247+ if (index >=0 && index < m_surfaceList.count()) {
248+ return m_surfaceList[index].surface;
249+ } else {
250+ return nullptr;
251+ }
252+}
253+
254+ApplicationInfoInterface *TopLevelSurfaceList::applicationAt(int index) const
255+{
256+ if (index >=0 && index < m_surfaceList.count()) {
257+ return m_surfaceList[index].application;
258+ } else {
259+ return nullptr;
260+ }
261+}
262+
263+int TopLevelSurfaceList::idAt(int index) const
264+{
265+ if (index >=0 && index < m_surfaceList.count()) {
266+ return m_surfaceList[index].id;
267+ } else {
268+ return 0;
269+ }
270+}
271+
272+int TopLevelSurfaceList::indexForId(int id) const
273+{
274+ for (int i = 0; i < m_surfaceList.count(); ++i) {
275+ if (m_surfaceList[i].id == id) {
276+ return i;
277+ }
278+ }
279+ return -1;
280+}
281+
282+void TopLevelSurfaceList::doRaiseId(int id)
283+{
284+ int fromIndex = indexForId(id);
285+ if (fromIndex != -1) {
286+ move(fromIndex, 0 /* toIndex */);
287+ }
288+}
289+
290+void TopLevelSurfaceList::raiseId(int id)
291+{
292+ if (m_modelState == IdleState) {
293+ DEBUG_MSG << "(id=" << id << ") - do it now.";
294+ doRaiseId(id);
295+ } else {
296+ DEBUG_MSG << "(id=" << id << ") - Model busy (modelState=" << m_modelState << "). Try again in the next event loop.";
297+ // The model has just signalled some change. If we have a Repeater responding to this update, it will get nuts
298+ // if we perform yet another model change straight away.
299+ //
300+ // A bad sympton of this problem is a Repeater.itemAt(index) call returning null event though Repeater.count says
301+ // the index is definitely within bounds.
302+ QMetaObject::invokeMethod(this, "raiseId", Qt::QueuedConnection, Q_ARG(int, id));
303+ }
304+}
305+
306+int TopLevelSurfaceList::generateId()
307+{
308+ int id = m_nextId;
309+ m_nextId = nextFreeId(m_nextId + 1);
310+ Q_EMIT nextIdChanged();
311+ return id;
312+}
313+
314+int TopLevelSurfaceList::nextFreeId(int candidateId)
315+{
316+ if (candidateId > m_maxId) {
317+ return nextFreeId(1);
318+ } else {
319+ if (indexForId(candidateId) == -1) {
320+ // it's indeed free
321+ return candidateId;
322+ } else {
323+ return nextFreeId(candidateId + 1);
324+ }
325+ }
326+}
327+
328+QString TopLevelSurfaceList::toString()
329+{
330+ QString str;
331+ for (int i = 0; i < m_surfaceList.count(); ++i) {
332+ auto item = m_surfaceList.at(i);
333+
334+ QString itemStr = QString("(index=%1,appId=%2,surface=0x%3,id=%4)")
335+ .arg(i)
336+ .arg(item.application->appId())
337+ .arg((qintptr)item.surface, 0, 16)
338+ .arg(item.id);
339+
340+ if (i > 0) {
341+ str.append(",");
342+ }
343+ str.append(itemStr);
344+ }
345+ return str;
346+}
347+
348+void TopLevelSurfaceList::addApplication(ApplicationInfoInterface *application)
349+{
350+ DEBUG_MSG << "(" << application->appId() << ")";
351+ Q_ASSERT(!m_applications.contains(application));
352+ m_applications.append(application);
353+
354+ MirSurfaceListInterface *surfaceList = application->surfaceList();
355+
356+ if (application->state() != ApplicationInfoInterface::Stopped) {
357+ if (surfaceList->count() == 0) {
358+ appendPlaceholder(application);
359+ } else {
360+ for (int i = 0; i < surfaceList->count(); ++i) {
361+ appendSurface(surfaceList->get(i), application);
362+ }
363+ }
364+ }
365+
366+ connect(surfaceList, &QAbstractItemModel::rowsInserted, this,
367+ [this, application, surfaceList](const QModelIndex & /*parent*/, int first, int last)
368+ {
369+ for (int i = last; i >= first; --i) {
370+ this->appendSurface(surfaceList->get(i), application);
371+ }
372+ });
373+}
374+
375+void TopLevelSurfaceList::removeApplication(ApplicationInfoInterface *application)
376+{
377+ DEBUG_MSG << "(" << application->appId() << ")";
378+ Q_ASSERT(m_applications.contains(application));
379+
380+ MirSurfaceListInterface *surfaceList = application->surfaceList();
381+
382+ disconnect(surfaceList, 0, this, 0);
383+
384+ Q_ASSERT(m_modelState == IdleState);
385+ m_modelState = RemovingState;
386+
387+ int i = 0;
388+ while (i < m_surfaceList.count()) {
389+ if (m_surfaceList.at(i).application == application) {
390+ beginRemoveRows(QModelIndex(), i, i);
391+ m_surfaceList.removeAt(i);
392+ endRemoveRows();
393+ Q_EMIT countChanged();
394+ Q_EMIT listChanged();
395+ } else {
396+ ++i;
397+ }
398+ }
399+
400+ m_modelState = IdleState;
401+
402+ DEBUG_MSG << " after " << toString();
403+
404+ m_applications.removeAll(application);
405+}
406+
407+QAbstractListModel *TopLevelSurfaceList::applicationsModel() const
408+{
409+ return m_applicationsModel;
410+}
411+
412+void TopLevelSurfaceList::setApplicationsModel(QAbstractListModel* value)
413+{
414+ if (m_applicationsModel == value) {
415+ return;
416+ }
417+
418+ DEBUG_MSG << "(" << value << ")";
419+
420+ Q_ASSERT(m_modelState == IdleState);
421+ m_modelState = ResettingState;
422+
423+ beginResetModel();
424+
425+ if (m_applicationsModel) {
426+ m_surfaceList.clear();
427+ m_applications.clear();
428+ disconnect(m_applicationsModel, 0, this, 0);
429+ }
430+
431+ m_applicationsModel = value;
432+
433+ if (m_applicationsModel) {
434+ findApplicationRole();
435+
436+ connect(m_applicationsModel, &QAbstractItemModel::rowsInserted,
437+ this, [this](const QModelIndex &/*parent*/, int first, int last) {
438+ for (int i = first; i <= last; ++i) {
439+ auto application = getApplicationFromModelAt(i);
440+ addApplication(application);
441+ }
442+ });
443+
444+ connect(m_applicationsModel, &QAbstractItemModel::rowsAboutToBeRemoved,
445+ this, [this](const QModelIndex &/*parent*/, int first, int last) {
446+ for (int i = first; i <= last; ++i) {
447+ auto application = getApplicationFromModelAt(i);
448+ removeApplication(application);
449+ }
450+ });
451+
452+ for (int i = 0; i < m_applicationsModel->rowCount(); ++i) {
453+ auto application = getApplicationFromModelAt(i);
454+ addApplication(application);
455+ }
456+ }
457+
458+ endResetModel();
459+ m_modelState = IdleState;
460+}
461+
462+ApplicationInfoInterface *TopLevelSurfaceList::getApplicationFromModelAt(int index)
463+{
464+ QModelIndex modelIndex = m_applicationsModel->index(index);
465+
466+ QVariant variant = m_applicationsModel->data(modelIndex, m_applicationRole);
467+
468+ // variant.value<ApplicationInfoInterface*>() returns null for some reason.
469+ return static_cast<ApplicationInfoInterface*>(variant.value<QObject*>());
470+}
471+
472+void TopLevelSurfaceList::findApplicationRole()
473+{
474+ QHash<int, QByteArray> namesHash = m_applicationsModel->roleNames();
475+
476+ m_applicationRole = -1;
477+ for (auto i = namesHash.begin(); i != namesHash.end() && m_applicationRole == -1; ++i) {
478+ if (i.value() == "application") {
479+ m_applicationRole = i.key();
480+ }
481+ }
482+
483+ if (m_applicationRole == -1) {
484+ qFatal("TopLevelSurfaceList: applicationsModel must have a \"application\" role.");
485+ }
486+}
plugins/WindowManager/TopLevelSurfaceList.hnew file+223
@@ -0,0 +1,223 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef TOPLEVELSURFACELIST_H
18+#define TOPLEVELSURFACELIST_H
19+
20+#include <QAbstractListModel>
21+#include <QList>
22+#include <QLoggingCategory>
23+
24+Q_DECLARE_LOGGING_CATEGORY(UNITY_TOPSURFACELIST)
25+
26+namespace unity {
27+ namespace shell {
28+ namespace application {
29+ class ApplicationInfoInterface;
30+ class MirSurfaceInterface;
31+ }
32+ }
33+}
34+
35+/**
36+ * @brief A model of top-level surfaces
37+ *
38+ * It's an abstraction of top-level application windows.
39+ *
40+ * When an entry first appears, it normaly doesn't have a surface yet, meaning that the application is
41+ * still starting up. A shell should then display a splash screen or saved screenshot of the application
42+ * until its surface comes up.
43+ *
44+ * As applications can have multiple surfaces and you can also have entries without surfaces at all,
45+ * the only way to unambiguously refer to an entry in this model is through its id.
46+ */
47+class TopLevelSurfaceList : public QAbstractListModel
48+{
49+
50+ Q_OBJECT
51+
52+ /**
53+ * @brief A list model of applications.
54+ *
55+ * It's expected to have a role called "application" which returns a ApplicationInfoInterface
56+ */
57+ Q_PROPERTY(QAbstractListModel* applicationsModel READ applicationsModel
58+ WRITE setApplicationsModel
59+ NOTIFY applicationsModelChanged)
60+
61+ /**
62+ * @brief Number of top-level surfaces in this model
63+ *
64+ * This is the same as rowCount, added in order to keep compatibility with QML ListModels.
65+ */
66+ Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
67+
68+ /**
69+ The id to be used on the next entry created
70+ Useful for tests
71+ */
72+ Q_PROPERTY(int nextId READ nextId NOTIFY nextIdChanged)
73+public:
74+
75+ /**
76+ * @brief The Roles supported by the model
77+ *
78+ * SurfaceRole - A MirSurfaceInterface. It will be null if the application is still starting up
79+ * ApplicationRole - An ApplicationInfoInterface
80+ * IdRole - A unique identifier for this entry. Useful to unambiguosly track elements as they move around in the list
81+ */
82+ enum Roles {
83+ SurfaceRole = Qt::UserRole,
84+ ApplicationRole = Qt::UserRole + 1,
85+ IdRole = Qt::UserRole + 2,
86+ };
87+
88+ explicit TopLevelSurfaceList(QObject *parent = nullptr);
89+ virtual ~TopLevelSurfaceList();
90+
91+ // QAbstractItemModel methods
92+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
93+ QVariant data(const QModelIndex& index, int role) const override;
94+ QHash<int, QByteArray> roleNames() const override {
95+ QHash<int, QByteArray> roleNames { {SurfaceRole, "surface"},
96+ {ApplicationRole, "application"},
97+ {IdRole, "id"} };
98+ return roleNames;
99+ }
100+
101+ int nextId() const { return m_nextId; }
102+
103+ QAbstractListModel *applicationsModel() const;
104+ void setApplicationsModel(QAbstractListModel*);
105+
106+public Q_SLOTS:
107+ /**
108+ * @brief Returns the surface at the given index
109+ *
110+ * It will be a nullptr if the application is still starting up and thus hasn't yet created
111+ * and drawn into a surface.
112+ */
113+ unity::shell::application::MirSurfaceInterface *surfaceAt(int index) const;
114+
115+ /**
116+ * @brief Returns the application at the given index
117+ */
118+ unity::shell::application::ApplicationInfoInterface *applicationAt(int index) const;
119+
120+ /**
121+ * @brief Returns the unique id of the element at the given index
122+ */
123+ int idAt(int index) const;
124+
125+ /**
126+ * @brief Returns the index where the row with the given id is located
127+ *
128+ * Returns -1 if there's no row with the given id.
129+ */
130+ int indexForId(int id) const;
131+
132+ /**
133+ * @brief Raises the row with the given id to index 0
134+ */
135+ void raiseId(int id);
136+
137+ void doRaiseId(int id);
138+
139+Q_SIGNALS:
140+ void countChanged();
141+
142+ /**
143+ * @brief Emitted when the list changes
144+ *
145+ * Emitted when model gains an element, loses an element or when elements exchange positions.
146+ */
147+ void listChanged();
148+
149+ void nextIdChanged();
150+
151+ void applicationsModelChanged();
152+
153+private:
154+ void addApplication(unity::shell::application::ApplicationInfoInterface *application);
155+ void removeApplication(unity::shell::application::ApplicationInfoInterface *application);
156+
157+ int indexOf(unity::shell::application::MirSurfaceInterface *surface);
158+ void raise(unity::shell::application::MirSurfaceInterface *surface);
159+ void move(int from, int to);
160+ void appendSurfaceHelper(unity::shell::application::MirSurfaceInterface *surface,
161+ unity::shell::application::ApplicationInfoInterface *application);
162+ void connectSurface(unity::shell::application::MirSurfaceInterface *surface);
163+ int generateId();
164+ int nextFreeId(int candidateId);
165+ QString toString();
166+ void onSurfaceDestroyed(unity::shell::application::MirSurfaceInterface *surface);
167+ void onSurfaceDied(unity::shell::application::MirSurfaceInterface *surface);
168+ void removeAt(int index);
169+ void findApplicationRole();
170+
171+ unity::shell::application::ApplicationInfoInterface *getApplicationFromModelAt(int index);
172+
173+ /*
174+ Placeholder for a future surface from a starting or running application.
175+ Enables shell to give immediate feedback to the user by showing, eg,
176+ a splash screen.
177+
178+ It's a model row containing a null surface and the given application.
179+ */
180+ void appendPlaceholder(unity::shell::application::ApplicationInfoInterface *application);
181+
182+ /*
183+ Adds a model row with the given surface and application
184+
185+ Alternatively, if a placeholder exists for the given application it's
186+ filled with the given surface instead.
187+ */
188+ void appendSurface(unity::shell::application::MirSurfaceInterface *surface,
189+ unity::shell::application::ApplicationInfoInterface *application);
190+
191+ struct ModelEntry {
192+ ModelEntry(unity::shell::application::MirSurfaceInterface *surface, unity::shell::application::ApplicationInfoInterface *application, int id)
193+ : surface(surface), application(application), id(id) {}
194+ unity::shell::application::MirSurfaceInterface *surface;
195+ unity::shell::application::ApplicationInfoInterface *application;
196+ int id;
197+ bool removeOnceSurfaceDestroyed{false};
198+ };
199+
200+ QList<ModelEntry> m_surfaceList;
201+ int m_nextId{1};
202+ static const int m_maxId{1000000};
203+
204+ // applications that are being monitored
205+ QList<unity::shell::application::ApplicationInfoInterface *> m_applications;
206+
207+ QAbstractListModel* m_applicationsModel{nullptr};
208+ int m_applicationRole{-1};
209+
210+ enum ModelState {
211+ IdleState,
212+ InsertingState,
213+ RemovingState,
214+ MovingState,
215+ ResettingState
216+ };
217+ ModelState m_modelState{IdleState};
218+};
219+
220+Q_DECLARE_METATYPE(TopLevelSurfaceList*)
221+Q_DECLARE_METATYPE(QAbstractListModel*)
222+
223+#endif // TOPLEVELSURFACELIST_H
plugins/WindowManager/WindowManagerPlugin.cppnew file+28
@@ -0,0 +1,28 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "WindowManagerPlugin.h"
18+
19+#include "TopLevelSurfaceList.h"
20+
21+#include <QtQml>
22+
23+void WindowManagerPlugin::registerTypes(const char *uri)
24+{
25+ qmlRegisterType<TopLevelSurfaceList>(uri, 0, 1, "TopLevelSurfaceList");
26+
27+ qRegisterMetaType<QAbstractListModel*>("QAbstractListModel*");
28+}
tests/mocks/Unity/Application/SessionManager.h → plugins/WindowManager/WindowManagerPlugin.hrenamed+10−22
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -14,31 +14,19 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−#ifndef SESSIONMANAGER_H
17+#ifndef WINDOWMANAGER_PLUGIN_H
18−#define SESSIONMANAGER_H
18+#define WINDOWMANAGER_PLUGIN_H
19
19
20−#include <QObject>
20+#include <QtQml/QQmlEngine>
21+#include <QtQml/QQmlExtensionPlugin>
21
22
22−class Session;
23+class WindowManagerPlugin : public QQmlExtensionPlugin
23−
24−class SessionManager : public QObject
25{
24{
26 Q_OBJECT
25 Q_OBJECT
27−public:
26+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28− explicit SessionManager(QObject *parent = 0);
29−
30− static SessionManager *singleton();
31−
32− Q_INVOKABLE Session* createSession(const QString& name, const QUrl& screenshot);
33
27
34− void registerSession(Session *session);
28+public:
35−
29+ void registerTypes(const char *uri) override;
36−Q_SIGNALS:
37− void sessionStarting(Session *session);
38− void sessionStopping(Session *session);
39−
40−private:
41− static SessionManager *the_session_manager;
42};
30};
43
31
44−#endif // SESSIONMANAGER_H
32+#endif // WINDOWMANAGER_PLUGIN_H
plugins/WindowManager/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module WindowManager
2+plugin windowmanager-qml
po/aa.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-02-12 10:18+0000\n"
11"PO-Revision-Date: 2016-02-12 10:18+0000\n"
12"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
12"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
13"Language-Team: Afar <aa@li.org>\n"
13"Language-Team: Afar <aa@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/am.po+12−18
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-24 19:07+0000\n"
11"PO-Revision-Date: 2016-03-24 19:07+0000\n"
12"Last-Translator: samson <Unknown>\n"
12"Last-Translator: samson <Unknown>\n"
13"Language-Team: Amharic <am@li.org>\n"
13"Language-Team: Amharic <am@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-25 05:54+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -446,19 +446,19 @@ msgstr "ወደ ላይ ይጥረጉ መልእክት ለ መፍጠር"
446msgid "Swipe up to manage the app"
446msgid "Swipe up to manage the app"
447msgstr "ወደ ላይ ይጥረጉ መተግበሪያ ለማስተዳደር"
447msgstr "ወደ ላይ ይጥረጉ መተግበሪያ ለማስተዳደር"
448
448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
452−
453#: qml/Tutorial/TutorialLeftLong.qml:47
449#: qml/Tutorial/TutorialLeftLong.qml:47
454msgid "Long swipe from the left edge to open the Today scope"
450msgid "Long swipe from the left edge to open the Today scope"
455msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
451msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
456
452
457−#: qml/Tutorial/TutorialRight.qml:54
453+#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Hover your mouse on the right edge to view your open apps"
454+msgid "Swipe from the left edge to open the launcher"
459−msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
455+msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
460
456
461#: qml/Tutorial/TutorialRight.qml:55
457#: qml/Tutorial/TutorialRight.qml:55
458+msgid "Push your mouse against the right edge to view your open apps"
459+msgstr ""
460+
461+#: qml/Tutorial/TutorialRight.qml:56
462msgid "Short or long swipe from the right edge to view your open apps"
462msgid "Short or long swipe from the right edge to view your open apps"
463msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
463msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
464
464
@@ -1051,11 +1051,5 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
1051#~ msgid "Call back"
1051#~ msgid "Call back"
1052#~ msgstr "መልሶ መደወያ"
1052#~ msgstr "መልሶ መደወያ"
1053
1053
1054−#~ msgid "Welcome to your Ubuntu device."
1054+#~ msgid "Hover your mouse on the right edge to view your open apps"
1055−#~ msgstr "እንኳን ድህና መጡ ወደ ኡቡንቱ"
1055+#~ msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
1056−
1057−#~ msgid "Please select how you’d like to unlock your device."
1058−#~ msgstr "እባክዎን የ እርስዎን አካል እንዴት እንደሚከፈት ይምረጡ"
1059−
1060−#~ msgid "Your device is now ready to use."
1061−#~ msgstr "የ እርስዎ አካል አሁን ዝግጁ ነው"
po/ar.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-29 09:41+0000\n"
11"PO-Revision-Date: 2015-07-29 09:41+0000\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
13"Language-Team: Arabic <ar@li.org>\n"
13"Language-Team: Arabic <ar@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
17"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
18"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
18"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -465,19 +465,19 @@ msgstr ""
465msgid "Swipe up to manage the app"
465msgid "Swipe up to manage the app"
466msgstr ""
466msgstr ""
467
467
468−#: qml/Tutorial/TutorialLeft.qml:47
469−msgid "Swipe from the left edge to open the launcher"
470−msgstr ""
471−
472#: qml/Tutorial/TutorialLeftLong.qml:47
468#: qml/Tutorial/TutorialLeftLong.qml:47
473msgid "Long swipe from the left edge to open the Today scope"
469msgid "Long swipe from the left edge to open the Today scope"
474msgstr ""
470msgstr ""
475
471
476−#: qml/Tutorial/TutorialRight.qml:54
472+#: qml/Tutorial/TutorialLeft.qml:47
477−msgid "Hover your mouse on the right edge to view your open apps"
473+msgid "Swipe from the left edge to open the launcher"
478msgstr ""
474msgstr ""
479
475
480#: qml/Tutorial/TutorialRight.qml:55
476#: qml/Tutorial/TutorialRight.qml:55
477+msgid "Push your mouse against the right edge to view your open apps"
478+msgstr ""
479+
480+#: qml/Tutorial/TutorialRight.qml:56
481msgid "Short or long swipe from the right edge to view your open apps"
481msgid "Short or long swipe from the right edge to view your open apps"
482msgstr ""
482msgstr ""
483
483
po/ast.po+8−8
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-04-17 16:57+0000\n"
11"PO-Revision-Date: 2016-04-17 16:57+0000\n"
12"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
12"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
13"Language-Team: Asturian <ast@li.org>\n"
13"Language-Team: Asturian <ast@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
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-04-18 05:42+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19"X-Generator: Launchpad (build 17995)\n"
19"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -447,19 +447,19 @@ msgstr ""
447msgid "Swipe up to manage the app"
447msgid "Swipe up to manage the app"
448msgstr ""
448msgstr ""
449
449
450−#: qml/Tutorial/TutorialLeft.qml:47
451−msgid "Swipe from the left edge to open the launcher"
452−msgstr ""
453−
454#: qml/Tutorial/TutorialLeftLong.qml:47
450#: qml/Tutorial/TutorialLeftLong.qml:47
455msgid "Long swipe from the left edge to open the Today scope"
451msgid "Long swipe from the left edge to open the Today scope"
456msgstr ""
452msgstr ""
457
453
458−#: qml/Tutorial/TutorialRight.qml:54
454+#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Hover your mouse on the right edge to view your open apps"
455+msgid "Swipe from the left edge to open the launcher"
460msgstr ""
456msgstr ""
461
457
462#: qml/Tutorial/TutorialRight.qml:55
458#: qml/Tutorial/TutorialRight.qml:55
459+msgid "Push your mouse against the right edge to view your open apps"
460+msgstr ""
461+
462+#: qml/Tutorial/TutorialRight.qml:56
463msgid "Short or long swipe from the right edge to view your open apps"
463msgid "Short or long swipe from the right edge to view your open apps"
464msgstr ""
464msgstr ""
465
465
po/az.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
11"PO-Revision-Date: 2014-09-03 16:39+0000\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
12"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -444,19 +444,19 @@ msgstr ""
444msgid "Swipe up to manage the app"
444msgid "Swipe up to manage the app"
445msgstr ""
445msgstr ""
446
446
447−#: qml/Tutorial/TutorialLeft.qml:47
448−msgid "Swipe from the left edge to open the launcher"
449−msgstr ""
450−
451#: qml/Tutorial/TutorialLeftLong.qml:47
447#: qml/Tutorial/TutorialLeftLong.qml:47
452msgid "Long swipe from the left edge to open the Today scope"
448msgid "Long swipe from the left edge to open the Today scope"
453msgstr ""
449msgstr ""
454
450
455−#: qml/Tutorial/TutorialRight.qml:54
451+#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Hover your mouse on the right edge to view your open apps"
452+msgid "Swipe from the left edge to open the launcher"
457msgstr ""
453msgstr ""
458
454
459#: qml/Tutorial/TutorialRight.qml:55
455#: qml/Tutorial/TutorialRight.qml:55
456+msgid "Push your mouse against the right edge to view your open apps"
457+msgstr ""
458+
459+#: qml/Tutorial/TutorialRight.qml:56
460msgid "Short or long swipe from the right edge to view your open apps"
460msgid "Short or long swipe from the right edge to view your open apps"
461msgstr ""
461msgstr ""
462
462
po/be.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-12-13 13:12+0000\n"
11"PO-Revision-Date: 2015-12-13 13:12+0000\n"
12"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
12"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
13"Language-Team: Belarusian <be@li.org>\n"
13"Language-Team: Belarusian <be@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -454,19 +454,19 @@ msgstr ""
454msgid "Swipe up to manage the app"
454msgid "Swipe up to manage the app"
455msgstr ""
455msgstr ""
456
456
457−#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Swipe from the left edge to open the launcher"
459−msgstr ""
460−
461#: qml/Tutorial/TutorialLeftLong.qml:47
457#: qml/Tutorial/TutorialLeftLong.qml:47
462msgid "Long swipe from the left edge to open the Today scope"
458msgid "Long swipe from the left edge to open the Today scope"
463msgstr ""
459msgstr ""
464
460
465−#: qml/Tutorial/TutorialRight.qml:54
461+#: qml/Tutorial/TutorialLeft.qml:47
466−msgid "Hover your mouse on the right edge to view your open apps"
462+msgid "Swipe from the left edge to open the launcher"
467msgstr ""
463msgstr ""
468
464
469#: qml/Tutorial/TutorialRight.qml:55
465#: qml/Tutorial/TutorialRight.qml:55
466+msgid "Push your mouse against the right edge to view your open apps"
467+msgstr ""
468+
469+#: qml/Tutorial/TutorialRight.qml:56
470msgid "Short or long swipe from the right edge to view your open apps"
470msgid "Short or long swipe from the right edge to view your open apps"
471msgstr ""
471msgstr ""
472
472
po/bg.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-04-12 14:43+0000\n"
11"PO-Revision-Date: 2015-04-12 14:43+0000\n"
12"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
12"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -442,19 +442,19 @@ msgstr ""
442msgid "Swipe up to manage the app"
442msgid "Swipe up to manage the app"
443msgstr ""
443msgstr ""
444
444
445−#: qml/Tutorial/TutorialLeft.qml:47
446−msgid "Swipe from the left edge to open the launcher"
447−msgstr ""
448−
449#: qml/Tutorial/TutorialLeftLong.qml:47
445#: qml/Tutorial/TutorialLeftLong.qml:47
450msgid "Long swipe from the left edge to open the Today scope"
446msgid "Long swipe from the left edge to open the Today scope"
451msgstr ""
447msgstr ""
452
448
453−#: qml/Tutorial/TutorialRight.qml:54
449+#: qml/Tutorial/TutorialLeft.qml:47
454−msgid "Hover your mouse on the right edge to view your open apps"
450+msgid "Swipe from the left edge to open the launcher"
455msgstr ""
451msgstr ""
456
452
457#: qml/Tutorial/TutorialRight.qml:55
453#: qml/Tutorial/TutorialRight.qml:55
454+msgid "Push your mouse against the right edge to view your open apps"
455+msgstr ""
456+
457+#: qml/Tutorial/TutorialRight.qml:56
458msgid "Short or long swipe from the right edge to view your open apps"
458msgid "Short or long swipe from the right edge to view your open apps"
459msgstr ""
459msgstr ""
460
460
po/bn.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-11-27 19:38+0000\n"
11"PO-Revision-Date: 2015-11-27 19:38+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Bengali <bn@li.org>\n"
13"Language-Team: Bengali <bn@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -443,19 +443,19 @@ msgstr ""
443msgid "Swipe up to manage the app"
443msgid "Swipe up to manage the app"
444msgstr ""
444msgstr ""
445
445
446−#: qml/Tutorial/TutorialLeft.qml:47
447−msgid "Swipe from the left edge to open the launcher"
448−msgstr ""
449−
450#: qml/Tutorial/TutorialLeftLong.qml:47
446#: qml/Tutorial/TutorialLeftLong.qml:47
451msgid "Long swipe from the left edge to open the Today scope"
447msgid "Long swipe from the left edge to open the Today scope"
452msgstr ""
448msgstr ""
453
449
454−#: qml/Tutorial/TutorialRight.qml:54
450+#: qml/Tutorial/TutorialLeft.qml:47
455−msgid "Hover your mouse on the right edge to view your open apps"
451+msgid "Swipe from the left edge to open the launcher"
456msgstr ""
452msgstr ""
457
453
458#: qml/Tutorial/TutorialRight.qml:55
454#: qml/Tutorial/TutorialRight.qml:55
455+msgid "Push your mouse against the right edge to view your open apps"
456+msgstr ""
457+
458+#: qml/Tutorial/TutorialRight.qml:56
459msgid "Short or long swipe from the right edge to view your open apps"
459msgid "Short or long swipe from the right edge to view your open apps"
460msgstr ""
460msgstr ""
461
461
po/br.po+57−64
@@ -7,16 +7,16 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11−"PO-Revision-Date: 2016-02-22 12:29+0000\n"
11+"PO-Revision-Date: 2016-04-18 07:33+0000\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
13"Language-Team: Breton <br@li.org>\n"
13"Language-Team: Breton <br@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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -144,6 +144,8 @@ msgctxt ""
144"Re-dock means connect the device again to an external screen/mouse/keyboard"
144"Re-dock means connect the device again to an external screen/mouse/keyboard"
145msgid "Re-dock, save your work and close these apps to continue."
145msgid "Re-dock, save your work and close these apps to continue."
146msgstr ""
146msgstr ""
147+"Adkevreit ouzh ar savlec'h degemer, enrollot ho labour ha serrit an arloadoù-"
148+"mañ evit kenderc'hel."
147
149
148#: qml/Components/ModeSwitchWarningDialog.qml:63
150#: qml/Components/ModeSwitchWarningDialog.qml:63
149msgid "Or force close now (unsaved data will be lost)."
151msgid "Or force close now (unsaved data will be lost)."
@@ -191,7 +193,7 @@ msgstr ""
191
193
192#: qml/Dash/FiltersPopover.qml:69
194#: qml/Dash/FiltersPopover.qml:69
193msgid "Reset"
195msgid "Reset"
194−msgstr ""
196+msgstr "Adderaouekaat"
195
197
196#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
198#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
197msgid "See less"
199msgid "See less"
@@ -208,11 +210,11 @@ msgstr "Klask"
208
210
209#: qml/Dash/PageHeaderExtraPanel.qml:55
211#: qml/Dash/PageHeaderExtraPanel.qml:55
210msgid "Recent Searches"
212msgid "Recent Searches"
211−msgstr ""
213+msgstr "Enklaskoù graet nevez zo"
212
214
213#: qml/Dash/PageHeaderExtraPanel.qml:66
215#: qml/Dash/PageHeaderExtraPanel.qml:66
214msgid "Clear All"
216msgid "Clear All"
215−msgstr ""
217+msgstr "Diverkañ pep tra"
216
218
217#: qml/Dash/Previews/PreviewActionCombo.qml:35
219#: qml/Dash/Previews/PreviewActionCombo.qml:35
218msgid "More..."
220msgid "More..."
@@ -433,7 +435,7 @@ msgstr ""
433
435
434#: qml/Tutorial/TutorialBottom.qml:78
436#: qml/Tutorial/TutorialBottom.qml:78
435msgid "Swipe up to add a contact"
437msgid "Swipe up to add a contact"
436−msgstr ""
438+msgstr "Riklit d'an nec'h evit ouzhpennañ un darempred"
437
439
438#: qml/Tutorial/TutorialBottom.qml:80
440#: qml/Tutorial/TutorialBottom.qml:80
439msgid "Swipe up for favorite calculations"
441msgid "Swipe up for favorite calculations"
@@ -445,25 +447,25 @@ msgstr ""
445
447
446#: qml/Tutorial/TutorialBottom.qml:84
448#: qml/Tutorial/TutorialBottom.qml:84
447msgid "Swipe up to create a message"
449msgid "Swipe up to create a message"
448−msgstr ""
450+msgstr "Riklit d'an nec'h evit krouiñ ur gemennadenn"
449
451
450#: qml/Tutorial/TutorialBottom.qml:85
452#: qml/Tutorial/TutorialBottom.qml:85
451msgid "Swipe up to manage the app"
453msgid "Swipe up to manage the app"
452msgstr ""
454msgstr ""
453
455
454−#: qml/Tutorial/TutorialLeft.qml:47
455−msgid "Swipe from the left edge to open the launcher"
456−msgstr ""
457−
458#: qml/Tutorial/TutorialLeftLong.qml:47
456#: qml/Tutorial/TutorialLeftLong.qml:47
459msgid "Long swipe from the left edge to open the Today scope"
457msgid "Long swipe from the left edge to open the Today scope"
460msgstr ""
458msgstr ""
461
459
462−#: qml/Tutorial/TutorialRight.qml:54
460+#: qml/Tutorial/TutorialLeft.qml:47
463−msgid "Hover your mouse on the right edge to view your open apps"
461+msgid "Swipe from the left edge to open the launcher"
464msgstr ""
462msgstr ""
465
463
466#: qml/Tutorial/TutorialRight.qml:55
464#: qml/Tutorial/TutorialRight.qml:55
465+msgid "Push your mouse against the right edge to view your open apps"
466+msgstr ""
467+
468+#: qml/Tutorial/TutorialRight.qml:56
467msgid "Short or long swipe from the right edge to view your open apps"
469msgid "Short or long swipe from the right edge to view your open apps"
468msgstr ""
470msgstr ""
469
471
@@ -482,7 +484,7 @@ msgstr "Distreiñ"
482
484
483#: qml/Wizard/Pages/10-welcome.qml:27
485#: qml/Wizard/Pages/10-welcome.qml:27
484msgid "Language"
486msgid "Language"
485−msgstr ""
487+msgstr "Yezh"
486
488
487#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
489#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
488#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
490#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -491,7 +493,7 @@ msgstr ""
491#: qml/Wizard/Pages/passcode-desktop.qml:124
493#: qml/Wizard/Pages/passcode-desktop.qml:124
492#: qml/Wizard/Pages/password-set.qml:141
494#: qml/Wizard/Pages/password-set.qml:141
493msgid "Next"
495msgid "Next"
494−msgstr ""
496+msgstr "War-lerc'h"
495
497
496#: qml/Wizard/Pages/30-wifi.qml:29
498#: qml/Wizard/Pages/30-wifi.qml:29
497msgid "Connect to Wi‑Fi"
499msgid "Connect to Wi‑Fi"
@@ -499,15 +501,15 @@ msgstr "Kevreañ ouzh ar Wi-Fi"
499
501
500#: qml/Wizard/Pages/30-wifi.qml:130
502#: qml/Wizard/Pages/30-wifi.qml:130
501msgid "Connected"
503msgid "Connected"
502−msgstr ""
504+msgstr "Kevreet"
503
505
504#: qml/Wizard/Pages/30-wifi.qml:163
506#: qml/Wizard/Pages/30-wifi.qml:163
505msgid "Available Wi-Fi networks"
507msgid "Available Wi-Fi networks"
506−msgstr ""
508+msgstr "Rouedadoù Wi-Fi da gaout"
507
509
508#: qml/Wizard/Pages/30-wifi.qml:164
510#: qml/Wizard/Pages/30-wifi.qml:164
509msgid "No available Wi-Fi networks"
511msgid "No available Wi-Fi networks"
510−msgstr ""
512+msgstr "N'eus ket rouedadoù Wi-Fi da gaout"
511
513
512#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
514#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
513#: qml/Wizard/Pages/sim.qml:101
515#: qml/Wizard/Pages/sim.qml:101
@@ -516,7 +518,7 @@ msgstr "Tremen hebiou"
516
518
517#: qml/Wizard/Pages/40-location.qml:27
519#: qml/Wizard/Pages/40-location.qml:27
518msgid "Location Services"
520msgid "Location Services"
519−msgstr ""
521+msgstr "Servijoù lec'hiañ"
520
522
521#: qml/Wizard/Pages/40-location.qml:83
523#: qml/Wizard/Pages/40-location.qml:83
522msgid ""
524msgid ""
@@ -532,15 +534,15 @@ msgstr ""
532#: qml/Wizard/Pages/40-location.qml:106
534#: qml/Wizard/Pages/40-location.qml:106
533msgctxt "part of: Nokia HERE terms and conditions"
535msgctxt "part of: Nokia HERE terms and conditions"
534msgid "terms and conditions"
536msgid "terms and conditions"
535−msgstr ""
537+msgstr "penndivizoù implij"
536
538
537#: qml/Wizard/Pages/40-location.qml:160
539#: qml/Wizard/Pages/40-location.qml:160
538msgid "GPS only"
540msgid "GPS only"
539−msgstr ""
541+msgstr "GPS hepken"
540
542
541#: qml/Wizard/Pages/40-location.qml:214
543#: qml/Wizard/Pages/40-location.qml:214
542msgid "Don't use my location"
544msgid "Don't use my location"
543−msgstr ""
545+msgstr "Arabat implijout ma lec'h"
544
546
545#: qml/Wizard/Pages/40-location.qml:260
547#: qml/Wizard/Pages/40-location.qml:260
546msgid "You can change it later in System Settings."
548msgid "You can change it later in System Settings."
@@ -548,15 +550,15 @@ msgstr ""
548
550
549#: qml/Wizard/Pages/50-timezone.qml:29
551#: qml/Wizard/Pages/50-timezone.qml:29
550msgid "Time Zone"
552msgid "Time Zone"
551−msgstr ""
553+msgstr "Gwerzhid-eur"
552
554
553#: qml/Wizard/Pages/50-timezone.qml:178
555#: qml/Wizard/Pages/50-timezone.qml:178
554msgid "Enter your city"
556msgid "Enter your city"
555−msgstr ""
557+msgstr "Skrivit ho kêr"
556
558
557#: qml/Wizard/Pages/60-account.qml:24
559#: qml/Wizard/Pages/60-account.qml:24
558msgid "Personalize Your Device"
560msgid "Personalize Your Device"
559−msgstr ""
561+msgstr "Personelaat ho penveg"
560
562
561#: qml/Wizard/Pages/60-account.qml:48
563#: qml/Wizard/Pages/60-account.qml:48
562msgid "Preferred Name"
564msgid "Preferred Name"
@@ -564,30 +566,30 @@ msgstr ""
564
566
565#: qml/Wizard/Pages/70-passwd-type.qml:39
567#: qml/Wizard/Pages/70-passwd-type.qml:39
566msgid "Lock Screen"
568msgid "Lock Screen"
567−msgstr ""
569+msgstr "Prennañ ar skramm"
568
570
569#: qml/Wizard/Pages/70-passwd-type.qml:101
571#: qml/Wizard/Pages/70-passwd-type.qml:101
570msgctxt "Label: Type of security method"
572msgctxt "Label: Type of security method"
571msgid "Create new password"
573msgid "Create new password"
572−msgstr ""
574+msgstr "Krouiñ ur ger-tremen nevez"
573
575
574#: qml/Wizard/Pages/70-passwd-type.qml:103
576#: qml/Wizard/Pages/70-passwd-type.qml:103
575msgctxt "Label: Type of security method"
577msgctxt "Label: Type of security method"
576msgid "Create passcode (numbers only)"
578msgid "Create passcode (numbers only)"
577−msgstr ""
579+msgstr "Krouiñ ur c'hod (difroù hepken)"
578
580
579#: qml/Wizard/Pages/70-passwd-type.qml:105
581#: qml/Wizard/Pages/70-passwd-type.qml:105
580msgctxt "Label: Type of security method"
582msgctxt "Label: Type of security method"
581msgid "No lock code"
583msgid "No lock code"
582−msgstr ""
584+msgstr "N'eus kod prennañ ebet"
583
585
584#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
586#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
585msgid "Privacy Policy"
587msgid "Privacy Policy"
586−msgstr ""
588+msgstr "Reolennoù prevezded"
587
589
588#: qml/Wizard/Pages/75-report-check.qml:26
590#: qml/Wizard/Pages/75-report-check.qml:26
589msgid "Help Us Improve"
591msgid "Help Us Improve"
590−msgstr ""
592+msgstr "Sikourit ac'hanomp da wellaat"
591
593
592#: qml/Wizard/Pages/75-report-check.qml:59
594#: qml/Wizard/Pages/75-report-check.qml:59
593msgid "Improve system performance by sending us crashes and error reports."
595msgid "Improve system performance by sending us crashes and error reports."
@@ -595,19 +597,19 @@ msgstr ""
595
597
596#: qml/Wizard/Pages/75-report-check.qml:60
598#: qml/Wizard/Pages/75-report-check.qml:60
597msgid "Privacy policy"
599msgid "Privacy policy"
598−msgstr ""
600+msgstr "Reolennoù buhez prevez"
599
601
600#: qml/Wizard/Pages/80-finished.qml:89
602#: qml/Wizard/Pages/80-finished.qml:89
601msgid "Welcome to Ubuntu"
603msgid "Welcome to Ubuntu"
602−msgstr ""
604+msgstr "Donemat en Ubuntu"
603
605
604#: qml/Wizard/Pages/80-finished.qml:104
606#: qml/Wizard/Pages/80-finished.qml:104
605msgid "You are ready to use your device now"
607msgid "You are ready to use your device now"
606−msgstr ""
608+msgstr "Bremañ oc'h prest da implijout ho penveg"
607
609
608#: qml/Wizard/Pages/80-finished.qml:124
610#: qml/Wizard/Pages/80-finished.qml:124
609msgid "Get Started"
611msgid "Get Started"
610−msgstr ""
612+msgstr "Kregiñ ganti"
611
613
612#: qml/Wizard/Pages/here-terms.qml:25
614#: qml/Wizard/Pages/here-terms.qml:25
613msgid "Terms & Conditions"
615msgid "Terms & Conditions"
@@ -637,7 +639,7 @@ msgstr ""
637
639
638#: qml/Wizard/Pages/here-terms.qml:107
640#: qml/Wizard/Pages/here-terms.qml:107
639msgid "Service Terms"
641msgid "Service Terms"
640−msgstr ""
642+msgstr "Divizoù servij"
641
643
642#: qml/Wizard/Pages/passcode-confirm.qml:43
644#: qml/Wizard/Pages/passcode-confirm.qml:43
643#: qml/Wizard/Pages/passcode-desktop.qml:80
645#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -646,16 +648,16 @@ msgstr "Kadarnaat ar c'hod-tremen"
646
648
647#: qml/Wizard/Pages/passcode-confirm.qml:45
649#: qml/Wizard/Pages/passcode-confirm.qml:45
648msgid "Incorrect passcode."
650msgid "Incorrect passcode."
649−msgstr ""
651+msgstr "Kod direizh"
650
652
651#: qml/Wizard/Pages/passcode-confirm.qml:45
653#: qml/Wizard/Pages/passcode-confirm.qml:45
652msgctxt "Enter the passcode again"
654msgctxt "Enter the passcode again"
653msgid "Please re-enter."
655msgid "Please re-enter."
654−msgstr ""
656+msgstr "Skrivit adarre, mar plij."
655
657
656#: qml/Wizard/Pages/passcode-desktop.qml:30
658#: qml/Wizard/Pages/passcode-desktop.qml:30
657msgid "Lock Screen Passcode"
659msgid "Lock Screen Passcode"
658−msgstr ""
660+msgstr "Kod da brennañ ar skramm"
659
661
660#: qml/Wizard/Pages/passcode-desktop.qml:56
662#: qml/Wizard/Pages/passcode-desktop.qml:56
661msgid "Enter 4 numbers to setup your passcode"
663msgid "Enter 4 numbers to setup your passcode"
@@ -664,11 +666,11 @@ msgstr ""
664#: qml/Wizard/Pages/passcode-desktop.qml:65
666#: qml/Wizard/Pages/passcode-desktop.qml:65
665#: qml/Wizard/Pages/passcode-set.qml:54
667#: qml/Wizard/Pages/passcode-set.qml:54
666msgid "Choose passcode"
668msgid "Choose passcode"
667−msgstr ""
669+msgstr "Choaz ur c'hod"
668
670
669#: qml/Wizard/Pages/passcode-desktop.qml:105
671#: qml/Wizard/Pages/passcode-desktop.qml:105
670msgid "Passcode too short"
672msgid "Passcode too short"
671−msgstr ""
673+msgstr "Kod re verr"
672
674
673#: qml/Wizard/Pages/passcode-desktop.qml:107
675#: qml/Wizard/Pages/passcode-desktop.qml:107
674msgid "Passcodes match"
676msgid "Passcodes match"
@@ -684,27 +686,27 @@ msgstr ""
684
686
685#: qml/Wizard/Pages/password-set.qml:30
687#: qml/Wizard/Pages/password-set.qml:30
686msgid "Lock Screen Password"
688msgid "Lock Screen Password"
687−msgstr ""
689+msgstr "Ger-tremen da brennañ ar skramm"
688
690
689#: qml/Wizard/Pages/password-set.qml:61
691#: qml/Wizard/Pages/password-set.qml:61
690msgid "Enter at least 8 characters"
692msgid "Enter at least 8 characters"
691−msgstr ""
693+msgstr "Skrivit 8 arouezenn da vihanañ"
692
694
693#: qml/Wizard/Pages/password-set.qml:73
695#: qml/Wizard/Pages/password-set.qml:73
694msgid "Choose password"
696msgid "Choose password"
695−msgstr ""
697+msgstr "Choaz ur ger-tremen"
696
698
697#: qml/Wizard/Pages/password-set.qml:103
699#: qml/Wizard/Pages/password-set.qml:103
698msgid "Confirm password"
700msgid "Confirm password"
699−msgstr ""
701+msgstr "Kadarnaat ar ger-tremen"
700
702
701#: qml/Wizard/Pages/sim.qml:27
703#: qml/Wizard/Pages/sim.qml:27
702msgid "No SIM card installed"
704msgid "No SIM card installed"
703−msgstr ""
705+msgstr "N'eus kartenn SIM ebet"
704
706
705#: qml/Wizard/Pages/sim.qml:54
707#: qml/Wizard/Pages/sim.qml:54
706msgid "SIM card added"
708msgid "SIM card added"
707−msgstr ""
709+msgstr "Lakaet ez eus bet ur gartenn SIM"
708
710
709#: qml/Wizard/Pages/sim.qml:55
711#: qml/Wizard/Pages/sim.qml:55
710msgid "You must restart the device to access the mobile network."
712msgid "You must restart the device to access the mobile network."
@@ -724,27 +726,27 @@ msgstr ""
724
726
725#: qml/Wizard/PasswordMeter.qml:87
727#: qml/Wizard/PasswordMeter.qml:87
726msgid "Passwords match"
728msgid "Passwords match"
727−msgstr ""
729+msgstr "Klotañ a ra ar gerioù-tremen an eil gant egile"
728
730
729#: qml/Wizard/PasswordMeter.qml:89
731#: qml/Wizard/PasswordMeter.qml:89
730msgid "Passwords do not match"
732msgid "Passwords do not match"
731−msgstr ""
733+msgstr "Ne glot ket ar gerioù-tremen"
732
734
733#: qml/Wizard/PasswordMeter.qml:93
735#: qml/Wizard/PasswordMeter.qml:93
734msgid "Strong password"
736msgid "Strong password"
735−msgstr ""
737+msgstr "Ger-tremen sur"
736
738
737#: qml/Wizard/PasswordMeter.qml:95
739#: qml/Wizard/PasswordMeter.qml:95
738msgid "Fair password"
740msgid "Fair password"
739−msgstr ""
741+msgstr "Ger-tremen reizh"
740
742
741#: qml/Wizard/PasswordMeter.qml:97
743#: qml/Wizard/PasswordMeter.qml:97
742msgid "Weak password"
744msgid "Weak password"
743−msgstr ""
745+msgstr "Ger-tremen diasur"
744
746
745#: qml/Wizard/PasswordMeter.qml:99
747#: qml/Wizard/PasswordMeter.qml:99
746msgid "Very weak password"
748msgid "Very weak password"
747−msgstr ""
749+msgstr "Ger-tremen diasur-kenañ"
748
750
749#~ msgid "Close"
751#~ msgid "Close"
750#~ msgstr "Serriñ"
752#~ msgstr "Serriñ"
@@ -1064,12 +1066,3 @@ msgstr ""
1064
1066
1065#~ msgid "Call back"
1067#~ msgid "Call back"
1066#~ msgstr "Gervel en-dro"
1068#~ msgstr "Gervel en-dro"
1067−
1068−#~ msgid "Welcome to your Ubuntu device."
1069−#~ msgstr "Donemat en ho penveg Ubuntu"
1070−
1071−#~ msgid "Please select how you’d like to unlock your device."
1072−#~ msgstr "Diuzit penaos e fell deoc'h dibrennañ ho penveg, mar plij."
1073−
1074−#~ msgid "Your device is now ready to use."
1075−#~ msgstr "Prest eo ho penveg da vezañ implijet bremañ."
po/bs.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-12-01 20:06+0000\n"
11"PO-Revision-Date: 2015-12-01 20:06+0000\n"
12"Last-Translator: Kenan Gutić <Unknown>\n"
12"Last-Translator: Kenan Gutić <Unknown>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -453,19 +453,19 @@ msgstr ""
453msgid "Swipe up to manage the app"
453msgid "Swipe up to manage the app"
454msgstr ""
454msgstr ""
455
455
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
459−
460#: qml/Tutorial/TutorialLeftLong.qml:47
456#: qml/Tutorial/TutorialLeftLong.qml:47
461msgid "Long swipe from the left edge to open the Today scope"
457msgid "Long swipe from the left edge to open the Today scope"
462msgstr ""
458msgstr ""
463
459
464−#: qml/Tutorial/TutorialRight.qml:54
460+#: qml/Tutorial/TutorialLeft.qml:47
465−msgid "Hover your mouse on the right edge to view your open apps"
461+msgid "Swipe from the left edge to open the launcher"
466msgstr ""
462msgstr ""
467
463
468#: qml/Tutorial/TutorialRight.qml:55
464#: qml/Tutorial/TutorialRight.qml:55
465+msgid "Push your mouse against the right edge to view your open apps"
466+msgstr ""
467+
468+#: qml/Tutorial/TutorialRight.qml:56
469msgid "Short or long swipe from the right edge to view your open apps"
469msgid "Short or long swipe from the right edge to view your open apps"
470msgstr ""
470msgstr ""
471
471
po/ca.po+11−11
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-04 09:48+0000\n"
11"PO-Revision-Date: 2015-07-04 09:48+0000\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
13"Language-Team: Catalan <ca@li.org>\n"
13"Language-Team: Catalan <ca@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -207,11 +207,11 @@ msgstr "Cerca"
207
207
208#: qml/Dash/PageHeaderExtraPanel.qml:55
208#: qml/Dash/PageHeaderExtraPanel.qml:55
209msgid "Recent Searches"
209msgid "Recent Searches"
210−msgstr ""
210+msgstr "Cerques recents"
211
211
212#: qml/Dash/PageHeaderExtraPanel.qml:66
212#: qml/Dash/PageHeaderExtraPanel.qml:66
213msgid "Clear All"
213msgid "Clear All"
214−msgstr ""
214+msgstr "Neteja-ho tot"
215
215
216#: qml/Dash/Previews/PreviewActionCombo.qml:35
216#: qml/Dash/Previews/PreviewActionCombo.qml:35
217msgid "More..."
217msgid "More..."
@@ -452,19 +452,19 @@ msgstr ""
452msgid "Swipe up to manage the app"
452msgid "Swipe up to manage the app"
453msgstr ""
453msgstr ""
454
454
455−#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Swipe from the left edge to open the launcher"
457−msgstr ""
458−
459#: qml/Tutorial/TutorialLeftLong.qml:47
455#: qml/Tutorial/TutorialLeftLong.qml:47
460msgid "Long swipe from the left edge to open the Today scope"
456msgid "Long swipe from the left edge to open the Today scope"
461msgstr ""
457msgstr ""
462
458
463−#: qml/Tutorial/TutorialRight.qml:54
459+#: qml/Tutorial/TutorialLeft.qml:47
464−msgid "Hover your mouse on the right edge to view your open apps"
460+msgid "Swipe from the left edge to open the launcher"
465msgstr ""
461msgstr ""
466
462
467#: qml/Tutorial/TutorialRight.qml:55
463#: qml/Tutorial/TutorialRight.qml:55
464+msgid "Push your mouse against the right edge to view your open apps"
465+msgstr ""
466+
467+#: qml/Tutorial/TutorialRight.qml:56
468msgid "Short or long swipe from the right edge to view your open apps"
468msgid "Short or long swipe from the right edge to view your open apps"
469msgstr ""
469msgstr ""
470
470
po/ca@valencia.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-02-22 15:22+0000\n"
11"PO-Revision-Date: 2015-02-22 15:22+0000\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
13"Language-Team: Catalan <ca@li.org>\n"
13"Language-Team: Catalan <ca@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -452,19 +452,19 @@ msgstr ""
452msgid "Swipe up to manage the app"
452msgid "Swipe up to manage the app"
453msgstr ""
453msgstr ""
454
454
455−#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Swipe from the left edge to open the launcher"
457−msgstr ""
458−
459#: qml/Tutorial/TutorialLeftLong.qml:47
455#: qml/Tutorial/TutorialLeftLong.qml:47
460msgid "Long swipe from the left edge to open the Today scope"
456msgid "Long swipe from the left edge to open the Today scope"
461msgstr ""
457msgstr ""
462
458
463−#: qml/Tutorial/TutorialRight.qml:54
459+#: qml/Tutorial/TutorialLeft.qml:47
464−msgid "Hover your mouse on the right edge to view your open apps"
460+msgid "Swipe from the left edge to open the launcher"
465msgstr ""
461msgstr ""
466
462
467#: qml/Tutorial/TutorialRight.qml:55
463#: qml/Tutorial/TutorialRight.qml:55
464+msgid "Push your mouse against the right edge to view your open apps"
465+msgstr ""
466+
467+#: qml/Tutorial/TutorialRight.qml:56
468msgid "Short or long swipe from the right edge to view your open apps"
468msgid "Short or long swipe from the right edge to view your open apps"
469msgstr ""
469msgstr ""
470
470
po/ce.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-02-15 04:01+0000\n"
11"PO-Revision-Date: 2015-02-15 04:01+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Chechen <ce@li.org>\n"
13"Language-Team: Chechen <ce@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/ckb.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/cs.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-07 10:44+0000\n"
11"PO-Revision-Date: 2015-07-07 10:44+0000\n"
12"Last-Translator: Vojtěch Daněk <vdanek@outlook.com>\n"
12"Last-Translator: Vojtěch Daněk <vdanek@outlook.com>\n"
13"Language-Team: Czech <cs@li.org>\n"
13"Language-Team: Czech <cs@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20"Language: cs\n"
20"Language: cs\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -453,19 +453,19 @@ msgstr ""
453msgid "Swipe up to manage the app"
453msgid "Swipe up to manage the app"
454msgstr ""
454msgstr ""
455
455
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
459−
460#: qml/Tutorial/TutorialLeftLong.qml:47
456#: qml/Tutorial/TutorialLeftLong.qml:47
461msgid "Long swipe from the left edge to open the Today scope"
457msgid "Long swipe from the left edge to open the Today scope"
462msgstr ""
458msgstr ""
463
459
464−#: qml/Tutorial/TutorialRight.qml:54
460+#: qml/Tutorial/TutorialLeft.qml:47
465−msgid "Hover your mouse on the right edge to view your open apps"
461+msgid "Swipe from the left edge to open the launcher"
466msgstr ""
462msgstr ""
467
463
468#: qml/Tutorial/TutorialRight.qml:55
464#: qml/Tutorial/TutorialRight.qml:55
465+msgid "Push your mouse against the right edge to view your open apps"
466+msgstr ""
467+
468+#: qml/Tutorial/TutorialRight.qml:56
469msgid "Short or long swipe from the right edge to view your open apps"
469msgid "Short or long swipe from the right edge to view your open apps"
470msgstr ""
470msgstr ""
471
471
po/cy.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-31 13:21+0000\n"
11"PO-Revision-Date: 2015-07-31 13:21+0000\n"
12"Last-Translator: Owen Llywelyn <owen.llywelyn@gmail.com>\n"
12"Last-Translator: Owen Llywelyn <owen.llywelyn@gmail.com>\n"
13"Language-Team: Welsh <cy@li.org>\n"
13"Language-Team: Welsh <cy@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
17"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
18"2 : 3;\n"
18"2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -457,19 +457,19 @@ msgstr ""
457msgid "Swipe up to manage the app"
457msgid "Swipe up to manage the app"
458msgstr ""
458msgstr ""
459
459
460−#: qml/Tutorial/TutorialLeft.qml:47
461−msgid "Swipe from the left edge to open the launcher"
462−msgstr ""
463−
464#: qml/Tutorial/TutorialLeftLong.qml:47
460#: qml/Tutorial/TutorialLeftLong.qml:47
465msgid "Long swipe from the left edge to open the Today scope"
461msgid "Long swipe from the left edge to open the Today scope"
466msgstr ""
462msgstr ""
467
463
468−#: qml/Tutorial/TutorialRight.qml:54
464+#: qml/Tutorial/TutorialLeft.qml:47
469−msgid "Hover your mouse on the right edge to view your open apps"
465+msgid "Swipe from the left edge to open the launcher"
470msgstr ""
466msgstr ""
471
467
472#: qml/Tutorial/TutorialRight.qml:55
468#: qml/Tutorial/TutorialRight.qml:55
469+msgid "Push your mouse against the right edge to view your open apps"
470+msgstr ""
471+
472+#: qml/Tutorial/TutorialRight.qml:56
473msgid "Short or long swipe from the right edge to view your open apps"
473msgid "Short or long swipe from the right edge to view your open apps"
474msgstr ""
474msgstr ""
475
475
po/da.po+9−9
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
12"PO-Revision-Date: 2015-07-06 12:05+0000\n"
12"PO-Revision-Date: 2015-07-06 12:05+0000\n"
13"Last-Translator: Folmer Fredslund <Unknown>\n"
13"Last-Translator: Folmer Fredslund <Unknown>\n"
14"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
14"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
18"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -451,19 +451,19 @@ msgstr ""
451msgid "Swipe up to manage the app"
451msgid "Swipe up to manage the app"
452msgstr ""
452msgstr ""
453
453
454−#: qml/Tutorial/TutorialLeft.qml:47
455−msgid "Swipe from the left edge to open the launcher"
456−msgstr ""
457−
458#: qml/Tutorial/TutorialLeftLong.qml:47
454#: qml/Tutorial/TutorialLeftLong.qml:47
459msgid "Long swipe from the left edge to open the Today scope"
455msgid "Long swipe from the left edge to open the Today scope"
460msgstr ""
456msgstr ""
461
457
462−#: qml/Tutorial/TutorialRight.qml:54
458+#: qml/Tutorial/TutorialLeft.qml:47
463−msgid "Hover your mouse on the right edge to view your open apps"
459+msgid "Swipe from the left edge to open the launcher"
464msgstr ""
460msgstr ""
465
461
466#: qml/Tutorial/TutorialRight.qml:55
462#: qml/Tutorial/TutorialRight.qml:55
463+msgid "Push your mouse against the right edge to view your open apps"
464+msgstr ""
465+
466+#: qml/Tutorial/TutorialRight.qml:56
467msgid "Short or long swipe from the right edge to view your open apps"
467msgid "Short or long swipe from the right edge to view your open apps"
468msgstr ""
468msgstr ""
469
469
po/de.po+90−78
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-13 15:41+0000\n"
11"PO-Revision-Date: 2016-03-13 15:41+0000\n"
12"Last-Translator: schuko24 <gerdsaenger@t-online.de>\n"
12"Last-Translator: schuko24 <gerdsaenger@t-online.de>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -188,11 +188,11 @@ msgstr "Zu Favoriten hinzufügen"
188
188
189#: qml/Dash/FiltersPopover.qml:60
189#: qml/Dash/FiltersPopover.qml:60
190msgid "Refine your results"
190msgid "Refine your results"
191−msgstr ""
191+msgstr "Ergebnisse verfeinern"
192
192
193#: qml/Dash/FiltersPopover.qml:69
193#: qml/Dash/FiltersPopover.qml:69
194msgid "Reset"
194msgid "Reset"
195−msgstr ""
195+msgstr "Zurücksetzen"
196
196
197#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
197#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
198msgid "See less"
198msgid "See less"
@@ -209,11 +209,11 @@ msgstr "Suchen"
209
209
210#: qml/Dash/PageHeaderExtraPanel.qml:55
210#: qml/Dash/PageHeaderExtraPanel.qml:55
211msgid "Recent Searches"
211msgid "Recent Searches"
212−msgstr ""
212+msgstr "Letzte Suchanfragen"
213
213
214#: qml/Dash/PageHeaderExtraPanel.qml:66
214#: qml/Dash/PageHeaderExtraPanel.qml:66
215msgid "Clear All"
215msgid "Clear All"
216−msgstr ""
216+msgstr "Alle zurücksetzen"
217
217
218#: qml/Dash/Previews/PreviewActionCombo.qml:35
218#: qml/Dash/Previews/PreviewActionCombo.qml:35
219msgid "More..."
219msgid "More..."
@@ -432,51 +432,56 @@ msgstr "Zurückrufen"
432
432
433#: qml/Stages/SideStage.qml:76
433#: qml/Stages/SideStage.qml:76
434msgid "Drag using 3 fingers any application from one window to the other"
434msgid "Drag using 3 fingers any application from one window to the other"
435−msgstr ""
435+msgstr "Eine Anwendung mit 3 Fingern von einem Fenster zum anderen ziehen"
436
436
437#: qml/Tutorial/TutorialBottom.qml:78
437#: qml/Tutorial/TutorialBottom.qml:78
438msgid "Swipe up to add a contact"
438msgid "Swipe up to add a contact"
439−msgstr ""
439+msgstr "Aufwärts wischen, um einen Kontakt hinzuzufügen"
440
440
441#: qml/Tutorial/TutorialBottom.qml:80
441#: qml/Tutorial/TutorialBottom.qml:80
442msgid "Swipe up for favorite calculations"
442msgid "Swipe up for favorite calculations"
443−msgstr ""
443+msgstr "Aufwärts wischen, um die Favoriten-Rechnungen anzuzeigen"
444
444
445#: qml/Tutorial/TutorialBottom.qml:82
445#: qml/Tutorial/TutorialBottom.qml:82
446msgid "Swipe up for recent calls"
446msgid "Swipe up for recent calls"
447−msgstr ""
447+msgstr "Aufwärts wischen, um die letzten Anrufe anzuzeigen"
448
448
449#: qml/Tutorial/TutorialBottom.qml:84
449#: qml/Tutorial/TutorialBottom.qml:84
450msgid "Swipe up to create a message"
450msgid "Swipe up to create a message"
451−msgstr ""
451+msgstr "Aufwärts wischen, um eine Nachricht zu erstellen"
452
452
453#: qml/Tutorial/TutorialBottom.qml:85
453#: qml/Tutorial/TutorialBottom.qml:85
454msgid "Swipe up to manage the app"
454msgid "Swipe up to manage the app"
455−msgstr ""
455+msgstr "Aufwärts wischen, um die Anwendung zu verwalten"
456−
457−#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Swipe from the left edge to open the launcher"
459−msgstr ""
460
456
461#: qml/Tutorial/TutorialLeftLong.qml:47
457#: qml/Tutorial/TutorialLeftLong.qml:47
462msgid "Long swipe from the left edge to open the Today scope"
458msgid "Long swipe from the left edge to open the Today scope"
463msgstr ""
459msgstr ""
460+"Langgezogene Wischgeste von der linken Kante, um den Heute-Scope zu öffnen"
464
461
465−#: qml/Tutorial/TutorialRight.qml:54
462+#: qml/Tutorial/TutorialLeft.qml:47
466−msgid "Hover your mouse on the right edge to view your open apps"
463+msgid "Swipe from the left edge to open the launcher"
467−msgstr ""
464+msgstr "Von der linken Kante wischen, um den Starter zu öffnen"
468
465
469#: qml/Tutorial/TutorialRight.qml:55
466#: qml/Tutorial/TutorialRight.qml:55
467+msgid "Push your mouse against the right edge to view your open apps"
468+msgstr ""
469+
470+#: qml/Tutorial/TutorialRight.qml:56
470msgid "Short or long swipe from the right edge to view your open apps"
471msgid "Short or long swipe from the right edge to view your open apps"
471msgstr ""
472msgstr ""
473+"Kurze oder langgezogene Wischgeste von der rechten Kante, um die offenen "
474+"Anwendungen zu sehen"
472
475
473#: qml/Tutorial/TutorialTop.qml:53
476#: qml/Tutorial/TutorialTop.qml:53
474msgid "Swipe from the top right edge to open the notification bar"
477msgid "Swipe from the top right edge to open the notification bar"
475msgstr ""
478msgstr ""
479+"Vom rechten oberen Rand her wischen, um die Benachrichtigungsleiste zu öffnen"
476
480
477#: qml/Tutorial/TutorialTop.qml:54
481#: qml/Tutorial/TutorialTop.qml:54
478msgid "Swipe from the top edge to open the notification bar"
482msgid "Swipe from the top edge to open the notification bar"
479msgstr ""
483msgstr ""
484+"Vom oberen Rand her wischen, um die Benachrichtigungsleiste zu öffnen"
480
485
481#: qml/Wizard/Page.qml:54
486#: qml/Wizard/Page.qml:54
482msgctxt "Button: Go back one page in the Wizard"
487msgctxt "Button: Go back one page in the Wizard"
@@ -485,7 +490,7 @@ msgstr "Zurück"
485
490
486#: qml/Wizard/Pages/10-welcome.qml:27
491#: qml/Wizard/Pages/10-welcome.qml:27
487msgid "Language"
492msgid "Language"
488−msgstr ""
493+msgstr "Sprache"
489
494
490#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
495#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
491#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
496#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -494,7 +499,7 @@ msgstr ""
494#: qml/Wizard/Pages/passcode-desktop.qml:124
499#: qml/Wizard/Pages/passcode-desktop.qml:124
495#: qml/Wizard/Pages/password-set.qml:141
500#: qml/Wizard/Pages/password-set.qml:141
496msgid "Next"
501msgid "Next"
497−msgstr ""
502+msgstr "Weiter"
498
503
499#: qml/Wizard/Pages/30-wifi.qml:29
504#: qml/Wizard/Pages/30-wifi.qml:29
500msgid "Connect to Wi‑Fi"
505msgid "Connect to Wi‑Fi"
@@ -502,15 +507,15 @@ msgstr "Mit WLAN verbinden"
502
507
503#: qml/Wizard/Pages/30-wifi.qml:130
508#: qml/Wizard/Pages/30-wifi.qml:130
504msgid "Connected"
509msgid "Connected"
505−msgstr ""
510+msgstr "Verbunden"
506
511
507#: qml/Wizard/Pages/30-wifi.qml:163
512#: qml/Wizard/Pages/30-wifi.qml:163
508msgid "Available Wi-Fi networks"
513msgid "Available Wi-Fi networks"
509−msgstr ""
514+msgstr "Verfügbare Funknetzwerke"
510
515
511#: qml/Wizard/Pages/30-wifi.qml:164
516#: qml/Wizard/Pages/30-wifi.qml:164
512msgid "No available Wi-Fi networks"
517msgid "No available Wi-Fi networks"
513−msgstr ""
518+msgstr "Keine Funknetzwerke verfügbar"
514
519
515#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
520#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
516#: qml/Wizard/Pages/sim.qml:101
521#: qml/Wizard/Pages/sim.qml:101
@@ -519,98 +524,102 @@ msgstr "Überspringen"
519
524
520#: qml/Wizard/Pages/40-location.qml:27
525#: qml/Wizard/Pages/40-location.qml:27
521msgid "Location Services"
526msgid "Location Services"
522−msgstr ""
527+msgstr "Standortdienste"
523
528
524#: qml/Wizard/Pages/40-location.qml:83
529#: qml/Wizard/Pages/40-location.qml:83
525msgid ""
530msgid ""
526"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
531"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
527"(recommended)"
532"(recommended)"
528msgstr ""
533msgstr ""
534+"GPS, WLAN-Netzwerke und Mobilfunknetzwerk anonymisiert für die "
535+"Standortbestimmung nutzen (empfohlen)"
529
536
530#: qml/Wizard/Pages/40-location.qml:105
537#: qml/Wizard/Pages/40-location.qml:105
531#, qt-format
538#, qt-format
532msgid "By selecting this option you agree to the Nokia HERE %1."
539msgid "By selecting this option you agree to the Nokia HERE %1."
533−msgstr ""
540+msgstr "Mit dem Auswählen dieser Option akzeptieren Sie die Nokia HERE %1."
534
541
535#: qml/Wizard/Pages/40-location.qml:106
542#: qml/Wizard/Pages/40-location.qml:106
536msgctxt "part of: Nokia HERE terms and conditions"
543msgctxt "part of: Nokia HERE terms and conditions"
537msgid "terms and conditions"
544msgid "terms and conditions"
538−msgstr ""
545+msgstr "Nutzungsbedingungen"
539
546
540#: qml/Wizard/Pages/40-location.qml:160
547#: qml/Wizard/Pages/40-location.qml:160
541msgid "GPS only"
548msgid "GPS only"
542−msgstr ""
549+msgstr "Nur GPS"
543
550
544#: qml/Wizard/Pages/40-location.qml:214
551#: qml/Wizard/Pages/40-location.qml:214
545msgid "Don't use my location"
552msgid "Don't use my location"
546−msgstr ""
553+msgstr "Meinen Standort nicht verwenden"
547
554
548#: qml/Wizard/Pages/40-location.qml:260
555#: qml/Wizard/Pages/40-location.qml:260
549msgid "You can change it later in System Settings."
556msgid "You can change it later in System Settings."
550−msgstr ""
557+msgstr "Dies kann später in den Systemeinstellungen geändert werden."
551
558
552#: qml/Wizard/Pages/50-timezone.qml:29
559#: qml/Wizard/Pages/50-timezone.qml:29
553msgid "Time Zone"
560msgid "Time Zone"
554−msgstr ""
561+msgstr "Zeitzone"
555
562
556#: qml/Wizard/Pages/50-timezone.qml:178
563#: qml/Wizard/Pages/50-timezone.qml:178
557msgid "Enter your city"
564msgid "Enter your city"
558−msgstr ""
565+msgstr "Bitte Ihre Stadt eingeben"
559
566
560#: qml/Wizard/Pages/60-account.qml:24
567#: qml/Wizard/Pages/60-account.qml:24
561msgid "Personalize Your Device"
568msgid "Personalize Your Device"
562−msgstr ""
569+msgstr "Ihr Gerät personalisieren"
563
570
564#: qml/Wizard/Pages/60-account.qml:48
571#: qml/Wizard/Pages/60-account.qml:48
565msgid "Preferred Name"
572msgid "Preferred Name"
566−msgstr ""
573+msgstr "Bevorzugter Name"
567
574
568#: qml/Wizard/Pages/70-passwd-type.qml:39
575#: qml/Wizard/Pages/70-passwd-type.qml:39
569msgid "Lock Screen"
576msgid "Lock Screen"
570−msgstr ""
577+msgstr "Sperrbildschirm"
571
578
572#: qml/Wizard/Pages/70-passwd-type.qml:101
579#: qml/Wizard/Pages/70-passwd-type.qml:101
573msgctxt "Label: Type of security method"
580msgctxt "Label: Type of security method"
574msgid "Create new password"
581msgid "Create new password"
575−msgstr ""
582+msgstr "Neues Passwort erstellen"
576
583
577#: qml/Wizard/Pages/70-passwd-type.qml:103
584#: qml/Wizard/Pages/70-passwd-type.qml:103
578msgctxt "Label: Type of security method"
585msgctxt "Label: Type of security method"
579msgid "Create passcode (numbers only)"
586msgid "Create passcode (numbers only)"
580−msgstr ""
587+msgstr "PIN erstellen (nur Ziffern)"
581
588
582#: qml/Wizard/Pages/70-passwd-type.qml:105
589#: qml/Wizard/Pages/70-passwd-type.qml:105
583msgctxt "Label: Type of security method"
590msgctxt "Label: Type of security method"
584msgid "No lock code"
591msgid "No lock code"
585−msgstr ""
592+msgstr "Kein Sperrcode"
586
593
587#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
594#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
588msgid "Privacy Policy"
595msgid "Privacy Policy"
589−msgstr ""
596+msgstr "Datenschutzerklärung"
590
597
591#: qml/Wizard/Pages/75-report-check.qml:26
598#: qml/Wizard/Pages/75-report-check.qml:26
592msgid "Help Us Improve"
599msgid "Help Us Improve"
593−msgstr ""
600+msgstr "Bei der Verbesserung unterstützen"
594
601
595#: qml/Wizard/Pages/75-report-check.qml:59
602#: qml/Wizard/Pages/75-report-check.qml:59
596msgid "Improve system performance by sending us crashes and error reports."
603msgid "Improve system performance by sending us crashes and error reports."
597msgstr ""
604msgstr ""
605+"Bei der Systemverbesserung unterstützen, in dem Absturz- und Fehlerberichte "
606+"gesendet werden."
598
607
599#: qml/Wizard/Pages/75-report-check.qml:60
608#: qml/Wizard/Pages/75-report-check.qml:60
600msgid "Privacy policy"
609msgid "Privacy policy"
601−msgstr ""
610+msgstr "Datenschutzerklärung"
602
611
603#: qml/Wizard/Pages/80-finished.qml:89
612#: qml/Wizard/Pages/80-finished.qml:89
604msgid "Welcome to Ubuntu"
613msgid "Welcome to Ubuntu"
605−msgstr ""
614+msgstr "Willkommen bei Ubuntu"
606
615
607#: qml/Wizard/Pages/80-finished.qml:104
616#: qml/Wizard/Pages/80-finished.qml:104
608msgid "You are ready to use your device now"
617msgid "You are ready to use your device now"
609−msgstr ""
618+msgstr "Sie können Ihr Gerät nun verwenden"
610
619
611#: qml/Wizard/Pages/80-finished.qml:124
620#: qml/Wizard/Pages/80-finished.qml:124
612msgid "Get Started"
621msgid "Get Started"
613−msgstr ""
622+msgstr "Erste Schritte"
614
623
615#: qml/Wizard/Pages/here-terms.qml:25
624#: qml/Wizard/Pages/here-terms.qml:25
616msgid "Terms & Conditions"
625msgid "Terms & Conditions"
@@ -619,6 +628,8 @@ msgstr "Nutzungsbedingungen"
619#: qml/Wizard/Pages/here-terms.qml:69
628#: qml/Wizard/Pages/here-terms.qml:69
620msgid "Your device uses positioning technologies provided by HERE."
629msgid "Your device uses positioning technologies provided by HERE."
621msgstr ""
630msgstr ""
631+"Das Gerät verwendet Standortermittlungsdienste, die durch HERE "
632+"bereitgestellt werden."
622
633
623#: qml/Wizard/Pages/here-terms.qml:81
634#: qml/Wizard/Pages/here-terms.qml:81
624msgid ""
635msgid ""
@@ -626,21 +637,26 @@ msgid ""
626"collects information about nearby cell towers and Wi-Fi hotspots around your "
637"collects information about nearby cell towers and Wi-Fi hotspots around your "
627"current location whenever your position is being found."
638"current location whenever your position is being found."
628msgstr ""
639msgstr ""
640+"Um die Standortbestimmung zu ermöglichen und zu verbessern, sammelt HERE "
641+"Informationen über nahegelegene Netzwerkstationen und WLAN-Hotspots in der "
642+"Umgebung, sobald eine Position erfasst wurde."
629
643
630#: qml/Wizard/Pages/here-terms.qml:93
644#: qml/Wizard/Pages/here-terms.qml:93
631msgid ""
645msgid ""
632"The information collected is used to analyze the service and to improve the "
646"The information collected is used to analyze the service and to improve the "
633"use of service, but not to identify you personally."
647"use of service, but not to identify you personally."
634msgstr ""
648msgstr ""
649+"Die gesammelte Information wird zur Analyse und zur Nutzungsverbesserung des "
650+"Dienstes genutzt. Nicht aber zur persönlichen Identifikation."
635
651
636#: qml/Wizard/Pages/here-terms.qml:106
652#: qml/Wizard/Pages/here-terms.qml:106
637#, qt-format
653#, qt-format
638msgid "By continuing, you agree to the HERE platform %1 and %2."
654msgid "By continuing, you agree to the HERE platform %1 and %2."
639−msgstr ""
655+msgstr "Wenn Sie fortfahren, stimmen Sie mit den HERE %1 und %2 überein."
640
656
641#: qml/Wizard/Pages/here-terms.qml:107
657#: qml/Wizard/Pages/here-terms.qml:107
642msgid "Service Terms"
658msgid "Service Terms"
643−msgstr ""
659+msgstr "Bedingungen des Dienstes"
644
660
645#: qml/Wizard/Pages/passcode-confirm.qml:43
661#: qml/Wizard/Pages/passcode-confirm.qml:43
646#: qml/Wizard/Pages/passcode-desktop.qml:80
662#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -649,69 +665,70 @@ msgstr "PIN bestätigen"
649
665
650#: qml/Wizard/Pages/passcode-confirm.qml:45
666#: qml/Wizard/Pages/passcode-confirm.qml:45
651msgid "Incorrect passcode."
667msgid "Incorrect passcode."
652−msgstr ""
668+msgstr "Falsche PIN."
653
669
654#: qml/Wizard/Pages/passcode-confirm.qml:45
670#: qml/Wizard/Pages/passcode-confirm.qml:45
655msgctxt "Enter the passcode again"
671msgctxt "Enter the passcode again"
656msgid "Please re-enter."
672msgid "Please re-enter."
657−msgstr ""
673+msgstr "Bitte erneut eingeben."
658
674
659#: qml/Wizard/Pages/passcode-desktop.qml:30
675#: qml/Wizard/Pages/passcode-desktop.qml:30
660msgid "Lock Screen Passcode"
676msgid "Lock Screen Passcode"
661−msgstr ""
677+msgstr "Sperrbildschirm-PIN"
662
678
663#: qml/Wizard/Pages/passcode-desktop.qml:56
679#: qml/Wizard/Pages/passcode-desktop.qml:56
664msgid "Enter 4 numbers to setup your passcode"
680msgid "Enter 4 numbers to setup your passcode"
665−msgstr ""
681+msgstr "Geben Sie 4 Ziffern ein, um Ihre PIN einzurichten"
666
682
667#: qml/Wizard/Pages/passcode-desktop.qml:65
683#: qml/Wizard/Pages/passcode-desktop.qml:65
668#: qml/Wizard/Pages/passcode-set.qml:54
684#: qml/Wizard/Pages/passcode-set.qml:54
669msgid "Choose passcode"
685msgid "Choose passcode"
670−msgstr ""
686+msgstr "PIN wählen"
671
687
672#: qml/Wizard/Pages/passcode-desktop.qml:105
688#: qml/Wizard/Pages/passcode-desktop.qml:105
673msgid "Passcode too short"
689msgid "Passcode too short"
674−msgstr ""
690+msgstr "PIN zu kurz"
675
691
676#: qml/Wizard/Pages/passcode-desktop.qml:107
692#: qml/Wizard/Pages/passcode-desktop.qml:107
677msgid "Passcodes match"
693msgid "Passcodes match"
678−msgstr ""
694+msgstr "PINs stimmen überein"
679
695
680#: qml/Wizard/Pages/passcode-desktop.qml:109
696#: qml/Wizard/Pages/passcode-desktop.qml:109
681msgid "Passcodes do not match"
697msgid "Passcodes do not match"
682−msgstr ""
698+msgstr "PINs stimmen nicht überein"
683
699
684#: qml/Wizard/Pages/passcode-set.qml:62
700#: qml/Wizard/Pages/passcode-set.qml:62
685msgid "Passcode must be 4 characters long"
701msgid "Passcode must be 4 characters long"
686−msgstr ""
702+msgstr "PIN muss 4 Ziffern lang sein"
687
703
688#: qml/Wizard/Pages/password-set.qml:30
704#: qml/Wizard/Pages/password-set.qml:30
689msgid "Lock Screen Password"
705msgid "Lock Screen Password"
690−msgstr ""
706+msgstr "Sperrbildschirm-Passwort"
691
707
692#: qml/Wizard/Pages/password-set.qml:61
708#: qml/Wizard/Pages/password-set.qml:61
693msgid "Enter at least 8 characters"
709msgid "Enter at least 8 characters"
694−msgstr ""
710+msgstr "Geben Sie mindestens 8 Zeichen ein"
695
711
696#: qml/Wizard/Pages/password-set.qml:73
712#: qml/Wizard/Pages/password-set.qml:73
697msgid "Choose password"
713msgid "Choose password"
698−msgstr ""
714+msgstr "Wählen Sie ein Passwort"
699
715
700#: qml/Wizard/Pages/password-set.qml:103
716#: qml/Wizard/Pages/password-set.qml:103
701msgid "Confirm password"
717msgid "Confirm password"
702−msgstr ""
718+msgstr "Passwort bestätigen"
703
719
704#: qml/Wizard/Pages/sim.qml:27
720#: qml/Wizard/Pages/sim.qml:27
705msgid "No SIM card installed"
721msgid "No SIM card installed"
706−msgstr ""
722+msgstr "Keine SIM-Karte im Gerät"
707
723
708#: qml/Wizard/Pages/sim.qml:54
724#: qml/Wizard/Pages/sim.qml:54
709msgid "SIM card added"
725msgid "SIM card added"
710−msgstr ""
726+msgstr "SIM-Karte hinzugefügt"
711
727
712#: qml/Wizard/Pages/sim.qml:55
728#: qml/Wizard/Pages/sim.qml:55
713msgid "You must restart the device to access the mobile network."
729msgid "You must restart the device to access the mobile network."
714msgstr ""
730msgstr ""
731+"Das Gerät muss neu gestartet werden, um auf das Mobilfunknetz zuzugreifen."
715
732
716#: qml/Wizard/Pages/sim.qml:59
733#: qml/Wizard/Pages/sim.qml:59
717msgid "Restart"
734msgid "Restart"
@@ -719,35 +736,35 @@ msgstr "Neustarten"
719
736
720#: qml/Wizard/Pages/sim.qml:78
737#: qml/Wizard/Pages/sim.qml:78
721msgid "You won’t be able to make calls or use text messaging without a SIM."
738msgid "You won’t be able to make calls or use text messaging without a SIM."
722−msgstr ""
739+msgstr "Anrufe oder SMS-Nachrichten sind ohne eine SIM-Karte nicht möglich."
723
740
724#: qml/Wizard/Pages/sim.qml:90
741#: qml/Wizard/Pages/sim.qml:90
725msgid "To proceed with no SIM tap Skip."
742msgid "To proceed with no SIM tap Skip."
726−msgstr ""
743+msgstr "Um ohne SIM-Karte fortzufahren, Überspringen drücken."
727
744
728#: qml/Wizard/PasswordMeter.qml:87
745#: qml/Wizard/PasswordMeter.qml:87
729msgid "Passwords match"
746msgid "Passwords match"
730−msgstr ""
747+msgstr "Passwörter stimmen überein"
731
748
732#: qml/Wizard/PasswordMeter.qml:89
749#: qml/Wizard/PasswordMeter.qml:89
733msgid "Passwords do not match"
750msgid "Passwords do not match"
734−msgstr ""
751+msgstr "Passwörter stimmen nicht überein"
735
752
736#: qml/Wizard/PasswordMeter.qml:93
753#: qml/Wizard/PasswordMeter.qml:93
737msgid "Strong password"
754msgid "Strong password"
738−msgstr ""
755+msgstr "Starkes Passwort"
739
756
740#: qml/Wizard/PasswordMeter.qml:95
757#: qml/Wizard/PasswordMeter.qml:95
741msgid "Fair password"
758msgid "Fair password"
742−msgstr ""
759+msgstr "Ausreichendes Passwort"
743
760
744#: qml/Wizard/PasswordMeter.qml:97
761#: qml/Wizard/PasswordMeter.qml:97
745msgid "Weak password"
762msgid "Weak password"
746−msgstr ""
763+msgstr "Schwaches Passwort"
747
764
748#: qml/Wizard/PasswordMeter.qml:99
765#: qml/Wizard/PasswordMeter.qml:99
749msgid "Very weak password"
766msgid "Very weak password"
750−msgstr ""
767+msgstr "Sehr schwaches Passwort"
751
768
752#~ msgid "Confirm"
769#~ msgid "Confirm"
753#~ msgstr "Bestätigen"
770#~ msgstr "Bestätigen"
@@ -1067,11 +1084,6 @@ msgstr ""
1067#~ msgid "Call back"
1084#~ msgid "Call back"
1068#~ msgstr "Zurückrufen"
1085#~ msgstr "Zurückrufen"
1069
1086
1070−#~ msgid "Your device is now ready to use."
1087+#~ msgid "Hover your mouse on the right edge to view your open apps"
1071−#~ msgstr "Ihr Gerät ist nun einsatzbereit."
1088+#~ msgstr ""
1072−
1089+#~ "Die Maus auf den rechten Rand bewegen, um die offenen Anwendungen zu sehen"
1073−#~ msgid "Welcome to your Ubuntu device."
1074−#~ msgstr "Willkommen auf Ihrem Ubuntu-Gerät."
1075−
1076−#~ msgid "Please select how you’d like to unlock your device."
1077−#~ msgstr "Bitte wählen Sie, wie Sie dieses Gerät entsperren möchten."
po/el.po+79−66
@@ -7,16 +7,16 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11−"PO-Revision-Date: 2015-12-04 09:38+0000\n"
11+"PO-Revision-Date: 2016-04-25 16:24+0000\n"
12"Last-Translator: Aggelos Arnaoutis <angelosarn@hotmail.com>\n"
12"Last-Translator: Aggelos Arnaoutis <angelosarn@hotmail.com>\n"
13"Language-Team: Greek <el@li.org>\n"
13"Language-Team: Greek <el@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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -43,13 +43,13 @@ msgstr "Κλειδωμένη συσκευή"
43msgid "You have been locked out due to too many failed passphrase attempts."
43msgid "You have been locked out due to too many failed passphrase attempts."
44msgstr ""
44msgstr ""
45"Δεν σας επιτρέπεται η πρόσβαση καθώς προσπαθήσατε επανηλλημένως να "
45"Δεν σας επιτρέπεται η πρόσβαση καθώς προσπαθήσατε επανηλλημένως να "
46−"συνδεθείτε με λάθος κωδικό."
46+"συνδεθείτε με λάθος συνθηματικό."
47
47
48#: qml/Components/DelayedLockscreen.qml:65
48#: qml/Components/DelayedLockscreen.qml:65
49msgid "You have been locked out due to too many failed passcode attempts."
49msgid "You have been locked out due to too many failed passcode attempts."
50msgstr ""
50msgstr ""
51"Δεν σας επιτρέπεται η πρόσβαση καθώς προσπαθήσατε επανηλλημένως να "
51"Δεν σας επιτρέπεται η πρόσβαση καθώς προσπαθήσατε επανηλλημένως να "
52−"συνδεθείτε με λάθος κωδικό."
52+"συνδεθείτε με λάθος κωδικό πρόσβασης."
53
53
54#: qml/Components/DelayedLockscreen.qml:74
54#: qml/Components/DelayedLockscreen.qml:74
55#, qt-format
55#, qt-format
@@ -188,11 +188,11 @@ msgstr "Προσθήκη στα αγαπημένα"
188
188
189#: qml/Dash/FiltersPopover.qml:60
189#: qml/Dash/FiltersPopover.qml:60
190msgid "Refine your results"
190msgid "Refine your results"
191−msgstr ""
191+msgstr "Βελτιώστε τα αποτελέσματά σας"
192
192
193#: qml/Dash/FiltersPopover.qml:69
193#: qml/Dash/FiltersPopover.qml:69
194msgid "Reset"
194msgid "Reset"
195−msgstr ""
195+msgstr "Επαναφορά"
196
196
197#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
197#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
198msgid "See less"
198msgid "See less"
@@ -209,11 +209,11 @@ msgstr "Αναζήτηση"
209
209
210#: qml/Dash/PageHeaderExtraPanel.qml:55
210#: qml/Dash/PageHeaderExtraPanel.qml:55
211msgid "Recent Searches"
211msgid "Recent Searches"
212−msgstr ""
212+msgstr "Πρόσφατες αναζητήσεις"
213
213
214#: qml/Dash/PageHeaderExtraPanel.qml:66
214#: qml/Dash/PageHeaderExtraPanel.qml:66
215msgid "Clear All"
215msgid "Clear All"
216−msgstr ""
216+msgstr "Καθαρισμός όλων"
217
217
218#: qml/Dash/Previews/PreviewActionCombo.qml:35
218#: qml/Dash/Previews/PreviewActionCombo.qml:35
219msgid "More..."
219msgid "More..."
@@ -269,6 +269,8 @@ msgid ""
269"Your device is now connected to an external display. Use this screen as a "
269"Your device is now connected to an external display. Use this screen as a "
270"touch pad to interact with the pointer."
270"touch pad to interact with the pointer."
271msgstr ""
271msgstr ""
272+"Η συσκεύη σας τώρα είναι συνδεδεμένη με μια εξωτερική οθόνη. Χρησιμοποιείστε "
273+"αυτήν την οθόνη ως επιφάνεια αφής για να αλληλεπηδράσετε με τον δείκτη."
272
274
273#: qml/Greeter/CoverPage.qml:118
275#: qml/Greeter/CoverPage.qml:118
274msgid "Unlock"
276msgid "Unlock"
@@ -284,7 +286,7 @@ msgstr "Ακουμπήστε για να ξεκλειδώσετε"
284
286
285#: qml/Greeter/NarrowView.qml:54
287#: qml/Greeter/NarrowView.qml:54
286msgid "Sorry, incorrect passphrase."
288msgid "Sorry, incorrect passphrase."
287−msgstr "Συγνώμη, μη έγκυρη συνθηματική φράση."
289+msgstr "Συγνώμη, μη έγκυρο συνθηματικό."
288
290
289#: qml/Greeter/NarrowView.qml:55
291#: qml/Greeter/NarrowView.qml:55
290msgid "Sorry, incorrect passcode."
292msgid "Sorry, incorrect passcode."
@@ -299,9 +301,8 @@ msgid ""
299"If passphrase is entered incorrectly, your phone will conduct a factory "
301"If passphrase is entered incorrectly, your phone will conduct a factory "
300"reset and all personal data will be deleted."
302"reset and all personal data will be deleted."
301msgstr ""
303msgstr ""
302−"Εάν η συνθηματική φράση που θα εισάγετε είναι μη έγκυρη, το τηλέφωνο σας θα "
304+"Εάν το συνθηματικό που θα εισάγετε είναι μη έγκυρο, το τηλέφωνο σας θα κάνει "
303−"κάνει επαναφορά των εργοστασιακών ρυθμίσεων και όλα τα δεδομένα σας θα "
305+"επαναφορά των εργοστασιακών ρυθμίσεων και όλα τα δεδομένα σας θα διαγραφούν."
304−"διαγραφούν."
305
306
306#: qml/Greeter/NarrowView.qml:59
307#: qml/Greeter/NarrowView.qml:59
307msgid ""
308msgid ""
@@ -323,7 +324,7 @@ msgstr "Εισαγωγή συνθηματικού"
323
324
324#: qml/Greeter/NarrowView.qml:118
325#: qml/Greeter/NarrowView.qml:118
325msgid "Enter passcode"
326msgid "Enter passcode"
326−msgstr "Εισαγωγή κωδικού"
327+msgstr "Εισαγωγή κωδικού πρόσβασης"
327
328
328#: qml/Greeter/NarrowView.qml:119
329#: qml/Greeter/NarrowView.qml:119
329#, qt-format
330#, qt-format
@@ -433,6 +434,8 @@ msgstr "Επανάκληση"
433#: qml/Stages/SideStage.qml:76
434#: qml/Stages/SideStage.qml:76
434msgid "Drag using 3 fingers any application from one window to the other"
435msgid "Drag using 3 fingers any application from one window to the other"
435msgstr ""
436msgstr ""
437+"Σύρετε με την χρήση των 3 δακτύλων οποιαδήποτε εφαρμογή από ένα παράθυρο σε "
438+"άλλο"
436
439
437#: qml/Tutorial/TutorialBottom.qml:78
440#: qml/Tutorial/TutorialBottom.qml:78
438msgid "Swipe up to add a contact"
441msgid "Swipe up to add a contact"
@@ -454,19 +457,19 @@ msgstr ""
454msgid "Swipe up to manage the app"
457msgid "Swipe up to manage the app"
455msgstr ""
458msgstr ""
456
459
457−#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Swipe from the left edge to open the launcher"
459−msgstr ""
460−
461#: qml/Tutorial/TutorialLeftLong.qml:47
460#: qml/Tutorial/TutorialLeftLong.qml:47
462msgid "Long swipe from the left edge to open the Today scope"
461msgid "Long swipe from the left edge to open the Today scope"
463msgstr ""
462msgstr ""
464
463
465−#: qml/Tutorial/TutorialRight.qml:54
464+#: qml/Tutorial/TutorialLeft.qml:47
466−msgid "Hover your mouse on the right edge to view your open apps"
465+msgid "Swipe from the left edge to open the launcher"
467msgstr ""
466msgstr ""
468
467
469#: qml/Tutorial/TutorialRight.qml:55
468#: qml/Tutorial/TutorialRight.qml:55
469+msgid "Push your mouse against the right edge to view your open apps"
470+msgstr ""
471+
472+#: qml/Tutorial/TutorialRight.qml:56
470msgid "Short or long swipe from the right edge to view your open apps"
473msgid "Short or long swipe from the right edge to view your open apps"
471msgstr ""
474msgstr ""
472
475
@@ -485,7 +488,7 @@ msgstr "Πίσω"
485
488
486#: qml/Wizard/Pages/10-welcome.qml:27
489#: qml/Wizard/Pages/10-welcome.qml:27
487msgid "Language"
490msgid "Language"
488−msgstr ""
491+msgstr "Γλώσσα"
489
492
490#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
493#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
491#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
494#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -494,7 +497,7 @@ msgstr ""
494#: qml/Wizard/Pages/passcode-desktop.qml:124
497#: qml/Wizard/Pages/passcode-desktop.qml:124
495#: qml/Wizard/Pages/password-set.qml:141
498#: qml/Wizard/Pages/password-set.qml:141
496msgid "Next"
499msgid "Next"
497−msgstr ""
500+msgstr "Επόμενο"
498
501
499#: qml/Wizard/Pages/30-wifi.qml:29
502#: qml/Wizard/Pages/30-wifi.qml:29
500msgid "Connect to Wi‑Fi"
503msgid "Connect to Wi‑Fi"
@@ -502,15 +505,15 @@ msgstr "Σύνδεση σε δίκτυο Wi-Fi"
502
505
503#: qml/Wizard/Pages/30-wifi.qml:130
506#: qml/Wizard/Pages/30-wifi.qml:130
504msgid "Connected"
507msgid "Connected"
505−msgstr ""
508+msgstr "Συνδεδεμένο"
506
509
507#: qml/Wizard/Pages/30-wifi.qml:163
510#: qml/Wizard/Pages/30-wifi.qml:163
508msgid "Available Wi-Fi networks"
511msgid "Available Wi-Fi networks"
509−msgstr ""
512+msgstr "Διαθέσιμα δίκτυα Wi-Fi"
510
513
511#: qml/Wizard/Pages/30-wifi.qml:164
514#: qml/Wizard/Pages/30-wifi.qml:164
512msgid "No available Wi-Fi networks"
515msgid "No available Wi-Fi networks"
513−msgstr ""
516+msgstr "Κανένα διαθέσιμο δίκτυο Wi-Fi"
514
517
515#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
518#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
516#: qml/Wizard/Pages/sim.qml:101
519#: qml/Wizard/Pages/sim.qml:101
@@ -519,7 +522,7 @@ msgstr "Παράβλεψη"
519
522
520#: qml/Wizard/Pages/40-location.qml:27
523#: qml/Wizard/Pages/40-location.qml:27
521msgid "Location Services"
524msgid "Location Services"
522−msgstr ""
525+msgstr "Υπηρεσίες τοποθεσίας"
523
526
524#: qml/Wizard/Pages/40-location.qml:83
527#: qml/Wizard/Pages/40-location.qml:83
525msgid ""
528msgid ""
@@ -531,82 +534,85 @@ msgstr ""
531#, qt-format
534#, qt-format
532msgid "By selecting this option you agree to the Nokia HERE %1."
535msgid "By selecting this option you agree to the Nokia HERE %1."
533msgstr ""
536msgstr ""
537+"Με το να επιλέξετε αυτήν την επιλογή συμφωνείτε με τους %1 Nokia HERE."
534
538
535#: qml/Wizard/Pages/40-location.qml:106
539#: qml/Wizard/Pages/40-location.qml:106
536msgctxt "part of: Nokia HERE terms and conditions"
540msgctxt "part of: Nokia HERE terms and conditions"
537msgid "terms and conditions"
541msgid "terms and conditions"
538−msgstr ""
542+msgstr "όρους χρήσης"
539
543
540#: qml/Wizard/Pages/40-location.qml:160
544#: qml/Wizard/Pages/40-location.qml:160
541msgid "GPS only"
545msgid "GPS only"
542−msgstr ""
546+msgstr "Μόνο GPS"
543
547
544#: qml/Wizard/Pages/40-location.qml:214
548#: qml/Wizard/Pages/40-location.qml:214
545msgid "Don't use my location"
549msgid "Don't use my location"
546−msgstr ""
550+msgstr "Μην χρησιμοποιήσεις την τοποθεσία μου"
547
551
548#: qml/Wizard/Pages/40-location.qml:260
552#: qml/Wizard/Pages/40-location.qml:260
549msgid "You can change it later in System Settings."
553msgid "You can change it later in System Settings."
550−msgstr ""
554+msgstr "Μπορείτε να το αλλάξετε αργότερα στις Ρυθμίσεις συστήματος."
551
555
552#: qml/Wizard/Pages/50-timezone.qml:29
556#: qml/Wizard/Pages/50-timezone.qml:29
553msgid "Time Zone"
557msgid "Time Zone"
554−msgstr ""
558+msgstr "Ζώνη ώρας"
555
559
556#: qml/Wizard/Pages/50-timezone.qml:178
560#: qml/Wizard/Pages/50-timezone.qml:178
557msgid "Enter your city"
561msgid "Enter your city"
558−msgstr ""
562+msgstr "Εισάγετε την πόλη σας"
559
563
560#: qml/Wizard/Pages/60-account.qml:24
564#: qml/Wizard/Pages/60-account.qml:24
561msgid "Personalize Your Device"
565msgid "Personalize Your Device"
562−msgstr ""
566+msgstr "Εξατομικεύστε την συσκευή σας."
563
567
564#: qml/Wizard/Pages/60-account.qml:48
568#: qml/Wizard/Pages/60-account.qml:48
565msgid "Preferred Name"
569msgid "Preferred Name"
566−msgstr ""
570+msgstr "Προτιμώμενο όνομα"
567
571
568#: qml/Wizard/Pages/70-passwd-type.qml:39
572#: qml/Wizard/Pages/70-passwd-type.qml:39
569msgid "Lock Screen"
573msgid "Lock Screen"
570−msgstr ""
574+msgstr "Κλείδωμα οθόνης"
571
575
572#: qml/Wizard/Pages/70-passwd-type.qml:101
576#: qml/Wizard/Pages/70-passwd-type.qml:101
573msgctxt "Label: Type of security method"
577msgctxt "Label: Type of security method"
574msgid "Create new password"
578msgid "Create new password"
575−msgstr ""
579+msgstr "Δημιουργία νέου κωδικού πρόσβασης"
576
580
577#: qml/Wizard/Pages/70-passwd-type.qml:103
581#: qml/Wizard/Pages/70-passwd-type.qml:103
578msgctxt "Label: Type of security method"
582msgctxt "Label: Type of security method"
579msgid "Create passcode (numbers only)"
583msgid "Create passcode (numbers only)"
580−msgstr ""
584+msgstr "Δημιουργία κωδικού πρόσβασης (αριθμοί μόνο)"
581
585
582#: qml/Wizard/Pages/70-passwd-type.qml:105
586#: qml/Wizard/Pages/70-passwd-type.qml:105
583msgctxt "Label: Type of security method"
587msgctxt "Label: Type of security method"
584msgid "No lock code"
588msgid "No lock code"
585−msgstr ""
589+msgstr "Κανένας κωδικός κλειδώματος"
586
590
587#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
591#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
588msgid "Privacy Policy"
592msgid "Privacy Policy"
589−msgstr ""
593+msgstr "Πολιτική απορρήτου"
590
594
591#: qml/Wizard/Pages/75-report-check.qml:26
595#: qml/Wizard/Pages/75-report-check.qml:26
592msgid "Help Us Improve"
596msgid "Help Us Improve"
593−msgstr ""
597+msgstr "Βοηθήστε μας να βελτιωθούμε"
594
598
595#: qml/Wizard/Pages/75-report-check.qml:59
599#: qml/Wizard/Pages/75-report-check.qml:59
596msgid "Improve system performance by sending us crashes and error reports."
600msgid "Improve system performance by sending us crashes and error reports."
597msgstr ""
601msgstr ""
602+"Βελτιώστε την απόδοση συστήματος με το να στέλνετε σε εμάς αναφορές "
603+"κατάρρευσης και σφαλμάτων."
598
604
599#: qml/Wizard/Pages/75-report-check.qml:60
605#: qml/Wizard/Pages/75-report-check.qml:60
600msgid "Privacy policy"
606msgid "Privacy policy"
601−msgstr ""
607+msgstr "Πολιτική απορρήτου"
602
608
603#: qml/Wizard/Pages/80-finished.qml:89
609#: qml/Wizard/Pages/80-finished.qml:89
604msgid "Welcome to Ubuntu"
610msgid "Welcome to Ubuntu"
605−msgstr ""
611+msgstr "Καλώς ήρθατε στο Ubuntu"
606
612
607#: qml/Wizard/Pages/80-finished.qml:104
613#: qml/Wizard/Pages/80-finished.qml:104
608msgid "You are ready to use your device now"
614msgid "You are ready to use your device now"
609−msgstr ""
615+msgstr "Είστε έτοιμος να χρησιμοποιείσετε της συσκεύη σας τώρα"
610
616
611#: qml/Wizard/Pages/80-finished.qml:124
617#: qml/Wizard/Pages/80-finished.qml:124
612msgid "Get Started"
618msgid "Get Started"
@@ -619,6 +625,8 @@ msgstr "Όροι και προϋποθέσεις"
619#: qml/Wizard/Pages/here-terms.qml:69
625#: qml/Wizard/Pages/here-terms.qml:69
620msgid "Your device uses positioning technologies provided by HERE."
626msgid "Your device uses positioning technologies provided by HERE."
621msgstr ""
627msgstr ""
628+"Η συσκεύη σας χρησιμοποιούν τεχνολογίες εντοπισμού θέσης που παρέχονται από "
629+"το HERE."
622
630
623#: qml/Wizard/Pages/here-terms.qml:81
631#: qml/Wizard/Pages/here-terms.qml:81
624msgid ""
632msgid ""
@@ -632,15 +640,17 @@ msgid ""
632"The information collected is used to analyze the service and to improve the "
640"The information collected is used to analyze the service and to improve the "
633"use of service, but not to identify you personally."
641"use of service, but not to identify you personally."
634msgstr ""
642msgstr ""
643+"Οι πληροφορίες που μαζεύονται χρησιμοποιούνται για αναλύσουν την υπηρεσία "
644+"και να βελτιώσουν την χρήση της υπηρεσίας, και όχι για να βρουν ποιος είστε."
635
645
636#: qml/Wizard/Pages/here-terms.qml:106
646#: qml/Wizard/Pages/here-terms.qml:106
637#, qt-format
647#, qt-format
638msgid "By continuing, you agree to the HERE platform %1 and %2."
648msgid "By continuing, you agree to the HERE platform %1 and %2."
639−msgstr ""
649+msgstr "Με το να συνεχίσετε, συμφωνείτε στα %1 και %2 της πλατφόρμας HERE."
640
650
641#: qml/Wizard/Pages/here-terms.qml:107
651#: qml/Wizard/Pages/here-terms.qml:107
642msgid "Service Terms"
652msgid "Service Terms"
643−msgstr ""
653+msgstr "Όρους υπηρεσίας"
644
654
645#: qml/Wizard/Pages/passcode-confirm.qml:43
655#: qml/Wizard/Pages/passcode-confirm.qml:43
646#: qml/Wizard/Pages/passcode-desktop.qml:80
656#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -649,69 +659,71 @@ msgstr "Επιβεβαιώστε τον κωδικό πρόσβασης"
649
659
650#: qml/Wizard/Pages/passcode-confirm.qml:45
660#: qml/Wizard/Pages/passcode-confirm.qml:45
651msgid "Incorrect passcode."
661msgid "Incorrect passcode."
652−msgstr ""
662+msgstr "Μη έγκυρος κωδικός πρόσβασης"
653
663
654#: qml/Wizard/Pages/passcode-confirm.qml:45
664#: qml/Wizard/Pages/passcode-confirm.qml:45
655msgctxt "Enter the passcode again"
665msgctxt "Enter the passcode again"
656msgid "Please re-enter."
666msgid "Please re-enter."
657−msgstr ""
667+msgstr "Παρακαλώ πληκτρολογήστε ξανά."
658
668
659#: qml/Wizard/Pages/passcode-desktop.qml:30
669#: qml/Wizard/Pages/passcode-desktop.qml:30
660msgid "Lock Screen Passcode"
670msgid "Lock Screen Passcode"
661−msgstr ""
671+msgstr "Κωδικός πρόσβασης κλειδώματος οθόνης"
662
672
663#: qml/Wizard/Pages/passcode-desktop.qml:56
673#: qml/Wizard/Pages/passcode-desktop.qml:56
664msgid "Enter 4 numbers to setup your passcode"
674msgid "Enter 4 numbers to setup your passcode"
665−msgstr ""
675+msgstr "Εισάγετε 4 αριθμούς για ρύθμιση κωδικού πρόσβασης"
666
676
667#: qml/Wizard/Pages/passcode-desktop.qml:65
677#: qml/Wizard/Pages/passcode-desktop.qml:65
668#: qml/Wizard/Pages/passcode-set.qml:54
678#: qml/Wizard/Pages/passcode-set.qml:54
669msgid "Choose passcode"
679msgid "Choose passcode"
670−msgstr ""
680+msgstr "Επιλογή κωδικού πρόσβασης"
671
681
672#: qml/Wizard/Pages/passcode-desktop.qml:105
682#: qml/Wizard/Pages/passcode-desktop.qml:105
673msgid "Passcode too short"
683msgid "Passcode too short"
674−msgstr ""
684+msgstr "Κωδικός πρόσβασης πολύ μικρός"
675
685
676#: qml/Wizard/Pages/passcode-desktop.qml:107
686#: qml/Wizard/Pages/passcode-desktop.qml:107
677msgid "Passcodes match"
687msgid "Passcodes match"
678−msgstr ""
688+msgstr "Ταίριασμα κωδικών πρόσβασης"
679
689
680#: qml/Wizard/Pages/passcode-desktop.qml:109
690#: qml/Wizard/Pages/passcode-desktop.qml:109
681msgid "Passcodes do not match"
691msgid "Passcodes do not match"
682−msgstr ""
692+msgstr "Οι κωδικοί πρόσβασης δεν ταιριάζουν"
683
693
684#: qml/Wizard/Pages/passcode-set.qml:62
694#: qml/Wizard/Pages/passcode-set.qml:62
685msgid "Passcode must be 4 characters long"
695msgid "Passcode must be 4 characters long"
686−msgstr ""
696+msgstr "Ο κωδικός πρόσβασης πρέπει να είναι 4 χαρακτήρες"
687
697
688#: qml/Wizard/Pages/password-set.qml:30
698#: qml/Wizard/Pages/password-set.qml:30
689msgid "Lock Screen Password"
699msgid "Lock Screen Password"
690−msgstr ""
700+msgstr "Κωδικός πρόσβασης κλειδώματος οθόνης"
691
701
692#: qml/Wizard/Pages/password-set.qml:61
702#: qml/Wizard/Pages/password-set.qml:61
693msgid "Enter at least 8 characters"
703msgid "Enter at least 8 characters"
694−msgstr ""
704+msgstr "Εισάγετε τουλάχιστον 8 χαρακτήρες"
695
705
696#: qml/Wizard/Pages/password-set.qml:73
706#: qml/Wizard/Pages/password-set.qml:73
697msgid "Choose password"
707msgid "Choose password"
698−msgstr ""
708+msgstr "Επιλογή κωδικού πρόσβασης"
699
709
700#: qml/Wizard/Pages/password-set.qml:103
710#: qml/Wizard/Pages/password-set.qml:103
701msgid "Confirm password"
711msgid "Confirm password"
702−msgstr ""
712+msgstr "Επιβεβαίωση κωδικού πρόσβασης"
703
713
704#: qml/Wizard/Pages/sim.qml:27
714#: qml/Wizard/Pages/sim.qml:27
705msgid "No SIM card installed"
715msgid "No SIM card installed"
706−msgstr ""
716+msgstr "Καμία κάρτα SIM δεν έχει εγκατασταθεί"
707
717
708#: qml/Wizard/Pages/sim.qml:54
718#: qml/Wizard/Pages/sim.qml:54
709msgid "SIM card added"
719msgid "SIM card added"
710−msgstr ""
720+msgstr "Κάρτα SIM προστέθηκε"
711
721
712#: qml/Wizard/Pages/sim.qml:55
722#: qml/Wizard/Pages/sim.qml:55
713msgid "You must restart the device to access the mobile network."
723msgid "You must restart the device to access the mobile network."
714msgstr ""
724msgstr ""
725+"Πρέπει να επανεκκίνησετε την συσκεύη σας για πρόσβαση στο δίκτυο κινητής "
726+"τηλεφωνίας."
715
727
716#: qml/Wizard/Pages/sim.qml:59
728#: qml/Wizard/Pages/sim.qml:59
717msgid "Restart"
729msgid "Restart"
@@ -720,6 +732,7 @@ msgstr "Επανεκκίνηση"
720#: qml/Wizard/Pages/sim.qml:78
732#: qml/Wizard/Pages/sim.qml:78
721msgid "You won’t be able to make calls or use text messaging without a SIM."
733msgid "You won’t be able to make calls or use text messaging without a SIM."
722msgstr ""
734msgstr ""
735+"Δεν θα μπορείτε να καλείτε ή να στέλνετε γραπτά μηνύματα χωρίς μια SIM."
723
736
724#: qml/Wizard/Pages/sim.qml:90
737#: qml/Wizard/Pages/sim.qml:90
725msgid "To proceed with no SIM tap Skip."
738msgid "To proceed with no SIM tap Skip."
@@ -727,23 +740,23 @@ msgstr ""
727
740
728#: qml/Wizard/PasswordMeter.qml:87
741#: qml/Wizard/PasswordMeter.qml:87
729msgid "Passwords match"
742msgid "Passwords match"
730−msgstr ""
743+msgstr "Οι κωδικοί πρόσβασης ταιριάζουν"
731
744
732#: qml/Wizard/PasswordMeter.qml:89
745#: qml/Wizard/PasswordMeter.qml:89
733msgid "Passwords do not match"
746msgid "Passwords do not match"
734−msgstr ""
747+msgstr "Οι κωδικοί πρόσβασης δεν ταιριάζουν"
735
748
736#: qml/Wizard/PasswordMeter.qml:93
749#: qml/Wizard/PasswordMeter.qml:93
737msgid "Strong password"
750msgid "Strong password"
738−msgstr ""
751+msgstr "Δυνατός κωδικός πρόσβασης"
739
752
740#: qml/Wizard/PasswordMeter.qml:95
753#: qml/Wizard/PasswordMeter.qml:95
741msgid "Fair password"
754msgid "Fair password"
742−msgstr ""
755+msgstr "Μέτριος κωδικός πρόσβασης"
743
756
744#: qml/Wizard/PasswordMeter.qml:97
757#: qml/Wizard/PasswordMeter.qml:97
745msgid "Weak password"
758msgid "Weak password"
746−msgstr ""
759+msgstr "Αδύναμος κωδικός πρόσβασης"
747
760
748#: qml/Wizard/PasswordMeter.qml:99
761#: qml/Wizard/PasswordMeter.qml:99
749msgid "Very weak password"
762msgid "Very weak password"
po/en_AU.po+13−10
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-27 10:09+0000\n"
11"PO-Revision-Date: 2016-03-27 10:09+0000\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-28 05:45+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -448,19 +448,19 @@ msgstr "Swipe up to create a message"
448msgid "Swipe up to manage the app"
448msgid "Swipe up to manage the app"
449msgstr "Swipe up to manage the app"
449msgstr "Swipe up to manage the app"
450
450
451−#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Swipe from the left edge to open the launcher"
453−msgstr "Swipe from the left edge to open the launcher"
454−
455#: qml/Tutorial/TutorialLeftLong.qml:47
451#: qml/Tutorial/TutorialLeftLong.qml:47
456msgid "Long swipe from the left edge to open the Today scope"
452msgid "Long swipe from the left edge to open the Today scope"
457msgstr "Long swipe from the left edge to open the Today scope"
453msgstr "Long swipe from the left edge to open the Today scope"
458
454
459−#: qml/Tutorial/TutorialRight.qml:54
455+#: qml/Tutorial/TutorialLeft.qml:47
460−msgid "Hover your mouse on the right edge to view your open apps"
456+msgid "Swipe from the left edge to open the launcher"
461−msgstr "Hover your mouse on the right edge to view your open apps"
457+msgstr "Swipe from the left edge to open the launcher"
462
458
463#: qml/Tutorial/TutorialRight.qml:55
459#: qml/Tutorial/TutorialRight.qml:55
460+msgid "Push your mouse against the right edge to view your open apps"
461+msgstr ""
462+
463+#: qml/Tutorial/TutorialRight.qml:56
464msgid "Short or long swipe from the right edge to view your open apps"
464msgid "Short or long swipe from the right edge to view your open apps"
465msgstr "Short or long swipe from the right edge to view your open apps"
465msgstr "Short or long swipe from the right edge to view your open apps"
466
466
@@ -1058,3 +1058,6 @@ msgstr "Very weak password"
1058
1058
1059#~ msgid "%a %d %b %l:%M %p"
1059#~ msgid "%a %d %b %l:%M %p"
1060#~ msgstr "%a %b %d %l:%M %p"
1060#~ msgstr "%a %b %d %l:%M %p"
1061+
1062+#~ msgid "Hover your mouse on the right edge to view your open apps"
1063+#~ msgstr "Hover your mouse on the right edge to view your open apps"
po/en_GB.po+13−10
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-30 11:54+0000\n"
11"PO-Revision-Date: 2016-03-30 11:54+0000\n"
12"Last-Translator: James Tait <Unknown>\n"
12"Last-Translator: James Tait <Unknown>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-31 05:49+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -448,19 +448,19 @@ msgstr "Swipe up to create a message"
448msgid "Swipe up to manage the app"
448msgid "Swipe up to manage the app"
449msgstr "Swipe up to manage the app"
449msgstr "Swipe up to manage the app"
450
450
451−#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Swipe from the left edge to open the launcher"
453−msgstr "Swipe from the left edge to open the launcher"
454−
455#: qml/Tutorial/TutorialLeftLong.qml:47
451#: qml/Tutorial/TutorialLeftLong.qml:47
456msgid "Long swipe from the left edge to open the Today scope"
452msgid "Long swipe from the left edge to open the Today scope"
457msgstr "Long swipe from the left edge to open the Today scope"
453msgstr "Long swipe from the left edge to open the Today scope"
458
454
459−#: qml/Tutorial/TutorialRight.qml:54
455+#: qml/Tutorial/TutorialLeft.qml:47
460−msgid "Hover your mouse on the right edge to view your open apps"
456+msgid "Swipe from the left edge to open the launcher"
461−msgstr "Hover your mouse on the right edge to view your open apps"
457+msgstr "Swipe from the left edge to open the launcher"
462
458
463#: qml/Tutorial/TutorialRight.qml:55
459#: qml/Tutorial/TutorialRight.qml:55
460+msgid "Push your mouse against the right edge to view your open apps"
461+msgstr ""
462+
463+#: qml/Tutorial/TutorialRight.qml:56
464msgid "Short or long swipe from the right edge to view your open apps"
464msgid "Short or long swipe from the right edge to view your open apps"
465msgstr "Short or long swipe from the right edge to view your open apps"
465msgstr "Short or long swipe from the right edge to view your open apps"
466
466
@@ -1061,3 +1061,6 @@ msgstr "Very weak password"
1061
1061
1062#~ msgid "Call back"
1062#~ msgid "Call back"
1063#~ msgstr "Call back"
1063#~ msgstr "Call back"
1064+
1065+#~ msgid "Hover your mouse on the right edge to view your open apps"
1066+#~ msgstr "Hover your mouse on the right edge to view your open apps"
po/eo.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-06-06 23:37+0000\n"
11"PO-Revision-Date: 2015-06-06 23:37+0000\n"
12"Last-Translator: Eliovir <Unknown>\n"
12"Last-Translator: Eliovir <Unknown>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/es.po+16−13
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-25 12:02+0000\n"
11"PO-Revision-Date: 2016-03-25 12:02+0000\n"
12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
13"Language-Team: Spanish <es@li.org>\n"
13"Language-Team: Spanish <es@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-26 05:44+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -454,20 +454,19 @@ msgstr "Deslice arriba para crear un mensaje"
454msgid "Swipe up to manage the app"
454msgid "Swipe up to manage the app"
455msgstr "Deslice arriba para configurar la apli"
455msgstr "Deslice arriba para configurar la apli"
456
456
457−#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Swipe from the left edge to open the launcher"
459−msgstr "Deslice desde el borde izquierdo para abrir el lanzador"
460−
461#: qml/Tutorial/TutorialLeftLong.qml:47
457#: qml/Tutorial/TutorialLeftLong.qml:47
462msgid "Long swipe from the left edge to open the Today scope"
458msgid "Long swipe from the left edge to open the Today scope"
463msgstr "Deslice largo desde el borde izquierdo para ver el scope Hoy"
459msgstr "Deslice largo desde el borde izquierdo para ver el scope Hoy"
464
460
465−#: qml/Tutorial/TutorialRight.qml:54
461+#: qml/Tutorial/TutorialLeft.qml:47
466−msgid "Hover your mouse on the right edge to view your open apps"
462+msgid "Swipe from the left edge to open the launcher"
467−msgstr ""
463+msgstr "Deslice desde el borde izquierdo para abrir el lanzador"
468−"Sitúe el ratón en el borde derecho para ver las aplicaciones abiertas"
469
464
470#: qml/Tutorial/TutorialRight.qml:55
465#: qml/Tutorial/TutorialRight.qml:55
466+msgid "Push your mouse against the right edge to view your open apps"
467+msgstr ""
468+
469+#: qml/Tutorial/TutorialRight.qml:56
471msgid "Short or long swipe from the right edge to view your open apps"
470msgid "Short or long swipe from the right edge to view your open apps"
472msgstr "Deslice desde el borde derecho para ver las aplis abiertas"
471msgstr "Deslice desde el borde derecho para ver las aplis abiertas"
473
472
@@ -608,11 +607,11 @@ msgstr "Política de privacidad"
608
607
609#: qml/Wizard/Pages/80-finished.qml:89
608#: qml/Wizard/Pages/80-finished.qml:89
610msgid "Welcome to Ubuntu"
609msgid "Welcome to Ubuntu"
611−msgstr "Le damos la bienvenida a Ubuntu"
610+msgstr "Bienvenido a su dispositivo Ubuntu"
612
611
613#: qml/Wizard/Pages/80-finished.qml:104
612#: qml/Wizard/Pages/80-finished.qml:104
614msgid "You are ready to use your device now"
613msgid "You are ready to use your device now"
615−msgstr "Ahora ya puede usar su dispositivo"
614+msgstr "El dispositivo ya está listo"
616
615
617#: qml/Wizard/Pages/80-finished.qml:124
616#: qml/Wizard/Pages/80-finished.qml:124
618msgid "Get Started"
617msgid "Get Started"
@@ -1075,3 +1074,7 @@ msgstr "Contraseña muy débil"
1075
1074
1076#~ msgid "Call back"
1075#~ msgid "Call back"
1077#~ msgstr "Devolver llamada"
1076#~ msgstr "Devolver llamada"
1077+
1078+#~ msgid "Hover your mouse on the right edge to view your open apps"
1079+#~ msgstr ""
1080+#~ "Sitúe el ratón en el borde derecho para ver las aplicaciones abiertas"
po/eu.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-13 23:29+0000\n"
11"PO-Revision-Date: 2015-07-13 23:29+0000\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
13"Language-Team: Basque <eu@li.org>\n"
13"Language-Team: Basque <eu@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -447,19 +447,19 @@ msgstr ""
447msgid "Swipe up to manage the app"
447msgid "Swipe up to manage the app"
448msgstr ""
448msgstr ""
449
449
450−#: qml/Tutorial/TutorialLeft.qml:47
451−msgid "Swipe from the left edge to open the launcher"
452−msgstr ""
453−
454#: qml/Tutorial/TutorialLeftLong.qml:47
450#: qml/Tutorial/TutorialLeftLong.qml:47
455msgid "Long swipe from the left edge to open the Today scope"
451msgid "Long swipe from the left edge to open the Today scope"
456msgstr ""
452msgstr ""
457
453
458−#: qml/Tutorial/TutorialRight.qml:54
454+#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Hover your mouse on the right edge to view your open apps"
455+msgid "Swipe from the left edge to open the launcher"
460msgstr ""
456msgstr ""
461
457
462#: qml/Tutorial/TutorialRight.qml:55
458#: qml/Tutorial/TutorialRight.qml:55
459+msgid "Push your mouse against the right edge to view your open apps"
460+msgstr ""
461+
462+#: qml/Tutorial/TutorialRight.qml:56
463msgid "Short or long swipe from the right edge to view your open apps"
463msgid "Short or long swipe from the right edge to view your open apps"
464msgstr ""
464msgstr ""
465
465
po/fa.po+13−10
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-30 14:29+0000\n"
11"PO-Revision-Date: 2016-03-30 14:29+0000\n"
12"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
12"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
13"Language-Team: Persian <fa@li.org>\n"
13"Language-Team: Persian <fa@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-31 05:49+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -446,19 +446,19 @@ msgstr "برای ایجاد پیام، به بالا بکشید"
446msgid "Swipe up to manage the app"
446msgid "Swipe up to manage the app"
447msgstr "برای مدیریت کاره، به بالا بکشید"
447msgstr "برای مدیریت کاره، به بالا بکشید"
448
448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr "برای گشودن اجراگر، از لبهٔ چپ بکشید"
452−
453#: qml/Tutorial/TutorialLeftLong.qml:47
449#: qml/Tutorial/TutorialLeftLong.qml:47
454msgid "Long swipe from the left edge to open the Today scope"
450msgid "Long swipe from the left edge to open the Today scope"
455msgstr "برای گشودن حوزهٔ امروز، از لبهٔ چپ طولانی بکشید"
451msgstr "برای گشودن حوزهٔ امروز، از لبهٔ چپ طولانی بکشید"
456
452
457−#: qml/Tutorial/TutorialRight.qml:54
453+#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Hover your mouse on the right edge to view your open apps"
454+msgid "Swipe from the left edge to open the launcher"
459−msgstr "برای دیدن کاره‌های گشوده، موشی‌تان را روی لبهٔ راست نگه دارید"
455+msgstr "برای گشودن اجراگر، از لبهٔ چپ بکشید"
460
456
461#: qml/Tutorial/TutorialRight.qml:55
457#: qml/Tutorial/TutorialRight.qml:55
458+msgid "Push your mouse against the right edge to view your open apps"
459+msgstr ""
460+
461+#: qml/Tutorial/TutorialRight.qml:56
462msgid "Short or long swipe from the right edge to view your open apps"
462msgid "Short or long swipe from the right edge to view your open apps"
463msgstr "برای دیدن کاره‌های گشوده، از گوشهٔ راست بکشید"
463msgstr "برای دیدن کاره‌های گشوده، از گوشهٔ راست بکشید"
464
464
@@ -1064,3 +1064,6 @@ msgstr "گذرواژهٔ خیلی ضعیف"
1064
1064
1065#~ msgid "Call back"
1065#~ msgid "Call back"
1066#~ msgstr "پاسخ تماس"
1066#~ msgstr "پاسخ تماس"
1067+
1068+#~ msgid "Hover your mouse on the right edge to view your open apps"
1069+#~ msgstr "برای دیدن کاره‌های گشوده، موشی‌تان را روی لبهٔ راست نگه دارید"
po/fi.po+90−84
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-04 18:32+0000\n"
11"PO-Revision-Date: 2015-07-04 18:32+0000\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
13"Language-Team: Finnish <fi@li.org>\n"
13"Language-Team: Finnish <fi@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -186,11 +186,11 @@ msgstr "Lisää suosikkeihin"
186
186
187#: qml/Dash/FiltersPopover.qml:60
187#: qml/Dash/FiltersPopover.qml:60
188msgid "Refine your results"
188msgid "Refine your results"
189−msgstr ""
189+msgstr "Tarkenna tuloksia"
190
190
191#: qml/Dash/FiltersPopover.qml:69
191#: qml/Dash/FiltersPopover.qml:69
192msgid "Reset"
192msgid "Reset"
193−msgstr ""
193+msgstr "Palauta"
194
194
195#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
195#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
196msgid "See less"
196msgid "See less"
@@ -207,11 +207,11 @@ msgstr "Etsi"
207
207
208#: qml/Dash/PageHeaderExtraPanel.qml:55
208#: qml/Dash/PageHeaderExtraPanel.qml:55
209msgid "Recent Searches"
209msgid "Recent Searches"
210−msgstr ""
210+msgstr "Viimeisimmät haut"
211
211
212#: qml/Dash/PageHeaderExtraPanel.qml:66
212#: qml/Dash/PageHeaderExtraPanel.qml:66
213msgid "Clear All"
213msgid "Clear All"
214−msgstr ""
214+msgstr "Tyhjennä kaikki"
215
215
216#: qml/Dash/Previews/PreviewActionCombo.qml:35
216#: qml/Dash/Previews/PreviewActionCombo.qml:35
217msgid "More..."
217msgid "More..."
@@ -280,7 +280,7 @@ msgstr "Yritä uudelleen"
280
280
281#: qml/Greeter/LoginList.qml:240
281#: qml/Greeter/LoginList.qml:240
282msgid "Tap to unlock"
282msgid "Tap to unlock"
283−msgstr "Napauta avataksesi lukituksen"
283+msgstr "Avaa lukitus"
284
284
285#: qml/Greeter/NarrowView.qml:54
285#: qml/Greeter/NarrowView.qml:54
286msgid "Sorry, incorrect passphrase."
286msgid "Sorry, incorrect passphrase."
@@ -430,51 +430,53 @@ msgstr "Soita takaisin"
430
430
431#: qml/Stages/SideStage.qml:76
431#: qml/Stages/SideStage.qml:76
432msgid "Drag using 3 fingers any application from one window to the other"
432msgid "Drag using 3 fingers any application from one window to the other"
433−msgstr ""
433+msgstr "Vedä kolmea sormea käyttäen mikä tahansa sovellus ikkunasta toiseen"
434
434
435#: qml/Tutorial/TutorialBottom.qml:78
435#: qml/Tutorial/TutorialBottom.qml:78
436msgid "Swipe up to add a contact"
436msgid "Swipe up to add a contact"
437−msgstr ""
437+msgstr "Vedä ylös lisätäksesi yhteystiedon"
438
438
439#: qml/Tutorial/TutorialBottom.qml:80
439#: qml/Tutorial/TutorialBottom.qml:80
440msgid "Swipe up for favorite calculations"
440msgid "Swipe up for favorite calculations"
441−msgstr ""
441+msgstr "Vedä ylös nähdäksesi suosikkilaskutoimitukset"
442
442
443#: qml/Tutorial/TutorialBottom.qml:82
443#: qml/Tutorial/TutorialBottom.qml:82
444msgid "Swipe up for recent calls"
444msgid "Swipe up for recent calls"
445−msgstr ""
445+msgstr "Vedä ylös nähdäksesi viimeisimmät puhelut"
446
446
447#: qml/Tutorial/TutorialBottom.qml:84
447#: qml/Tutorial/TutorialBottom.qml:84
448msgid "Swipe up to create a message"
448msgid "Swipe up to create a message"
449−msgstr ""
449+msgstr "Vedä ylös luodaksesi uuden viestin"
450
450
451#: qml/Tutorial/TutorialBottom.qml:85
451#: qml/Tutorial/TutorialBottom.qml:85
452msgid "Swipe up to manage the app"
452msgid "Swipe up to manage the app"
453−msgstr ""
453+msgstr "Vedä ylös hallitaksesi sovellusta"
454−
455−#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Swipe from the left edge to open the launcher"
457−msgstr ""
458
454
459#: qml/Tutorial/TutorialLeftLong.qml:47
455#: qml/Tutorial/TutorialLeftLong.qml:47
460msgid "Long swipe from the left edge to open the Today scope"
456msgid "Long swipe from the left edge to open the Today scope"
461−msgstr ""
457+msgstr "Tee pitkä veto vasemmasta reunasta avataksesi Tänään-näkymän"
462
458
463−#: qml/Tutorial/TutorialRight.qml:54
459+#: qml/Tutorial/TutorialLeft.qml:47
464−msgid "Hover your mouse on the right edge to view your open apps"
460+msgid "Swipe from the left edge to open the launcher"
465−msgstr ""
461+msgstr "Vedä vasemmasta reunasta avataksesi käynnistimen"
466
462
467#: qml/Tutorial/TutorialRight.qml:55
463#: qml/Tutorial/TutorialRight.qml:55
464+msgid "Push your mouse against the right edge to view your open apps"
465+msgstr ""
466+
467+#: qml/Tutorial/TutorialRight.qml:56
468msgid "Short or long swipe from the right edge to view your open apps"
468msgid "Short or long swipe from the right edge to view your open apps"
469msgstr ""
469msgstr ""
470+"Tee lyhyt tai pitkä veto oikeasta laidasta nähdäksesi avoinna olevat "
471+"sovellukset"
470
472
471#: qml/Tutorial/TutorialTop.qml:53
473#: qml/Tutorial/TutorialTop.qml:53
472msgid "Swipe from the top right edge to open the notification bar"
474msgid "Swipe from the top right edge to open the notification bar"
473−msgstr ""
475+msgstr "Vedä oikeasta yläreunasta avataksesi ilmoituspalkin"
474
476
475#: qml/Tutorial/TutorialTop.qml:54
477#: qml/Tutorial/TutorialTop.qml:54
476msgid "Swipe from the top edge to open the notification bar"
478msgid "Swipe from the top edge to open the notification bar"
477−msgstr ""
479+msgstr "Vedä yläreunasta avataksesi ilmoituspalkin"
478
480
479#: qml/Wizard/Page.qml:54
481#: qml/Wizard/Page.qml:54
480msgctxt "Button: Go back one page in the Wizard"
482msgctxt "Button: Go back one page in the Wizard"
@@ -483,7 +485,7 @@ msgstr "Takaisin"
483
485
484#: qml/Wizard/Pages/10-welcome.qml:27
486#: qml/Wizard/Pages/10-welcome.qml:27
485msgid "Language"
487msgid "Language"
486−msgstr ""
488+msgstr "Kieli"
487
489
488#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
490#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
489#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
491#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -492,7 +494,7 @@ msgstr ""
492#: qml/Wizard/Pages/passcode-desktop.qml:124
494#: qml/Wizard/Pages/passcode-desktop.qml:124
493#: qml/Wizard/Pages/password-set.qml:141
495#: qml/Wizard/Pages/password-set.qml:141
494msgid "Next"
496msgid "Next"
495−msgstr ""
497+msgstr "Seuraava"
496
498
497#: qml/Wizard/Pages/30-wifi.qml:29
499#: qml/Wizard/Pages/30-wifi.qml:29
498msgid "Connect to Wi‑Fi"
500msgid "Connect to Wi‑Fi"
@@ -500,15 +502,15 @@ msgstr "Yhdistä wifi-verkkoon"
500
502
501#: qml/Wizard/Pages/30-wifi.qml:130
503#: qml/Wizard/Pages/30-wifi.qml:130
502msgid "Connected"
504msgid "Connected"
503−msgstr ""
505+msgstr "Yhdistetty"
504
506
505#: qml/Wizard/Pages/30-wifi.qml:163
507#: qml/Wizard/Pages/30-wifi.qml:163
506msgid "Available Wi-Fi networks"
508msgid "Available Wi-Fi networks"
507−msgstr ""
509+msgstr "Käytettävissä olevat wifi-verkot"
508
510
509#: qml/Wizard/Pages/30-wifi.qml:164
511#: qml/Wizard/Pages/30-wifi.qml:164
510msgid "No available Wi-Fi networks"
512msgid "No available Wi-Fi networks"
511−msgstr ""
513+msgstr "Ei käytettävissä olevia wifi-verkkoja"
512
514
513#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
515#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
514#: qml/Wizard/Pages/sim.qml:101
516#: qml/Wizard/Pages/sim.qml:101
@@ -517,98 +519,102 @@ msgstr "Ohita"
517
519
518#: qml/Wizard/Pages/40-location.qml:27
520#: qml/Wizard/Pages/40-location.qml:27
519msgid "Location Services"
521msgid "Location Services"
520−msgstr ""
522+msgstr "Sijaintipalvelut"
521
523
522#: qml/Wizard/Pages/40-location.qml:83
524#: qml/Wizard/Pages/40-location.qml:83
523msgid ""
525msgid ""
524"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
526"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
525"(recommended)"
527"(recommended)"
526msgstr ""
528msgstr ""
529+"Käytä GPS:ää, wifi-tukiasemia ja mobiiliverkkoa anonyymisti sijainnin "
530+"havaitsemiseen (suositeltu)"
527
531
528#: qml/Wizard/Pages/40-location.qml:105
532#: qml/Wizard/Pages/40-location.qml:105
529#, qt-format
533#, qt-format
530msgid "By selecting this option you agree to the Nokia HERE %1."
534msgid "By selecting this option you agree to the Nokia HERE %1."
531−msgstr ""
535+msgstr "Valitsemalla tämän kohdan hyväksyt HERE:n %1."
532
536
533#: qml/Wizard/Pages/40-location.qml:106
537#: qml/Wizard/Pages/40-location.qml:106
534msgctxt "part of: Nokia HERE terms and conditions"
538msgctxt "part of: Nokia HERE terms and conditions"
535msgid "terms and conditions"
539msgid "terms and conditions"
536−msgstr ""
540+msgstr "käyttöehdot"
537
541
538#: qml/Wizard/Pages/40-location.qml:160
542#: qml/Wizard/Pages/40-location.qml:160
539msgid "GPS only"
543msgid "GPS only"
540−msgstr ""
544+msgstr "Vain GPS"
541
545
542#: qml/Wizard/Pages/40-location.qml:214
546#: qml/Wizard/Pages/40-location.qml:214
543msgid "Don't use my location"
547msgid "Don't use my location"
544−msgstr ""
548+msgstr "Älä käytä sijaintiani"
545
549
546#: qml/Wizard/Pages/40-location.qml:260
550#: qml/Wizard/Pages/40-location.qml:260
547msgid "You can change it later in System Settings."
551msgid "You can change it later in System Settings."
548−msgstr ""
552+msgstr "Voit muuttaa asetusta myöhemmin järjestelmän asetuksista."
549
553
550#: qml/Wizard/Pages/50-timezone.qml:29
554#: qml/Wizard/Pages/50-timezone.qml:29
551msgid "Time Zone"
555msgid "Time Zone"
552−msgstr ""
556+msgstr "Aikavyöhyke"
553
557
554#: qml/Wizard/Pages/50-timezone.qml:178
558#: qml/Wizard/Pages/50-timezone.qml:178
555msgid "Enter your city"
559msgid "Enter your city"
556−msgstr ""
560+msgstr "Määritä kaupunkisi"
557
561
558#: qml/Wizard/Pages/60-account.qml:24
562#: qml/Wizard/Pages/60-account.qml:24
559msgid "Personalize Your Device"
563msgid "Personalize Your Device"
560−msgstr ""
564+msgstr "Mukauta laitteesi"
561
565
562#: qml/Wizard/Pages/60-account.qml:48
566#: qml/Wizard/Pages/60-account.qml:48
563msgid "Preferred Name"
567msgid "Preferred Name"
564−msgstr ""
568+msgstr "Ensisijainen nimi"
565
569
566#: qml/Wizard/Pages/70-passwd-type.qml:39
570#: qml/Wizard/Pages/70-passwd-type.qml:39
567msgid "Lock Screen"
571msgid "Lock Screen"
568−msgstr ""
572+msgstr "Lukitusnäyttö"
569
573
570#: qml/Wizard/Pages/70-passwd-type.qml:101
574#: qml/Wizard/Pages/70-passwd-type.qml:101
571msgctxt "Label: Type of security method"
575msgctxt "Label: Type of security method"
572msgid "Create new password"
576msgid "Create new password"
573−msgstr ""
577+msgstr "Luo uusi salasana"
574
578
575#: qml/Wizard/Pages/70-passwd-type.qml:103
579#: qml/Wizard/Pages/70-passwd-type.qml:103
576msgctxt "Label: Type of security method"
580msgctxt "Label: Type of security method"
577msgid "Create passcode (numbers only)"
581msgid "Create passcode (numbers only)"
578−msgstr ""
582+msgstr "Luo suojakoodi (vain numeroita)"
579
583
580#: qml/Wizard/Pages/70-passwd-type.qml:105
584#: qml/Wizard/Pages/70-passwd-type.qml:105
581msgctxt "Label: Type of security method"
585msgctxt "Label: Type of security method"
582msgid "No lock code"
586msgid "No lock code"
583−msgstr ""
587+msgstr "Ei lukituskoodia"
584
588
585#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
589#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
586msgid "Privacy Policy"
590msgid "Privacy Policy"
587−msgstr ""
591+msgstr "Tietosuoja"
588
592
589#: qml/Wizard/Pages/75-report-check.qml:26
593#: qml/Wizard/Pages/75-report-check.qml:26
590msgid "Help Us Improve"
594msgid "Help Us Improve"
591−msgstr ""
595+msgstr "Auta parantamaan"
592
596
593#: qml/Wizard/Pages/75-report-check.qml:59
597#: qml/Wizard/Pages/75-report-check.qml:59
594msgid "Improve system performance by sending us crashes and error reports."
598msgid "Improve system performance by sending us crashes and error reports."
595msgstr ""
599msgstr ""
600+"Paranna järjestelmän suorituskykyä lähettämällä virheraportteja "
601+"Canonicalille."
596
602
597#: qml/Wizard/Pages/75-report-check.qml:60
603#: qml/Wizard/Pages/75-report-check.qml:60
598msgid "Privacy policy"
604msgid "Privacy policy"
599−msgstr ""
605+msgstr "Tietosuojakäytäntö"
600
606
601#: qml/Wizard/Pages/80-finished.qml:89
607#: qml/Wizard/Pages/80-finished.qml:89
602msgid "Welcome to Ubuntu"
608msgid "Welcome to Ubuntu"
603−msgstr ""
609+msgstr "Tervetuloa Ubuntuun"
604
610
605#: qml/Wizard/Pages/80-finished.qml:104
611#: qml/Wizard/Pages/80-finished.qml:104
606msgid "You are ready to use your device now"
612msgid "You are ready to use your device now"
607−msgstr ""
613+msgstr "Voit aloittaa nyt laitteesi käytön"
608
614
609#: qml/Wizard/Pages/80-finished.qml:124
615#: qml/Wizard/Pages/80-finished.qml:124
610msgid "Get Started"
616msgid "Get Started"
611−msgstr ""
617+msgstr "Alkuun pääsy"
612
618
613#: qml/Wizard/Pages/here-terms.qml:25
619#: qml/Wizard/Pages/here-terms.qml:25
614msgid "Terms & Conditions"
620msgid "Terms & Conditions"
@@ -616,7 +622,7 @@ msgstr "Käyttöehdot"
616
622
617#: qml/Wizard/Pages/here-terms.qml:69
623#: qml/Wizard/Pages/here-terms.qml:69
618msgid "Your device uses positioning technologies provided by HERE."
624msgid "Your device uses positioning technologies provided by HERE."
619−msgstr ""
625+msgstr "Laitteesi käyttää HERE:n tarjoamia sijaintiteknologioita."
620
626
621#: qml/Wizard/Pages/here-terms.qml:81
627#: qml/Wizard/Pages/here-terms.qml:81
622msgid ""
628msgid ""
@@ -624,21 +630,26 @@ msgid ""
624"collects information about nearby cell towers and Wi-Fi hotspots around your "
630"collects information about nearby cell towers and Wi-Fi hotspots around your "
625"current location whenever your position is being found."
631"current location whenever your position is being found."
626msgstr ""
632msgstr ""
633+"Sijaintipalvelujen ja niiden parantamisen vuoksi HERE kerää tietoja "
634+"lähelläsi olevista matkapuhelinmastoista ja wifi-tukiasemista, kun "
635+"sijaintisi paikannetaan."
627
636
628#: qml/Wizard/Pages/here-terms.qml:93
637#: qml/Wizard/Pages/here-terms.qml:93
629msgid ""
638msgid ""
630"The information collected is used to analyze the service and to improve the "
639"The information collected is used to analyze the service and to improve the "
631"use of service, but not to identify you personally."
640"use of service, but not to identify you personally."
632msgstr ""
641msgstr ""
642+"Kerättyä tietoa käytetään palvelun analysointiin ja palvelun parantamiseen, "
643+"mutta ei sinun henkilökohtaiseen tunnistamiseen."
633
644
634#: qml/Wizard/Pages/here-terms.qml:106
645#: qml/Wizard/Pages/here-terms.qml:106
635#, qt-format
646#, qt-format
636msgid "By continuing, you agree to the HERE platform %1 and %2."
647msgid "By continuing, you agree to the HERE platform %1 and %2."
637−msgstr ""
648+msgstr "Jatkamalla hyväksyt HERE-alustan %1 ja %2."
638
649
639#: qml/Wizard/Pages/here-terms.qml:107
650#: qml/Wizard/Pages/here-terms.qml:107
640msgid "Service Terms"
651msgid "Service Terms"
641−msgstr ""
652+msgstr "palveluehdot"
642
653
643#: qml/Wizard/Pages/passcode-confirm.qml:43
654#: qml/Wizard/Pages/passcode-confirm.qml:43
644#: qml/Wizard/Pages/passcode-desktop.qml:80
655#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -647,69 +658,69 @@ msgstr "Vahvista suojakoodi"
647
658
648#: qml/Wizard/Pages/passcode-confirm.qml:45
659#: qml/Wizard/Pages/passcode-confirm.qml:45
649msgid "Incorrect passcode."
660msgid "Incorrect passcode."
650−msgstr ""
661+msgstr "Virheellinen suojakoodi."
651
662
652#: qml/Wizard/Pages/passcode-confirm.qml:45
663#: qml/Wizard/Pages/passcode-confirm.qml:45
653msgctxt "Enter the passcode again"
664msgctxt "Enter the passcode again"
654msgid "Please re-enter."
665msgid "Please re-enter."
655−msgstr ""
666+msgstr "Anna uudelleen"
656
667
657#: qml/Wizard/Pages/passcode-desktop.qml:30
668#: qml/Wizard/Pages/passcode-desktop.qml:30
658msgid "Lock Screen Passcode"
669msgid "Lock Screen Passcode"
659−msgstr ""
670+msgstr "Lukitusnäytön suojakoodi"
660
671
661#: qml/Wizard/Pages/passcode-desktop.qml:56
672#: qml/Wizard/Pages/passcode-desktop.qml:56
662msgid "Enter 4 numbers to setup your passcode"
673msgid "Enter 4 numbers to setup your passcode"
663−msgstr ""
674+msgstr "Anna 4 numeroa määrittääksesi suojakoodisi"
664
675
665#: qml/Wizard/Pages/passcode-desktop.qml:65
676#: qml/Wizard/Pages/passcode-desktop.qml:65
666#: qml/Wizard/Pages/passcode-set.qml:54
677#: qml/Wizard/Pages/passcode-set.qml:54
667msgid "Choose passcode"
678msgid "Choose passcode"
668−msgstr ""
679+msgstr "Valitse suojakoodi"
669
680
670#: qml/Wizard/Pages/passcode-desktop.qml:105
681#: qml/Wizard/Pages/passcode-desktop.qml:105
671msgid "Passcode too short"
682msgid "Passcode too short"
672−msgstr ""
683+msgstr "Suojakoodi on liian lyhyt"
673
684
674#: qml/Wizard/Pages/passcode-desktop.qml:107
685#: qml/Wizard/Pages/passcode-desktop.qml:107
675msgid "Passcodes match"
686msgid "Passcodes match"
676−msgstr ""
687+msgstr "Suojakoodit vastaavat toisiaan"
677
688
678#: qml/Wizard/Pages/passcode-desktop.qml:109
689#: qml/Wizard/Pages/passcode-desktop.qml:109
679msgid "Passcodes do not match"
690msgid "Passcodes do not match"
680−msgstr ""
691+msgstr "Suojakoodit eivät vastaa toisiaan"
681
692
682#: qml/Wizard/Pages/passcode-set.qml:62
693#: qml/Wizard/Pages/passcode-set.qml:62
683msgid "Passcode must be 4 characters long"
694msgid "Passcode must be 4 characters long"
684−msgstr ""
695+msgstr "Suojakoodin tulee olla 4 merkkiä pitkä"
685
696
686#: qml/Wizard/Pages/password-set.qml:30
697#: qml/Wizard/Pages/password-set.qml:30
687msgid "Lock Screen Password"
698msgid "Lock Screen Password"
688−msgstr ""
699+msgstr "Lukitusnäytön salasana"
689
700
690#: qml/Wizard/Pages/password-set.qml:61
701#: qml/Wizard/Pages/password-set.qml:61
691msgid "Enter at least 8 characters"
702msgid "Enter at least 8 characters"
692−msgstr ""
703+msgstr "Anna ainakin 8 merkkiä"
693
704
694#: qml/Wizard/Pages/password-set.qml:73
705#: qml/Wizard/Pages/password-set.qml:73
695msgid "Choose password"
706msgid "Choose password"
696−msgstr ""
707+msgstr "Valitse salasana"
697
708
698#: qml/Wizard/Pages/password-set.qml:103
709#: qml/Wizard/Pages/password-set.qml:103
699msgid "Confirm password"
710msgid "Confirm password"
700−msgstr ""
711+msgstr "Vahvista salasana"
701
712
702#: qml/Wizard/Pages/sim.qml:27
713#: qml/Wizard/Pages/sim.qml:27
703msgid "No SIM card installed"
714msgid "No SIM card installed"
704−msgstr ""
715+msgstr "SIM-korttia ei ole asennettu"
705
716
706#: qml/Wizard/Pages/sim.qml:54
717#: qml/Wizard/Pages/sim.qml:54
707msgid "SIM card added"
718msgid "SIM card added"
708−msgstr ""
719+msgstr "SIM-kortti lisätty"
709
720
710#: qml/Wizard/Pages/sim.qml:55
721#: qml/Wizard/Pages/sim.qml:55
711msgid "You must restart the device to access the mobile network."
722msgid "You must restart the device to access the mobile network."
712−msgstr ""
723+msgstr "Käynnistä laite uudelleen, jotta voit käyttää mobiiliverkkoa."
713
724
714#: qml/Wizard/Pages/sim.qml:59
725#: qml/Wizard/Pages/sim.qml:59
715msgid "Restart"
726msgid "Restart"
@@ -717,35 +728,35 @@ msgstr "Käynnistä uudelleen"
717
728
718#: qml/Wizard/Pages/sim.qml:78
729#: qml/Wizard/Pages/sim.qml:78
719msgid "You won’t be able to make calls or use text messaging without a SIM."
730msgid "You won’t be able to make calls or use text messaging without a SIM."
720−msgstr ""
731+msgstr "Et voi käyttää puheluita ja tekstiviestejä ilman SIM-korttia."
721
732
722#: qml/Wizard/Pages/sim.qml:90
733#: qml/Wizard/Pages/sim.qml:90
723msgid "To proceed with no SIM tap Skip."
734msgid "To proceed with no SIM tap Skip."
724−msgstr ""
735+msgstr "Valitse \"Ohita\" jatkaaksesi ilman SIM-korttia."
725
736
726#: qml/Wizard/PasswordMeter.qml:87
737#: qml/Wizard/PasswordMeter.qml:87
727msgid "Passwords match"
738msgid "Passwords match"
728−msgstr ""
739+msgstr "Salasanat vastaavat toisiaan"
729
740
730#: qml/Wizard/PasswordMeter.qml:89
741#: qml/Wizard/PasswordMeter.qml:89
731msgid "Passwords do not match"
742msgid "Passwords do not match"
732−msgstr ""
743+msgstr "Salasanat eivät vastaa toisiaan"
733
744
734#: qml/Wizard/PasswordMeter.qml:93
745#: qml/Wizard/PasswordMeter.qml:93
735msgid "Strong password"
746msgid "Strong password"
736−msgstr ""
747+msgstr "Vahva salasana"
737
748
738#: qml/Wizard/PasswordMeter.qml:95
749#: qml/Wizard/PasswordMeter.qml:95
739msgid "Fair password"
750msgid "Fair password"
740−msgstr ""
751+msgstr "Keskinkertainen salasana"
741
752
742#: qml/Wizard/PasswordMeter.qml:97
753#: qml/Wizard/PasswordMeter.qml:97
743msgid "Weak password"
754msgid "Weak password"
744−msgstr ""
755+msgstr "Heikko salasana"
745
756
746#: qml/Wizard/PasswordMeter.qml:99
757#: qml/Wizard/PasswordMeter.qml:99
747msgid "Very weak password"
758msgid "Very weak password"
748−msgstr ""
759+msgstr "Erittäin heikko salasana"
749
760
750#~ msgid "Confirm"
761#~ msgid "Confirm"
751#~ msgstr "Hyväksy"
762#~ msgstr "Hyväksy"
@@ -1060,11 +1071,6 @@ msgstr ""
1060#~ msgid "Call back"
1071#~ msgid "Call back"
1061#~ msgstr "Soita takaisin"
1072#~ msgstr "Soita takaisin"
1062
1073
1063−#~ msgid "Welcome to your Ubuntu device."
1074+#~ msgid "Hover your mouse on the right edge to view your open apps"
1064−#~ msgstr "Tervetuloa Ubuntu-laitteesi pariin."
1075+#~ msgstr ""
1065−
1076+#~ "Vie hiiren osoitin oikeaan reunaan nähdäksesi avoinna olevat sovellukset"
1066−#~ msgid "Please select how you’d like to unlock your device."
1067−#~ msgstr "Valitse kuinka haluat avata laitteen lukituksen."
1068−
1069−#~ msgid "Your device is now ready to use."
1070−#~ msgstr "Laitteesi on nyt valmis käytettäväksi."
po/fo.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
13"Language-Team: Faroese <fo@li.org>\n"
13"Language-Team: Faroese <fo@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/fr.po+18−15
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-26 13:06+0000\n"
11"PO-Revision-Date: 2016-03-26 13:06+0000\n"
12"Last-Translator: Jean-Marc <Unknown>\n"
12"Last-Translator: Jean-Marc <Unknown>\n"
13"Language-Team: French <fr@li.org>\n"
13"Language-Team: French <fr@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-27 05:47+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -460,22 +460,21 @@ msgstr "Faites glisser vers le haut pour créer un message"
460msgid "Swipe up to manage the app"
460msgid "Swipe up to manage the app"
461msgstr "Faites glisser vers le haut pour gérer l'application"
461msgstr "Faites glisser vers le haut pour gérer l'application"
462
462
463−#: qml/Tutorial/TutorialLeft.qml:47
464−msgid "Swipe from the left edge to open the launcher"
465−msgstr "Faites glisser à partir du bord gauche pour ouvrir le lanceur"
466−
467#: qml/Tutorial/TutorialLeftLong.qml:47
463#: qml/Tutorial/TutorialLeftLong.qml:47
468msgid "Long swipe from the left edge to open the Today scope"
464msgid "Long swipe from the left edge to open the Today scope"
469msgstr ""
465msgstr ""
470"Faites glisser à partir du bord gauche jusqu'au bord droit pour ouvrir le "
466"Faites glisser à partir du bord gauche jusqu'au bord droit pour ouvrir le "
471"moteur de recherche Aujourd'hui"
467"moteur de recherche Aujourd'hui"
472
468
473−#: qml/Tutorial/TutorialRight.qml:54
469+#: qml/Tutorial/TutorialLeft.qml:47
474−msgid "Hover your mouse on the right edge to view your open apps"
470+msgid "Swipe from the left edge to open the launcher"
475−msgstr ""
471+msgstr "Faites glisser à partir du bord gauche pour ouvrir le lanceur"
476−"Passez votre souris sur le bord droit pour voir vos applications ouvertes"
477
472
478#: qml/Tutorial/TutorialRight.qml:55
473#: qml/Tutorial/TutorialRight.qml:55
474+msgid "Push your mouse against the right edge to view your open apps"
475+msgstr ""
476+
477+#: qml/Tutorial/TutorialRight.qml:56
479msgid "Short or long swipe from the right edge to view your open apps"
478msgid "Short or long swipe from the right edge to view your open apps"
480msgstr ""
479msgstr ""
481"Faites glisser brièvement ou longuement à partir du bord droit pour voir vos "
480"Faites glisser brièvement ou longuement à partir du bord droit pour voir vos "
@@ -564,7 +563,7 @@ msgstr "Ne pas utiliser ma position"
564
563
565#: qml/Wizard/Pages/40-location.qml:260
564#: qml/Wizard/Pages/40-location.qml:260
566msgid "You can change it later in System Settings."
565msgid "You can change it later in System Settings."
567−msgstr "Vous pouvez le modifier ultérieurement dans les Paramètres système."
566+msgstr "Vous pourrez le modifier ultérieurement dans les Paramètres système."
568
567
569#: qml/Wizard/Pages/50-timezone.qml:29
568#: qml/Wizard/Pages/50-timezone.qml:29
570msgid "Time Zone"
569msgid "Time Zone"
@@ -607,7 +606,7 @@ msgstr "Politique de confidentialité"
607
606
608#: qml/Wizard/Pages/75-report-check.qml:26
607#: qml/Wizard/Pages/75-report-check.qml:26
609msgid "Help Us Improve"
608msgid "Help Us Improve"
610−msgstr "Aidez-nous à améliorer"
609+msgstr "Aidez-nous à nous améliorer"
611
610
612#: qml/Wizard/Pages/75-report-check.qml:59
611#: qml/Wizard/Pages/75-report-check.qml:59
613msgid "Improve system performance by sending us crashes and error reports."
612msgid "Improve system performance by sending us crashes and error reports."
@@ -617,7 +616,7 @@ msgstr ""
617
616
618#: qml/Wizard/Pages/75-report-check.qml:60
617#: qml/Wizard/Pages/75-report-check.qml:60
619msgid "Privacy policy"
618msgid "Privacy policy"
620−msgstr "Politique relative à la vie privée"
619+msgstr "Politique de confidentialité"
621
620
622#: qml/Wizard/Pages/80-finished.qml:89
621#: qml/Wizard/Pages/80-finished.qml:89
623msgid "Welcome to Ubuntu"
622msgid "Welcome to Ubuntu"
@@ -752,7 +751,7 @@ msgstr ""
752
751
753#: qml/Wizard/Pages/sim.qml:90
752#: qml/Wizard/Pages/sim.qml:90
754msgid "To proceed with no SIM tap Skip."
753msgid "To proceed with no SIM tap Skip."
755−msgstr "Pour poursuivre sans carte SIM, appuyez sur « Ignorer »"
754+msgstr "Pour poursuivre sans carte SIM, appuyez sur « Passer »"
756
755
757#: qml/Wizard/PasswordMeter.qml:87
756#: qml/Wizard/PasswordMeter.qml:87
758msgid "Passwords match"
757msgid "Passwords match"
@@ -1102,3 +1101,7 @@ msgstr "Mot de passe très faible"
1102
1101
1103#~ msgid "Call back"
1102#~ msgid "Call back"
1104#~ msgstr "Rappeler"
1103#~ msgstr "Rappeler"
1104+
1105+#~ msgid "Hover your mouse on the right edge to view your open apps"
1106+#~ msgstr ""
1107+#~ "Passez votre souris sur le bord droit pour voir vos applications ouvertes"
po/ga.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-01-25 11:33+0000\n"
11"PO-Revision-Date: 2016-01-25 11:33+0000\n"
12"Last-Translator: Joshua Kiley <Unknown>\n"
12"Last-Translator: Joshua Kiley <Unknown>\n"
13"Language-Team: Irish <ga@li.org>\n"
13"Language-Team: Irish <ga@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n"
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -448,19 +448,19 @@ msgstr ""
448msgid "Swipe up to manage the app"
448msgid "Swipe up to manage the app"
449msgstr ""
449msgstr ""
450
450
451−#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Swipe from the left edge to open the launcher"
453−msgstr ""
454−
455#: qml/Tutorial/TutorialLeftLong.qml:47
451#: qml/Tutorial/TutorialLeftLong.qml:47
456msgid "Long swipe from the left edge to open the Today scope"
452msgid "Long swipe from the left edge to open the Today scope"
457msgstr ""
453msgstr ""
458
454
459−#: qml/Tutorial/TutorialRight.qml:54
455+#: qml/Tutorial/TutorialLeft.qml:47
460−msgid "Hover your mouse on the right edge to view your open apps"
456+msgid "Swipe from the left edge to open the launcher"
461msgstr ""
457msgstr ""
462
458
463#: qml/Tutorial/TutorialRight.qml:55
459#: qml/Tutorial/TutorialRight.qml:55
460+msgid "Push your mouse against the right edge to view your open apps"
461+msgstr ""
462+
463+#: qml/Tutorial/TutorialRight.qml:56
464msgid "Short or long swipe from the right edge to view your open apps"
464msgid "Short or long swipe from the right edge to view your open apps"
465msgstr ""
465msgstr ""
466
466
po/gd.po+15−12
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-04-08 18:34+0000\n"
11"PO-Revision-Date: 2016-04-08 18:34+0000\n"
12"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
12"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
13"Language-Team: Fòram na Gàidhlig\n"
13"Language-Team: Fòram na Gàidhlig\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
17"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
18"(n > 2 && n < 20) ? 2 : 3;\n"
18"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-04-09 05:45+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
20−"X-Generator: Launchpad (build 17990)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21"Language: gd\n"
21"Language: gd\n"
22
22
23#: plugins/IntegratedLightDM/Greeter.cpp:112
23#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -471,24 +471,22 @@ msgstr "Dèan grad-shlaighdeadh suas airson teachdaireachd a chruthachadh"
471msgid "Swipe up to manage the app"
471msgid "Swipe up to manage the app"
472msgstr "Dèan grad-shlaighdeadh suas gus an aplacaid a stiùireadh"
472msgstr "Dèan grad-shlaighdeadh suas gus an aplacaid a stiùireadh"
473
473
474−#: qml/Tutorial/TutorialLeft.qml:47
475−msgid "Swipe from the left edge to open the launcher"
476−msgstr ""
477−"Dèan grad-shlaighdeadh a-steach on oir chlì gus an lòinsear a chur gu dol"
478−
479#: qml/Tutorial/TutorialLeftLong.qml:47
474#: qml/Tutorial/TutorialLeftLong.qml:47
480msgid "Long swipe from the left edge to open the Today scope"
475msgid "Long swipe from the left edge to open the Today scope"
481msgstr ""
476msgstr ""
482"Dèan grad-shlaighdeadh a-steach on oir chlì gus breath an latha an-diugh "
477"Dèan grad-shlaighdeadh a-steach on oir chlì gus breath an latha an-diugh "
483"fhosgladh"
478"fhosgladh"
484
479
485−#: qml/Tutorial/TutorialRight.qml:54
480+#: qml/Tutorial/TutorialLeft.qml:47
486−msgid "Hover your mouse on the right edge to view your open apps"
481+msgid "Swipe from the left edge to open the launcher"
487msgstr ""
482msgstr ""
488−"Fan an luchag agad os cionn na h-oir dheas a dh’fhaicinn nan aplacaidean a "
483+"Dèan grad-shlaighdeadh a-steach on oir chlì gus an lòinsear a chur gu dol"
489−"tha fosgailte agad"
490
484
491#: qml/Tutorial/TutorialRight.qml:55
485#: qml/Tutorial/TutorialRight.qml:55
486+msgid "Push your mouse against the right edge to view your open apps"
487+msgstr ""
488+
489+#: qml/Tutorial/TutorialRight.qml:56
492msgid "Short or long swipe from the right edge to view your open apps"
490msgid "Short or long swipe from the right edge to view your open apps"
493msgstr ""
491msgstr ""
494"Dèan grad-shlaighdeadh fada no goirid on oir dheas a dh’fhaicinn nan "
492"Dèan grad-shlaighdeadh fada no goirid on oir dheas a dh’fhaicinn nan "
@@ -1111,3 +1109,8 @@ msgstr "Facal-faire glè lag"
1111
1109
1112#~ msgid "Call back"
1110#~ msgid "Call back"
1113#~ msgstr "Fònaig air ais"
1111#~ msgstr "Fònaig air ais"
1112+
1113+#~ msgid "Hover your mouse on the right edge to view your open apps"
1114+#~ msgstr ""
1115+#~ "Fan an luchag agad os cionn na h-oir dheas a dh’fhaicinn nan aplacaidean a "
1116+#~ "tha fosgailte agad"
po/gl.po+87−82
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-01-15 14:56+0000\n"
11"PO-Revision-Date: 2016-01-15 14:56+0000\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
13"Language-Team: Galician <gl@li.org>\n"
13"Language-Team: Galician <gl@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -182,11 +182,11 @@ msgstr "Engadir aos favoritos"
182
182
183#: qml/Dash/FiltersPopover.qml:60
183#: qml/Dash/FiltersPopover.qml:60
184msgid "Refine your results"
184msgid "Refine your results"
185−msgstr ""
185+msgstr "Afinar os resultados"
186
186
187#: qml/Dash/FiltersPopover.qml:69
187#: qml/Dash/FiltersPopover.qml:69
188msgid "Reset"
188msgid "Reset"
189−msgstr ""
189+msgstr "Restabelecer"
190
190
191#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
191#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192msgid "See less"
192msgid "See less"
@@ -203,11 +203,11 @@ msgstr "Buscar"
203
203
204#: qml/Dash/PageHeaderExtraPanel.qml:55
204#: qml/Dash/PageHeaderExtraPanel.qml:55
205msgid "Recent Searches"
205msgid "Recent Searches"
206−msgstr ""
206+msgstr "Buscas recentes"
207
207
208#: qml/Dash/PageHeaderExtraPanel.qml:66
208#: qml/Dash/PageHeaderExtraPanel.qml:66
209msgid "Clear All"
209msgid "Clear All"
210−msgstr ""
210+msgstr "Limpar todo"
211
211
212#: qml/Dash/Previews/PreviewActionCombo.qml:35
212#: qml/Dash/Previews/PreviewActionCombo.qml:35
213msgid "More..."
213msgid "More..."
@@ -426,51 +426,52 @@ msgstr "Chamar de volta"
426
426
427#: qml/Stages/SideStage.qml:76
427#: qml/Stages/SideStage.qml:76
428msgid "Drag using 3 fingers any application from one window to the other"
428msgid "Drag using 3 fingers any application from one window to the other"
429−msgstr ""
429+msgstr "Arrastre con 3 dedos calquera aplicativo dunha xanela á outra"
430
430
431#: qml/Tutorial/TutorialBottom.qml:78
431#: qml/Tutorial/TutorialBottom.qml:78
432msgid "Swipe up to add a contact"
432msgid "Swipe up to add a contact"
433−msgstr ""
433+msgstr "Esvare cara a arriba para engadir un contacto"
434
434
435#: qml/Tutorial/TutorialBottom.qml:80
435#: qml/Tutorial/TutorialBottom.qml:80
436msgid "Swipe up for favorite calculations"
436msgid "Swipe up for favorite calculations"
437−msgstr ""
437+msgstr "Esvare cara a arriba para marcar favorito un cálculo"
438
438
439#: qml/Tutorial/TutorialBottom.qml:82
439#: qml/Tutorial/TutorialBottom.qml:82
440msgid "Swipe up for recent calls"
440msgid "Swipe up for recent calls"
441−msgstr ""
441+msgstr "Esvare cara a arriba para ver as chamadas recentes"
442
442
443#: qml/Tutorial/TutorialBottom.qml:84
443#: qml/Tutorial/TutorialBottom.qml:84
444msgid "Swipe up to create a message"
444msgid "Swipe up to create a message"
445−msgstr ""
445+msgstr "Esvare cara a arriba para crear unha mensaxe"
446
446
447#: qml/Tutorial/TutorialBottom.qml:85
447#: qml/Tutorial/TutorialBottom.qml:85
448msgid "Swipe up to manage the app"
448msgid "Swipe up to manage the app"
449−msgstr ""
449+msgstr "Esvare cara a arriba para xestionar un aplicativo"
450−
451−#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Swipe from the left edge to open the launcher"
453−msgstr ""
454
450
455#: qml/Tutorial/TutorialLeftLong.qml:47
451#: qml/Tutorial/TutorialLeftLong.qml:47
456msgid "Long swipe from the left edge to open the Today scope"
452msgid "Long swipe from the left edge to open the Today scope"
457−msgstr ""
453+msgstr "Esvare longo desde o bordo esquerdo para abrir o ámbito Hoxe"
458
454
459−#: qml/Tutorial/TutorialRight.qml:54
455+#: qml/Tutorial/TutorialLeft.qml:47
460−msgid "Hover your mouse on the right edge to view your open apps"
456+msgid "Swipe from the left edge to open the launcher"
461−msgstr ""
457+msgstr "Esvare desde o bordo esquerdo para abrir o Iniciador"
462
458
463#: qml/Tutorial/TutorialRight.qml:55
459#: qml/Tutorial/TutorialRight.qml:55
464−msgid "Short or long swipe from the right edge to view your open apps"
460+msgid "Push your mouse against the right edge to view your open apps"
465msgstr ""
461msgstr ""
466
462
463+#: qml/Tutorial/TutorialRight.qml:56
464+msgid "Short or long swipe from the right edge to view your open apps"
465+msgstr "Esvare desde o bordo dereito para ver os aplicativos abertos"
466+
467#: qml/Tutorial/TutorialTop.qml:53
467#: qml/Tutorial/TutorialTop.qml:53
468msgid "Swipe from the top right edge to open the notification bar"
468msgid "Swipe from the top right edge to open the notification bar"
469msgstr ""
469msgstr ""
470+"Esvare desde o bordo superior dereito para abrir a barra de notificacións"
470
471
471#: qml/Tutorial/TutorialTop.qml:54
472#: qml/Tutorial/TutorialTop.qml:54
472msgid "Swipe from the top edge to open the notification bar"
473msgid "Swipe from the top edge to open the notification bar"
473−msgstr ""
474+msgstr "Esvare desde o bordo superior para abrir a barra de notificacións"
474
475
475#: qml/Wizard/Page.qml:54
476#: qml/Wizard/Page.qml:54
476msgctxt "Button: Go back one page in the Wizard"
477msgctxt "Button: Go back one page in the Wizard"
@@ -479,7 +480,7 @@ msgstr "Atrás"
479
480
480#: qml/Wizard/Pages/10-welcome.qml:27
481#: qml/Wizard/Pages/10-welcome.qml:27
481msgid "Language"
482msgid "Language"
482−msgstr ""
483+msgstr "Idioma"
483
484
484#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
485#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
485#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
486#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -488,7 +489,7 @@ msgstr ""
488#: qml/Wizard/Pages/passcode-desktop.qml:124
489#: qml/Wizard/Pages/passcode-desktop.qml:124
489#: qml/Wizard/Pages/password-set.qml:141
490#: qml/Wizard/Pages/password-set.qml:141
490msgid "Next"
491msgid "Next"
491−msgstr ""
492+msgstr "Seguinte"
492
493
493#: qml/Wizard/Pages/30-wifi.qml:29
494#: qml/Wizard/Pages/30-wifi.qml:29
494msgid "Connect to Wi‑Fi"
495msgid "Connect to Wi‑Fi"
@@ -496,15 +497,15 @@ msgstr "Conectar a unha wifi"
496
497
497#: qml/Wizard/Pages/30-wifi.qml:130
498#: qml/Wizard/Pages/30-wifi.qml:130
498msgid "Connected"
499msgid "Connected"
499−msgstr ""
500+msgstr "Conectado"
500
501
501#: qml/Wizard/Pages/30-wifi.qml:163
502#: qml/Wizard/Pages/30-wifi.qml:163
502msgid "Available Wi-Fi networks"
503msgid "Available Wi-Fi networks"
503−msgstr ""
504+msgstr "Hai redes wifi dispoñíbeis"
504
505
505#: qml/Wizard/Pages/30-wifi.qml:164
506#: qml/Wizard/Pages/30-wifi.qml:164
506msgid "No available Wi-Fi networks"
507msgid "No available Wi-Fi networks"
507−msgstr ""
508+msgstr "Non hai redes wifi dispoñíbeis"
508
509
509#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
510#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
510#: qml/Wizard/Pages/sim.qml:101
511#: qml/Wizard/Pages/sim.qml:101
@@ -513,98 +514,101 @@ msgstr "Saltar"
513
514
514#: qml/Wizard/Pages/40-location.qml:27
515#: qml/Wizard/Pages/40-location.qml:27
515msgid "Location Services"
516msgid "Location Services"
516−msgstr ""
517+msgstr "Servizos de localización"
517
518
518#: qml/Wizard/Pages/40-location.qml:83
519#: qml/Wizard/Pages/40-location.qml:83
519msgid ""
520msgid ""
520"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
521"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
521"(recommended)"
522"(recommended)"
522msgstr ""
523msgstr ""
524+"Usar GPS, punto de conexión wifi e rede móbil anonimamente para detectar a "
525+"localización (recomendado)"
523
526
524#: qml/Wizard/Pages/40-location.qml:105
527#: qml/Wizard/Pages/40-location.qml:105
525#, qt-format
528#, qt-format
526msgid "By selecting this option you agree to the Nokia HERE %1."
529msgid "By selecting this option you agree to the Nokia HERE %1."
527−msgstr ""
530+msgstr "Seleccionando esta opción acepta os %1 de HERE."
528
531
529#: qml/Wizard/Pages/40-location.qml:106
532#: qml/Wizard/Pages/40-location.qml:106
530msgctxt "part of: Nokia HERE terms and conditions"
533msgctxt "part of: Nokia HERE terms and conditions"
531msgid "terms and conditions"
534msgid "terms and conditions"
532−msgstr ""
535+msgstr "termos e condicións"
533
536
534#: qml/Wizard/Pages/40-location.qml:160
537#: qml/Wizard/Pages/40-location.qml:160
535msgid "GPS only"
538msgid "GPS only"
536−msgstr ""
539+msgstr "Só GPS"
537
540
538#: qml/Wizard/Pages/40-location.qml:214
541#: qml/Wizard/Pages/40-location.qml:214
539msgid "Don't use my location"
542msgid "Don't use my location"
540−msgstr ""
543+msgstr "Non usar a localización"
541
544
542#: qml/Wizard/Pages/40-location.qml:260
545#: qml/Wizard/Pages/40-location.qml:260
543msgid "You can change it later in System Settings."
546msgid "You can change it later in System Settings."
544−msgstr ""
547+msgstr "Pode cambiala depois nos axustes do sistema"
545
548
546#: qml/Wizard/Pages/50-timezone.qml:29
549#: qml/Wizard/Pages/50-timezone.qml:29
547msgid "Time Zone"
550msgid "Time Zone"
548−msgstr ""
551+msgstr "Zona horaria"
549
552
550#: qml/Wizard/Pages/50-timezone.qml:178
553#: qml/Wizard/Pages/50-timezone.qml:178
551msgid "Enter your city"
554msgid "Enter your city"
552−msgstr ""
555+msgstr "Introduza a súa cidade"
553
556
554#: qml/Wizard/Pages/60-account.qml:24
557#: qml/Wizard/Pages/60-account.qml:24
555msgid "Personalize Your Device"
558msgid "Personalize Your Device"
556−msgstr ""
559+msgstr "Personalice o dispositivo"
557
560
558#: qml/Wizard/Pages/60-account.qml:48
561#: qml/Wizard/Pages/60-account.qml:48
559msgid "Preferred Name"
562msgid "Preferred Name"
560−msgstr ""
563+msgstr "Nome preferido"
561
564
562#: qml/Wizard/Pages/70-passwd-type.qml:39
565#: qml/Wizard/Pages/70-passwd-type.qml:39
563msgid "Lock Screen"
566msgid "Lock Screen"
564−msgstr ""
567+msgstr "Bloquear pantalla"
565
568
566#: qml/Wizard/Pages/70-passwd-type.qml:101
569#: qml/Wizard/Pages/70-passwd-type.qml:101
567msgctxt "Label: Type of security method"
570msgctxt "Label: Type of security method"
568msgid "Create new password"
571msgid "Create new password"
569−msgstr ""
572+msgstr "Crear novo contrasinal"
570
573
571#: qml/Wizard/Pages/70-passwd-type.qml:103
574#: qml/Wizard/Pages/70-passwd-type.qml:103
572msgctxt "Label: Type of security method"
575msgctxt "Label: Type of security method"
573msgid "Create passcode (numbers only)"
576msgid "Create passcode (numbers only)"
574−msgstr ""
577+msgstr "Crear clave (só números)"
575
578
576#: qml/Wizard/Pages/70-passwd-type.qml:105
579#: qml/Wizard/Pages/70-passwd-type.qml:105
577msgctxt "Label: Type of security method"
580msgctxt "Label: Type of security method"
578msgid "No lock code"
581msgid "No lock code"
579−msgstr ""
582+msgstr "Sen código de bloqueo"
580
583
581#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
584#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
582msgid "Privacy Policy"
585msgid "Privacy Policy"
583−msgstr ""
586+msgstr "Política de confidencialidade"
584
587
585#: qml/Wizard/Pages/75-report-check.qml:26
588#: qml/Wizard/Pages/75-report-check.qml:26
586msgid "Help Us Improve"
589msgid "Help Us Improve"
587−msgstr ""
590+msgstr "Axúdenos a mellorar"
588
591
589#: qml/Wizard/Pages/75-report-check.qml:59
592#: qml/Wizard/Pages/75-report-check.qml:59
590msgid "Improve system performance by sending us crashes and error reports."
593msgid "Improve system performance by sending us crashes and error reports."
591msgstr ""
594msgstr ""
595+"Mellorar o rendemento do sistema enviándonos informes de erro e quebra."
592
596
593#: qml/Wizard/Pages/75-report-check.qml:60
597#: qml/Wizard/Pages/75-report-check.qml:60
594msgid "Privacy policy"
598msgid "Privacy policy"
595−msgstr ""
599+msgstr "Política de confidencialidade"
596
600
597#: qml/Wizard/Pages/80-finished.qml:89
601#: qml/Wizard/Pages/80-finished.qml:89
598msgid "Welcome to Ubuntu"
602msgid "Welcome to Ubuntu"
599−msgstr ""
603+msgstr "Benvida/o a Ubuntu"
600
604
601#: qml/Wizard/Pages/80-finished.qml:104
605#: qml/Wizard/Pages/80-finished.qml:104
602msgid "You are ready to use your device now"
606msgid "You are ready to use your device now"
603−msgstr ""
607+msgstr "Xa está listo para usar o dispositivo"
604
608
605#: qml/Wizard/Pages/80-finished.qml:124
609#: qml/Wizard/Pages/80-finished.qml:124
606msgid "Get Started"
610msgid "Get Started"
607−msgstr ""
611+msgstr "Comezar"
608
612
609#: qml/Wizard/Pages/here-terms.qml:25
613#: qml/Wizard/Pages/here-terms.qml:25
610msgid "Terms & Conditions"
614msgid "Terms & Conditions"
@@ -612,7 +616,7 @@ msgstr "Termos e condicións"
612
616
613#: qml/Wizard/Pages/here-terms.qml:69
617#: qml/Wizard/Pages/here-terms.qml:69
614msgid "Your device uses positioning technologies provided by HERE."
618msgid "Your device uses positioning technologies provided by HERE."
615−msgstr ""
619+msgstr "O dispositivo usa tecnoloxías de posicionamento fornecidas por HERE."
616
620
617#: qml/Wizard/Pages/here-terms.qml:81
621#: qml/Wizard/Pages/here-terms.qml:81
618msgid ""
622msgid ""
@@ -620,21 +624,26 @@ msgid ""
620"collects information about nearby cell towers and Wi-Fi hotspots around your "
624"collects information about nearby cell towers and Wi-Fi hotspots around your "
621"current location whenever your position is being found."
625"current location whenever your position is being found."
622msgstr ""
626msgstr ""
627+"Para proporcionarlle servizos de posicionamento e mellorar a calidade, HERE "
628+"recompila información sobre torres de telefonía móbil cercanas e puntos wifi "
629+"preto da localización actual sempre que se estabelece a posición."
623
630
624#: qml/Wizard/Pages/here-terms.qml:93
631#: qml/Wizard/Pages/here-terms.qml:93
625msgid ""
632msgid ""
626"The information collected is used to analyze the service and to improve the "
633"The information collected is used to analyze the service and to improve the "
627"use of service, but not to identify you personally."
634"use of service, but not to identify you personally."
628msgstr ""
635msgstr ""
636+"A información recompilada úsase para analizar o servizo e mellorar o uso, "
637+"pero non o identifica persoalmente."
629
638
630#: qml/Wizard/Pages/here-terms.qml:106
639#: qml/Wizard/Pages/here-terms.qml:106
631#, qt-format
640#, qt-format
632msgid "By continuing, you agree to the HERE platform %1 and %2."
641msgid "By continuing, you agree to the HERE platform %1 and %2."
633−msgstr ""
642+msgstr "Se continúa, acepta implicitamente a plataforma %1 e %2 de HERE."
634
643
635#: qml/Wizard/Pages/here-terms.qml:107
644#: qml/Wizard/Pages/here-terms.qml:107
636msgid "Service Terms"
645msgid "Service Terms"
637−msgstr ""
646+msgstr "Termos de servizo"
638
647
639#: qml/Wizard/Pages/passcode-confirm.qml:43
648#: qml/Wizard/Pages/passcode-confirm.qml:43
640#: qml/Wizard/Pages/passcode-desktop.qml:80
649#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -643,69 +652,69 @@ msgstr "Confirmar a clave"
643
652
644#: qml/Wizard/Pages/passcode-confirm.qml:45
653#: qml/Wizard/Pages/passcode-confirm.qml:45
645msgid "Incorrect passcode."
654msgid "Incorrect passcode."
646−msgstr ""
655+msgstr "A clave é incorrecta"
647
656
648#: qml/Wizard/Pages/passcode-confirm.qml:45
657#: qml/Wizard/Pages/passcode-confirm.qml:45
649msgctxt "Enter the passcode again"
658msgctxt "Enter the passcode again"
650msgid "Please re-enter."
659msgid "Please re-enter."
651−msgstr ""
660+msgstr "Reintroducir"
652
661
653#: qml/Wizard/Pages/passcode-desktop.qml:30
662#: qml/Wizard/Pages/passcode-desktop.qml:30
654msgid "Lock Screen Passcode"
663msgid "Lock Screen Passcode"
655−msgstr ""
664+msgstr "Clave da pantalla de bloqueo"
656
665
657#: qml/Wizard/Pages/passcode-desktop.qml:56
666#: qml/Wizard/Pages/passcode-desktop.qml:56
658msgid "Enter 4 numbers to setup your passcode"
667msgid "Enter 4 numbers to setup your passcode"
659−msgstr ""
668+msgstr "Introduza 4 números para estabelecer a clave"
660
669
661#: qml/Wizard/Pages/passcode-desktop.qml:65
670#: qml/Wizard/Pages/passcode-desktop.qml:65
662#: qml/Wizard/Pages/passcode-set.qml:54
671#: qml/Wizard/Pages/passcode-set.qml:54
663msgid "Choose passcode"
672msgid "Choose passcode"
664−msgstr ""
673+msgstr "Escolla unha clave"
665
674
666#: qml/Wizard/Pages/passcode-desktop.qml:105
675#: qml/Wizard/Pages/passcode-desktop.qml:105
667msgid "Passcode too short"
676msgid "Passcode too short"
668−msgstr ""
677+msgstr "A clave é curta de máis"
669
678
670#: qml/Wizard/Pages/passcode-desktop.qml:107
679#: qml/Wizard/Pages/passcode-desktop.qml:107
671msgid "Passcodes match"
680msgid "Passcodes match"
672−msgstr ""
681+msgstr "As claves coinciden"
673
682
674#: qml/Wizard/Pages/passcode-desktop.qml:109
683#: qml/Wizard/Pages/passcode-desktop.qml:109
675msgid "Passcodes do not match"
684msgid "Passcodes do not match"
676−msgstr ""
685+msgstr "As claves non coinciden"
677
686
678#: qml/Wizard/Pages/passcode-set.qml:62
687#: qml/Wizard/Pages/passcode-set.qml:62
679msgid "Passcode must be 4 characters long"
688msgid "Passcode must be 4 characters long"
680−msgstr ""
689+msgstr "A clave debe ter 4 caracteres"
681
690
682#: qml/Wizard/Pages/password-set.qml:30
691#: qml/Wizard/Pages/password-set.qml:30
683msgid "Lock Screen Password"
692msgid "Lock Screen Password"
684−msgstr ""
693+msgstr "Contrasinal da pantalla de bloqueo"
685
694
686#: qml/Wizard/Pages/password-set.qml:61
695#: qml/Wizard/Pages/password-set.qml:61
687msgid "Enter at least 8 characters"
696msgid "Enter at least 8 characters"
688−msgstr ""
697+msgstr "Introduza cando menos 8 caracteres"
689
698
690#: qml/Wizard/Pages/password-set.qml:73
699#: qml/Wizard/Pages/password-set.qml:73
691msgid "Choose password"
700msgid "Choose password"
692−msgstr ""
701+msgstr "Seleccionar contrasinal"
693
702
694#: qml/Wizard/Pages/password-set.qml:103
703#: qml/Wizard/Pages/password-set.qml:103
695msgid "Confirm password"
704msgid "Confirm password"
696−msgstr ""
705+msgstr "Confirmar o contrasinal"
697
706
698#: qml/Wizard/Pages/sim.qml:27
707#: qml/Wizard/Pages/sim.qml:27
699msgid "No SIM card installed"
708msgid "No SIM card installed"
700−msgstr ""
709+msgstr "Non está instalada ningunha tarxeta SIM"
701
710
702#: qml/Wizard/Pages/sim.qml:54
711#: qml/Wizard/Pages/sim.qml:54
703msgid "SIM card added"
712msgid "SIM card added"
704−msgstr ""
713+msgstr "Engadiuse a tarxeta SIM"
705
714
706#: qml/Wizard/Pages/sim.qml:55
715#: qml/Wizard/Pages/sim.qml:55
707msgid "You must restart the device to access the mobile network."
716msgid "You must restart the device to access the mobile network."
708−msgstr ""
717+msgstr "Debe reiniciar o dispositivo para acceder á rede móbil."
709
718
710#: qml/Wizard/Pages/sim.qml:59
719#: qml/Wizard/Pages/sim.qml:59
711msgid "Restart"
720msgid "Restart"
@@ -714,34 +723,36 @@ msgstr "Reiniciar"
714#: qml/Wizard/Pages/sim.qml:78
723#: qml/Wizard/Pages/sim.qml:78
715msgid "You won’t be able to make calls or use text messaging without a SIM."
724msgid "You won’t be able to make calls or use text messaging without a SIM."
716msgstr ""
725msgstr ""
726+"Non será posíbel facer chamadas nin usar a mensaxería de texto sen unha "
727+"tarxeta SIM."
717
728
718#: qml/Wizard/Pages/sim.qml:90
729#: qml/Wizard/Pages/sim.qml:90
719msgid "To proceed with no SIM tap Skip."
730msgid "To proceed with no SIM tap Skip."
720−msgstr ""
731+msgstr "Para continuar sen tarxeta SIM toque Saltar."
721
732
722#: qml/Wizard/PasswordMeter.qml:87
733#: qml/Wizard/PasswordMeter.qml:87
723msgid "Passwords match"
734msgid "Passwords match"
724−msgstr ""
735+msgstr "Os contrasinais coinciden"
725
736
726#: qml/Wizard/PasswordMeter.qml:89
737#: qml/Wizard/PasswordMeter.qml:89
727msgid "Passwords do not match"
738msgid "Passwords do not match"
728−msgstr ""
739+msgstr "Os contrasinais non coinciden"
729
740
730#: qml/Wizard/PasswordMeter.qml:93
741#: qml/Wizard/PasswordMeter.qml:93
731msgid "Strong password"
742msgid "Strong password"
732−msgstr ""
743+msgstr "O contrasinal é forte"
733
744
734#: qml/Wizard/PasswordMeter.qml:95
745#: qml/Wizard/PasswordMeter.qml:95
735msgid "Fair password"
746msgid "Fair password"
736−msgstr ""
747+msgstr "O contrasinal é aceptábel"
737
748
738#: qml/Wizard/PasswordMeter.qml:97
749#: qml/Wizard/PasswordMeter.qml:97
739msgid "Weak password"
750msgid "Weak password"
740−msgstr ""
751+msgstr "O contrasinal é feble"
741
752
742#: qml/Wizard/PasswordMeter.qml:99
753#: qml/Wizard/PasswordMeter.qml:99
743msgid "Very weak password"
754msgid "Very weak password"
744−msgstr ""
755+msgstr "O contrasinal é moi feble"
745
756
746#~ msgid "Confirm"
757#~ msgid "Confirm"
747#~ msgstr "Confirmar"
758#~ msgstr "Confirmar"
@@ -1058,11 +1069,5 @@ msgstr ""
1058#~ msgid "%a %d %b %l:%M %p"
1069#~ msgid "%a %d %b %l:%M %p"
1059#~ msgstr "%a, %d de %b  %l:%M %p"
1070#~ msgstr "%a, %d de %b  %l:%M %p"
1060
1071
1061−#~ msgid "Welcome to your Ubuntu device."
1072+#~ msgid "Hover your mouse on the right edge to view your open apps"
1062−#~ msgstr "Benvido/a ao seu dispositivo Ubuntu."
1073+#~ msgstr "Pouse o cursor no bordo dereito para ver os aplicativos abertos"
1063−
1064−#~ msgid "Please select how you’d like to unlock your device."
1065−#~ msgstr "Seleccione o xeito de desbloquear o dispositivo."
1066−
1067−#~ msgid "Your device is now ready to use."
1068−#~ msgstr "O dispositivo xa está listo para o seu uso."
po/gv.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-04-02 14:24+0000\n"
11"PO-Revision-Date: 2015-04-02 14:24+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Manx <gv@li.org>\n"
13"Language-Team: Manx <gv@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=3; plural=n == 1 ? 0 : (n == 2 ? 1 : 2);\n"
17"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : (n == 2 ? 1 : 2);\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -447,19 +447,19 @@ msgstr ""
447msgid "Swipe up to manage the app"
447msgid "Swipe up to manage the app"
448msgstr ""
448msgstr ""
449
449
450−#: qml/Tutorial/TutorialLeft.qml:47
451−msgid "Swipe from the left edge to open the launcher"
452−msgstr ""
453−
454#: qml/Tutorial/TutorialLeftLong.qml:47
450#: qml/Tutorial/TutorialLeftLong.qml:47
455msgid "Long swipe from the left edge to open the Today scope"
451msgid "Long swipe from the left edge to open the Today scope"
456msgstr ""
452msgstr ""
457
453
458−#: qml/Tutorial/TutorialRight.qml:54
454+#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Hover your mouse on the right edge to view your open apps"
455+msgid "Swipe from the left edge to open the launcher"
460msgstr ""
456msgstr ""
461
457
462#: qml/Tutorial/TutorialRight.qml:55
458#: qml/Tutorial/TutorialRight.qml:55
459+msgid "Push your mouse against the right edge to view your open apps"
460+msgstr ""
461+
462+#: qml/Tutorial/TutorialRight.qml:56
463msgid "Short or long swipe from the right edge to view your open apps"
463msgid "Short or long swipe from the right edge to view your open apps"
464msgstr ""
464msgstr ""
465
465
po/he.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-12 08:47+0000\n"
11"PO-Revision-Date: 2015-07-12 08:47+0000\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
13"Language-Team: Hebrew <he@li.org>\n"
13"Language-Team: Hebrew <he@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/hi.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
12"Last-Translator: Siddhanathan Shanmugam <Unknown>\n"
12"Last-Translator: Siddhanathan Shanmugam <Unknown>\n"
13"Language-Team: Hindi <hi@li.org>\n"
13"Language-Team: Hindi <hi@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/hr.po+91−82
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Croatian <hr@li.org>\n"
13"Language-Team: Croatian <hr@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -119,7 +119,7 @@ msgstr "Isključi"
119#: qml/Components/Dialogs.qml:210
119#: qml/Components/Dialogs.qml:210
120msgctxt "Button: Restart the system"
120msgctxt "Button: Restart the system"
121msgid "Restart"
121msgid "Restart"
122−msgstr "Ponovo pokreni"
122+msgstr "Ponovno pokreni"
123
123
124#: qml/Components/Lockscreen.qml:231
124#: qml/Components/Lockscreen.qml:231
125msgid "Return to Call"
125msgid "Return to Call"
@@ -186,11 +186,11 @@ msgstr "Dodaj u omiljene"
186
186
187#: qml/Dash/FiltersPopover.qml:60
187#: qml/Dash/FiltersPopover.qml:60
188msgid "Refine your results"
188msgid "Refine your results"
189−msgstr ""
189+msgstr "Precizirajte svoje rezultate"
190
190
191#: qml/Dash/FiltersPopover.qml:69
191#: qml/Dash/FiltersPopover.qml:69
192msgid "Reset"
192msgid "Reset"
193−msgstr ""
193+msgstr "Ponovno postavi"
194
194
195#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
195#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
196msgid "See less"
196msgid "See less"
@@ -207,11 +207,11 @@ msgstr "Pretraži"
207
207
208#: qml/Dash/PageHeaderExtraPanel.qml:55
208#: qml/Dash/PageHeaderExtraPanel.qml:55
209msgid "Recent Searches"
209msgid "Recent Searches"
210−msgstr ""
210+msgstr "Nedavna pretraživanja"
211
211
212#: qml/Dash/PageHeaderExtraPanel.qml:66
212#: qml/Dash/PageHeaderExtraPanel.qml:66
213msgid "Clear All"
213msgid "Clear All"
214−msgstr ""
214+msgstr "Obriši sve"
215
215
216#: qml/Dash/Previews/PreviewActionCombo.qml:35
216#: qml/Dash/Previews/PreviewActionCombo.qml:35
217msgid "More..."
217msgid "More..."
@@ -434,50 +434,53 @@ msgstr "Uzvrati poziv"
434#: qml/Stages/SideStage.qml:76
434#: qml/Stages/SideStage.qml:76
435msgid "Drag using 3 fingers any application from one window to the other"
435msgid "Drag using 3 fingers any application from one window to the other"
436msgstr ""
436msgstr ""
437+"Povucite pomoću 3 prsta bilo koju aplikaciju iz jednog prozora u drugi"
437
438
438#: qml/Tutorial/TutorialBottom.qml:78
439#: qml/Tutorial/TutorialBottom.qml:78
439msgid "Swipe up to add a contact"
440msgid "Swipe up to add a contact"
440−msgstr ""
441+msgstr "Povucite prema gore za dodavanje kontakta"
441
442
442#: qml/Tutorial/TutorialBottom.qml:80
443#: qml/Tutorial/TutorialBottom.qml:80
443msgid "Swipe up for favorite calculations"
444msgid "Swipe up for favorite calculations"
444−msgstr ""
445+msgstr "Povucite prema gore za izračunavanje omiljenih"
445
446
446#: qml/Tutorial/TutorialBottom.qml:82
447#: qml/Tutorial/TutorialBottom.qml:82
447msgid "Swipe up for recent calls"
448msgid "Swipe up for recent calls"
448−msgstr ""
449+msgstr "Povucite prema gore za nedavne pozive"
449
450
450#: qml/Tutorial/TutorialBottom.qml:84
451#: qml/Tutorial/TutorialBottom.qml:84
451msgid "Swipe up to create a message"
452msgid "Swipe up to create a message"
452−msgstr ""
453+msgstr "Povucite prema gore za stvaranje poruke"
453
454
454#: qml/Tutorial/TutorialBottom.qml:85
455#: qml/Tutorial/TutorialBottom.qml:85
455msgid "Swipe up to manage the app"
456msgid "Swipe up to manage the app"
456−msgstr ""
457+msgstr "Povucite prema gore za upravljanje aplikacijom"
457−
458−#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Swipe from the left edge to open the launcher"
460−msgstr ""
461
458
462#: qml/Tutorial/TutorialLeftLong.qml:47
459#: qml/Tutorial/TutorialLeftLong.qml:47
463msgid "Long swipe from the left edge to open the Today scope"
460msgid "Long swipe from the left edge to open the Today scope"
464−msgstr ""
461+msgstr "Dulje povucite od lijevog ruba za otvaranje današnjeg djelokruga"
465
462
466−#: qml/Tutorial/TutorialRight.qml:54
463+#: qml/Tutorial/TutorialLeft.qml:47
467−msgid "Hover your mouse on the right edge to view your open apps"
464+msgid "Swipe from the left edge to open the launcher"
468−msgstr ""
465+msgstr "Povucite od lijevog ruba za otvaranje pokretača"
469
466
470#: qml/Tutorial/TutorialRight.qml:55
467#: qml/Tutorial/TutorialRight.qml:55
468+msgid "Push your mouse against the right edge to view your open apps"
469+msgstr ""
470+
471+#: qml/Tutorial/TutorialRight.qml:56
471msgid "Short or long swipe from the right edge to view your open apps"
472msgid "Short or long swipe from the right edge to view your open apps"
472msgstr ""
473msgstr ""
474+"Kraće ili dulje povucite od desnog ruba kako bi vidjeli svoje otvorene "
475+"aplikacije"
473
476
474#: qml/Tutorial/TutorialTop.qml:53
477#: qml/Tutorial/TutorialTop.qml:53
475msgid "Swipe from the top right edge to open the notification bar"
478msgid "Swipe from the top right edge to open the notification bar"
476−msgstr ""
479+msgstr "Povucite od gornjeg desnog ruba za otvaranje obavijesne trake"
477
480
478#: qml/Tutorial/TutorialTop.qml:54
481#: qml/Tutorial/TutorialTop.qml:54
479msgid "Swipe from the top edge to open the notification bar"
482msgid "Swipe from the top edge to open the notification bar"
480−msgstr ""
483+msgstr "Povucite od gornjeg ruba za otvaranje obavijesne trake"
481
484
482#: qml/Wizard/Page.qml:54
485#: qml/Wizard/Page.qml:54
483msgctxt "Button: Go back one page in the Wizard"
486msgctxt "Button: Go back one page in the Wizard"
@@ -486,7 +489,7 @@ msgstr "Natrag"
486
489
487#: qml/Wizard/Pages/10-welcome.qml:27
490#: qml/Wizard/Pages/10-welcome.qml:27
488msgid "Language"
491msgid "Language"
489−msgstr ""
492+msgstr "Jezik"
490
493
491#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
494#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
492#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
495#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -495,7 +498,7 @@ msgstr ""
495#: qml/Wizard/Pages/passcode-desktop.qml:124
498#: qml/Wizard/Pages/passcode-desktop.qml:124
496#: qml/Wizard/Pages/password-set.qml:141
499#: qml/Wizard/Pages/password-set.qml:141
497msgid "Next"
500msgid "Next"
498−msgstr ""
501+msgstr "Sljedeće"
499
502
500#: qml/Wizard/Pages/30-wifi.qml:29
503#: qml/Wizard/Pages/30-wifi.qml:29
501msgid "Connect to Wi‑Fi"
504msgid "Connect to Wi‑Fi"
@@ -503,15 +506,15 @@ msgstr "Povezivanje s Wi‑Fi"
503
506
504#: qml/Wizard/Pages/30-wifi.qml:130
507#: qml/Wizard/Pages/30-wifi.qml:130
505msgid "Connected"
508msgid "Connected"
506−msgstr ""
509+msgstr "Povezano"
507
510
508#: qml/Wizard/Pages/30-wifi.qml:163
511#: qml/Wizard/Pages/30-wifi.qml:163
509msgid "Available Wi-Fi networks"
512msgid "Available Wi-Fi networks"
510−msgstr ""
513+msgstr "Dostupne bežične mreže"
511
514
512#: qml/Wizard/Pages/30-wifi.qml:164
515#: qml/Wizard/Pages/30-wifi.qml:164
513msgid "No available Wi-Fi networks"
516msgid "No available Wi-Fi networks"
514−msgstr ""
517+msgstr "Nema dostupnih bežičnih mreža"
515
518
516#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
519#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
517#: qml/Wizard/Pages/sim.qml:101
520#: qml/Wizard/Pages/sim.qml:101
@@ -520,98 +523,101 @@ msgstr "Preskoči"
520
523
521#: qml/Wizard/Pages/40-location.qml:27
524#: qml/Wizard/Pages/40-location.qml:27
522msgid "Location Services"
525msgid "Location Services"
523−msgstr ""
526+msgstr "Usluge lokacije"
524
527
525#: qml/Wizard/Pages/40-location.qml:83
528#: qml/Wizard/Pages/40-location.qml:83
526msgid ""
529msgid ""
527"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
530"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
528"(recommended)"
531"(recommended)"
529msgstr ""
532msgstr ""
533+"Koristi GPS, bežične pristupne točke i mobilnu mrežu anonimno za otkrivanje "
534+"lokacije (preporučeno)"
530
535
531#: qml/Wizard/Pages/40-location.qml:105
536#: qml/Wizard/Pages/40-location.qml:105
532#, qt-format
537#, qt-format
533msgid "By selecting this option you agree to the Nokia HERE %1."
538msgid "By selecting this option you agree to the Nokia HERE %1."
534−msgstr ""
539+msgstr "Odabirom ove mogućnosti pristajete na Nokia HERE %1."
535
540
536#: qml/Wizard/Pages/40-location.qml:106
541#: qml/Wizard/Pages/40-location.qml:106
537msgctxt "part of: Nokia HERE terms and conditions"
542msgctxt "part of: Nokia HERE terms and conditions"
538msgid "terms and conditions"
543msgid "terms and conditions"
539−msgstr ""
544+msgstr "uvjete i odredbe"
540
545
541#: qml/Wizard/Pages/40-location.qml:160
546#: qml/Wizard/Pages/40-location.qml:160
542msgid "GPS only"
547msgid "GPS only"
543−msgstr ""
548+msgstr "Samo GPS"
544
549
545#: qml/Wizard/Pages/40-location.qml:214
550#: qml/Wizard/Pages/40-location.qml:214
546msgid "Don't use my location"
551msgid "Don't use my location"
547−msgstr ""
552+msgstr "Ne koristi uslugu lokacije"
548
553
549#: qml/Wizard/Pages/40-location.qml:260
554#: qml/Wizard/Pages/40-location.qml:260
550msgid "You can change it later in System Settings."
555msgid "You can change it later in System Settings."
551−msgstr ""
556+msgstr "Ovo možete kasnije promijeniti u postavkama sustava."
552
557
553#: qml/Wizard/Pages/50-timezone.qml:29
558#: qml/Wizard/Pages/50-timezone.qml:29
554msgid "Time Zone"
559msgid "Time Zone"
555−msgstr ""
560+msgstr "Vremenska zona"
556
561
557#: qml/Wizard/Pages/50-timezone.qml:178
562#: qml/Wizard/Pages/50-timezone.qml:178
558msgid "Enter your city"
563msgid "Enter your city"
559−msgstr ""
564+msgstr "Upišite svoj grad"
560
565
561#: qml/Wizard/Pages/60-account.qml:24
566#: qml/Wizard/Pages/60-account.qml:24
562msgid "Personalize Your Device"
567msgid "Personalize Your Device"
563−msgstr ""
568+msgstr "Personalizirajte svoj uređaj"
564
569
565#: qml/Wizard/Pages/60-account.qml:48
570#: qml/Wizard/Pages/60-account.qml:48
566msgid "Preferred Name"
571msgid "Preferred Name"
567−msgstr ""
572+msgstr "Željeno ime"
568
573
569#: qml/Wizard/Pages/70-passwd-type.qml:39
574#: qml/Wizard/Pages/70-passwd-type.qml:39
570msgid "Lock Screen"
575msgid "Lock Screen"
571−msgstr ""
576+msgstr "Zaključaj zaslon"
572
577
573#: qml/Wizard/Pages/70-passwd-type.qml:101
578#: qml/Wizard/Pages/70-passwd-type.qml:101
574msgctxt "Label: Type of security method"
579msgctxt "Label: Type of security method"
575msgid "Create new password"
580msgid "Create new password"
576−msgstr ""
581+msgstr "Stvori novu lozinku"
577
582
578#: qml/Wizard/Pages/70-passwd-type.qml:103
583#: qml/Wizard/Pages/70-passwd-type.qml:103
579msgctxt "Label: Type of security method"
584msgctxt "Label: Type of security method"
580msgid "Create passcode (numbers only)"
585msgid "Create passcode (numbers only)"
581−msgstr ""
586+msgstr "Stvori sigurnosni kôd (samo brojevi)"
582
587
583#: qml/Wizard/Pages/70-passwd-type.qml:105
588#: qml/Wizard/Pages/70-passwd-type.qml:105
584msgctxt "Label: Type of security method"
589msgctxt "Label: Type of security method"
585msgid "No lock code"
590msgid "No lock code"
586−msgstr ""
591+msgstr "Nema kôda zaključavanja"
587
592
588#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
593#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
589msgid "Privacy Policy"
594msgid "Privacy Policy"
590−msgstr ""
595+msgstr "Pravila privatnosti"
591
596
592#: qml/Wizard/Pages/75-report-check.qml:26
597#: qml/Wizard/Pages/75-report-check.qml:26
593msgid "Help Us Improve"
598msgid "Help Us Improve"
594−msgstr ""
599+msgstr "Pomognite nam poboljšati"
595
600
596#: qml/Wizard/Pages/75-report-check.qml:59
601#: qml/Wizard/Pages/75-report-check.qml:59
597msgid "Improve system performance by sending us crashes and error reports."
602msgid "Improve system performance by sending us crashes and error reports."
598msgstr ""
603msgstr ""
604+"Poboljšajte performanse sustava šaljući nam izvješća grešaka i rušenja."
599
605
600#: qml/Wizard/Pages/75-report-check.qml:60
606#: qml/Wizard/Pages/75-report-check.qml:60
601msgid "Privacy policy"
607msgid "Privacy policy"
602−msgstr ""
608+msgstr "Pravila privatnosti"
603
609
604#: qml/Wizard/Pages/80-finished.qml:89
610#: qml/Wizard/Pages/80-finished.qml:89
605msgid "Welcome to Ubuntu"
611msgid "Welcome to Ubuntu"
606−msgstr ""
612+msgstr "Dobrodošli u Ubuntu"
607
613
608#: qml/Wizard/Pages/80-finished.qml:104
614#: qml/Wizard/Pages/80-finished.qml:104
609msgid "You are ready to use your device now"
615msgid "You are ready to use your device now"
610−msgstr ""
616+msgstr "Sada ste spremni koristiti svoj uređaj"
611
617
612#: qml/Wizard/Pages/80-finished.qml:124
618#: qml/Wizard/Pages/80-finished.qml:124
613msgid "Get Started"
619msgid "Get Started"
614−msgstr ""
620+msgstr "Započnite"
615
621
616#: qml/Wizard/Pages/here-terms.qml:25
622#: qml/Wizard/Pages/here-terms.qml:25
617msgid "Terms & Conditions"
623msgid "Terms & Conditions"
@@ -620,6 +626,7 @@ msgstr "Uvjeti i odredbe"
620#: qml/Wizard/Pages/here-terms.qml:69
626#: qml/Wizard/Pages/here-terms.qml:69
621msgid "Your device uses positioning technologies provided by HERE."
627msgid "Your device uses positioning technologies provided by HERE."
622msgstr ""
628msgstr ""
629+"Vaš uređaj koristi tehnologiju određivanja položaja koju omogućuje HERE."
623
630
624#: qml/Wizard/Pages/here-terms.qml:81
631#: qml/Wizard/Pages/here-terms.qml:81
625msgid ""
632msgid ""
@@ -627,21 +634,27 @@ msgid ""
627"collects information about nearby cell towers and Wi-Fi hotspots around your "
634"collects information about nearby cell towers and Wi-Fi hotspots around your "
628"current location whenever your position is being found."
635"current location whenever your position is being found."
629msgstr ""
636msgstr ""
637+"Kako bi vam omogućili uslugu određivanja položaja i poboljšali njenu "
638+"kvalitetu, HERE prikuplja informacije o obližnjim mobilnim odašiljačima i "
639+"bežičnim pristupnim točkama u okolini vaše trenutne lokacije kada je vaš "
640+"položaj pronađen."
630
641
631#: qml/Wizard/Pages/here-terms.qml:93
642#: qml/Wizard/Pages/here-terms.qml:93
632msgid ""
643msgid ""
633"The information collected is used to analyze the service and to improve the "
644"The information collected is used to analyze the service and to improve the "
634"use of service, but not to identify you personally."
645"use of service, but not to identify you personally."
635msgstr ""
646msgstr ""
647+"Prikupljene informacije se koriste za analizu i poboljšanje korištenja "
648+"usluga, ali ne i kako bi Vas osobno identificirali."
636
649
637#: qml/Wizard/Pages/here-terms.qml:106
650#: qml/Wizard/Pages/here-terms.qml:106
638#, qt-format
651#, qt-format
639msgid "By continuing, you agree to the HERE platform %1 and %2."
652msgid "By continuing, you agree to the HERE platform %1 and %2."
640−msgstr ""
653+msgstr "Nastavkom, pristajete na HERE platformu %1 i %2."
641
654
642#: qml/Wizard/Pages/here-terms.qml:107
655#: qml/Wizard/Pages/here-terms.qml:107
643msgid "Service Terms"
656msgid "Service Terms"
644−msgstr ""
657+msgstr "Uvjeti korištenja"
645
658
646#: qml/Wizard/Pages/passcode-confirm.qml:43
659#: qml/Wizard/Pages/passcode-confirm.qml:43
647#: qml/Wizard/Pages/passcode-desktop.qml:80
660#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -650,105 +663,106 @@ msgstr "Potvrdi kôd"
650
663
651#: qml/Wizard/Pages/passcode-confirm.qml:45
664#: qml/Wizard/Pages/passcode-confirm.qml:45
652msgid "Incorrect passcode."
665msgid "Incorrect passcode."
653−msgstr ""
666+msgstr "Neispravan sigurnosni kôd"
654
667
655#: qml/Wizard/Pages/passcode-confirm.qml:45
668#: qml/Wizard/Pages/passcode-confirm.qml:45
656msgctxt "Enter the passcode again"
669msgctxt "Enter the passcode again"
657msgid "Please re-enter."
670msgid "Please re-enter."
658−msgstr ""
671+msgstr "Ponovno upišite."
659
672
660#: qml/Wizard/Pages/passcode-desktop.qml:30
673#: qml/Wizard/Pages/passcode-desktop.qml:30
661msgid "Lock Screen Passcode"
674msgid "Lock Screen Passcode"
662−msgstr ""
675+msgstr "Kôd zaključavanja zaslona"
663
676
664#: qml/Wizard/Pages/passcode-desktop.qml:56
677#: qml/Wizard/Pages/passcode-desktop.qml:56
665msgid "Enter 4 numbers to setup your passcode"
678msgid "Enter 4 numbers to setup your passcode"
666−msgstr ""
679+msgstr "Upišite 4 broja za postavljanje vašeg kôda"
667
680
668#: qml/Wizard/Pages/passcode-desktop.qml:65
681#: qml/Wizard/Pages/passcode-desktop.qml:65
669#: qml/Wizard/Pages/passcode-set.qml:54
682#: qml/Wizard/Pages/passcode-set.qml:54
670msgid "Choose passcode"
683msgid "Choose passcode"
671−msgstr ""
684+msgstr "Odaberi kôd"
672
685
673#: qml/Wizard/Pages/passcode-desktop.qml:105
686#: qml/Wizard/Pages/passcode-desktop.qml:105
674msgid "Passcode too short"
687msgid "Passcode too short"
675−msgstr ""
688+msgstr "Kôd je prekratak"
676
689
677#: qml/Wizard/Pages/passcode-desktop.qml:107
690#: qml/Wizard/Pages/passcode-desktop.qml:107
678msgid "Passcodes match"
691msgid "Passcodes match"
679−msgstr ""
692+msgstr "Kôdovi se podudaraju"
680
693
681#: qml/Wizard/Pages/passcode-desktop.qml:109
694#: qml/Wizard/Pages/passcode-desktop.qml:109
682msgid "Passcodes do not match"
695msgid "Passcodes do not match"
683−msgstr ""
696+msgstr "Kôdovi se ne podudaraju"
684
697
685#: qml/Wizard/Pages/passcode-set.qml:62
698#: qml/Wizard/Pages/passcode-set.qml:62
686msgid "Passcode must be 4 characters long"
699msgid "Passcode must be 4 characters long"
687−msgstr ""
700+msgstr "Kôd mora sadržavati 4 znamenke"
688
701
689#: qml/Wizard/Pages/password-set.qml:30
702#: qml/Wizard/Pages/password-set.qml:30
690msgid "Lock Screen Password"
703msgid "Lock Screen Password"
691−msgstr ""
704+msgstr "Lozinka zaključavanja zaslona"
692
705
693#: qml/Wizard/Pages/password-set.qml:61
706#: qml/Wizard/Pages/password-set.qml:61
694msgid "Enter at least 8 characters"
707msgid "Enter at least 8 characters"
695−msgstr ""
708+msgstr "Upišite najmanje 8 znamenaka"
696
709
697#: qml/Wizard/Pages/password-set.qml:73
710#: qml/Wizard/Pages/password-set.qml:73
698msgid "Choose password"
711msgid "Choose password"
699−msgstr ""
712+msgstr "Odaberi lozinku"
700
713
701#: qml/Wizard/Pages/password-set.qml:103
714#: qml/Wizard/Pages/password-set.qml:103
702msgid "Confirm password"
715msgid "Confirm password"
703−msgstr ""
716+msgstr "Potvrdi lozniku"
704
717
705#: qml/Wizard/Pages/sim.qml:27
718#: qml/Wizard/Pages/sim.qml:27
706msgid "No SIM card installed"
719msgid "No SIM card installed"
707−msgstr ""
720+msgstr "Nema instalirane SIM kartice"
708
721
709#: qml/Wizard/Pages/sim.qml:54
722#: qml/Wizard/Pages/sim.qml:54
710msgid "SIM card added"
723msgid "SIM card added"
711−msgstr ""
724+msgstr "SIM kartica dodana"
712
725
713#: qml/Wizard/Pages/sim.qml:55
726#: qml/Wizard/Pages/sim.qml:55
714msgid "You must restart the device to access the mobile network."
727msgid "You must restart the device to access the mobile network."
715−msgstr ""
728+msgstr "Morate ponovno pokrenuti uređaj za pristup mobilnoj mreži."
716
729
717#: qml/Wizard/Pages/sim.qml:59
730#: qml/Wizard/Pages/sim.qml:59
718msgid "Restart"
731msgid "Restart"
719−msgstr ""
732+msgstr "Ponovno pokreni"
720
733
721#: qml/Wizard/Pages/sim.qml:78
734#: qml/Wizard/Pages/sim.qml:78
722msgid "You won’t be able to make calls or use text messaging without a SIM."
735msgid "You won’t be able to make calls or use text messaging without a SIM."
723msgstr ""
736msgstr ""
737+"Nećete biti u mogućnosti obavljati razgovore i slati poruke bez SIM kartice."
724
738
725#: qml/Wizard/Pages/sim.qml:90
739#: qml/Wizard/Pages/sim.qml:90
726msgid "To proceed with no SIM tap Skip."
740msgid "To proceed with no SIM tap Skip."
727−msgstr ""
741+msgstr "Za nastavak bez SIM kartice dotaknite Preskoči."
728
742
729#: qml/Wizard/PasswordMeter.qml:87
743#: qml/Wizard/PasswordMeter.qml:87
730msgid "Passwords match"
744msgid "Passwords match"
731−msgstr ""
745+msgstr "Lozinke se podudaraju"
732
746
733#: qml/Wizard/PasswordMeter.qml:89
747#: qml/Wizard/PasswordMeter.qml:89
734msgid "Passwords do not match"
748msgid "Passwords do not match"
735−msgstr ""
749+msgstr "Lozinke se ne podudaraju"
736
750
737#: qml/Wizard/PasswordMeter.qml:93
751#: qml/Wizard/PasswordMeter.qml:93
738msgid "Strong password"
752msgid "Strong password"
739−msgstr ""
753+msgstr "Snažna lozinka"
740
754
741#: qml/Wizard/PasswordMeter.qml:95
755#: qml/Wizard/PasswordMeter.qml:95
742msgid "Fair password"
756msgid "Fair password"
743−msgstr ""
757+msgstr "Solidna lozinka"
744
758
745#: qml/Wizard/PasswordMeter.qml:97
759#: qml/Wizard/PasswordMeter.qml:97
746msgid "Weak password"
760msgid "Weak password"
747−msgstr ""
761+msgstr "Slaba lozinka"
748
762
749#: qml/Wizard/PasswordMeter.qml:99
763#: qml/Wizard/PasswordMeter.qml:99
750msgid "Very weak password"
764msgid "Very weak password"
751−msgstr ""
765+msgstr "Vrlo slaba lozinka"
752
766
753#~ msgid "Confirm"
767#~ msgid "Confirm"
754#~ msgstr "Potvrdi"
768#~ msgstr "Potvrdi"
@@ -990,11 +1004,6 @@ msgstr ""
990#~ msgid "Long swipe from the right edge."
1004#~ msgid "Long swipe from the right edge."
991#~ msgstr "Povuci dugo s desnog ruba"
1005#~ msgstr "Povuci dugo s desnog ruba"
992
1006
993−#~ msgid "Your device is now ready to use."
1007+#~ msgid "Hover your mouse on the right edge to view your open apps"
994−#~ msgstr "Vaš uređaj je sada spreman za upotrebu."
1008+#~ msgstr ""
995−
1009+#~ "Lebdite svojim mišem po desnom rubu kako bi vidjeli otvorene aplikacije"
996−#~ msgid "Welcome to your Ubuntu device."
997−#~ msgstr "Dobrodošli u svoj Ubuntu uređaj."
998−
999−#~ msgid "Please select how you’d like to unlock your device."
1000−#~ msgstr "Odaberite kako želite otključavati svoj uređaj."
po/hu.po+13−19
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-24 09:19+0000\n"
11"PO-Revision-Date: 2016-03-24 09:19+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"
@@ -15,8 +15,8 @@ msgstr ""
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-03-25 05:55+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -451,19 +451,19 @@ msgstr "Csúsztasson felfelé új üzenet írásához"
451msgid "Swipe up to manage the app"
451msgid "Swipe up to manage the app"
452msgstr "Csúsztasson felfelé az alkalmazás kezeléséhez"
452msgstr "Csúsztasson felfelé az alkalmazás kezeléséhez"
453
453
454−#: qml/Tutorial/TutorialLeft.qml:47
455−msgid "Swipe from the left edge to open the launcher"
456−msgstr "Csúsztasson balról az indító eléréshez"
457−
458#: qml/Tutorial/TutorialLeftLong.qml:47
454#: qml/Tutorial/TutorialLeftLong.qml:47
459msgid "Long swipe from the left edge to open the Today scope"
455msgid "Long swipe from the left edge to open the Today scope"
460msgstr "Hosszan csúsztasson balról a Ma lencse eléréséhez"
456msgstr "Hosszan csúsztasson balról a Ma lencse eléréséhez"
461
457
462−#: qml/Tutorial/TutorialRight.qml:54
458+#: qml/Tutorial/TutorialLeft.qml:47
463−msgid "Hover your mouse on the right edge to view your open apps"
459+msgid "Swipe from the left edge to open the launcher"
464−msgstr "Húzza az egeret jobbra a nyitott alkalmazások eléréséhez"
460+msgstr "Csúsztasson balról az indító eléréshez"
465
461
466#: qml/Tutorial/TutorialRight.qml:55
462#: qml/Tutorial/TutorialRight.qml:55
463+msgid "Push your mouse against the right edge to view your open apps"
464+msgstr ""
465+
466+#: qml/Tutorial/TutorialRight.qml:56
467msgid "Short or long swipe from the right edge to view your open apps"
467msgid "Short or long swipe from the right edge to view your open apps"
468msgstr ""
468msgstr ""
469"Csúsztasson röviden vagy hosszan jobbról a nyitott alkalmazások eléréshez"
469"Csúsztasson röviden vagy hosszan jobbról a nyitott alkalmazások eléréshez"
@@ -547,7 +547,7 @@ msgstr "Ne határozza meg"
547
547
548#: qml/Wizard/Pages/40-location.qml:260
548#: qml/Wizard/Pages/40-location.qml:260
549msgid "You can change it later in System Settings."
549msgid "You can change it later in System Settings."
550−msgstr "Ezt később a Rendszerbállítások alatt módosíthatja."
550+msgstr "Ezt később a Rendszerbeállítások alatt módosíthatja."
551
551
552#: qml/Wizard/Pages/50-timezone.qml:29
552#: qml/Wizard/Pages/50-timezone.qml:29
553msgid "Time Zone"
553msgid "Time Zone"
@@ -1075,11 +1075,5 @@ msgstr "Nagyon gyenge jelszó"
1075#~ msgid "You almost got it!"
1075#~ msgid "You almost got it!"
1076#~ msgstr "Majdnem megvan!"
1076#~ msgstr "Majdnem megvan!"
1077
1077
1078−#~ msgid "Your device is now ready to use."
1078+#~ msgid "Hover your mouse on the right edge to view your open apps"
1079−#~ msgstr "Az eszköze készen áll a használatra."
1079+#~ msgstr "Húzza az egeret jobbra a nyitott alkalmazások eléréséhez"
1080−
1081−#~ msgid "Please select how you’d like to unlock your device."
1082−#~ msgstr "Válassza ki, hogy milyen módon szeretné feloldani az eszközét."
1083−
1084−#~ msgid "Welcome to your Ubuntu device."
1085−#~ msgstr "Köszönti az Ubuntus eszköze."
po/hy.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-10-28 06:34+0000\n"
11"PO-Revision-Date: 2014-10-28 06:34+0000\n"
12"Last-Translator: Vahan Harutyunyan <Unknown>\n"
12"Last-Translator: Vahan Harutyunyan <Unknown>\n"
13"Language-Team: Armenian <hy@li.org>\n"
13"Language-Team: Armenian <hy@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -444,19 +444,19 @@ msgstr ""
444msgid "Swipe up to manage the app"
444msgid "Swipe up to manage the app"
445msgstr ""
445msgstr ""
446
446
447−#: qml/Tutorial/TutorialLeft.qml:47
448−msgid "Swipe from the left edge to open the launcher"
449−msgstr ""
450−
451#: qml/Tutorial/TutorialLeftLong.qml:47
447#: qml/Tutorial/TutorialLeftLong.qml:47
452msgid "Long swipe from the left edge to open the Today scope"
448msgid "Long swipe from the left edge to open the Today scope"
453msgstr ""
449msgstr ""
454
450
455−#: qml/Tutorial/TutorialRight.qml:54
451+#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Hover your mouse on the right edge to view your open apps"
452+msgid "Swipe from the left edge to open the launcher"
457msgstr ""
453msgstr ""
458
454
459#: qml/Tutorial/TutorialRight.qml:55
455#: qml/Tutorial/TutorialRight.qml:55
456+msgid "Push your mouse against the right edge to view your open apps"
457+msgstr ""
458+
459+#: qml/Tutorial/TutorialRight.qml:56
460msgid "Short or long swipe from the right edge to view your open apps"
460msgid "Short or long swipe from the right edge to view your open apps"
461msgstr ""
461msgstr ""
462
462
po/ia.po+89−82
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-08-25 19:31+0000\n"
11"PO-Revision-Date: 2015-08-25 19:31+0000\n"
12"Last-Translator: karm <melo@carmu.com>\n"
12"Last-Translator: karm <melo@carmu.com>\n"
13"Language-Team: Interlingua <ia@li.org>\n"
13"Language-Team: Interlingua <ia@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -184,11 +184,11 @@ msgstr "Adder al Favoritos"
184
184
185#: qml/Dash/FiltersPopover.qml:60
185#: qml/Dash/FiltersPopover.qml:60
186msgid "Refine your results"
186msgid "Refine your results"
187−msgstr ""
187+msgstr "Poli tu resultatos"
188
188
189#: qml/Dash/FiltersPopover.qml:69
189#: qml/Dash/FiltersPopover.qml:69
190msgid "Reset"
190msgid "Reset"
191−msgstr ""
191+msgstr "Restabilir"
192
192
193#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
193#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
194msgid "See less"
194msgid "See less"
@@ -205,11 +205,11 @@ msgstr "Cerca"
205
205
206#: qml/Dash/PageHeaderExtraPanel.qml:55
206#: qml/Dash/PageHeaderExtraPanel.qml:55
207msgid "Recent Searches"
207msgid "Recent Searches"
208−msgstr ""
208+msgstr "Recercas recente"
209
209
210#: qml/Dash/PageHeaderExtraPanel.qml:66
210#: qml/Dash/PageHeaderExtraPanel.qml:66
211msgid "Clear All"
211msgid "Clear All"
212−msgstr ""
212+msgstr "Clarar toto"
213
213
214#: qml/Dash/Previews/PreviewActionCombo.qml:35
214#: qml/Dash/Previews/PreviewActionCombo.qml:35
215msgid "More..."
215msgid "More..."
@@ -428,51 +428,52 @@ msgstr "Appellar retro"
428
428
429#: qml/Stages/SideStage.qml:76
429#: qml/Stages/SideStage.qml:76
430msgid "Drag using 3 fingers any application from one window to the other"
430msgid "Drag using 3 fingers any application from one window to the other"
431−msgstr ""
431+msgstr "Tirar per 3 digitos qualcunque application ab un fenestra al altere"
432
432
433#: qml/Tutorial/TutorialBottom.qml:78
433#: qml/Tutorial/TutorialBottom.qml:78
434msgid "Swipe up to add a contact"
434msgid "Swipe up to add a contact"
435−msgstr ""
435+msgstr "Striar in alto pro adder un contacto"
436
436
437#: qml/Tutorial/TutorialBottom.qml:80
437#: qml/Tutorial/TutorialBottom.qml:80
438msgid "Swipe up for favorite calculations"
438msgid "Swipe up for favorite calculations"
439−msgstr ""
439+msgstr "Striar in alto pro le calculationes favorite"
440
440
441#: qml/Tutorial/TutorialBottom.qml:82
441#: qml/Tutorial/TutorialBottom.qml:82
442msgid "Swipe up for recent calls"
442msgid "Swipe up for recent calls"
443−msgstr ""
443+msgstr "Striar in alto pro le appellos recente"
444
444
445#: qml/Tutorial/TutorialBottom.qml:84
445#: qml/Tutorial/TutorialBottom.qml:84
446msgid "Swipe up to create a message"
446msgid "Swipe up to create a message"
447−msgstr ""
447+msgstr "Striar in alto pro crear un message"
448
448
449#: qml/Tutorial/TutorialBottom.qml:85
449#: qml/Tutorial/TutorialBottom.qml:85
450msgid "Swipe up to manage the app"
450msgid "Swipe up to manage the app"
451−msgstr ""
451+msgstr "Striar in alto pro gerer le applicationes"
452−
453−#: qml/Tutorial/TutorialLeft.qml:47
454−msgid "Swipe from the left edge to open the launcher"
455−msgstr ""
456
452
457#: qml/Tutorial/TutorialLeftLong.qml:47
453#: qml/Tutorial/TutorialLeftLong.qml:47
458msgid "Long swipe from the left edge to open the Today scope"
454msgid "Long swipe from the left edge to open the Today scope"
459−msgstr ""
455+msgstr "Striar ab le bordo sinistre pro aperir le campo Hodie"
460
456
461−#: qml/Tutorial/TutorialRight.qml:54
457+#: qml/Tutorial/TutorialLeft.qml:47
462−msgid "Hover your mouse on the right edge to view your open apps"
458+msgid "Swipe from the left edge to open the launcher"
463−msgstr ""
459+msgstr "Striar ab le bordo sinistre pro aperir le lanceator"
464
460
465#: qml/Tutorial/TutorialRight.qml:55
461#: qml/Tutorial/TutorialRight.qml:55
462+msgid "Push your mouse against the right edge to view your open apps"
463+msgstr ""
464+
465+#: qml/Tutorial/TutorialRight.qml:56
466msgid "Short or long swipe from the right edge to view your open apps"
466msgid "Short or long swipe from the right edge to view your open apps"
467msgstr ""
467msgstr ""
468+"Striar breve o longe ab le bordo dextre pro vider tu applicationes aperte"
468
469
469#: qml/Tutorial/TutorialTop.qml:53
470#: qml/Tutorial/TutorialTop.qml:53
470msgid "Swipe from the top right edge to open the notification bar"
471msgid "Swipe from the top right edge to open the notification bar"
471−msgstr ""
472+msgstr "Stria ab le bordo alte dextre pro aperir le barra del notificationes"
472
473
473#: qml/Tutorial/TutorialTop.qml:54
474#: qml/Tutorial/TutorialTop.qml:54
474msgid "Swipe from the top edge to open the notification bar"
475msgid "Swipe from the top edge to open the notification bar"
475−msgstr ""
476+msgstr "Stria ab le bordo alte pro aperir le barra de notification"
476
477
477#: qml/Wizard/Page.qml:54
478#: qml/Wizard/Page.qml:54
478msgctxt "Button: Go back one page in the Wizard"
479msgctxt "Button: Go back one page in the Wizard"
@@ -481,7 +482,7 @@ msgstr "Retro"
481
482
482#: qml/Wizard/Pages/10-welcome.qml:27
483#: qml/Wizard/Pages/10-welcome.qml:27
483msgid "Language"
484msgid "Language"
484−msgstr ""
485+msgstr "Lingua"
485
486
486#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
487#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
487#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
488#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -490,7 +491,7 @@ msgstr ""
490#: qml/Wizard/Pages/passcode-desktop.qml:124
491#: qml/Wizard/Pages/passcode-desktop.qml:124
491#: qml/Wizard/Pages/password-set.qml:141
492#: qml/Wizard/Pages/password-set.qml:141
492msgid "Next"
493msgid "Next"
493−msgstr ""
494+msgstr "Sequente"
494
495
495#: qml/Wizard/Pages/30-wifi.qml:29
496#: qml/Wizard/Pages/30-wifi.qml:29
496msgid "Connect to Wi‑Fi"
497msgid "Connect to Wi‑Fi"
@@ -498,15 +499,15 @@ msgstr "Connecter al Wi‑Fi"
498
499
499#: qml/Wizard/Pages/30-wifi.qml:130
500#: qml/Wizard/Pages/30-wifi.qml:130
500msgid "Connected"
501msgid "Connected"
501−msgstr ""
502+msgstr "Connexe"
502
503
503#: qml/Wizard/Pages/30-wifi.qml:163
504#: qml/Wizard/Pages/30-wifi.qml:163
504msgid "Available Wi-Fi networks"
505msgid "Available Wi-Fi networks"
505−msgstr ""
506+msgstr "Retes Wi-Fi disponibile"
506
507
507#: qml/Wizard/Pages/30-wifi.qml:164
508#: qml/Wizard/Pages/30-wifi.qml:164
508msgid "No available Wi-Fi networks"
509msgid "No available Wi-Fi networks"
509−msgstr ""
510+msgstr "Nulle retes Wi-Fi disponibile"
510
511
511#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
512#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
512#: qml/Wizard/Pages/sim.qml:101
513#: qml/Wizard/Pages/sim.qml:101
@@ -515,98 +516,102 @@ msgstr "Salta"
515
516
516#: qml/Wizard/Pages/40-location.qml:27
517#: qml/Wizard/Pages/40-location.qml:27
517msgid "Location Services"
518msgid "Location Services"
518−msgstr ""
519+msgstr "Servicios de position"
519
520
520#: qml/Wizard/Pages/40-location.qml:83
521#: qml/Wizard/Pages/40-location.qml:83
521msgid ""
522msgid ""
522"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
523"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
523"(recommended)"
524"(recommended)"
524msgstr ""
525msgstr ""
526+"Usar GPS, hotspots Wi-Fi e rete mobile anonymemente pro revelar le position "
527+"(recommendate)"
525
528
526#: qml/Wizard/Pages/40-location.qml:105
529#: qml/Wizard/Pages/40-location.qml:105
527#, qt-format
530#, qt-format
528msgid "By selecting this option you agree to the Nokia HERE %1."
531msgid "By selecting this option you agree to the Nokia HERE %1."
529−msgstr ""
532+msgstr "Per iste option tu conveni con le Nokia HERE %1."
530
533
531#: qml/Wizard/Pages/40-location.qml:106
534#: qml/Wizard/Pages/40-location.qml:106
532msgctxt "part of: Nokia HERE terms and conditions"
535msgctxt "part of: Nokia HERE terms and conditions"
533msgid "terms and conditions"
536msgid "terms and conditions"
534−msgstr ""
537+msgstr "Terminos & Conditiones"
535
538
536#: qml/Wizard/Pages/40-location.qml:160
539#: qml/Wizard/Pages/40-location.qml:160
537msgid "GPS only"
540msgid "GPS only"
538−msgstr ""
541+msgstr "GPS solmente"
539
542
540#: qml/Wizard/Pages/40-location.qml:214
543#: qml/Wizard/Pages/40-location.qml:214
541msgid "Don't use my location"
544msgid "Don't use my location"
542−msgstr ""
545+msgstr "Non usar mi position"
543
546
544#: qml/Wizard/Pages/40-location.qml:260
547#: qml/Wizard/Pages/40-location.qml:260
545msgid "You can change it later in System Settings."
548msgid "You can change it later in System Settings."
546−msgstr ""
549+msgstr "Tu poter cambiar lo depois in configurationes del systema."
547
550
548#: qml/Wizard/Pages/50-timezone.qml:29
551#: qml/Wizard/Pages/50-timezone.qml:29
549msgid "Time Zone"
552msgid "Time Zone"
550−msgstr ""
553+msgstr "Fuso horari"
551
554
552#: qml/Wizard/Pages/50-timezone.qml:178
555#: qml/Wizard/Pages/50-timezone.qml:178
553msgid "Enter your city"
556msgid "Enter your city"
554−msgstr ""
557+msgstr "Insere tu citate"
555
558
556#: qml/Wizard/Pages/60-account.qml:24
559#: qml/Wizard/Pages/60-account.qml:24
557msgid "Personalize Your Device"
560msgid "Personalize Your Device"
558−msgstr ""
561+msgstr "Personalisa tu dispositivo"
559
562
560#: qml/Wizard/Pages/60-account.qml:48
563#: qml/Wizard/Pages/60-account.qml:48
561msgid "Preferred Name"
564msgid "Preferred Name"
562−msgstr ""
565+msgstr "Preferred Name"
563
566
564#: qml/Wizard/Pages/70-passwd-type.qml:39
567#: qml/Wizard/Pages/70-passwd-type.qml:39
565msgid "Lock Screen"
568msgid "Lock Screen"
566−msgstr ""
569+msgstr "Blocar le schermo"
567
570
568#: qml/Wizard/Pages/70-passwd-type.qml:101
571#: qml/Wizard/Pages/70-passwd-type.qml:101
569msgctxt "Label: Type of security method"
572msgctxt "Label: Type of security method"
570msgid "Create new password"
573msgid "Create new password"
571−msgstr ""
574+msgstr "Crear un nove contrasigno"
572
575
573#: qml/Wizard/Pages/70-passwd-type.qml:103
576#: qml/Wizard/Pages/70-passwd-type.qml:103
574msgctxt "Label: Type of security method"
577msgctxt "Label: Type of security method"
575msgid "Create passcode (numbers only)"
578msgid "Create passcode (numbers only)"
576−msgstr ""
579+msgstr "Crear codice-contrasigno (numeros sol)"
577
580
578#: qml/Wizard/Pages/70-passwd-type.qml:105
581#: qml/Wizard/Pages/70-passwd-type.qml:105
579msgctxt "Label: Type of security method"
582msgctxt "Label: Type of security method"
580msgid "No lock code"
583msgid "No lock code"
581−msgstr ""
584+msgstr "Nulle codice de bloco"
582
585
583#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
586#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
584msgid "Privacy Policy"
587msgid "Privacy Policy"
585−msgstr ""
588+msgstr "Regulas del confidentialitate"
586
589
587#: qml/Wizard/Pages/75-report-check.qml:26
590#: qml/Wizard/Pages/75-report-check.qml:26
588msgid "Help Us Improve"
591msgid "Help Us Improve"
589−msgstr ""
592+msgstr "Adjuta nos a meliorar"
590
593
591#: qml/Wizard/Pages/75-report-check.qml:59
594#: qml/Wizard/Pages/75-report-check.qml:59
592msgid "Improve system performance by sending us crashes and error reports."
595msgid "Improve system performance by sending us crashes and error reports."
593msgstr ""
596msgstr ""
597+"Meliorar le performance del systema per expedir nos errores e reportos de "
598+"error."
594
599
595#: qml/Wizard/Pages/75-report-check.qml:60
600#: qml/Wizard/Pages/75-report-check.qml:60
596msgid "Privacy policy"
601msgid "Privacy policy"
597−msgstr ""
602+msgstr "Politica de confidentialitate"
598
603
599#: qml/Wizard/Pages/80-finished.qml:89
604#: qml/Wizard/Pages/80-finished.qml:89
600msgid "Welcome to Ubuntu"
605msgid "Welcome to Ubuntu"
601−msgstr ""
606+msgstr "Benvenite a Ubuntu."
602
607
603#: qml/Wizard/Pages/80-finished.qml:104
608#: qml/Wizard/Pages/80-finished.qml:104
604msgid "You are ready to use your device now"
609msgid "You are ready to use your device now"
605−msgstr ""
610+msgstr "Tu es preste a usar tu dispositivo nunc"
606
611
607#: qml/Wizard/Pages/80-finished.qml:124
612#: qml/Wizard/Pages/80-finished.qml:124
608msgid "Get Started"
613msgid "Get Started"
609−msgstr ""
614+msgstr "Initiar"
610
615
611#: qml/Wizard/Pages/here-terms.qml:25
616#: qml/Wizard/Pages/here-terms.qml:25
612msgid "Terms & Conditions"
617msgid "Terms & Conditions"
@@ -614,7 +619,7 @@ msgstr "Terminos & Conditiones"
614
619
615#: qml/Wizard/Pages/here-terms.qml:69
620#: qml/Wizard/Pages/here-terms.qml:69
616msgid "Your device uses positioning technologies provided by HERE."
621msgid "Your device uses positioning technologies provided by HERE."
617−msgstr ""
622+msgstr "Tu dispositivo usa le technologias de positionamento de HERE."
618
623
619#: qml/Wizard/Pages/here-terms.qml:81
624#: qml/Wizard/Pages/here-terms.qml:81
620msgid ""
625msgid ""
@@ -622,21 +627,26 @@ msgid ""
622"collects information about nearby cell towers and Wi-Fi hotspots around your "
627"collects information about nearby cell towers and Wi-Fi hotspots around your "
623"current location whenever your position is being found."
628"current location whenever your position is being found."
624msgstr ""
629msgstr ""
630+"Pro fornir te le servicios de positionamento e pro affinar lor qualitate, "
631+"HERE collige informationes del turres del cella vicin e del hotspots Wi-Fi "
632+"circa tu actual position quandocunque tu position debe esser trovate."
625
633
626#: qml/Wizard/Pages/here-terms.qml:93
634#: qml/Wizard/Pages/here-terms.qml:93
627msgid ""
635msgid ""
628"The information collected is used to analyze the service and to improve the "
636"The information collected is used to analyze the service and to improve the "
629"use of service, but not to identify you personally."
637"use of service, but not to identify you personally."
630msgstr ""
638msgstr ""
639+"Le information colligite es usate pro analysar le servicio e pro affinar le "
640+"usa de servicio, ma non pro identificar te personalmente"
631
641
632#: qml/Wizard/Pages/here-terms.qml:106
642#: qml/Wizard/Pages/here-terms.qml:106
633#, qt-format
643#, qt-format
634msgid "By continuing, you agree to the HERE platform %1 and %2."
644msgid "By continuing, you agree to the HERE platform %1 and %2."
635−msgstr ""
645+msgstr "Per continuar, tu conveni al platteforma %1 e %2 de HERE."
636
646
637#: qml/Wizard/Pages/here-terms.qml:107
647#: qml/Wizard/Pages/here-terms.qml:107
638msgid "Service Terms"
648msgid "Service Terms"
639−msgstr ""
649+msgstr "Terminos de servicio"
640
650
641#: qml/Wizard/Pages/passcode-confirm.qml:43
651#: qml/Wizard/Pages/passcode-confirm.qml:43
642#: qml/Wizard/Pages/passcode-desktop.qml:80
652#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -645,69 +655,69 @@ msgstr "Confirma le codice-contrasigno"
645
655
646#: qml/Wizard/Pages/passcode-confirm.qml:45
656#: qml/Wizard/Pages/passcode-confirm.qml:45
647msgid "Incorrect passcode."
657msgid "Incorrect passcode."
648−msgstr ""
658+msgstr "Codice-contrasigno non correcte."
649
659
650#: qml/Wizard/Pages/passcode-confirm.qml:45
660#: qml/Wizard/Pages/passcode-confirm.qml:45
651msgctxt "Enter the passcode again"
661msgctxt "Enter the passcode again"
652msgid "Please re-enter."
662msgid "Please re-enter."
653−msgstr ""
663+msgstr "Per favor re-inserer"
654
664
655#: qml/Wizard/Pages/passcode-desktop.qml:30
665#: qml/Wizard/Pages/passcode-desktop.qml:30
656msgid "Lock Screen Passcode"
666msgid "Lock Screen Passcode"
657−msgstr ""
667+msgstr "Codice contrasigno del bloca schermo."
658
668
659#: qml/Wizard/Pages/passcode-desktop.qml:56
669#: qml/Wizard/Pages/passcode-desktop.qml:56
660msgid "Enter 4 numbers to setup your passcode"
670msgid "Enter 4 numbers to setup your passcode"
661−msgstr ""
671+msgstr "Insere 4 numeros pro configurar tu codice-contrasigno"
662
672
663#: qml/Wizard/Pages/passcode-desktop.qml:65
673#: qml/Wizard/Pages/passcode-desktop.qml:65
664#: qml/Wizard/Pages/passcode-set.qml:54
674#: qml/Wizard/Pages/passcode-set.qml:54
665msgid "Choose passcode"
675msgid "Choose passcode"
666−msgstr ""
676+msgstr "Seliger le codice-contrasigno"
667
677
668#: qml/Wizard/Pages/passcode-desktop.qml:105
678#: qml/Wizard/Pages/passcode-desktop.qml:105
669msgid "Passcode too short"
679msgid "Passcode too short"
670−msgstr ""
680+msgstr "Codice-contrasigno troppo breve"
671
681
672#: qml/Wizard/Pages/passcode-desktop.qml:107
682#: qml/Wizard/Pages/passcode-desktop.qml:107
673msgid "Passcodes match"
683msgid "Passcodes match"
674−msgstr ""
684+msgstr "Le codices-contrasigno concorda"
675
685
676#: qml/Wizard/Pages/passcode-desktop.qml:109
686#: qml/Wizard/Pages/passcode-desktop.qml:109
677msgid "Passcodes do not match"
687msgid "Passcodes do not match"
678−msgstr ""
688+msgstr "Le codices-contrasigno non concorda"
679
689
680#: qml/Wizard/Pages/passcode-set.qml:62
690#: qml/Wizard/Pages/passcode-set.qml:62
681msgid "Passcode must be 4 characters long"
691msgid "Passcode must be 4 characters long"
682−msgstr ""
692+msgstr "Le codice-contrasigno debe esser longe 4 characteres"
683
693
684#: qml/Wizard/Pages/password-set.qml:30
694#: qml/Wizard/Pages/password-set.qml:30
685msgid "Lock Screen Password"
695msgid "Lock Screen Password"
686−msgstr ""
696+msgstr "Contrasigno del bloco del schermo"
687
697
688#: qml/Wizard/Pages/password-set.qml:61
698#: qml/Wizard/Pages/password-set.qml:61
689msgid "Enter at least 8 characters"
699msgid "Enter at least 8 characters"
690−msgstr ""
700+msgstr "Insere al minimo 8 characteres"
691
701
692#: qml/Wizard/Pages/password-set.qml:73
702#: qml/Wizard/Pages/password-set.qml:73
693msgid "Choose password"
703msgid "Choose password"
694−msgstr ""
704+msgstr "Seliger un contrasigno"
695
705
696#: qml/Wizard/Pages/password-set.qml:103
706#: qml/Wizard/Pages/password-set.qml:103
697msgid "Confirm password"
707msgid "Confirm password"
698−msgstr ""
708+msgstr "Confirmar le contrasigno"
699
709
700#: qml/Wizard/Pages/sim.qml:27
710#: qml/Wizard/Pages/sim.qml:27
701msgid "No SIM card installed"
711msgid "No SIM card installed"
702−msgstr ""
712+msgstr "Nulle carta SIM installate"
703
713
704#: qml/Wizard/Pages/sim.qml:54
714#: qml/Wizard/Pages/sim.qml:54
705msgid "SIM card added"
715msgid "SIM card added"
706−msgstr ""
716+msgstr "Carta SIM addite"
707
717
708#: qml/Wizard/Pages/sim.qml:55
718#: qml/Wizard/Pages/sim.qml:55
709msgid "You must restart the device to access the mobile network."
719msgid "You must restart the device to access the mobile network."
710−msgstr ""
720+msgstr "Tu debe reinitiar le dispositivo pro acceder le rete mobile."
711
721
712#: qml/Wizard/Pages/sim.qml:59
722#: qml/Wizard/Pages/sim.qml:59
713msgid "Restart"
723msgid "Restart"
@@ -716,34 +726,35 @@ msgstr "Re-Initiar"
716#: qml/Wizard/Pages/sim.qml:78
726#: qml/Wizard/Pages/sim.qml:78
717msgid "You won’t be able to make calls or use text messaging without a SIM."
727msgid "You won’t be able to make calls or use text messaging without a SIM."
718msgstr ""
728msgstr ""
729+"Tu non essera capace a facer appellos o usar messages de texto sin un SIM."
719
730
720#: qml/Wizard/Pages/sim.qml:90
731#: qml/Wizard/Pages/sim.qml:90
721msgid "To proceed with no SIM tap Skip."
732msgid "To proceed with no SIM tap Skip."
722−msgstr ""
733+msgstr "Pro proceder sin SIM colpa Saltar."
723
734
724#: qml/Wizard/PasswordMeter.qml:87
735#: qml/Wizard/PasswordMeter.qml:87
725msgid "Passwords match"
736msgid "Passwords match"
726−msgstr ""
737+msgstr "Le contrasignos concorda"
727
738
728#: qml/Wizard/PasswordMeter.qml:89
739#: qml/Wizard/PasswordMeter.qml:89
729msgid "Passwords do not match"
740msgid "Passwords do not match"
730−msgstr ""
741+msgstr "Le contrasignos non concorda"
731
742
732#: qml/Wizard/PasswordMeter.qml:93
743#: qml/Wizard/PasswordMeter.qml:93
733msgid "Strong password"
744msgid "Strong password"
734−msgstr ""
745+msgstr "Contrasigno forte"
735
746
736#: qml/Wizard/PasswordMeter.qml:95
747#: qml/Wizard/PasswordMeter.qml:95
737msgid "Fair password"
748msgid "Fair password"
738−msgstr ""
749+msgstr "Contrasigno passabile"
739
750
740#: qml/Wizard/PasswordMeter.qml:97
751#: qml/Wizard/PasswordMeter.qml:97
741msgid "Weak password"
752msgid "Weak password"
742−msgstr ""
753+msgstr "Contrasigno debile"
743
754
744#: qml/Wizard/PasswordMeter.qml:99
755#: qml/Wizard/PasswordMeter.qml:99
745msgid "Very weak password"
756msgid "Very weak password"
746−msgstr ""
757+msgstr "Contrasigno troppo debile"
747
758
748#~ msgid "Log out"
759#~ msgid "Log out"
749#~ msgstr "Clauder le Session"
760#~ msgstr "Clauder le Session"
@@ -1049,11 +1060,7 @@ msgstr ""
1049#~ msgid "Yesterday %l:%M %p"
1060#~ msgid "Yesterday %l:%M %p"
1050#~ msgstr "Heri"
1061#~ msgstr "Heri"
1051
1062
1052−#~ msgid "Welcome to your Ubuntu device."
1063+#~ msgid "Hover your mouse on the right edge to view your open apps"
1053−#~ msgstr "Benvenite a tu dispositivo Ubuntu."
1064+#~ msgstr ""
1054−
1065+#~ "Passar supra con tu mus sur le bordo dextere pro vider tu applicationes "
1055−#~ msgid "Please select how you’d like to unlock your device."
1066+#~ "aperte"
1056−#~ msgstr "Per favor elige como tu prefere disblocar tu dispositivo."
1057−
1058−#~ msgid "Your device is now ready to use."
1059−#~ msgstr "Tu dispositivo es nunc preste a usar."
po/id.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Indonesian <id@li.org>\n"
13"Language-Team: Indonesian <id@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -447,19 +447,19 @@ msgstr ""
447msgid "Swipe up to manage the app"
447msgid "Swipe up to manage the app"
448msgstr ""
448msgstr ""
449
449
450−#: qml/Tutorial/TutorialLeft.qml:47
451−msgid "Swipe from the left edge to open the launcher"
452−msgstr ""
453−
454#: qml/Tutorial/TutorialLeftLong.qml:47
450#: qml/Tutorial/TutorialLeftLong.qml:47
455msgid "Long swipe from the left edge to open the Today scope"
451msgid "Long swipe from the left edge to open the Today scope"
456msgstr ""
452msgstr ""
457
453
458−#: qml/Tutorial/TutorialRight.qml:54
454+#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Hover your mouse on the right edge to view your open apps"
455+msgid "Swipe from the left edge to open the launcher"
460msgstr ""
456msgstr ""
461
457
462#: qml/Tutorial/TutorialRight.qml:55
458#: qml/Tutorial/TutorialRight.qml:55
459+msgid "Push your mouse against the right edge to view your open apps"
460+msgstr ""
461+
462+#: qml/Tutorial/TutorialRight.qml:56
463msgid "Short or long swipe from the right edge to view your open apps"
463msgid "Short or long swipe from the right edge to view your open apps"
464msgstr ""
464msgstr ""
465
465
po/is.po+9−9
@@ -9,7 +9,7 @@ msgid ""
9msgstr ""
9msgstr ""
10"Project-Id-Version: po_unity8-is\n"
10"Project-Id-Version: po_unity8-is\n"
11"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
12−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
12+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
13"PO-Revision-Date: 2014-11-13 09:32+0000\n"
13"PO-Revision-Date: 2014-11-13 09:32+0000\n"
14"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
14"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
15"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
15"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
@@ -17,8 +17,8 @@ msgstr ""
17"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
19"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
20+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
21−"X-Generator: Launchpad (build 17958)\n"
21+"X-Generator: Launchpad (build 17995)\n"
22"Language: is\n"
22"Language: is\n"
23
23
24#: plugins/IntegratedLightDM/Greeter.cpp:112
24#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -453,19 +453,19 @@ msgstr ""
453msgid "Swipe up to manage the app"
453msgid "Swipe up to manage the app"
454msgstr ""
454msgstr ""
455
455
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
459−
460#: qml/Tutorial/TutorialLeftLong.qml:47
456#: qml/Tutorial/TutorialLeftLong.qml:47
461msgid "Long swipe from the left edge to open the Today scope"
457msgid "Long swipe from the left edge to open the Today scope"
462msgstr ""
458msgstr ""
463
459
464−#: qml/Tutorial/TutorialRight.qml:54
460+#: qml/Tutorial/TutorialLeft.qml:47
465−msgid "Hover your mouse on the right edge to view your open apps"
461+msgid "Swipe from the left edge to open the launcher"
466msgstr ""
462msgstr ""
467
463
468#: qml/Tutorial/TutorialRight.qml:55
464#: qml/Tutorial/TutorialRight.qml:55
465+msgid "Push your mouse against the right edge to view your open apps"
466+msgstr ""
467+
468+#: qml/Tutorial/TutorialRight.qml:56
469msgid "Short or long swipe from the right edge to view your open apps"
469msgid "Short or long swipe from the right edge to view your open apps"
470msgstr ""
470msgstr ""
471
471
po/it.po+14−11
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-04-03 16:08+0000\n"
11"PO-Revision-Date: 2016-04-03 16:08+0000\n"
12"Last-Translator: Milo Casagrande <milo.casagrande@gmail.com>\n"
12"Last-Translator: Milo Casagrande <milo.casagrande@gmail.com>\n"
13"Language-Team: Italian <it@li.org>\n"
13"Language-Team: Italian <it@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-04-04 05:38+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17972)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -455,20 +455,19 @@ msgstr "Scorrere verso l'alto per creare un messaggio"
455msgid "Swipe up to manage the app"
455msgid "Swipe up to manage the app"
456msgstr "Scorrere verso l'alto per gestire l'applicazione"
456msgstr "Scorrere verso l'alto per gestire l'applicazione"
457
457
458−#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Swipe from the left edge to open the launcher"
460−msgstr "Scorrere dal bordo sinistro per aprire il launcher"
461−
462#: qml/Tutorial/TutorialLeftLong.qml:47
458#: qml/Tutorial/TutorialLeftLong.qml:47
463msgid "Long swipe from the left edge to open the Today scope"
459msgid "Long swipe from the left edge to open the Today scope"
464msgstr "Scorrere lentamente dal bordo sinistro per aprire la scope Oggi"
460msgstr "Scorrere lentamente dal bordo sinistro per aprire la scope Oggi"
465
461
466−#: qml/Tutorial/TutorialRight.qml:54
462+#: qml/Tutorial/TutorialLeft.qml:47
467−msgid "Hover your mouse on the right edge to view your open apps"
463+msgid "Swipe from the left edge to open the launcher"
468−msgstr ""
464+msgstr "Scorrere dal bordo sinistro per aprire il launcher"
469−"Posizionare il mouse sul bordo destro per vedere le applicazioni aperte"
470
465
471#: qml/Tutorial/TutorialRight.qml:55
466#: qml/Tutorial/TutorialRight.qml:55
467+msgid "Push your mouse against the right edge to view your open apps"
468+msgstr ""
469+
470+#: qml/Tutorial/TutorialRight.qml:56
472msgid "Short or long swipe from the right edge to view your open apps"
471msgid "Short or long swipe from the right edge to view your open apps"
473msgstr ""
472msgstr ""
474"Scorrere lentamente o velocemente dal bordo destro per visualizzare le "
473"Scorrere lentamente o velocemente dal bordo destro per visualizzare le "
@@ -1083,3 +1082,7 @@ msgstr "Password molto fragile"
1083
1082
1084#~ msgid "Call back"
1083#~ msgid "Call back"
1085#~ msgstr "Richiama"
1084#~ msgstr "Richiama"
1085+
1086+#~ msgid "Hover your mouse on the right edge to view your open apps"
1087+#~ msgstr ""
1088+#~ "Posizionare il mouse sul bordo destro per vedere le applicazioni aperte"
po/ja.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-10-05 10:05+0000\n"
11"PO-Revision-Date: 2015-10-05 10:05+0000\n"
12"Last-Translator: Kentaro Kazuhama <Unknown>\n"
12"Last-Translator: Kentaro Kazuhama <Unknown>\n"
13"Language-Team: Japanese <ja@li.org>\n"
13"Language-Team: Japanese <ja@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -439,19 +439,19 @@ msgstr ""
439msgid "Swipe up to manage the app"
439msgid "Swipe up to manage the app"
440msgstr ""
440msgstr ""
441
441
442−#: qml/Tutorial/TutorialLeft.qml:47
443−msgid "Swipe from the left edge to open the launcher"
444−msgstr ""
445−
446#: qml/Tutorial/TutorialLeftLong.qml:47
442#: qml/Tutorial/TutorialLeftLong.qml:47
447msgid "Long swipe from the left edge to open the Today scope"
443msgid "Long swipe from the left edge to open the Today scope"
448msgstr ""
444msgstr ""
449
445
450−#: qml/Tutorial/TutorialRight.qml:54
446+#: qml/Tutorial/TutorialLeft.qml:47
451−msgid "Hover your mouse on the right edge to view your open apps"
447+msgid "Swipe from the left edge to open the launcher"
452msgstr ""
448msgstr ""
453
449
454#: qml/Tutorial/TutorialRight.qml:55
450#: qml/Tutorial/TutorialRight.qml:55
451+msgid "Push your mouse against the right edge to view your open apps"
452+msgstr ""
453+
454+#: qml/Tutorial/TutorialRight.qml:56
455msgid "Short or long swipe from the right edge to view your open apps"
455msgid "Short or long swipe from the right edge to view your open apps"
456msgstr ""
456msgstr ""
457
457
po/km.po+31−34
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-08-20 02:48+0000\n"
11"PO-Revision-Date: 2014-08-20 02:48+0000\n"
12"Last-Translator: Sophea Sok <sksophea@gmail.com>\n"
12"Last-Translator: Sophea Sok <sksophea@gmail.com>\n"
13"Language-Team: Khmer <km@li.org>\n"
13"Language-Team: Khmer <km@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -29,7 +29,7 @@ msgstr "ភ្ជាប់​ផ្លូវកាត់"
29
29
30#: plugins/Unity/Launcher/launcheritem.cpp:53
30#: plugins/Unity/Launcher/launcheritem.cpp:53
31msgid "Quit"
31msgid "Quit"
32−msgstr ""
32+msgstr "ចាកចេញ"
33
33
34#: plugins/Unity/Launcher/launcheritem.cpp:107
34#: plugins/Unity/Launcher/launcheritem.cpp:107
35msgid "Unpin shortcut"
35msgid "Unpin shortcut"
@@ -155,7 +155,7 @@ msgstr ""
155
155
156#: qml/Components/ModeSwitchWarningDialog.qml:88
156#: qml/Components/ModeSwitchWarningDialog.qml:88
157msgid "Close all"
157msgid "Close all"
158−msgstr ""
158+msgstr "បិទ​ទាំង​អស់"
159
159
160#: qml/Dash/DashPageHeader.qml:337
160#: qml/Dash/DashPageHeader.qml:337
161msgctxt "Button: Open the Ubuntu Store"
161msgctxt "Button: Open the Ubuntu Store"
@@ -186,7 +186,7 @@ msgstr ""
186
186
187#: qml/Dash/FiltersPopover.qml:69
187#: qml/Dash/FiltersPopover.qml:69
188msgid "Reset"
188msgid "Reset"
189−msgstr ""
189+msgstr "កំណត់​ឡើង​វិញ​"
190
190
191#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
191#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192msgid "See less"
192msgid "See less"
@@ -207,7 +207,7 @@ msgstr ""
207
207
208#: qml/Dash/PageHeaderExtraPanel.qml:66
208#: qml/Dash/PageHeaderExtraPanel.qml:66
209msgid "Clear All"
209msgid "Clear All"
210−msgstr ""
210+msgstr "សម្អាត​ទាំងអស់"
211
211
212#: qml/Dash/Previews/PreviewActionCombo.qml:35
212#: qml/Dash/Previews/PreviewActionCombo.qml:35
213msgid "More..."
213msgid "More..."
@@ -357,32 +357,29 @@ msgstr ""
357#, qt-format
357#, qt-format
358msgid "%1 hour"
358msgid "%1 hour"
359msgid_plural "%1 hours"
359msgid_plural "%1 hours"
360−msgstr[0] ""
360+msgstr[0] "%1 ម៉ោង"
361−msgstr[1] ""
362
361
363#: qml/Panel/Indicators/MenuItemFactory.qml:894
362#: qml/Panel/Indicators/MenuItemFactory.qml:894
364#, qt-format
363#, qt-format
365msgid "%1 minute"
364msgid "%1 minute"
366msgid_plural "%1 minutes"
365msgid_plural "%1 minutes"
367−msgstr[0] ""
366+msgstr[0] "%1 នាទី"
368−msgstr[1] ""
369
367
370#: qml/Panel/Indicators/MenuItemFactory.qml:899
368#: qml/Panel/Indicators/MenuItemFactory.qml:899
371#, qt-format
369#, qt-format
372msgid "%1 second"
370msgid "%1 second"
373msgid_plural "%1 seconds"
371msgid_plural "%1 seconds"
374−msgstr[0] ""
372+msgstr[0] "%1 វិនាទី"
375−msgstr[1] ""
376
373
377#: qml/Panel/Indicators/MenuItemFactory.qml:902
374#: qml/Panel/Indicators/MenuItemFactory.qml:902
378msgid "0 seconds"
375msgid "0 seconds"
379−msgstr ""
376+msgstr "០ វិនាទី"
380
377
381#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
378#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
382#: qml/Panel/Indicators/MenuItemFactory.qml:904
379#: qml/Panel/Indicators/MenuItemFactory.qml:904
383#, qt-format
380#, qt-format
384msgid "%1 remaining"
381msgid "%1 remaining"
385−msgstr ""
382+msgstr "នៅ​សល់ %1"
386
383
387#: qml/Panel/Indicators/MenuItemFactory.qml:910
384#: qml/Panel/Indicators/MenuItemFactory.qml:910
388msgid "In queue…"
385msgid "In queue…"
@@ -412,7 +409,7 @@ msgstr "បាន​បរាជ័យ ប៉ះ​ ដើម្បី​ព្
412#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
409#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
413msgctxt "Button: Send a reply message"
410msgctxt "Button: Send a reply message"
414msgid "Send"
411msgid "Send"
415−msgstr ""
412+msgstr "ផ្ញើ"
416
413
417#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
414#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
418msgctxt "Label: Hint in message indicator line edit"
415msgctxt "Label: Hint in message indicator line edit"
@@ -422,7 +419,7 @@ msgstr "ឆ្លើយតប"
422#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
419#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
423msgctxt "Button: Call back on phone"
420msgctxt "Button: Call back on phone"
424msgid "Call back"
421msgid "Call back"
425−msgstr ""
422+msgstr "ហៅ​មកវិញ"
426
423
427#: qml/Stages/SideStage.qml:76
424#: qml/Stages/SideStage.qml:76
428msgid "Drag using 3 fingers any application from one window to the other"
425msgid "Drag using 3 fingers any application from one window to the other"
@@ -448,19 +445,19 @@ msgstr ""
448msgid "Swipe up to manage the app"
445msgid "Swipe up to manage the app"
449msgstr ""
446msgstr ""
450
447
451−#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Swipe from the left edge to open the launcher"
453−msgstr ""
454−
455#: qml/Tutorial/TutorialLeftLong.qml:47
448#: qml/Tutorial/TutorialLeftLong.qml:47
456msgid "Long swipe from the left edge to open the Today scope"
449msgid "Long swipe from the left edge to open the Today scope"
457msgstr ""
450msgstr ""
458
451
459−#: qml/Tutorial/TutorialRight.qml:54
452+#: qml/Tutorial/TutorialLeft.qml:47
460−msgid "Hover your mouse on the right edge to view your open apps"
453+msgid "Swipe from the left edge to open the launcher"
461msgstr ""
454msgstr ""
462
455
463#: qml/Tutorial/TutorialRight.qml:55
456#: qml/Tutorial/TutorialRight.qml:55
457+msgid "Push your mouse against the right edge to view your open apps"
458+msgstr ""
459+
460+#: qml/Tutorial/TutorialRight.qml:56
464msgid "Short or long swipe from the right edge to view your open apps"
461msgid "Short or long swipe from the right edge to view your open apps"
465msgstr ""
462msgstr ""
466
463
@@ -479,7 +476,7 @@ msgstr "ថយក្រោយ"
479
476
480#: qml/Wizard/Pages/10-welcome.qml:27
477#: qml/Wizard/Pages/10-welcome.qml:27
481msgid "Language"
478msgid "Language"
482−msgstr ""
479+msgstr "ភាសា"
483
480
484#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
481#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
485#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
482#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -488,7 +485,7 @@ msgstr ""
488#: qml/Wizard/Pages/passcode-desktop.qml:124
485#: qml/Wizard/Pages/passcode-desktop.qml:124
489#: qml/Wizard/Pages/password-set.qml:141
486#: qml/Wizard/Pages/password-set.qml:141
490msgid "Next"
487msgid "Next"
491−msgstr ""
488+msgstr "បន្ទាប់"
492
489
493#: qml/Wizard/Pages/30-wifi.qml:29
490#: qml/Wizard/Pages/30-wifi.qml:29
494msgid "Connect to Wi‑Fi"
491msgid "Connect to Wi‑Fi"
@@ -496,7 +493,7 @@ msgstr ""
496
493
497#: qml/Wizard/Pages/30-wifi.qml:130
494#: qml/Wizard/Pages/30-wifi.qml:130
498msgid "Connected"
495msgid "Connected"
499−msgstr ""
496+msgstr "បាន​តភ្ជាប់"
500
497
501#: qml/Wizard/Pages/30-wifi.qml:163
498#: qml/Wizard/Pages/30-wifi.qml:163
502msgid "Available Wi-Fi networks"
499msgid "Available Wi-Fi networks"
@@ -545,7 +542,7 @@ msgstr ""
545
542
546#: qml/Wizard/Pages/50-timezone.qml:29
543#: qml/Wizard/Pages/50-timezone.qml:29
547msgid "Time Zone"
544msgid "Time Zone"
548−msgstr ""
545+msgstr "តំបន់​ពេល​វេលា"
549
546
550#: qml/Wizard/Pages/50-timezone.qml:178
547#: qml/Wizard/Pages/50-timezone.qml:178
551msgid "Enter your city"
548msgid "Enter your city"
@@ -561,7 +558,7 @@ msgstr ""
561
558
562#: qml/Wizard/Pages/70-passwd-type.qml:39
559#: qml/Wizard/Pages/70-passwd-type.qml:39
563msgid "Lock Screen"
560msgid "Lock Screen"
564−msgstr ""
561+msgstr "​អេក្រង់ចាក់សោ"
565
562
566#: qml/Wizard/Pages/70-passwd-type.qml:101
563#: qml/Wizard/Pages/70-passwd-type.qml:101
567msgctxt "Label: Type of security method"
564msgctxt "Label: Type of security method"
@@ -580,7 +577,7 @@ msgstr ""
580
577
581#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
578#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
582msgid "Privacy Policy"
579msgid "Privacy Policy"
583−msgstr ""
580+msgstr "គោលនយោបាយ​ភាព​ឯកជន"
584
581
585#: qml/Wizard/Pages/75-report-check.qml:26
582#: qml/Wizard/Pages/75-report-check.qml:26
586msgid "Help Us Improve"
583msgid "Help Us Improve"
@@ -592,11 +589,11 @@ msgstr ""
592
589
593#: qml/Wizard/Pages/75-report-check.qml:60
590#: qml/Wizard/Pages/75-report-check.qml:60
594msgid "Privacy policy"
591msgid "Privacy policy"
595−msgstr ""
592+msgstr "គោលនយោបាយ​ភាព​ឯកជន"
596
593
597#: qml/Wizard/Pages/80-finished.qml:89
594#: qml/Wizard/Pages/80-finished.qml:89
598msgid "Welcome to Ubuntu"
595msgid "Welcome to Ubuntu"
599−msgstr ""
596+msgstr "សូម​ស្វាគមន៍​ការ​មកកាន់​ Ubuntu"
600
597
601#: qml/Wizard/Pages/80-finished.qml:104
598#: qml/Wizard/Pages/80-finished.qml:104
602msgid "You are ready to use your device now"
599msgid "You are ready to use your device now"
@@ -693,7 +690,7 @@ msgstr ""
693
690
694#: qml/Wizard/Pages/password-set.qml:103
691#: qml/Wizard/Pages/password-set.qml:103
695msgid "Confirm password"
692msgid "Confirm password"
696−msgstr ""
693+msgstr "បញ្ជាក់​ពាក្យ​សម្ងាត់"
697
694
698#: qml/Wizard/Pages/sim.qml:27
695#: qml/Wizard/Pages/sim.qml:27
699msgid "No SIM card installed"
696msgid "No SIM card installed"
@@ -721,11 +718,11 @@ msgstr ""
721
718
722#: qml/Wizard/PasswordMeter.qml:87
719#: qml/Wizard/PasswordMeter.qml:87
723msgid "Passwords match"
720msgid "Passwords match"
724−msgstr ""
721+msgstr "ពាក្យ​សម្ងាត់​ត្រូវ​គ្នា​ហើយ"
725
722
726#: qml/Wizard/PasswordMeter.qml:89
723#: qml/Wizard/PasswordMeter.qml:89
727msgid "Passwords do not match"
724msgid "Passwords do not match"
728−msgstr ""
725+msgstr "ពាក្យ​សម្ងាត់​មិន​ដូច​គ្នា​ទេ"
729
726
730#: qml/Wizard/PasswordMeter.qml:93
727#: qml/Wizard/PasswordMeter.qml:93
731msgid "Strong password"
728msgid "Strong password"
po/kn.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kannada <kn@li.org>\n"
13"Language-Team: Kannada <kn@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/ko.po+9−18
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-08-19 13:02+0000\n"
11"PO-Revision-Date: 2014-08-19 13:02+0000\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
13"Language-Team: Korean <ko@li.org>\n"
13"Language-Team: Korean <ko@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -436,19 +436,19 @@ msgstr ""
436msgid "Swipe up to manage the app"
436msgid "Swipe up to manage the app"
437msgstr ""
437msgstr ""
438
438
439−#: qml/Tutorial/TutorialLeft.qml:47
440−msgid "Swipe from the left edge to open the launcher"
441−msgstr ""
442−
443#: qml/Tutorial/TutorialLeftLong.qml:47
439#: qml/Tutorial/TutorialLeftLong.qml:47
444msgid "Long swipe from the left edge to open the Today scope"
440msgid "Long swipe from the left edge to open the Today scope"
445msgstr ""
441msgstr ""
446
442
447−#: qml/Tutorial/TutorialRight.qml:54
443+#: qml/Tutorial/TutorialLeft.qml:47
448−msgid "Hover your mouse on the right edge to view your open apps"
444+msgid "Swipe from the left edge to open the launcher"
449msgstr ""
445msgstr ""
450
446
451#: qml/Tutorial/TutorialRight.qml:55
447#: qml/Tutorial/TutorialRight.qml:55
448+msgid "Push your mouse against the right edge to view your open apps"
449+msgstr ""
450+
451+#: qml/Tutorial/TutorialRight.qml:56
452msgid "Short or long swipe from the right edge to view your open apps"
452msgid "Short or long swipe from the right edge to view your open apps"
453msgstr ""
453msgstr ""
454
454
@@ -1035,12 +1035,3 @@ msgstr ""
1035
1035
1036#~ msgid "Call back"
1036#~ msgid "Call back"
1037#~ msgstr "부재중 번호로 전화"
1037#~ msgstr "부재중 번호로 전화"
1038−
1039−#~ msgid "Welcome to your Ubuntu device."
1040−#~ msgstr "우분투를 사용해주셔서 감사합니다."
1041−
1042−#~ msgid "Please select how you’d like to unlock your device."
1043−#~ msgstr "장치의 잠금 해제 방법을 선택해주십시오."
1044−
1045−#~ msgid "Your device is now ready to use."
1046−#~ msgstr "이제 장치를 사용할 수 있습니다."
po/ku.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-09-10 13:14+0000\n"
11"PO-Revision-Date: 2014-09-10 13:14+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Kurdish <ku@li.org>\n"
13"Language-Team: Kurdish <ku@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -446,19 +446,19 @@ msgstr ""
446msgid "Swipe up to manage the app"
446msgid "Swipe up to manage the app"
447msgstr ""
447msgstr ""
448
448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr ""
452−
453#: qml/Tutorial/TutorialLeftLong.qml:47
449#: qml/Tutorial/TutorialLeftLong.qml:47
454msgid "Long swipe from the left edge to open the Today scope"
450msgid "Long swipe from the left edge to open the Today scope"
455msgstr ""
451msgstr ""
456
452
457−#: qml/Tutorial/TutorialRight.qml:54
453+#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Hover your mouse on the right edge to view your open apps"
454+msgid "Swipe from the left edge to open the launcher"
459msgstr ""
455msgstr ""
460
456
461#: qml/Tutorial/TutorialRight.qml:55
457#: qml/Tutorial/TutorialRight.qml:55
458+msgid "Push your mouse against the right edge to view your open apps"
459+msgstr ""
460+
461+#: qml/Tutorial/TutorialRight.qml:56
462msgid "Short or long swipe from the right edge to view your open apps"
462msgid "Short or long swipe from the right edge to view your open apps"
463msgstr ""
463msgstr ""
464
464
po/ky.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/lo.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
13"Language-Team: Lao <lo@li.org>\n"
13"Language-Team: Lao <lo@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/lt.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-05-19 17:15+0000\n"
11"PO-Revision-Date: 2014-05-19 17:15+0000\n"
12"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
12"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"(n%100<10 || n%100>=20) ? 1 : 2;\n"
18"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -441,19 +441,19 @@ msgstr ""
441msgid "Swipe up to manage the app"
441msgid "Swipe up to manage the app"
442msgstr ""
442msgstr ""
443
443
444−#: qml/Tutorial/TutorialLeft.qml:47
445−msgid "Swipe from the left edge to open the launcher"
446−msgstr ""
447−
448#: qml/Tutorial/TutorialLeftLong.qml:47
444#: qml/Tutorial/TutorialLeftLong.qml:47
449msgid "Long swipe from the left edge to open the Today scope"
445msgid "Long swipe from the left edge to open the Today scope"
450msgstr ""
446msgstr ""
451
447
452−#: qml/Tutorial/TutorialRight.qml:54
448+#: qml/Tutorial/TutorialLeft.qml:47
453−msgid "Hover your mouse on the right edge to view your open apps"
449+msgid "Swipe from the left edge to open the launcher"
454msgstr ""
450msgstr ""
455
451
456#: qml/Tutorial/TutorialRight.qml:55
452#: qml/Tutorial/TutorialRight.qml:55
453+msgid "Push your mouse against the right edge to view your open apps"
454+msgstr ""
455+
456+#: qml/Tutorial/TutorialRight.qml:56
457msgid "Short or long swipe from the right edge to view your open apps"
457msgid "Short or long swipe from the right edge to view your open apps"
458msgstr ""
458msgstr ""
459
459
po/lv.po+9−9
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity\n"
9"Project-Id-Version: unity\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
12"PO-Revision-Date: 2015-11-22 19:13+0000\n"
12"PO-Revision-Date: 2015-11-22 19:13+0000\n"
13"Last-Translator: Klavs Anson <anson.klavs@gmail.com>\n"
13"Last-Translator: Klavs Anson <anson.klavs@gmail.com>\n"
14"Language-Team: Latvian <lata-l10n@googlegroups.com>\n"
14"Language-Team: Latvian <lata-l10n@googlegroups.com>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21"Language: lv\n"
21"Language: lv\n"
22
22
23#: plugins/IntegratedLightDM/Greeter.cpp:112
23#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -452,19 +452,19 @@ msgstr ""
452msgid "Swipe up to manage the app"
452msgid "Swipe up to manage the app"
453msgstr ""
453msgstr ""
454
454
455−#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Swipe from the left edge to open the launcher"
457−msgstr ""
458−
459#: qml/Tutorial/TutorialLeftLong.qml:47
455#: qml/Tutorial/TutorialLeftLong.qml:47
460msgid "Long swipe from the left edge to open the Today scope"
456msgid "Long swipe from the left edge to open the Today scope"
461msgstr ""
457msgstr ""
462
458
463−#: qml/Tutorial/TutorialRight.qml:54
459+#: qml/Tutorial/TutorialLeft.qml:47
464−msgid "Hover your mouse on the right edge to view your open apps"
460+msgid "Swipe from the left edge to open the launcher"
465msgstr ""
461msgstr ""
466
462
467#: qml/Tutorial/TutorialRight.qml:55
463#: qml/Tutorial/TutorialRight.qml:55
464+msgid "Push your mouse against the right edge to view your open apps"
465+msgstr ""
466+
467+#: qml/Tutorial/TutorialRight.qml:56
468msgid "Short or long swipe from the right edge to view your open apps"
468msgid "Short or long swipe from the right edge to view your open apps"
469msgstr ""
469msgstr ""
470
470
po/ml.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
12"Last-Translator: ST Alfas <Unknown>\n"
12"Last-Translator: ST Alfas <Unknown>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/mr.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
13"Language-Team: Marathi <mr@li.org>\n"
13"Language-Team: Marathi <mr@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/ms.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
12"Last-Translator: abuyop <Unknown>\n"
12"Last-Translator: abuyop <Unknown>\n"
13"Language-Team: Malay <ms@li.org>\n"
13"Language-Team: Malay <ms@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -446,19 +446,19 @@ msgstr ""
446msgid "Swipe up to manage the app"
446msgid "Swipe up to manage the app"
447msgstr ""
447msgstr ""
448
448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr ""
452−
453#: qml/Tutorial/TutorialLeftLong.qml:47
449#: qml/Tutorial/TutorialLeftLong.qml:47
454msgid "Long swipe from the left edge to open the Today scope"
450msgid "Long swipe from the left edge to open the Today scope"
455msgstr ""
451msgstr ""
456
452
457−#: qml/Tutorial/TutorialRight.qml:54
453+#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Hover your mouse on the right edge to view your open apps"
454+msgid "Swipe from the left edge to open the launcher"
459msgstr ""
455msgstr ""
460
456
461#: qml/Tutorial/TutorialRight.qml:55
457#: qml/Tutorial/TutorialRight.qml:55
458+msgid "Push your mouse against the right edge to view your open apps"
459+msgstr ""
460+
461+#: qml/Tutorial/TutorialRight.qml:56
462msgid "Short or long swipe from the right edge to view your open apps"
462msgid "Short or long swipe from the right edge to view your open apps"
463msgstr ""
463msgstr ""
464
464
po/my.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
13"Language-Team: Burmese <my@li.org>\n"
13"Language-Team: Burmese <my@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/nb.po+13−10
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-29 08:56+0000\n"
11"PO-Revision-Date: 2016-03-29 08:56+0000\n"
12"Last-Translator: Åka Sikrom <Unknown>\n"
12"Last-Translator: Åka Sikrom <Unknown>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-30 06:25+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -452,19 +452,19 @@ msgstr "Dra opp for å lage en melding"
452msgid "Swipe up to manage the app"
452msgid "Swipe up to manage the app"
453msgstr "Dra opp for å håndtere programmet"
453msgstr "Dra opp for å håndtere programmet"
454
454
455−#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Swipe from the left edge to open the launcher"
457−msgstr "Dra fra venstre kant for å åpne oppstarteren"
458−
459#: qml/Tutorial/TutorialLeftLong.qml:47
455#: qml/Tutorial/TutorialLeftLong.qml:47
460msgid "Long swipe from the left edge to open the Today scope"
456msgid "Long swipe from the left edge to open the Today scope"
461msgstr "Dra langt fra venstre kant for å åpne virkefeltet «I dag»"
457msgstr "Dra langt fra venstre kant for å åpne virkefeltet «I dag»"
462
458
463−#: qml/Tutorial/TutorialRight.qml:54
459+#: qml/Tutorial/TutorialLeft.qml:47
464−msgid "Hover your mouse on the right edge to view your open apps"
460+msgid "Swipe from the left edge to open the launcher"
465−msgstr "Hold musepekeren over høyre kant for å vise åpne programmer"
461+msgstr "Dra fra venstre kant for å åpne oppstarteren"
466
462
467#: qml/Tutorial/TutorialRight.qml:55
463#: qml/Tutorial/TutorialRight.qml:55
464+msgid "Push your mouse against the right edge to view your open apps"
465+msgstr ""
466+
467+#: qml/Tutorial/TutorialRight.qml:56
468msgid "Short or long swipe from the right edge to view your open apps"
468msgid "Short or long swipe from the right edge to view your open apps"
469msgstr "Dra fra høyre kant for å vise åpne programmer"
469msgstr "Dra fra høyre kant for å vise åpne programmer"
470
470
@@ -1063,3 +1063,6 @@ msgstr "Veldig svakt passord"
1063
1063
1064#~ msgid "Tomorrow %H:%M"
1064#~ msgid "Tomorrow %H:%M"
1065#~ msgstr "I morgen %H:%M"
1065#~ msgstr "I morgen %H:%M"
1066+
1067+#~ msgid "Hover your mouse on the right edge to view your open apps"
1068+#~ msgstr "Hold musepekeren over høyre kant for å vise åpne programmer"
po/ne.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-12-06 15:11+0000\n"
11"PO-Revision-Date: 2015-12-06 15:11+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Nepali <ne@li.org>\n"
13"Language-Team: Nepali <ne@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/nl.po+26−31
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-07 07:14+0000\n"
11"PO-Revision-Date: 2015-07-07 07:14+0000\n"
12"Last-Translator: Hannie Dumoleyn <Unknown>\n"
12"Last-Translator: Hannie Dumoleyn <Unknown>\n"
13"Language-Team: Dutch <nl@li.org>\n"
13"Language-Team: Dutch <nl@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -189,11 +189,11 @@ msgstr "Toevoegen aan favorieten"
189
189
190#: qml/Dash/FiltersPopover.qml:60
190#: qml/Dash/FiltersPopover.qml:60
191msgid "Refine your results"
191msgid "Refine your results"
192−msgstr ""
192+msgstr "Resultaten verfijnen"
193
193
194#: qml/Dash/FiltersPopover.qml:69
194#: qml/Dash/FiltersPopover.qml:69
195msgid "Reset"
195msgid "Reset"
196−msgstr ""
196+msgstr "Herstellen"
197
197
198#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
198#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
199msgid "See less"
199msgid "See less"
@@ -210,11 +210,11 @@ msgstr "Zoeken"
210
210
211#: qml/Dash/PageHeaderExtraPanel.qml:55
211#: qml/Dash/PageHeaderExtraPanel.qml:55
212msgid "Recent Searches"
212msgid "Recent Searches"
213−msgstr ""
213+msgstr "Recente zoekopdrachten"
214
214
215#: qml/Dash/PageHeaderExtraPanel.qml:66
215#: qml/Dash/PageHeaderExtraPanel.qml:66
216msgid "Clear All"
216msgid "Clear All"
217−msgstr ""
217+msgstr "Alles wissen"
218
218
219#: qml/Dash/Previews/PreviewActionCombo.qml:35
219#: qml/Dash/Previews/PreviewActionCombo.qml:35
220msgid "More..."
220msgid "More..."
@@ -239,7 +239,7 @@ msgstr "Voeg recensie toe"
239
239
240#: qml/Dash/Previews/PreviewSharing.qml:66
240#: qml/Dash/Previews/PreviewSharing.qml:66
241msgid "Preview Share Item"
241msgid "Preview Share Item"
242−msgstr ""
242+msgstr "Voorbeeld van share-item"
243
243
244#: qml/Dash/PullToRefreshScopeStyle.qml:55
244#: qml/Dash/PullToRefreshScopeStyle.qml:55
245msgid "Pull to refresh…"
245msgid "Pull to refresh…"
@@ -434,46 +434,47 @@ msgstr "Terugbellen"
434#: qml/Stages/SideStage.qml:76
434#: qml/Stages/SideStage.qml:76
435msgid "Drag using 3 fingers any application from one window to the other"
435msgid "Drag using 3 fingers any application from one window to the other"
436msgstr ""
436msgstr ""
437+"Een toepassing met 3 vingers slepen van het ene venster naar het andere"
437
438
438#: qml/Tutorial/TutorialBottom.qml:78
439#: qml/Tutorial/TutorialBottom.qml:78
439msgid "Swipe up to add a contact"
440msgid "Swipe up to add a contact"
440−msgstr ""
441+msgstr "Omhoog vegen om een contact toe te voegen"
441
442
442#: qml/Tutorial/TutorialBottom.qml:80
443#: qml/Tutorial/TutorialBottom.qml:80
443msgid "Swipe up for favorite calculations"
444msgid "Swipe up for favorite calculations"
444−msgstr ""
445+msgstr "Omhoog vegen voor favoriete berekeningen"
445
446
446#: qml/Tutorial/TutorialBottom.qml:82
447#: qml/Tutorial/TutorialBottom.qml:82
447msgid "Swipe up for recent calls"
448msgid "Swipe up for recent calls"
448−msgstr ""
449+msgstr "Omhoog vegen voor recente gesprekken"
449
450
450#: qml/Tutorial/TutorialBottom.qml:84
451#: qml/Tutorial/TutorialBottom.qml:84
451msgid "Swipe up to create a message"
452msgid "Swipe up to create a message"
452−msgstr ""
453+msgstr "Omhoog vegen om een bericht aan te maken"
453
454
454#: qml/Tutorial/TutorialBottom.qml:85
455#: qml/Tutorial/TutorialBottom.qml:85
455msgid "Swipe up to manage the app"
456msgid "Swipe up to manage the app"
456−msgstr ""
457+msgstr "Omhoog vegen om de app te beheren"
457−
458−#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Swipe from the left edge to open the launcher"
460−msgstr ""
461
458
462#: qml/Tutorial/TutorialLeftLong.qml:47
459#: qml/Tutorial/TutorialLeftLong.qml:47
463msgid "Long swipe from the left edge to open the Today scope"
460msgid "Long swipe from the left edge to open the Today scope"
464−msgstr ""
461+msgstr "Lang vanaf de linkerkant vegen om de Vandaag-scope te openen"
465
462
466−#: qml/Tutorial/TutorialRight.qml:54
463+#: qml/Tutorial/TutorialLeft.qml:47
467−msgid "Hover your mouse on the right edge to view your open apps"
464+msgid "Swipe from the left edge to open the launcher"
468−msgstr ""
465+msgstr "Vanaf de linkerkant vegen om de starter te openen"
469
466
470#: qml/Tutorial/TutorialRight.qml:55
467#: qml/Tutorial/TutorialRight.qml:55
471−msgid "Short or long swipe from the right edge to view your open apps"
468+msgid "Push your mouse against the right edge to view your open apps"
472msgstr ""
469msgstr ""
473
470
471+#: qml/Tutorial/TutorialRight.qml:56
472+msgid "Short or long swipe from the right edge to view your open apps"
473+msgstr "Kort of lang vegen vanaf de rechterkant om uw geopende apps te zien"
474+
474#: qml/Tutorial/TutorialTop.qml:53
475#: qml/Tutorial/TutorialTop.qml:53
475msgid "Swipe from the top right edge to open the notification bar"
476msgid "Swipe from the top right edge to open the notification bar"
476−msgstr ""
477+msgstr "Vanuit de rechterbovenhoek vegen om de notificatiebalk te openen"
477
478
478#: qml/Tutorial/TutorialTop.qml:54
479#: qml/Tutorial/TutorialTop.qml:54
479msgid "Swipe from the top edge to open the notification bar"
480msgid "Swipe from the top edge to open the notification bar"
@@ -1065,11 +1066,5 @@ msgstr ""
1065#~ msgid "Call back"
1066#~ msgid "Call back"
1066#~ msgstr "Terugbellen"
1067#~ msgstr "Terugbellen"
1067
1068
1068−#~ msgid "Please select how you’d like to unlock your device."
1069+#~ msgid "Hover your mouse on the right edge to view your open apps"
1069−#~ msgstr "Kies a.u.b. hoe u graag uw apparaat zou willen ontgrendelen."
1070+#~ msgstr "Beweeg uw muis naar de rechterkant om uw geopende apps te zien"
1070−
1071−#~ msgid "Welcome to your Ubuntu device."
1072−#~ msgstr "Welkom bij uw Ubuntu-apparaat."
1073−
1074−#~ msgid "Your device is now ready to use."
1075−#~ msgstr "Uw apparaat is nu klaar voor gebruik."
po/nn.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-05-12 11:32+0000\n"
11"PO-Revision-Date: 2015-05-12 11:32+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Norwegian Nynorsk <nn@li.org>\n"
13"Language-Team: Norwegian Nynorsk <nn@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/oc.po+353−110
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-02-05 20:35+0000\n"
11"PO-Revision-Date: 2015-02-05 20:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Occitan (post 1500) <oc@li.org>\n"
13"Language-Team: Occitan (post 1500) <oc@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -25,68 +25,72 @@ msgstr "Senhal : "
25#: plugins/Unity/Launcher/launcheritem.cpp:48
25#: plugins/Unity/Launcher/launcheritem.cpp:48
26#: plugins/Unity/Launcher/launcheritem.cpp:107
26#: plugins/Unity/Launcher/launcheritem.cpp:107
27msgid "Pin shortcut"
27msgid "Pin shortcut"
28−msgstr ""
28+msgstr "Espingolar l'acorchi"
29
29
30#: plugins/Unity/Launcher/launcheritem.cpp:53
30#: plugins/Unity/Launcher/launcheritem.cpp:53
31msgid "Quit"
31msgid "Quit"
32−msgstr ""
32+msgstr "Quitar"
33
33
34#: plugins/Unity/Launcher/launcheritem.cpp:107
34#: plugins/Unity/Launcher/launcheritem.cpp:107
35msgid "Unpin shortcut"
35msgid "Unpin shortcut"
36−msgstr ""
36+msgstr "Destacar l'acorchi"
37
37
38#: qml/Components/DelayedLockscreen.qml:49
38#: qml/Components/DelayedLockscreen.qml:49
39msgid "Device Locked"
39msgid "Device Locked"
40−msgstr ""
40+msgstr "Periferic verrolhat"
41
41
42#: qml/Components/DelayedLockscreen.qml:64
42#: qml/Components/DelayedLockscreen.qml:64
43msgid "You have been locked out due to too many failed passphrase attempts."
43msgid "You have been locked out due to too many failed passphrase attempts."
44msgstr ""
44msgstr ""
45+"Sètz estat blocat en seguida d'un tròp grand nombre de temptativas de sasida "
46+"d'una frasa secreta erronèa."
45
47
46#: qml/Components/DelayedLockscreen.qml:65
48#: qml/Components/DelayedLockscreen.qml:65
47msgid "You have been locked out due to too many failed passcode attempts."
49msgid "You have been locked out due to too many failed passcode attempts."
48msgstr ""
50msgstr ""
51+"Sètz estat blocat en seguida d'un tròp grand nombre de temptativas de sasida "
52+"d'un senhal erronèu."
49
53
50#: qml/Components/DelayedLockscreen.qml:74
54#: qml/Components/DelayedLockscreen.qml:74
51#, qt-format
55#, qt-format
52msgid "Please wait %1 minute and then try again…"
56msgid "Please wait %1 minute and then try again…"
53msgid_plural "Please wait %1 minutes and then try again…"
57msgid_plural "Please wait %1 minutes and then try again…"
54−msgstr[0] ""
58+msgstr[0] "Pacientatz %1 minuta e reensajatz..."
55−msgstr[1] ""
59+msgstr[1] "Pacientatz %1 minutas e reensajatz..."
56
60
57#: qml/Components/Dialogs.qml:144
61#: qml/Components/Dialogs.qml:144
58msgctxt "Title: Lock/Log out dialog"
62msgctxt "Title: Lock/Log out dialog"
59msgid "Log out"
63msgid "Log out"
60−msgstr ""
64+msgstr "Tampar la session"
61
65
62#: qml/Components/Dialogs.qml:145
66#: qml/Components/Dialogs.qml:145
63msgid "Are you sure you want to log out?"
67msgid "Are you sure you want to log out?"
64−msgstr ""
68+msgstr "Sètz segur que volètz vous déconnecter ?"
65
69
66#: qml/Components/Dialogs.qml:147
70#: qml/Components/Dialogs.qml:147
67msgctxt "Button: Lock the system"
71msgctxt "Button: Lock the system"
68msgid "Lock"
72msgid "Lock"
69−msgstr ""
73+msgstr "Verrolhar"
70
74
71#: qml/Components/Dialogs.qml:154
75#: qml/Components/Dialogs.qml:154
72msgctxt "Button: Log out from the system"
76msgctxt "Button: Log out from the system"
73msgid "Log Out"
77msgid "Log Out"
74−msgstr ""
78+msgstr "Tampar la session"
75
79
76#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
80#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
77#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
81#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
78#: qml/Wizard/Pages/passcode-set.qml:32
82#: qml/Wizard/Pages/passcode-set.qml:32
79msgid "Cancel"
83msgid "Cancel"
80−msgstr ""
84+msgstr "Anullar"
81
85
82#: qml/Components/Dialogs.qml:173
86#: qml/Components/Dialogs.qml:173
83msgctxt "Title: Reboot dialog"
87msgctxt "Title: Reboot dialog"
84msgid "Reboot"
88msgid "Reboot"
85−msgstr ""
89+msgstr "Reaviar"
86
90
87#: qml/Components/Dialogs.qml:174
91#: qml/Components/Dialogs.qml:174
88msgid "Are you sure you want to reboot?"
92msgid "Are you sure you want to reboot?"
89−msgstr ""
93+msgstr "Sètz segur que volètz reaviar ?"
90
94
91#: qml/Components/Dialogs.qml:176
95#: qml/Components/Dialogs.qml:176
92msgid "No"
96msgid "No"
@@ -94,335 +98,349 @@ msgstr "Non"
94
98
95#: qml/Components/Dialogs.qml:183
99#: qml/Components/Dialogs.qml:183
96msgid "Yes"
100msgid "Yes"
97−msgstr ""
101+msgstr "Òc"
98
102
99#: qml/Components/Dialogs.qml:198
103#: qml/Components/Dialogs.qml:198
100msgctxt "Title: Power off/Restart dialog"
104msgctxt "Title: Power off/Restart dialog"
101msgid "Power"
105msgid "Power"
102−msgstr ""
106+msgstr "Alimentacion"
103
107
104#: qml/Components/Dialogs.qml:199
108#: qml/Components/Dialogs.qml:199
105msgid ""
109msgid ""
106"Are you sure you would like\n"
110"Are you sure you would like\n"
107"to power off?"
111"to power off?"
108msgstr ""
112msgstr ""
113+"Sètz segur que volètz\n"
114+"copar l'alimentacion ?"
109
115
110#: qml/Components/Dialogs.qml:201
116#: qml/Components/Dialogs.qml:201
111msgctxt "Button: Power off the system"
117msgctxt "Button: Power off the system"
112msgid "Power off"
118msgid "Power off"
113−msgstr ""
119+msgstr "Atudar"
114
120
115#: qml/Components/Dialogs.qml:210
121#: qml/Components/Dialogs.qml:210
116msgctxt "Button: Restart the system"
122msgctxt "Button: Restart the system"
117msgid "Restart"
123msgid "Restart"
118−msgstr ""
124+msgstr "Reaviar"
119
125
120#: qml/Components/Lockscreen.qml:231
126#: qml/Components/Lockscreen.qml:231
121msgid "Return to Call"
127msgid "Return to Call"
122−msgstr ""
128+msgstr "Tornar a l'apèl"
123
129
124#: qml/Components/Lockscreen.qml:231
130#: qml/Components/Lockscreen.qml:231
125msgid "Emergency Call"
131msgid "Emergency Call"
126−msgstr ""
132+msgstr "Apèl d'urgéncia"
127
133
128#: qml/Components/Lockscreen.qml:263
134#: qml/Components/Lockscreen.qml:263
129msgid "OK"
135msgid "OK"
130−msgstr ""
136+msgstr "D'acòrdi"
131
137
132#: qml/Components/ModeSwitchWarningDialog.qml:32
138#: qml/Components/ModeSwitchWarningDialog.qml:32
133msgid "Apps may have unsaved data:"
139msgid "Apps may have unsaved data:"
134−msgstr ""
140+msgstr "Las aplicacions pòdon aver de donadas pas enregistradas :"
135
141
136#: qml/Components/ModeSwitchWarningDialog.qml:57
142#: qml/Components/ModeSwitchWarningDialog.qml:57
137msgctxt ""
143msgctxt ""
138"Re-dock means connect the device again to an external screen/mouse/keyboard"
144"Re-dock means connect the device again to an external screen/mouse/keyboard"
139msgid "Re-dock, save your work and close these apps to continue."
145msgid "Re-dock, save your work and close these apps to continue."
140msgstr ""
146msgstr ""
147+"Rebrancatz-vos sus l'estacion d'acuèlh, enregistratz vòstre trabalh e "
148+"tampatz aquestas aplicacions per contunhar."
141
149
142#: qml/Components/ModeSwitchWarningDialog.qml:63
150#: qml/Components/ModeSwitchWarningDialog.qml:63
143msgid "Or force close now (unsaved data will be lost)."
151msgid "Or force close now (unsaved data will be lost)."
144msgstr ""
152msgstr ""
153+"Ou forçar la tampadura ara (les donadas pas enregistradas seràn perdues)."
145
154
146#: qml/Components/ModeSwitchWarningDialog.qml:75
155#: qml/Components/ModeSwitchWarningDialog.qml:75
147msgid "OK, I will reconnect"
156msgid "OK, I will reconnect"
148−msgstr ""
157+msgstr "OK, me vau reconnectar"
149
158
150#: qml/Components/ModeSwitchWarningDialog.qml:76
159#: qml/Components/ModeSwitchWarningDialog.qml:76
151msgid "Reconnect now!"
160msgid "Reconnect now!"
152−msgstr ""
161+msgstr "Se reconnectar ara !"
153
162
154#: qml/Components/ModeSwitchWarningDialog.qml:88
163#: qml/Components/ModeSwitchWarningDialog.qml:88
155msgid "Close all"
164msgid "Close all"
156−msgstr ""
165+msgstr "Tampar tot"
157
166
158#: qml/Dash/DashPageHeader.qml:337
167#: qml/Dash/DashPageHeader.qml:337
159msgctxt "Button: Open the Ubuntu Store"
168msgctxt "Button: Open the Ubuntu Store"
160msgid "Store"
169msgid "Store"
161−msgstr ""
170+msgstr "Logitèca"
162
171
163#: qml/Dash/DashPageHeader.qml:344
172#: qml/Dash/DashPageHeader.qml:344
164msgctxt "Button: Start a search in the current dash scope"
173msgctxt "Button: Start a search in the current dash scope"
165msgid "Search"
174msgid "Search"
166−msgstr ""
175+msgstr "Recercar"
167
176
168#: qml/Dash/DashPageHeader.qml:354
177#: qml/Dash/DashPageHeader.qml:354
169msgctxt "Button: Show the current dash scope settings"
178msgctxt "Button: Show the current dash scope settings"
170msgid "Settings"
179msgid "Settings"
171−msgstr ""
180+msgstr "Paramètres"
172
181
173#: qml/Dash/DashPageHeader.qml:361
182#: qml/Dash/DashPageHeader.qml:361
174msgid "Remove from Favorites"
183msgid "Remove from Favorites"
175−msgstr ""
184+msgstr "Levar dels favoris"
176
185
177#: qml/Dash/DashPageHeader.qml:361
186#: qml/Dash/DashPageHeader.qml:361
178msgid "Add to Favorites"
187msgid "Add to Favorites"
179−msgstr ""
188+msgstr "Apondre als favoris"
180
189
181#: qml/Dash/FiltersPopover.qml:60
190#: qml/Dash/FiltersPopover.qml:60
182msgid "Refine your results"
191msgid "Refine your results"
183−msgstr ""
192+msgstr "Afinar vòstres resultats"
184
193
185#: qml/Dash/FiltersPopover.qml:69
194#: qml/Dash/FiltersPopover.qml:69
186msgid "Reset"
195msgid "Reset"
187−msgstr ""
196+msgstr "Reïnicializar"
188
197
189#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
198#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190msgid "See less"
199msgid "See less"
191−msgstr ""
200+msgstr "Veire mens"
192
201
193#: qml/Dash/GenericScopeView.qml:570
202#: qml/Dash/GenericScopeView.qml:570
194msgid "See all"
203msgid "See all"
195−msgstr ""
204+msgstr "Veire tot"
196
205
197#: qml/Dash/GenericScopeView.qml:627
206#: qml/Dash/GenericScopeView.qml:627
198msgctxt "Label: Hint for dash search line edit"
207msgctxt "Label: Hint for dash search line edit"
199msgid "Search"
208msgid "Search"
200−msgstr ""
209+msgstr "Recercar"
201
210
202#: qml/Dash/PageHeaderExtraPanel.qml:55
211#: qml/Dash/PageHeaderExtraPanel.qml:55
203msgid "Recent Searches"
212msgid "Recent Searches"
204−msgstr ""
213+msgstr "Recèrcas recentas"
205
214
206#: qml/Dash/PageHeaderExtraPanel.qml:66
215#: qml/Dash/PageHeaderExtraPanel.qml:66
207msgid "Clear All"
216msgid "Clear All"
208−msgstr ""
217+msgstr "Escafar tot"
209
218
210#: qml/Dash/Previews/PreviewActionCombo.qml:35
219#: qml/Dash/Previews/PreviewActionCombo.qml:35
211msgid "More..."
220msgid "More..."
212−msgstr ""
221+msgstr "Mai..."
213
222
214#: qml/Dash/Previews/PreviewActionCombo.qml:35
223#: qml/Dash/Previews/PreviewActionCombo.qml:35
215msgid "Less..."
224msgid "Less..."
216−msgstr ""
225+msgstr "Moins..."
217
226
218#: qml/Dash/Previews/PreviewCommentInput.qml:68
227#: qml/Dash/Previews/PreviewCommentInput.qml:68
219#: qml/Dash/Previews/PreviewRatingInput.qml:174
228#: qml/Dash/Previews/PreviewRatingInput.qml:174
220msgid "Send"
229msgid "Send"
221−msgstr ""
230+msgstr "Mandar"
222
231
223#: qml/Dash/Previews/PreviewRatingInput.qml:84
232#: qml/Dash/Previews/PreviewRatingInput.qml:84
224msgid "Rate this"
233msgid "Rate this"
225−msgstr ""
234+msgstr "Avaloratz aquò"
226
235
227#: qml/Dash/Previews/PreviewRatingInput.qml:129
236#: qml/Dash/Previews/PreviewRatingInput.qml:129
228msgid "Add a review"
237msgid "Add a review"
229−msgstr ""
238+msgstr "Apondre un avís"
230
239
231#: qml/Dash/Previews/PreviewSharing.qml:66
240#: qml/Dash/Previews/PreviewSharing.qml:66
232msgid "Preview Share Item"
241msgid "Preview Share Item"
233−msgstr ""
242+msgstr "Apercebut de l'element partejat"
234
243
235#: qml/Dash/PullToRefreshScopeStyle.qml:55
244#: qml/Dash/PullToRefreshScopeStyle.qml:55
236msgid "Pull to refresh…"
245msgid "Pull to refresh…"
237−msgstr ""
246+msgstr "Tirer per actualizar..."
238
247
239#: qml/Dash/PullToRefreshScopeStyle.qml:60
248#: qml/Dash/PullToRefreshScopeStyle.qml:60
240msgid "Release to refresh…"
249msgid "Release to refresh…"
241−msgstr ""
250+msgstr "Daissar anar per actualizar..."
242
251
243#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
252#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
244msgid "Enable location data"
253msgid "Enable location data"
245−msgstr ""
254+msgstr "Activar las donadas de localizacion"
246
255
247#: qml/Dash/ScopesList.qml:67
256#: qml/Dash/ScopesList.qml:67
248msgid "Manage"
257msgid "Manage"
249−msgstr ""
258+msgstr "Gerir"
250
259
251#: qml/Dash/ScopesList.qml:113
260#: qml/Dash/ScopesList.qml:113
252msgid "Home"
261msgid "Home"
253−msgstr ""
262+msgstr "Acuèlh"
254
263
255#: qml/Dash/ScopesList.qml:114
264#: qml/Dash/ScopesList.qml:114
256msgid "Also installed"
265msgid "Also installed"
257−msgstr ""
266+msgstr "Tanben installadas"
258
267
259#: qml/DisabledScreenNotice.qml:104
268#: qml/DisabledScreenNotice.qml:104
260msgid ""
269msgid ""
261"Your device is now connected to an external display. Use this screen as a "
270"Your device is now connected to an external display. Use this screen as a "
262"touch pad to interact with the pointer."
271"touch pad to interact with the pointer."
263msgstr ""
272msgstr ""
273+"Vòstre aparelh es ara connectat a un ecran extèrne. Utilizatz aqueste ecran "
274+"coma un pavat tactil per interagir amb lo puntador."
264
275
265#: qml/Greeter/CoverPage.qml:118
276#: qml/Greeter/CoverPage.qml:118
266msgid "Unlock"
277msgid "Unlock"
267−msgstr ""
278+msgstr "Desverrolhar"
268
279
269#: qml/Greeter/LoginList.qml:239
280#: qml/Greeter/LoginList.qml:239
270msgid "Retry"
281msgid "Retry"
271−msgstr ""
282+msgstr "Ensajar tornamai"
272
283
273#: qml/Greeter/LoginList.qml:240
284#: qml/Greeter/LoginList.qml:240
274msgid "Tap to unlock"
285msgid "Tap to unlock"
275−msgstr ""
286+msgstr "Quichar per desverrolhar"
276
287
277#: qml/Greeter/NarrowView.qml:54
288#: qml/Greeter/NarrowView.qml:54
278msgid "Sorry, incorrect passphrase."
289msgid "Sorry, incorrect passphrase."
279−msgstr ""
290+msgstr "O planhèm, frasa secreta incorrècta."
280
291
281#: qml/Greeter/NarrowView.qml:55
292#: qml/Greeter/NarrowView.qml:55
282msgid "Sorry, incorrect passcode."
293msgid "Sorry, incorrect passcode."
283−msgstr ""
294+msgstr "O planhèm, còde incorrècte."
284
295
285#: qml/Greeter/NarrowView.qml:56
296#: qml/Greeter/NarrowView.qml:56
286msgid "This will be your last attempt."
297msgid "This will be your last attempt."
287−msgstr ""
298+msgstr "Aquò serà vòstra darrièra temptativa."
288
299
289#: qml/Greeter/NarrowView.qml:58
300#: qml/Greeter/NarrowView.qml:58
290msgid ""
301msgid ""
291"If passphrase is entered incorrectly, your phone will conduct a factory "
302"If passphrase is entered incorrectly, your phone will conduct a factory "
292"reset and all personal data will be deleted."
303"reset and all personal data will be deleted."
293msgstr ""
304msgstr ""
305+"Se la frasa secreta es sasida de manièra incorrècta, vòstre telefòn "
306+"efectuarà una reïnicializacion als paramètres d'usina e totas las donadas "
307+"personalas seràn suprimidas."
294
308
295#: qml/Greeter/NarrowView.qml:59
309#: qml/Greeter/NarrowView.qml:59
296msgid ""
310msgid ""
297"If passcode is entered incorrectly, your phone will conduct a factory reset "
311"If passcode is entered incorrectly, your phone will conduct a factory reset "
298"and all personal data will be deleted."
312"and all personal data will be deleted."
299msgstr ""
313msgstr ""
314+"Se lo còde es sasit de manièra incorrècta, vòstre telefòn efectuarà una "
315+"reïnicializacion als paramètres d'usina e totas las donadas personalas "
316+"seront suprimidas."
300
317
301#: qml/Greeter/NarrowView.qml:116
318#: qml/Greeter/NarrowView.qml:116
302#, qt-format
319#, qt-format
303msgid "Enter %1"
320msgid "Enter %1"
304−msgstr ""
321+msgstr "Sasissètz %1"
305
322
306#: qml/Greeter/NarrowView.qml:117
323#: qml/Greeter/NarrowView.qml:117
307msgid "Enter passphrase"
324msgid "Enter passphrase"
308−msgstr ""
325+msgstr "Sasissètz la frasa secreta"
309
326
310#: qml/Greeter/NarrowView.qml:118
327#: qml/Greeter/NarrowView.qml:118
311msgid "Enter passcode"
328msgid "Enter passcode"
312−msgstr ""
329+msgstr "Sasissètz lo senhal"
313
330
314#: qml/Greeter/NarrowView.qml:119
331#: qml/Greeter/NarrowView.qml:119
315#, qt-format
332#, qt-format
316msgid "Sorry, incorrect %1"
333msgid "Sorry, incorrect %1"
317−msgstr ""
334+msgstr "O planhèm, %1 incorrècte"
318
335
319#: qml/Greeter/NarrowView.qml:120
336#: qml/Greeter/NarrowView.qml:120
320msgid "Sorry, incorrect passphrase"
337msgid "Sorry, incorrect passphrase"
321−msgstr ""
338+msgstr "O planhèm, frasa secreta incorrecte"
322
339
323#: qml/Greeter/NarrowView.qml:121
340#: qml/Greeter/NarrowView.qml:121
324msgctxt "passphrase"
341msgctxt "passphrase"
325msgid "Please re-enter"
342msgid "Please re-enter"
326−msgstr ""
343+msgstr "Veuillez rensagesir"
327
344
328#: qml/Greeter/NarrowView.qml:122
345#: qml/Greeter/NarrowView.qml:122
329msgid "Sorry, incorrect passcode"
346msgid "Sorry, incorrect passcode"
330−msgstr ""
347+msgstr "O planhèm, còde incorrècte"
331
348
332#: qml/Notifications/NotificationMenuItemFactory.qml:129
349#: qml/Notifications/NotificationMenuItemFactory.qml:129
333msgid "Show password"
350msgid "Show password"
334−msgstr ""
351+msgstr "Afichar lo senhal"
335
352
336#: qml/Panel/ActiveCallHint.qml:79
353#: qml/Panel/ActiveCallHint.qml:79
337msgid "Tap to return to call..."
354msgid "Tap to return to call..."
338−msgstr ""
355+msgstr "Quichatz per tornar a l'apèl..."
339
356
340#: qml/Panel/ActiveCallHint.qml:92
357#: qml/Panel/ActiveCallHint.qml:92
341msgid "Conference"
358msgid "Conference"
342−msgstr ""
359+msgstr "Conferéncia"
343
360
344#: qml/Panel/Indicators/MenuItemFactory.qml:761
361#: qml/Panel/Indicators/MenuItemFactory.qml:761
345msgid "Nothing is playing"
362msgid "Nothing is playing"
346−msgstr ""
363+msgstr "Res es pas en cors de lectura"
347
364
348#: qml/Panel/Indicators/MenuItemFactory.qml:890
365#: qml/Panel/Indicators/MenuItemFactory.qml:890
349#, qt-format
366#, qt-format
350msgid "%1 hour"
367msgid "%1 hour"
351msgid_plural "%1 hours"
368msgid_plural "%1 hours"
352−msgstr[0] ""
369+msgstr[0] "%1 ora"
353−msgstr[1] ""
370+msgstr[1] "%1 oras"
354
371
355#: qml/Panel/Indicators/MenuItemFactory.qml:894
372#: qml/Panel/Indicators/MenuItemFactory.qml:894
356#, qt-format
373#, qt-format
357msgid "%1 minute"
374msgid "%1 minute"
358msgid_plural "%1 minutes"
375msgid_plural "%1 minutes"
359−msgstr[0] ""
376+msgstr[0] "%1 minuta"
360−msgstr[1] ""
377+msgstr[1] "%1 minutas"
361
378
362#: qml/Panel/Indicators/MenuItemFactory.qml:899
379#: qml/Panel/Indicators/MenuItemFactory.qml:899
363#, qt-format
380#, qt-format
364msgid "%1 second"
381msgid "%1 second"
365msgid_plural "%1 seconds"
382msgid_plural "%1 seconds"
366−msgstr[0] ""
383+msgstr[0] "%1 segonda"
367−msgstr[1] ""
384+msgstr[1] "%1 segondas"
368
385
369#: qml/Panel/Indicators/MenuItemFactory.qml:902
386#: qml/Panel/Indicators/MenuItemFactory.qml:902
370msgid "0 seconds"
387msgid "0 seconds"
371−msgstr ""
388+msgstr "0 segonda"
372
389
373#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
390#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
374#: qml/Panel/Indicators/MenuItemFactory.qml:904
391#: qml/Panel/Indicators/MenuItemFactory.qml:904
375#, qt-format
392#, qt-format
376msgid "%1 remaining"
393msgid "%1 remaining"
377−msgstr ""
394+msgstr "Demòra %1"
378
395
379#: qml/Panel/Indicators/MenuItemFactory.qml:910
396#: qml/Panel/Indicators/MenuItemFactory.qml:910
380msgid "In queue…"
397msgid "In queue…"
381−msgstr ""
398+msgstr "Dins la fia d'espèra..."
382
399
383#: qml/Panel/Indicators/MenuItemFactory.qml:914
400#: qml/Panel/Indicators/MenuItemFactory.qml:914
384msgid "Downloading"
401msgid "Downloading"
385−msgstr ""
402+msgstr "Telecargament en cors"
386
403
387#: qml/Panel/Indicators/MenuItemFactory.qml:916
404#: qml/Panel/Indicators/MenuItemFactory.qml:916
388msgid "Paused, tap to resume"
405msgid "Paused, tap to resume"
389−msgstr ""
406+msgstr "En pausa, quichatz per reprene"
390
407
391#: qml/Panel/Indicators/MenuItemFactory.qml:918
408#: qml/Panel/Indicators/MenuItemFactory.qml:918
392msgid "Canceled"
409msgid "Canceled"
393−msgstr ""
410+msgstr "Anullat"
394
411
395#: qml/Panel/Indicators/MenuItemFactory.qml:920
412#: qml/Panel/Indicators/MenuItemFactory.qml:920
396msgid "Finished"
413msgid "Finished"
397−msgstr ""
414+msgstr "Acabat"
398
415
399#: qml/Panel/Indicators/MenuItemFactory.qml:922
416#: qml/Panel/Indicators/MenuItemFactory.qml:922
400msgid "Failed, tap to retry"
417msgid "Failed, tap to retry"
401−msgstr ""
418+msgstr "Fracàs, quichatz per reensajar"
402
419
403#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
420#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
404#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
421#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
405msgctxt "Button: Send a reply message"
422msgctxt "Button: Send a reply message"
406msgid "Send"
423msgid "Send"
407−msgstr ""
424+msgstr "Mandar"
408
425
409#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
426#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
410msgctxt "Label: Hint in message indicator line edit"
427msgctxt "Label: Hint in message indicator line edit"
411msgid "Reply"
428msgid "Reply"
412−msgstr ""
429+msgstr "Respondre"
413
430
414#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
431#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
415msgctxt "Button: Call back on phone"
432msgctxt "Button: Call back on phone"
416msgid "Call back"
433msgid "Call back"
417−msgstr ""
434+msgstr "Rapelar"
418
435
419#: qml/Stages/SideStage.qml:76
436#: qml/Stages/SideStage.qml:76
420msgid "Drag using 3 fingers any application from one window to the other"
437msgid "Drag using 3 fingers any application from one window to the other"
421msgstr ""
438msgstr ""
439+"Fasètz lisar amb 3 dets quina aplicacion que siá d'una fenèstra a l'autra"
422
440
423#: qml/Tutorial/TutorialBottom.qml:78
441#: qml/Tutorial/TutorialBottom.qml:78
424msgid "Swipe up to add a contact"
442msgid "Swipe up to add a contact"
425−msgstr ""
443+msgstr "Fasètz lisar cap amont per apondre un contact"
426
444
427#: qml/Tutorial/TutorialBottom.qml:80
445#: qml/Tutorial/TutorialBottom.qml:80
428msgid "Swipe up for favorite calculations"
446msgid "Swipe up for favorite calculations"
@@ -434,25 +452,25 @@ msgstr ""
434
452
435#: qml/Tutorial/TutorialBottom.qml:84
453#: qml/Tutorial/TutorialBottom.qml:84
436msgid "Swipe up to create a message"
454msgid "Swipe up to create a message"
437−msgstr ""
455+msgstr "Fasètz lisar cap amont per crear un messatge"
438
456
439#: qml/Tutorial/TutorialBottom.qml:85
457#: qml/Tutorial/TutorialBottom.qml:85
440msgid "Swipe up to manage the app"
458msgid "Swipe up to manage the app"
441−msgstr ""
459+msgstr "Fasètz lisar cap amont per gerir l'aplicacion"
442−
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446
460
447#: qml/Tutorial/TutorialLeftLong.qml:47
461#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
462msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
463msgstr ""
450
464
451−#: qml/Tutorial/TutorialRight.qml:54
465+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
466+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
467msgstr ""
454
468
455#: qml/Tutorial/TutorialRight.qml:55
469#: qml/Tutorial/TutorialRight.qml:55
470+msgid "Push your mouse against the right edge to view your open apps"
471+msgstr ""
472+
473+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
474msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
475msgstr ""
458
476
@@ -467,7 +485,7 @@ msgstr ""
467#: qml/Wizard/Page.qml:54
485#: qml/Wizard/Page.qml:54
468msgctxt "Button: Go back one page in the Wizard"
486msgctxt "Button: Go back one page in the Wizard"
469msgid "Back"
487msgid "Back"
470−msgstr ""
488+msgstr "Precedent"
471
489
472#: qml/Wizard/Pages/10-welcome.qml:27
490#: qml/Wizard/Pages/10-welcome.qml:27
473msgid "Language"
491msgid "Language"
@@ -480,32 +498,32 @@ msgstr ""
480#: qml/Wizard/Pages/passcode-desktop.qml:124
498#: qml/Wizard/Pages/passcode-desktop.qml:124
481#: qml/Wizard/Pages/password-set.qml:141
499#: qml/Wizard/Pages/password-set.qml:141
482msgid "Next"
500msgid "Next"
483−msgstr ""
501+msgstr "Seguent"
484
502
485#: qml/Wizard/Pages/30-wifi.qml:29
503#: qml/Wizard/Pages/30-wifi.qml:29
486msgid "Connect to Wi‑Fi"
504msgid "Connect to Wi‑Fi"
487−msgstr ""
505+msgstr "Se connecter al Wi-Fi"
488
506
489#: qml/Wizard/Pages/30-wifi.qml:130
507#: qml/Wizard/Pages/30-wifi.qml:130
490msgid "Connected"
508msgid "Connected"
491−msgstr ""
509+msgstr "Connectat"
492
510
493#: qml/Wizard/Pages/30-wifi.qml:163
511#: qml/Wizard/Pages/30-wifi.qml:163
494msgid "Available Wi-Fi networks"
512msgid "Available Wi-Fi networks"
495−msgstr ""
513+msgstr "Rets Wi-Fi disponiblas"
496
514
497#: qml/Wizard/Pages/30-wifi.qml:164
515#: qml/Wizard/Pages/30-wifi.qml:164
498msgid "No available Wi-Fi networks"
516msgid "No available Wi-Fi networks"
499−msgstr ""
517+msgstr "Cap de ret Wi-Fi pas disponibla"
500
518
501#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
519#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
502#: qml/Wizard/Pages/sim.qml:101
520#: qml/Wizard/Pages/sim.qml:101
503msgid "Skip"
521msgid "Skip"
504−msgstr ""
522+msgstr "Passar"
505
523
506#: qml/Wizard/Pages/40-location.qml:27
524#: qml/Wizard/Pages/40-location.qml:27
507msgid "Location Services"
525msgid "Location Services"
508−msgstr ""
526+msgstr "Servicis de localizacion"
509
527
510#: qml/Wizard/Pages/40-location.qml:83
528#: qml/Wizard/Pages/40-location.qml:83
511msgid ""
529msgid ""
@@ -516,12 +534,12 @@ msgstr ""
516#: qml/Wizard/Pages/40-location.qml:105
534#: qml/Wizard/Pages/40-location.qml:105
517#, qt-format
535#, qt-format
518msgid "By selecting this option you agree to the Nokia HERE %1."
536msgid "By selecting this option you agree to the Nokia HERE %1."
519−msgstr ""
537+msgstr "En seleccionant aquesta opcion, acceptatz los %1 de Nokia HERE."
520
538
521#: qml/Wizard/Pages/40-location.qml:106
539#: qml/Wizard/Pages/40-location.qml:106
522msgctxt "part of: Nokia HERE terms and conditions"
540msgctxt "part of: Nokia HERE terms and conditions"
523msgid "terms and conditions"
541msgid "terms and conditions"
524−msgstr ""
542+msgstr "condicions generalas d'utilizacion"
525
543
526#: qml/Wizard/Pages/40-location.qml:160
544#: qml/Wizard/Pages/40-location.qml:160
527msgid "GPS only"
545msgid "GPS only"
@@ -529,7 +547,7 @@ msgstr ""
529
547
530#: qml/Wizard/Pages/40-location.qml:214
548#: qml/Wizard/Pages/40-location.qml:214
531msgid "Don't use my location"
549msgid "Don't use my location"
532−msgstr ""
550+msgstr "Ne pas utilizar ma position"
533
551
534#: qml/Wizard/Pages/40-location.qml:260
552#: qml/Wizard/Pages/40-location.qml:260
535msgid "You can change it later in System Settings."
553msgid "You can change it later in System Settings."
@@ -537,7 +555,7 @@ msgstr ""
537
555
538#: qml/Wizard/Pages/50-timezone.qml:29
556#: qml/Wizard/Pages/50-timezone.qml:29
539msgid "Time Zone"
557msgid "Time Zone"
540−msgstr ""
558+msgstr "Fus orari"
541
559
542#: qml/Wizard/Pages/50-timezone.qml:178
560#: qml/Wizard/Pages/50-timezone.qml:178
543msgid "Enter your city"
561msgid "Enter your city"
@@ -572,7 +590,7 @@ msgstr ""
572
590
573#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
591#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
574msgid "Privacy Policy"
592msgid "Privacy Policy"
575−msgstr ""
593+msgstr "Politica de confidentialité"
576
594
577#: qml/Wizard/Pages/75-report-check.qml:26
595#: qml/Wizard/Pages/75-report-check.qml:26
578msgid "Help Us Improve"
596msgid "Help Us Improve"
@@ -600,7 +618,7 @@ msgstr ""
600
618
601#: qml/Wizard/Pages/here-terms.qml:25
619#: qml/Wizard/Pages/here-terms.qml:25
602msgid "Terms & Conditions"
620msgid "Terms & Conditions"
603−msgstr ""
621+msgstr "Condicions generalas d'utilizacion"
604
622
605#: qml/Wizard/Pages/here-terms.qml:69
623#: qml/Wizard/Pages/here-terms.qml:69
606msgid "Your device uses positioning technologies provided by HERE."
624msgid "Your device uses positioning technologies provided by HERE."
@@ -631,7 +649,7 @@ msgstr ""
631#: qml/Wizard/Pages/passcode-confirm.qml:43
649#: qml/Wizard/Pages/passcode-confirm.qml:43
632#: qml/Wizard/Pages/passcode-desktop.qml:80
650#: qml/Wizard/Pages/passcode-desktop.qml:80
633msgid "Confirm passcode"
651msgid "Confirm passcode"
634−msgstr ""
652+msgstr "Confirmatz vòstre còde"
635
653
636#: qml/Wizard/Pages/passcode-confirm.qml:45
654#: qml/Wizard/Pages/passcode-confirm.qml:45
637msgid "Incorrect passcode."
655msgid "Incorrect passcode."
@@ -701,7 +719,7 @@ msgstr ""
701
719
702#: qml/Wizard/Pages/sim.qml:59
720#: qml/Wizard/Pages/sim.qml:59
703msgid "Restart"
721msgid "Restart"
704−msgstr ""
722+msgstr "Reaviar"
705
723
706#: qml/Wizard/Pages/sim.qml:78
724#: qml/Wizard/Pages/sim.qml:78
707msgid "You won’t be able to make calls or use text messaging without a SIM."
725msgid "You won’t be able to make calls or use text messaging without a SIM."
@@ -734,3 +752,228 @@ msgstr ""
734#: qml/Wizard/PasswordMeter.qml:99
752#: qml/Wizard/PasswordMeter.qml:99
735msgid "Very weak password"
753msgid "Very weak password"
736msgstr ""
754msgstr ""
755+
756+#~ msgid "Unlock SIM"
757+#~ msgstr "Desverrolhar la carta SIM"
758+
759+#~ msgid "Roaming"
760+#~ msgstr "Roaming"
761+
762+#~ msgid "Are you sure you want to shut down?"
763+#~ msgstr "Sètz segur que volètz atudar ?"
764+
765+#~ msgid "Without it, you won’t be able to make calls or use text messaging."
766+#~ msgstr ""
767+#~ "Sans elle, vous ne serez pas en mesura de passer dels apèls o de mandar des "
768+#~ "SMS."
769+
770+#~ msgid "Welcome to your Ubuntu phone."
771+#~ msgstr "Benvenguda sus vòstre telefòn Ubuntu."
772+
773+#~ msgid "Let’s get started."
774+#~ msgstr "Commençons."
775+
776+#~ msgid "Continue"
777+#~ msgstr "Contunhar"
778+
779+#~ msgid "Lock security"
780+#~ msgstr "Seguretat de verrolhatge"
781+
782+#~ msgid "Please select how you’d like to unlock your phone."
783+#~ msgstr "Veuillez seleccionar comment desiratz desverrolhar vòstre telefòn."
784+
785+#~ msgid "Available networks…"
786+#~ msgstr "Rets disponibles..."
787+
788+#~ msgid "Improving your experience"
789+#~ msgstr "Amélioration de votre expérience"
790+
791+#~ msgid "Not at all"
792+#~ msgstr "Pas del tout"
793+
794+#~ msgid "No available networks."
795+#~ msgstr "Aucun ret disponible."
796+
797+#~ msgid "Using GPS only (less accurate)"
798+#~ msgstr "Utilizacion del GPS solament (mens précis)"
799+
800+#~ msgid "Add a SIM card and restart your device"
801+#~ msgstr "Apondètz una carta SIM e redémarrez votre aparelh"
802+
803+#~ msgid "Hi!"
804+#~ msgstr "Salut !"
805+
806+#~ msgid "You can change your mind later in <b>System Settings</b>."
807+#~ msgstr "Podètz cambiar d'avis pus tard dins les <b>Paramètres Sistèma</b>."
808+
809+#~ msgid ""
810+#~ "Your phone is set up to automatically report errors to Canonical and its "
811+#~ "partners, the makers of the operating system."
812+#~ msgstr ""
813+#~ "Vòstre telefòn es reglat per mandar automaticament des rapòrts d'error à "
814+#~ "Canonical e a ses partenaires, les fabricants del sistèma operatiu."
815+
816+#~ msgid ""
817+#~ "This can be disabled in <b>System Settings</b> under <b>Security &amp; "
818+#~ "Privacy</b>"
819+#~ msgstr ""
820+#~ "Aquò benlèu desactivat dins les <b>Paramètres sistèma</b> jos <b>Seguretat "
821+#~ "&amp; vida privada</b>"
822+
823+#~ msgid "Nice work!"
824+#~ msgstr "Beau trabalh !"
825+
826+#~ msgid "All done"
827+#~ msgstr "Ça y est"
828+
829+#~ msgid "Finish"
830+#~ msgstr "Acabar"
831+
832+#~ msgid "Your phone is now ready to use."
833+#~ msgstr "Vòstre telefòn es ara prèst a èsser utilizat."
834+
835+#~ msgid "Choose your passcode"
836+#~ msgstr "Causissètz vòstre còde"
837+
838+#~ msgid "Please try again."
839+#~ msgstr "Ensajatz tornamai."
840+
841+#~ msgid "Let the phone detect your location:"
842+#~ msgstr "Daissar lo telefòn detectar vòstra posicion :"
843+
844+#~ msgid ""
845+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
846+#~ "conditions</a>."
847+#~ msgstr ""
848+#~ "En seleccionnant aquesta opcion, acceptatz las <a href='#'>conditions "
849+#~ "generalas d'utilizacion</a> de Nokia HERE."
850+
851+#~ msgid "Location"
852+#~ msgstr "Posicion"
853+
854+#~ msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
855+#~ msgstr ""
856+#~ "Utilizacion des informations del GPS, del Wi-Fi anonimizat e de la ret "
857+#~ "cellulaire (recommandé)"
858+
859+#, qt-format
860+#~ msgid "〈 %1"
861+#~ msgstr "〈 %1"
862+
863+#, qt-format
864+#~ msgid "%1 〉"
865+#~ msgstr "%1 〉"
866+
867+#~ msgid "Confirm passphrase"
868+#~ msgstr "Confirmez votre frasa secreta"
869+
870+#~ msgid "Passphrase must be 4 characters long"
871+#~ msgstr "La frasa secreta deu comportar 4 caractèrs"
872+
873+#~ msgid "This action does different things for different apps"
874+#~ msgstr "Aquesta accion fait diferentas choses per diferentas applications"
875+
876+#~ msgid "You almost got it!"
877+#~ msgstr "Vous y êtes presque !"
878+
879+#~ msgid "Short swipe from the left edge."
880+#~ msgstr "Lisatz doucement a partir del bord esquèrra."
881+
882+#~ msgid "Open the launcher"
883+#~ msgstr "Ouvrez lo aviador"
884+
885+#~ msgid "Tap here to continue."
886+#~ msgstr "Quichatz aicí per contunhar."
887+
888+#~ msgid "These are the shortcuts to favorite apps"
889+#~ msgstr "Son los acorchis cap a vos applications favorites"
890+
891+#~ msgid "Swipe up from the bottom edge."
892+#~ msgstr "Lisatz cap amont a partir del bord inferior."
893+
894+#~ msgid "Open special menus"
895+#~ msgstr "Dobrir les menus especials"
896+
897+#~ msgid "Tap here to finish."
898+#~ msgstr "Quichatz aicí per terminer."
899+
900+#~ msgid "To view open apps"
901+#~ msgstr "Per veire las aplicacions dobèrtas"
902+
903+#~ msgid "View all your running tasks."
904+#~ msgstr "Veire totas les prètzfaches en cors."
905+
906+#~ msgid "Long swipe from the right edge."
907+#~ msgstr "Lisatz en ara a partir del bord droit."
908+
909+#~ msgid "Try again."
910+#~ msgstr "Réessayez."
911+
912+#~ msgctxt "Button: Shut down the system"
913+#~ msgid "Shut down"
914+#~ msgstr "Atudar"
915+
916+#~ msgctxt "Title: Reboot/Shut down dialog"
917+#~ msgid "Shut down"
918+#~ msgstr "Atudar"
919+
920+#~ msgctxt "Button: Reboot the system"
921+#~ msgid "Reboot"
922+#~ msgstr "Reaviar"
923+
924+#~ msgctxt "Label: Type of security method"
925+#~ msgid "Swipe"
926+#~ msgstr "Lisament"
927+
928+#~ msgctxt "Label: Description of security method"
929+#~ msgid "4 digits only"
930+#~ msgstr "4 chifras solament"
931+
932+#~ msgctxt "Label: Type of security method"
933+#~ msgid "Passcode"
934+#~ msgstr "Code"
935+
936+#~ msgctxt "Label: Description of security method"
937+#~ msgid "No security"
938+#~ msgstr "Aucune seguretat"
939+
940+#~ msgctxt "Label: Type of security method"
941+#~ msgid "Passphrase"
942+#~ msgstr "Frasa secreta"
943+
944+#~ msgctxt "Label: Description of security method"
945+#~ msgid "Numbers and letters"
946+#~ msgstr "Chifras e lettres"
947+
948+#~ msgid "%a %H:%M"
949+#~ msgstr "%a %H:%M"
950+
951+#~ msgid "%a %d %b %H:%M"
952+#~ msgstr "%a %b %d %H:%M"
953+
954+#~ msgid "%a %l:%M %p"
955+#~ msgstr "%a %l:%M"
956+
957+#~ msgid "Tomorrow %l:%M %p"
958+#~ msgstr "Demain %l:%M"
959+
960+#~ msgid "%l:%M %p"
961+#~ msgstr "%l:%M"
962+
963+#~ msgid "Yesterday %l:%M %p"
964+#~ msgstr "Ièr %l:%M"
965+
966+#~ msgid "Tomorrow %H:%M"
967+#~ msgstr "Demain %H:%M"
968+
969+#~ msgid "%H:%M"
970+#~ msgstr "%H:%M"
971+
972+#~ msgid "Yesterday %H:%M"
973+#~ msgstr "Ièr %H:%M"
974+
975+#~ msgid "%a %d %b %l:%M %p"
976+#~ msgstr "%a %b %d %l:%M"
977+
978+#~ msgid "Call back"
979+#~ msgstr "Rapelar"
po/or.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-03-21 05:28+0000\n"
11"PO-Revision-Date: 2015-03-21 05:28+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Oriya <or@li.org>\n"
13"Language-Team: Oriya <or@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/pa.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-04-24 04:29+0000\n"
11"PO-Revision-Date: 2015-04-24 04:29+0000\n"
12"Last-Translator: Gursharnjit_Singh <ubuntuser13@gmail.com>\n"
12"Last-Translator: Gursharnjit_Singh <ubuntuser13@gmail.com>\n"
13"Language-Team: Punjabi <pa@li.org>\n"
13"Language-Team: Punjabi <pa@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -446,19 +446,19 @@ msgstr ""
446msgid "Swipe up to manage the app"
446msgid "Swipe up to manage the app"
447msgstr ""
447msgstr ""
448
448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr ""
452−
453#: qml/Tutorial/TutorialLeftLong.qml:47
449#: qml/Tutorial/TutorialLeftLong.qml:47
454msgid "Long swipe from the left edge to open the Today scope"
450msgid "Long swipe from the left edge to open the Today scope"
455msgstr ""
451msgstr ""
456
452
457−#: qml/Tutorial/TutorialRight.qml:54
453+#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Hover your mouse on the right edge to view your open apps"
454+msgid "Swipe from the left edge to open the launcher"
459msgstr ""
455msgstr ""
460
456
461#: qml/Tutorial/TutorialRight.qml:55
457#: qml/Tutorial/TutorialRight.qml:55
458+msgid "Push your mouse against the right edge to view your open apps"
459+msgstr ""
460+
461+#: qml/Tutorial/TutorialRight.qml:56
462msgid "Short or long swipe from the right edge to view your open apps"
462msgid "Short or long swipe from the right edge to view your open apps"
463msgstr ""
463msgstr ""
464
464
po/pl.po+76−56
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-28 20:45+0000\n"
11"PO-Revision-Date: 2016-03-28 20:45+0000\n"
12"Last-Translator: Krzysztof Tataradziński <Unknown>\n"
12"Last-Translator: Krzysztof Tataradziński <Unknown>\n"
13"Language-Team: Polish <pl@li.org>\n"
13"Language-Team: Polish <pl@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
17"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
18"|| n%100>=20) ? 1 : 2;\n"
18"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-29 05:41+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20−"X-Generator: Launchpad (build 17967)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -140,6 +140,7 @@ msgctxt ""
140"Re-dock means connect the device again to an external screen/mouse/keyboard"
140"Re-dock means connect the device again to an external screen/mouse/keyboard"
141msgid "Re-dock, save your work and close these apps to continue."
141msgid "Re-dock, save your work and close these apps to continue."
142msgstr ""
142msgstr ""
143+"Zadokuj ponownie, zapisz co niezapisane i zamknij te aplikacje by kontynuować"
143
144
144#: qml/Components/ModeSwitchWarningDialog.qml:63
145#: qml/Components/ModeSwitchWarningDialog.qml:63
145msgid "Or force close now (unsaved data will be lost)."
146msgid "Or force close now (unsaved data will be lost)."
@@ -182,11 +183,11 @@ msgstr "Dodaj do ulubionych"
182
183
183#: qml/Dash/FiltersPopover.qml:60
184#: qml/Dash/FiltersPopover.qml:60
184msgid "Refine your results"
185msgid "Refine your results"
185−msgstr ""
186+msgstr "Przefiltruj wyniki"
186
187
187#: qml/Dash/FiltersPopover.qml:69
188#: qml/Dash/FiltersPopover.qml:69
188msgid "Reset"
189msgid "Reset"
189−msgstr ""
190+msgstr "Reset"
190
191
191#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192msgid "See less"
193msgid "See less"
@@ -434,47 +435,51 @@ msgstr ""
434
435
435#: qml/Tutorial/TutorialBottom.qml:78
436#: qml/Tutorial/TutorialBottom.qml:78
436msgid "Swipe up to add a contact"
437msgid "Swipe up to add a contact"
437−msgstr ""
438+msgstr "Przeciągnij w górę, by dodać kontakt"
438
439
439#: qml/Tutorial/TutorialBottom.qml:80
440#: qml/Tutorial/TutorialBottom.qml:80
440msgid "Swipe up for favorite calculations"
441msgid "Swipe up for favorite calculations"
441−msgstr ""
442+msgstr "Przeciągnij w górę, by wyświetlić ostatnie obliczenia"
442
443
443#: qml/Tutorial/TutorialBottom.qml:82
444#: qml/Tutorial/TutorialBottom.qml:82
444msgid "Swipe up for recent calls"
445msgid "Swipe up for recent calls"
445−msgstr ""
446+msgstr "Przeciągnij w górę, by wyświetlić ostatnie połączenia"
446
447
447#: qml/Tutorial/TutorialBottom.qml:84
448#: qml/Tutorial/TutorialBottom.qml:84
448msgid "Swipe up to create a message"
449msgid "Swipe up to create a message"
449−msgstr ""
450+msgstr "Przeciągnij w górę, by napisać nową wiadomość"
450
451
451#: qml/Tutorial/TutorialBottom.qml:85
452#: qml/Tutorial/TutorialBottom.qml:85
452msgid "Swipe up to manage the app"
453msgid "Swipe up to manage the app"
453−msgstr ""
454+msgstr "Przeciągnij w górę, by zarządzać aplikacją"
454−
455−#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Swipe from the left edge to open the launcher"
457−msgstr ""
458
455
459#: qml/Tutorial/TutorialLeftLong.qml:47
456#: qml/Tutorial/TutorialLeftLong.qml:47
460msgid "Long swipe from the left edge to open the Today scope"
457msgid "Long swipe from the left edge to open the Today scope"
461−msgstr ""
458+msgstr "Długie przeciągnięcie od lewej krawędzi otwiera aplikacje soczewek"
462
459
463−#: qml/Tutorial/TutorialRight.qml:54
460+#: qml/Tutorial/TutorialLeft.qml:47
464−msgid "Hover your mouse on the right edge to view your open apps"
461+msgid "Swipe from the left edge to open the launcher"
465−msgstr ""
462+msgstr "Przeciągnięcie od lewej krawędzi otwiera pasek uruchamiania"
466
463
467#: qml/Tutorial/TutorialRight.qml:55
464#: qml/Tutorial/TutorialRight.qml:55
465+msgid "Push your mouse against the right edge to view your open apps"
466+msgstr ""
467+
468+#: qml/Tutorial/TutorialRight.qml:56
468msgid "Short or long swipe from the right edge to view your open apps"
469msgid "Short or long swipe from the right edge to view your open apps"
469msgstr ""
470msgstr ""
471+"Długie lub krótkie przeciągnięcie od prawej krawędzi wyświetla otwarte "
472+"aplikacje"
470
473
471#: qml/Tutorial/TutorialTop.qml:53
474#: qml/Tutorial/TutorialTop.qml:53
472msgid "Swipe from the top right edge to open the notification bar"
475msgid "Swipe from the top right edge to open the notification bar"
473−msgstr ""
476+msgstr "Przeciągnij z prawego, górnego rogu, by otworzyć menu powiadomień"
474
477
475#: qml/Tutorial/TutorialTop.qml:54
478#: qml/Tutorial/TutorialTop.qml:54
476msgid "Swipe from the top edge to open the notification bar"
479msgid "Swipe from the top edge to open the notification bar"
477msgstr ""
480msgstr ""
481+"Połóż palec na wybraną ikonę górnego paska powiadomień i przeciągnij go w "
482+"dół, by otworzyć żądane menu"
478
483
479#: qml/Wizard/Page.qml:54
484#: qml/Wizard/Page.qml:54
480msgctxt "Button: Go back one page in the Wizard"
485msgctxt "Button: Go back one page in the Wizard"
@@ -524,16 +529,19 @@ msgid ""
524"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
529"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
525"(recommended)"
530"(recommended)"
526msgstr ""
531msgstr ""
532+"Anonimowe ustalanie lokalizacji za pomocą GPS, Wi-Fi oraz GSM (zalecane)"
527
533
528#: qml/Wizard/Pages/40-location.qml:105
534#: qml/Wizard/Pages/40-location.qml:105
529#, qt-format
535#, qt-format
530msgid "By selecting this option you agree to the Nokia HERE %1."
536msgid "By selecting this option you agree to the Nokia HERE %1."
531msgstr ""
537msgstr ""
538+"Zaznaczając tę opcję zgadzasz się z postanowieniami zasad użytkowania Nokia "
539+"HERE %1"
532
540
533#: qml/Wizard/Pages/40-location.qml:106
541#: qml/Wizard/Pages/40-location.qml:106
534msgctxt "part of: Nokia HERE terms and conditions"
542msgctxt "part of: Nokia HERE terms and conditions"
535msgid "terms and conditions"
543msgid "terms and conditions"
536−msgstr ""
544+msgstr "Zasady użytkowania"
537
545
538#: qml/Wizard/Pages/40-location.qml:160
546#: qml/Wizard/Pages/40-location.qml:160
539msgid "GPS only"
547msgid "GPS only"
@@ -541,11 +549,11 @@ msgstr "Tylko GPS"
541
549
542#: qml/Wizard/Pages/40-location.qml:214
550#: qml/Wizard/Pages/40-location.qml:214
543msgid "Don't use my location"
551msgid "Don't use my location"
544−msgstr ""
552+msgstr "Nie sprawdzaj mojej lokalizacji"
545
553
546#: qml/Wizard/Pages/40-location.qml:260
554#: qml/Wizard/Pages/40-location.qml:260
547msgid "You can change it later in System Settings."
555msgid "You can change it later in System Settings."
548−msgstr ""
556+msgstr "Możesz to później zmienić w ustawianiach systemu"
549
557
550#: qml/Wizard/Pages/50-timezone.qml:29
558#: qml/Wizard/Pages/50-timezone.qml:29
551msgid "Time Zone"
559msgid "Time Zone"
@@ -553,15 +561,15 @@ msgstr "Strefa czasowa"
553
561
554#: qml/Wizard/Pages/50-timezone.qml:178
562#: qml/Wizard/Pages/50-timezone.qml:178
555msgid "Enter your city"
563msgid "Enter your city"
556−msgstr ""
564+msgstr "Podaj przybliżoną lokalizację"
557
565
558#: qml/Wizard/Pages/60-account.qml:24
566#: qml/Wizard/Pages/60-account.qml:24
559msgid "Personalize Your Device"
567msgid "Personalize Your Device"
560−msgstr ""
568+msgstr "Personalizacja urządzenia"
561
569
562#: qml/Wizard/Pages/60-account.qml:48
570#: qml/Wizard/Pages/60-account.qml:48
563msgid "Preferred Name"
571msgid "Preferred Name"
564−msgstr ""
572+msgstr "Imię"
565
573
566#: qml/Wizard/Pages/70-passwd-type.qml:39
574#: qml/Wizard/Pages/70-passwd-type.qml:39
567msgid "Lock Screen"
575msgid "Lock Screen"
@@ -570,17 +578,17 @@ msgstr "Blokada ekranu"
570#: qml/Wizard/Pages/70-passwd-type.qml:101
578#: qml/Wizard/Pages/70-passwd-type.qml:101
571msgctxt "Label: Type of security method"
579msgctxt "Label: Type of security method"
572msgid "Create new password"
580msgid "Create new password"
573−msgstr ""
581+msgstr "Hasło"
574
582
575#: qml/Wizard/Pages/70-passwd-type.qml:103
583#: qml/Wizard/Pages/70-passwd-type.qml:103
576msgctxt "Label: Type of security method"
584msgctxt "Label: Type of security method"
577msgid "Create passcode (numbers only)"
585msgid "Create passcode (numbers only)"
578−msgstr ""
586+msgstr "Kod (tylko cyfry)"
579
587
580#: qml/Wizard/Pages/70-passwd-type.qml:105
588#: qml/Wizard/Pages/70-passwd-type.qml:105
581msgctxt "Label: Type of security method"
589msgctxt "Label: Type of security method"
582msgid "No lock code"
590msgid "No lock code"
583−msgstr ""
591+msgstr "Brak zabezpieczeń"
584
592
585#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
593#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
586msgid "Privacy Policy"
594msgid "Privacy Policy"
@@ -588,11 +596,14 @@ msgstr "Polityka prywatności"
588
596
589#: qml/Wizard/Pages/75-report-check.qml:26
597#: qml/Wizard/Pages/75-report-check.qml:26
590msgid "Help Us Improve"
598msgid "Help Us Improve"
591−msgstr ""
599+msgstr "Pomóż ulepszać system"
592
600
593#: qml/Wizard/Pages/75-report-check.qml:59
601#: qml/Wizard/Pages/75-report-check.qml:59
594msgid "Improve system performance by sending us crashes and error reports."
602msgid "Improve system performance by sending us crashes and error reports."
595msgstr ""
603msgstr ""
604+"Twoje urządzenie może automatycznie wysyłać deweloperom raporty o problemach "
605+"w funkcjonowaniu systemu oraz aplikacji. Dzięki Tobie następna aktualizacja "
606+"może je rozwiązać."
596
607
597#: qml/Wizard/Pages/75-report-check.qml:60
608#: qml/Wizard/Pages/75-report-check.qml:60
598msgid "Privacy policy"
609msgid "Privacy policy"
@@ -604,7 +615,7 @@ msgstr "Witamy w Ubuntu"
604
615
605#: qml/Wizard/Pages/80-finished.qml:104
616#: qml/Wizard/Pages/80-finished.qml:104
606msgid "You are ready to use your device now"
617msgid "You are ready to use your device now"
607−msgstr ""
618+msgstr "Twoje urządzenie jest gotowe do działania!"
608
619
609#: qml/Wizard/Pages/80-finished.qml:124
620#: qml/Wizard/Pages/80-finished.qml:124
610msgid "Get Started"
621msgid "Get Started"
@@ -616,7 +627,7 @@ msgstr "Zasady i warunki"
616
627
617#: qml/Wizard/Pages/here-terms.qml:69
628#: qml/Wizard/Pages/here-terms.qml:69
618msgid "Your device uses positioning technologies provided by HERE."
629msgid "Your device uses positioning technologies provided by HERE."
619−msgstr ""
630+msgstr "Twoje urządzenie odnajduje lokalizację za pomocą serwisu HERE."
620
631
621#: qml/Wizard/Pages/here-terms.qml:81
632#: qml/Wizard/Pages/here-terms.qml:81
622msgid ""
633msgid ""
@@ -624,21 +635,25 @@ msgid ""
624"collects information about nearby cell towers and Wi-Fi hotspots around your "
635"collects information about nearby cell towers and Wi-Fi hotspots around your "
625"current location whenever your position is being found."
636"current location whenever your position is being found."
626msgstr ""
637msgstr ""
638+"Aby była ona jak najdokładniejsza, HERE szuka informacji także o nadajnikach "
639+"sieci GSM oraz sieciach Wi-Fi."
627
640
628#: qml/Wizard/Pages/here-terms.qml:93
641#: qml/Wizard/Pages/here-terms.qml:93
629msgid ""
642msgid ""
630"The information collected is used to analyze the service and to improve the "
643"The information collected is used to analyze the service and to improve the "
631"use of service, but not to identify you personally."
644"use of service, but not to identify you personally."
632msgstr ""
645msgstr ""
646+"Dzięki informacjom o dokładnym położeniu usługi lokalizacji działają lepiej. "
647+"Są one anonimowe i nie mają na celu identyfikacji użytkownika."
633
648
634#: qml/Wizard/Pages/here-terms.qml:106
649#: qml/Wizard/Pages/here-terms.qml:106
635#, qt-format
650#, qt-format
636msgid "By continuing, you agree to the HERE platform %1 and %2."
651msgid "By continuing, you agree to the HERE platform %1 and %2."
637−msgstr ""
652+msgstr "Kontynuując akcpetujesz %1 oraz %2."
638
653
639#: qml/Wizard/Pages/here-terms.qml:107
654#: qml/Wizard/Pages/here-terms.qml:107
640msgid "Service Terms"
655msgid "Service Terms"
641−msgstr ""
656+msgstr "Zasady"
642
657
643#: qml/Wizard/Pages/passcode-confirm.qml:43
658#: qml/Wizard/Pages/passcode-confirm.qml:43
644#: qml/Wizard/Pages/passcode-desktop.qml:80
659#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -647,69 +662,69 @@ msgstr "Potwierdź kod"
647
662
648#: qml/Wizard/Pages/passcode-confirm.qml:45
663#: qml/Wizard/Pages/passcode-confirm.qml:45
649msgid "Incorrect passcode."
664msgid "Incorrect passcode."
650−msgstr ""
665+msgstr "Niepoprawny kod"
651
666
652#: qml/Wizard/Pages/passcode-confirm.qml:45
667#: qml/Wizard/Pages/passcode-confirm.qml:45
653msgctxt "Enter the passcode again"
668msgctxt "Enter the passcode again"
654msgid "Please re-enter."
669msgid "Please re-enter."
655−msgstr ""
670+msgstr "Spróbuj ponownie"
656
671
657#: qml/Wizard/Pages/passcode-desktop.qml:30
672#: qml/Wizard/Pages/passcode-desktop.qml:30
658msgid "Lock Screen Passcode"
673msgid "Lock Screen Passcode"
659−msgstr ""
674+msgstr "Kod blokady ekranu"
660
675
661#: qml/Wizard/Pages/passcode-desktop.qml:56
676#: qml/Wizard/Pages/passcode-desktop.qml:56
662msgid "Enter 4 numbers to setup your passcode"
677msgid "Enter 4 numbers to setup your passcode"
663−msgstr ""
678+msgstr "Podaj 4 cyfry nowego kodu"
664
679
665#: qml/Wizard/Pages/passcode-desktop.qml:65
680#: qml/Wizard/Pages/passcode-desktop.qml:65
666#: qml/Wizard/Pages/passcode-set.qml:54
681#: qml/Wizard/Pages/passcode-set.qml:54
667msgid "Choose passcode"
682msgid "Choose passcode"
668−msgstr ""
683+msgstr "Nowy kod"
669
684
670#: qml/Wizard/Pages/passcode-desktop.qml:105
685#: qml/Wizard/Pages/passcode-desktop.qml:105
671msgid "Passcode too short"
686msgid "Passcode too short"
672−msgstr ""
687+msgstr "Kod za krótki"
673
688
674#: qml/Wizard/Pages/passcode-desktop.qml:107
689#: qml/Wizard/Pages/passcode-desktop.qml:107
675msgid "Passcodes match"
690msgid "Passcodes match"
676−msgstr ""
691+msgstr "Kody zgodne"
677
692
678#: qml/Wizard/Pages/passcode-desktop.qml:109
693#: qml/Wizard/Pages/passcode-desktop.qml:109
679msgid "Passcodes do not match"
694msgid "Passcodes do not match"
680−msgstr ""
695+msgstr "Kody nie zgadzają się"
681
696
682#: qml/Wizard/Pages/passcode-set.qml:62
697#: qml/Wizard/Pages/passcode-set.qml:62
683msgid "Passcode must be 4 characters long"
698msgid "Passcode must be 4 characters long"
684−msgstr ""
699+msgstr "Kod musi składać się z 4 cyfr"
685
700
686#: qml/Wizard/Pages/password-set.qml:30
701#: qml/Wizard/Pages/password-set.qml:30
687msgid "Lock Screen Password"
702msgid "Lock Screen Password"
688−msgstr ""
703+msgstr "Hasło blokady ekranu"
689
704
690#: qml/Wizard/Pages/password-set.qml:61
705#: qml/Wizard/Pages/password-set.qml:61
691msgid "Enter at least 8 characters"
706msgid "Enter at least 8 characters"
692−msgstr ""
707+msgstr "Podaj co najmniej 8 znaków"
693
708
694#: qml/Wizard/Pages/password-set.qml:73
709#: qml/Wizard/Pages/password-set.qml:73
695msgid "Choose password"
710msgid "Choose password"
696−msgstr ""
711+msgstr "Nowe hasło"
697
712
698#: qml/Wizard/Pages/password-set.qml:103
713#: qml/Wizard/Pages/password-set.qml:103
699msgid "Confirm password"
714msgid "Confirm password"
700−msgstr ""
715+msgstr "Potwierdź hasło"
701
716
702#: qml/Wizard/Pages/sim.qml:27
717#: qml/Wizard/Pages/sim.qml:27
703msgid "No SIM card installed"
718msgid "No SIM card installed"
704−msgstr ""
719+msgstr "Brak karty SIM"
705
720
706#: qml/Wizard/Pages/sim.qml:54
721#: qml/Wizard/Pages/sim.qml:54
707msgid "SIM card added"
722msgid "SIM card added"
708−msgstr ""
723+msgstr "Znaleziono kartę SIM"
709
724
710#: qml/Wizard/Pages/sim.qml:55
725#: qml/Wizard/Pages/sim.qml:55
711msgid "You must restart the device to access the mobile network."
726msgid "You must restart the device to access the mobile network."
712−msgstr ""
727+msgstr "Aby móc z niej korzystać należy uruchomić ponownie urządzenie."
713
728
714#: qml/Wizard/Pages/sim.qml:59
729#: qml/Wizard/Pages/sim.qml:59
715msgid "Restart"
730msgid "Restart"
@@ -718,34 +733,36 @@ msgstr "Uruchom ponownie"
718#: qml/Wizard/Pages/sim.qml:78
733#: qml/Wizard/Pages/sim.qml:78
719msgid "You won’t be able to make calls or use text messaging without a SIM."
734msgid "You won’t be able to make calls or use text messaging without a SIM."
720msgstr ""
735msgstr ""
736+"Brak karty SIM nie pozwala na wysyłanie wiadomości SMS oraz wykonywanie "
737+"połączeń przez sieć GSM."
721
738
722#: qml/Wizard/Pages/sim.qml:90
739#: qml/Wizard/Pages/sim.qml:90
723msgid "To proceed with no SIM tap Skip."
740msgid "To proceed with no SIM tap Skip."
724−msgstr ""
741+msgstr "Pomiń, by kontynuować bez karty SIM"
725
742
726#: qml/Wizard/PasswordMeter.qml:87
743#: qml/Wizard/PasswordMeter.qml:87
727msgid "Passwords match"
744msgid "Passwords match"
728−msgstr ""
745+msgstr "Hasła zgodne"
729
746
730#: qml/Wizard/PasswordMeter.qml:89
747#: qml/Wizard/PasswordMeter.qml:89
731msgid "Passwords do not match"
748msgid "Passwords do not match"
732−msgstr ""
749+msgstr "Hasła nie zgadzają się."
733
750
734#: qml/Wizard/PasswordMeter.qml:93
751#: qml/Wizard/PasswordMeter.qml:93
735msgid "Strong password"
752msgid "Strong password"
736−msgstr ""
753+msgstr "Silne hasło"
737
754
738#: qml/Wizard/PasswordMeter.qml:95
755#: qml/Wizard/PasswordMeter.qml:95
739msgid "Fair password"
756msgid "Fair password"
740−msgstr ""
757+msgstr "Dostateczne hasło"
741
758
742#: qml/Wizard/PasswordMeter.qml:97
759#: qml/Wizard/PasswordMeter.qml:97
743msgid "Weak password"
760msgid "Weak password"
744−msgstr ""
761+msgstr "Słabe hasło"
745
762
746#: qml/Wizard/PasswordMeter.qml:99
763#: qml/Wizard/PasswordMeter.qml:99
747msgid "Very weak password"
764msgid "Very weak password"
748−msgstr ""
765+msgstr "Bardzo słabe hasło"
749
766
750#~ msgid "Confirm"
767#~ msgid "Confirm"
751#~ msgstr "Potwierdź"
768#~ msgstr "Potwierdź"
@@ -1049,3 +1066,6 @@ msgstr ""
1049
1066
1050#~ msgid "Call back"
1067#~ msgid "Call back"
1051#~ msgstr "Oddzwoń"
1068#~ msgstr "Oddzwoń"
1069+
1070+#~ msgid "Hover your mouse on the right edge to view your open apps"
1071+#~ msgstr "Skieruj mysz do prawej krawędzi, by zobaczyć otwarte aplikacje"
po/pt.po+88−85
@@ -7,16 +7,16 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-02-18 01:11+0000\n"
11"PO-Revision-Date: 2016-02-18 01:11+0000\n"
12−"Last-Translator: Ivo Xavier <ivofernandes12@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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -187,11 +187,11 @@ msgstr "Adicionar aos favoritos"
187
187
188#: qml/Dash/FiltersPopover.qml:60
188#: qml/Dash/FiltersPopover.qml:60
189msgid "Refine your results"
189msgid "Refine your results"
190−msgstr ""
190+msgstr "Redefina os seus resultados"
191
191
192#: qml/Dash/FiltersPopover.qml:69
192#: qml/Dash/FiltersPopover.qml:69
193msgid "Reset"
193msgid "Reset"
194−msgstr ""
194+msgstr "Repor"
195
195
196#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
196#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
197msgid "See less"
197msgid "See less"
@@ -208,11 +208,11 @@ msgstr "Procurar"
208
208
209#: qml/Dash/PageHeaderExtraPanel.qml:55
209#: qml/Dash/PageHeaderExtraPanel.qml:55
210msgid "Recent Searches"
210msgid "Recent Searches"
211−msgstr ""
211+msgstr "Procuras recentes"
212
212
213#: qml/Dash/PageHeaderExtraPanel.qml:66
213#: qml/Dash/PageHeaderExtraPanel.qml:66
214msgid "Clear All"
214msgid "Clear All"
215−msgstr ""
215+msgstr "Limpar todos"
216
216
217#: qml/Dash/Previews/PreviewActionCombo.qml:35
217#: qml/Dash/Previews/PreviewActionCombo.qml:35
218msgid "More..."
218msgid "More..."
@@ -431,51 +431,51 @@ msgstr "Ligar de volta"
431
431
432#: qml/Stages/SideStage.qml:76
432#: qml/Stages/SideStage.qml:76
433msgid "Drag using 3 fingers any application from one window to the other"
433msgid "Drag using 3 fingers any application from one window to the other"
434−msgstr ""
434+msgstr "Arraste qualquer app usando três dedos de uma janela para outra"
435
435
436#: qml/Tutorial/TutorialBottom.qml:78
436#: qml/Tutorial/TutorialBottom.qml:78
437msgid "Swipe up to add a contact"
437msgid "Swipe up to add a contact"
438−msgstr ""
438+msgstr "Deslize para adicionar um contacto"
439
439
440#: qml/Tutorial/TutorialBottom.qml:80
440#: qml/Tutorial/TutorialBottom.qml:80
441msgid "Swipe up for favorite calculations"
441msgid "Swipe up for favorite calculations"
442−msgstr ""
442+msgstr "Deslize para cima para marcar os seus cálculos"
443
443
444#: qml/Tutorial/TutorialBottom.qml:82
444#: qml/Tutorial/TutorialBottom.qml:82
445msgid "Swipe up for recent calls"
445msgid "Swipe up for recent calls"
446−msgstr ""
446+msgstr "Deslize para cima para ver as chamadas recentes"
447
447
448#: qml/Tutorial/TutorialBottom.qml:84
448#: qml/Tutorial/TutorialBottom.qml:84
449msgid "Swipe up to create a message"
449msgid "Swipe up to create a message"
450−msgstr ""
450+msgstr "Deslize para cima para criar uma mensagem nova"
451
451
452#: qml/Tutorial/TutorialBottom.qml:85
452#: qml/Tutorial/TutorialBottom.qml:85
453msgid "Swipe up to manage the app"
453msgid "Swipe up to manage the app"
454−msgstr ""
454+msgstr "Deslize para cima para gerir a app"
455−
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
459
455
460#: qml/Tutorial/TutorialLeftLong.qml:47
456#: qml/Tutorial/TutorialLeftLong.qml:47
461msgid "Long swipe from the left edge to open the Today scope"
457msgid "Long swipe from the left edge to open the Today scope"
462−msgstr ""
458+msgstr "Deslize longo da margem esquerda para abrir a scope Hoje"
463
459
464−#: qml/Tutorial/TutorialRight.qml:54
460+#: qml/Tutorial/TutorialLeft.qml:47
465−msgid "Hover your mouse on the right edge to view your open apps"
461+msgid "Swipe from the left edge to open the launcher"
466−msgstr ""
462+msgstr "Deslize da margem esquerda para abrir o Launcher"
467
463
468#: qml/Tutorial/TutorialRight.qml:55
464#: qml/Tutorial/TutorialRight.qml:55
469−msgid "Short or long swipe from the right edge to view your open apps"
465+msgid "Push your mouse against the right edge to view your open apps"
470msgstr ""
466msgstr ""
471
467
468+#: qml/Tutorial/TutorialRight.qml:56
469+msgid "Short or long swipe from the right edge to view your open apps"
470+msgstr "Deslize curto ou longo da margem direita para ver as apps abertas"
471+
472#: qml/Tutorial/TutorialTop.qml:53
472#: qml/Tutorial/TutorialTop.qml:53
473msgid "Swipe from the top right edge to open the notification bar"
473msgid "Swipe from the top right edge to open the notification bar"
474−msgstr ""
474+msgstr "Deslize da margem superior direita para abrir as notificações"
475
475
476#: qml/Tutorial/TutorialTop.qml:54
476#: qml/Tutorial/TutorialTop.qml:54
477msgid "Swipe from the top edge to open the notification bar"
477msgid "Swipe from the top edge to open the notification bar"
478−msgstr ""
478+msgstr "Deslize da margem esquerda para abrir as notificações"
479
479
480#: qml/Wizard/Page.qml:54
480#: qml/Wizard/Page.qml:54
481msgctxt "Button: Go back one page in the Wizard"
481msgctxt "Button: Go back one page in the Wizard"
@@ -484,7 +484,7 @@ msgstr "Retroceder"
484
484
485#: qml/Wizard/Pages/10-welcome.qml:27
485#: qml/Wizard/Pages/10-welcome.qml:27
486msgid "Language"
486msgid "Language"
487−msgstr ""
487+msgstr "Idioma"
488
488
489#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
489#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
490#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
490#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -493,7 +493,7 @@ msgstr ""
493#: qml/Wizard/Pages/passcode-desktop.qml:124
493#: qml/Wizard/Pages/passcode-desktop.qml:124
494#: qml/Wizard/Pages/password-set.qml:141
494#: qml/Wizard/Pages/password-set.qml:141
495msgid "Next"
495msgid "Next"
496−msgstr ""
496+msgstr "Próximo"
497
497
498#: qml/Wizard/Pages/30-wifi.qml:29
498#: qml/Wizard/Pages/30-wifi.qml:29
499msgid "Connect to Wi‑Fi"
499msgid "Connect to Wi‑Fi"
@@ -501,15 +501,15 @@ msgstr "Ligar ao Wi-Fi"
501
501
502#: qml/Wizard/Pages/30-wifi.qml:130
502#: qml/Wizard/Pages/30-wifi.qml:130
503msgid "Connected"
503msgid "Connected"
504−msgstr ""
504+msgstr "Ligado"
505
505
506#: qml/Wizard/Pages/30-wifi.qml:163
506#: qml/Wizard/Pages/30-wifi.qml:163
507msgid "Available Wi-Fi networks"
507msgid "Available Wi-Fi networks"
508−msgstr ""
508+msgstr "Redes Wi-Fi disponíveis"
509
509
510#: qml/Wizard/Pages/30-wifi.qml:164
510#: qml/Wizard/Pages/30-wifi.qml:164
511msgid "No available Wi-Fi networks"
511msgid "No available Wi-Fi networks"
512−msgstr ""
512+msgstr "Sem redes Wi-Fi disponíveis"
513
513
514#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
514#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
515#: qml/Wizard/Pages/sim.qml:101
515#: qml/Wizard/Pages/sim.qml:101
@@ -518,98 +518,101 @@ msgstr "Saltar"
518
518
519#: qml/Wizard/Pages/40-location.qml:27
519#: qml/Wizard/Pages/40-location.qml:27
520msgid "Location Services"
520msgid "Location Services"
521−msgstr ""
521+msgstr "Serviços de localização"
522
522
523#: qml/Wizard/Pages/40-location.qml:83
523#: qml/Wizard/Pages/40-location.qml:83
524msgid ""
524msgid ""
525"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
525"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
526"(recommended)"
526"(recommended)"
527msgstr ""
527msgstr ""
528+"Usar GPS, hotspots Wi-Fi e rede móvel anonimamente para detetar a sua "
529+"localização (recomendado)"
528
530
529#: qml/Wizard/Pages/40-location.qml:105
531#: qml/Wizard/Pages/40-location.qml:105
530#, qt-format
532#, qt-format
531msgid "By selecting this option you agree to the Nokia HERE %1."
533msgid "By selecting this option you agree to the Nokia HERE %1."
532−msgstr ""
534+msgstr "Ao selecionar está a concordar com os %1 do Nokia HERE."
533
535
534#: qml/Wizard/Pages/40-location.qml:106
536#: qml/Wizard/Pages/40-location.qml:106
535msgctxt "part of: Nokia HERE terms and conditions"
537msgctxt "part of: Nokia HERE terms and conditions"
536msgid "terms and conditions"
538msgid "terms and conditions"
537−msgstr ""
539+msgstr "termos e condições"
538
540
539#: qml/Wizard/Pages/40-location.qml:160
541#: qml/Wizard/Pages/40-location.qml:160
540msgid "GPS only"
542msgid "GPS only"
541−msgstr ""
543+msgstr "Apenas GPS"
542
544
543#: qml/Wizard/Pages/40-location.qml:214
545#: qml/Wizard/Pages/40-location.qml:214
544msgid "Don't use my location"
546msgid "Don't use my location"
545−msgstr ""
547+msgstr "Não use a minha localização"
546
548
547#: qml/Wizard/Pages/40-location.qml:260
549#: qml/Wizard/Pages/40-location.qml:260
548msgid "You can change it later in System Settings."
550msgid "You can change it later in System Settings."
549−msgstr ""
551+msgstr "Pode alterar mais tarde nas Definições"
550
552
551#: qml/Wizard/Pages/50-timezone.qml:29
553#: qml/Wizard/Pages/50-timezone.qml:29
552msgid "Time Zone"
554msgid "Time Zone"
553−msgstr ""
555+msgstr "Fuso horário"
554
556
555#: qml/Wizard/Pages/50-timezone.qml:178
557#: qml/Wizard/Pages/50-timezone.qml:178
556msgid "Enter your city"
558msgid "Enter your city"
557−msgstr ""
559+msgstr "Introduza a sua cidade"
558
560
559#: qml/Wizard/Pages/60-account.qml:24
561#: qml/Wizard/Pages/60-account.qml:24
560msgid "Personalize Your Device"
562msgid "Personalize Your Device"
561−msgstr ""
563+msgstr "Personalize o seu dispositivo"
562
564
563#: qml/Wizard/Pages/60-account.qml:48
565#: qml/Wizard/Pages/60-account.qml:48
564msgid "Preferred Name"
566msgid "Preferred Name"
565−msgstr ""
567+msgstr "Nome preferido"
566
568
567#: qml/Wizard/Pages/70-passwd-type.qml:39
569#: qml/Wizard/Pages/70-passwd-type.qml:39
568msgid "Lock Screen"
570msgid "Lock Screen"
569−msgstr ""
571+msgstr "Bloquear ecrã"
570
572
571#: qml/Wizard/Pages/70-passwd-type.qml:101
573#: qml/Wizard/Pages/70-passwd-type.qml:101
572msgctxt "Label: Type of security method"
574msgctxt "Label: Type of security method"
573msgid "Create new password"
575msgid "Create new password"
574−msgstr ""
576+msgstr "Criar nova palavra-passe"
575
577
576#: qml/Wizard/Pages/70-passwd-type.qml:103
578#: qml/Wizard/Pages/70-passwd-type.qml:103
577msgctxt "Label: Type of security method"
579msgctxt "Label: Type of security method"
578msgid "Create passcode (numbers only)"
580msgid "Create passcode (numbers only)"
579−msgstr ""
581+msgstr "Criar código (números apenas)"
580
582
581#: qml/Wizard/Pages/70-passwd-type.qml:105
583#: qml/Wizard/Pages/70-passwd-type.qml:105
582msgctxt "Label: Type of security method"
584msgctxt "Label: Type of security method"
583msgid "No lock code"
585msgid "No lock code"
584−msgstr ""
586+msgstr "Sem código de bloqueio"
585
587
586#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
588#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
587msgid "Privacy Policy"
589msgid "Privacy Policy"
588−msgstr ""
590+msgstr "Política de privacidade"
589
591
590#: qml/Wizard/Pages/75-report-check.qml:26
592#: qml/Wizard/Pages/75-report-check.qml:26
591msgid "Help Us Improve"
593msgid "Help Us Improve"
592−msgstr ""
594+msgstr "Ajude-nos a melhorar"
593
595
594#: qml/Wizard/Pages/75-report-check.qml:59
596#: qml/Wizard/Pages/75-report-check.qml:59
595msgid "Improve system performance by sending us crashes and error reports."
597msgid "Improve system performance by sending us crashes and error reports."
596msgstr ""
598msgstr ""
599+"Melhore a performance do sistema ao enviar-nos relatórios de erros e falhas."
597
600
598#: qml/Wizard/Pages/75-report-check.qml:60
601#: qml/Wizard/Pages/75-report-check.qml:60
599msgid "Privacy policy"
602msgid "Privacy policy"
600−msgstr ""
603+msgstr "Política de privacidade"
601
604
602#: qml/Wizard/Pages/80-finished.qml:89
605#: qml/Wizard/Pages/80-finished.qml:89
603msgid "Welcome to Ubuntu"
606msgid "Welcome to Ubuntu"
604−msgstr ""
607+msgstr "Bem-vindo (a) ao Ubuntu"
605
608
606#: qml/Wizard/Pages/80-finished.qml:104
609#: qml/Wizard/Pages/80-finished.qml:104
607msgid "You are ready to use your device now"
610msgid "You are ready to use your device now"
608−msgstr ""
611+msgstr "Está pronto (a) para usar o seu dispositivo"
609
612
610#: qml/Wizard/Pages/80-finished.qml:124
613#: qml/Wizard/Pages/80-finished.qml:124
611msgid "Get Started"
614msgid "Get Started"
612−msgstr ""
615+msgstr "Começar"
613
616
614#: qml/Wizard/Pages/here-terms.qml:25
617#: qml/Wizard/Pages/here-terms.qml:25
615msgid "Terms & Conditions"
618msgid "Terms & Conditions"
@@ -618,6 +621,7 @@ msgstr "Termos e condições"
618#: qml/Wizard/Pages/here-terms.qml:69
621#: qml/Wizard/Pages/here-terms.qml:69
619msgid "Your device uses positioning technologies provided by HERE."
622msgid "Your device uses positioning technologies provided by HERE."
620msgstr ""
623msgstr ""
624+"O seu dispositivo usa tecnologias de posicionamento fornecidas pela HERE."
621
625
622#: qml/Wizard/Pages/here-terms.qml:81
626#: qml/Wizard/Pages/here-terms.qml:81
623msgid ""
627msgid ""
@@ -625,21 +629,26 @@ msgid ""
625"collects information about nearby cell towers and Wi-Fi hotspots around your "
629"collects information about nearby cell towers and Wi-Fi hotspots around your "
626"current location whenever your position is being found."
630"current location whenever your position is being found."
627msgstr ""
631msgstr ""
632+"Para fornecer serviços de localização e melhorar a sua qualidade, a HERE "
633+"recolhe informação sobre redes e hotspots Wi-Fi próximos quando a sua "
634+"posição está a ser encontrada."
628
635
629#: qml/Wizard/Pages/here-terms.qml:93
636#: qml/Wizard/Pages/here-terms.qml:93
630msgid ""
637msgid ""
631"The information collected is used to analyze the service and to improve the "
638"The information collected is used to analyze the service and to improve the "
632"use of service, but not to identify you personally."
639"use of service, but not to identify you personally."
633msgstr ""
640msgstr ""
641+"A informação recolhida é usada analisar e melhorar o serviço, não para o "
642+"identificar."
634
643
635#: qml/Wizard/Pages/here-terms.qml:106
644#: qml/Wizard/Pages/here-terms.qml:106
636#, qt-format
645#, qt-format
637msgid "By continuing, you agree to the HERE platform %1 and %2."
646msgid "By continuing, you agree to the HERE platform %1 and %2."
638−msgstr ""
647+msgstr "Ao continuar, está a concordar com a plataforma HERE %1 e %2."
639
648
640#: qml/Wizard/Pages/here-terms.qml:107
649#: qml/Wizard/Pages/here-terms.qml:107
641msgid "Service Terms"
650msgid "Service Terms"
642−msgstr ""
651+msgstr "Termos de serviço"
643
652
644#: qml/Wizard/Pages/passcode-confirm.qml:43
653#: qml/Wizard/Pages/passcode-confirm.qml:43
645#: qml/Wizard/Pages/passcode-desktop.qml:80
654#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -648,69 +657,69 @@ msgstr "Confirme o código"
648
657
649#: qml/Wizard/Pages/passcode-confirm.qml:45
658#: qml/Wizard/Pages/passcode-confirm.qml:45
650msgid "Incorrect passcode."
659msgid "Incorrect passcode."
651−msgstr ""
660+msgstr "Código incorreto."
652
661
653#: qml/Wizard/Pages/passcode-confirm.qml:45
662#: qml/Wizard/Pages/passcode-confirm.qml:45
654msgctxt "Enter the passcode again"
663msgctxt "Enter the passcode again"
655msgid "Please re-enter."
664msgid "Please re-enter."
656−msgstr ""
665+msgstr "Por favor, volte a introduzir."
657
666
658#: qml/Wizard/Pages/passcode-desktop.qml:30
667#: qml/Wizard/Pages/passcode-desktop.qml:30
659msgid "Lock Screen Passcode"
668msgid "Lock Screen Passcode"
660−msgstr ""
669+msgstr "Código de ecrã de bloqueio"
661
670
662#: qml/Wizard/Pages/passcode-desktop.qml:56
671#: qml/Wizard/Pages/passcode-desktop.qml:56
663msgid "Enter 4 numbers to setup your passcode"
672msgid "Enter 4 numbers to setup your passcode"
664−msgstr ""
673+msgstr "Introduza 4 números para definir o seu código"
665
674
666#: qml/Wizard/Pages/passcode-desktop.qml:65
675#: qml/Wizard/Pages/passcode-desktop.qml:65
667#: qml/Wizard/Pages/passcode-set.qml:54
676#: qml/Wizard/Pages/passcode-set.qml:54
668msgid "Choose passcode"
677msgid "Choose passcode"
669−msgstr ""
678+msgstr "Escolha o código"
670
679
671#: qml/Wizard/Pages/passcode-desktop.qml:105
680#: qml/Wizard/Pages/passcode-desktop.qml:105
672msgid "Passcode too short"
681msgid "Passcode too short"
673−msgstr ""
682+msgstr "Código muito curto"
674
683
675#: qml/Wizard/Pages/passcode-desktop.qml:107
684#: qml/Wizard/Pages/passcode-desktop.qml:107
676msgid "Passcodes match"
685msgid "Passcodes match"
677−msgstr ""
686+msgstr "Códigos coincidem"
678
687
679#: qml/Wizard/Pages/passcode-desktop.qml:109
688#: qml/Wizard/Pages/passcode-desktop.qml:109
680msgid "Passcodes do not match"
689msgid "Passcodes do not match"
681−msgstr ""
690+msgstr "Códigos não coincidem"
682
691
683#: qml/Wizard/Pages/passcode-set.qml:62
692#: qml/Wizard/Pages/passcode-set.qml:62
684msgid "Passcode must be 4 characters long"
693msgid "Passcode must be 4 characters long"
685−msgstr ""
694+msgstr "Os códigos devem ter 4 dígitos"
686
695
687#: qml/Wizard/Pages/password-set.qml:30
696#: qml/Wizard/Pages/password-set.qml:30
688msgid "Lock Screen Password"
697msgid "Lock Screen Password"
689−msgstr ""
698+msgstr "Palavra-passe de ecrã de bloqueio"
690
699
691#: qml/Wizard/Pages/password-set.qml:61
700#: qml/Wizard/Pages/password-set.qml:61
692msgid "Enter at least 8 characters"
701msgid "Enter at least 8 characters"
693−msgstr ""
702+msgstr "Introduza no mínimo 8 caracteres"
694
703
695#: qml/Wizard/Pages/password-set.qml:73
704#: qml/Wizard/Pages/password-set.qml:73
696msgid "Choose password"
705msgid "Choose password"
697−msgstr ""
706+msgstr "Escolha a palavra-passe"
698
707
699#: qml/Wizard/Pages/password-set.qml:103
708#: qml/Wizard/Pages/password-set.qml:103
700msgid "Confirm password"
709msgid "Confirm password"
701−msgstr ""
710+msgstr "Confirme a palavra-passe"
702
711
703#: qml/Wizard/Pages/sim.qml:27
712#: qml/Wizard/Pages/sim.qml:27
704msgid "No SIM card installed"
713msgid "No SIM card installed"
705−msgstr ""
714+msgstr "Sem cartão SIM inserido"
706
715
707#: qml/Wizard/Pages/sim.qml:54
716#: qml/Wizard/Pages/sim.qml:54
708msgid "SIM card added"
717msgid "SIM card added"
709−msgstr ""
718+msgstr "Cartão SIM adicionado"
710
719
711#: qml/Wizard/Pages/sim.qml:55
720#: qml/Wizard/Pages/sim.qml:55
712msgid "You must restart the device to access the mobile network."
721msgid "You must restart the device to access the mobile network."
713−msgstr ""
722+msgstr "Deve reiniciar o seu dispositivo para aceder à rede móvel."
714
723
715#: qml/Wizard/Pages/sim.qml:59
724#: qml/Wizard/Pages/sim.qml:59
716msgid "Restart"
725msgid "Restart"
@@ -718,35 +727,35 @@ msgstr "Reiniciar"
718
727
719#: qml/Wizard/Pages/sim.qml:78
728#: qml/Wizard/Pages/sim.qml:78
720msgid "You won’t be able to make calls or use text messaging without a SIM."
729msgid "You won’t be able to make calls or use text messaging without a SIM."
721−msgstr ""
730+msgstr "Não conseguirá fazer chamadas ou enviar mensagens sem um cartão SIM."
722
731
723#: qml/Wizard/Pages/sim.qml:90
732#: qml/Wizard/Pages/sim.qml:90
724msgid "To proceed with no SIM tap Skip."
733msgid "To proceed with no SIM tap Skip."
725−msgstr ""
734+msgstr "Para continuar sem um cartão SIM toque em Saltar."
726
735
727#: qml/Wizard/PasswordMeter.qml:87
736#: qml/Wizard/PasswordMeter.qml:87
728msgid "Passwords match"
737msgid "Passwords match"
729−msgstr ""
738+msgstr "As palavras-passe coincidem"
730
739
731#: qml/Wizard/PasswordMeter.qml:89
740#: qml/Wizard/PasswordMeter.qml:89
732msgid "Passwords do not match"
741msgid "Passwords do not match"
733−msgstr ""
742+msgstr "As palavras-passe não coincidem"
734
743
735#: qml/Wizard/PasswordMeter.qml:93
744#: qml/Wizard/PasswordMeter.qml:93
736msgid "Strong password"
745msgid "Strong password"
737−msgstr ""
746+msgstr "Palavra-passe forte"
738
747
739#: qml/Wizard/PasswordMeter.qml:95
748#: qml/Wizard/PasswordMeter.qml:95
740msgid "Fair password"
749msgid "Fair password"
741−msgstr ""
750+msgstr "Palavra-passe razoável"
742
751
743#: qml/Wizard/PasswordMeter.qml:97
752#: qml/Wizard/PasswordMeter.qml:97
744msgid "Weak password"
753msgid "Weak password"
745−msgstr ""
754+msgstr "Palavra-passe fraca"
746
755
747#: qml/Wizard/PasswordMeter.qml:99
756#: qml/Wizard/PasswordMeter.qml:99
748msgid "Very weak password"
757msgid "Very weak password"
749−msgstr ""
758+msgstr "Palavra-passe muito fraca"
750
759
751#~ msgid "Top edge"
760#~ msgid "Top edge"
752#~ msgstr "Margem superior"
761#~ msgstr "Margem superior"
@@ -1049,15 +1058,6 @@ msgstr ""
1049#~ msgid "Loading. Please Wait..."
1058#~ msgid "Loading. Please Wait..."
1050#~ msgstr "A carregar. Por favor, aguarde..."
1059#~ msgstr "A carregar. Por favor, aguarde..."
1051
1060
1052−#~ msgid "Welcome to your Ubuntu device."
1053−#~ msgstr "Bem-vindo ao seu dispositivo Ubuntu."
1054−
1055−#~ msgid "Please select how you’d like to unlock your device."
1056−#~ msgstr "Escolha como quer desbloquear o seu dispositivo."
1057−
1058−#~ msgid "Your device is now ready to use."
1059−#~ msgstr "O seu dispositivo está pronto."
1060−
1061#~ msgid "Choose your passcode"
1061#~ msgid "Choose your passcode"
1062#~ msgstr "Escolha o código"
1062#~ msgstr "Escolha o código"
1063
1063
@@ -1070,3 +1070,6 @@ msgstr ""
1070#~ msgstr ""
1070#~ msgstr ""
1071#~ "Isto pode ser desligado nas <b>Definições</b> debaixo da <b>Segurança eamp; "
1071#~ "Isto pode ser desligado nas <b>Definições</b> debaixo da <b>Segurança eamp; "
1072#~ "Privacidade</b>"
1072#~ "Privacidade</b>"
1073+
1074+#~ msgid "Hover your mouse on the right edge to view your open apps"
1075+#~ msgstr "Passe o rato na margem direita para ver as apps abertas"
po/pt_BR.po+23−23
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-08-05 04:40+0000\n"
11"PO-Revision-Date: 2015-08-05 04:40+0000\n"
12"Last-Translator: Julio Alexander Sieg <julio.sieg@gmail.com>\n"
12"Last-Translator: Julio Alexander Sieg <julio.sieg@gmail.com>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -29,7 +29,7 @@ msgstr "Fixar atalho"
29
29
30#: plugins/Unity/Launcher/launcheritem.cpp:53
30#: plugins/Unity/Launcher/launcheritem.cpp:53
31msgid "Quit"
31msgid "Quit"
32−msgstr ""
32+msgstr "Sair"
33
33
34#: plugins/Unity/Launcher/launcheritem.cpp:107
34#: plugins/Unity/Launcher/launcheritem.cpp:107
35msgid "Unpin shortcut"
35msgid "Unpin shortcut"
@@ -135,7 +135,7 @@ msgstr "OK"
135
135
136#: qml/Components/ModeSwitchWarningDialog.qml:32
136#: qml/Components/ModeSwitchWarningDialog.qml:32
137msgid "Apps may have unsaved data:"
137msgid "Apps may have unsaved data:"
138−msgstr ""
138+msgstr "Os aplicativos podem conter dados não salvos:"
139
139
140#: qml/Components/ModeSwitchWarningDialog.qml:57
140#: qml/Components/ModeSwitchWarningDialog.qml:57
141msgctxt ""
141msgctxt ""
@@ -145,19 +145,19 @@ msgstr ""
145
145
146#: qml/Components/ModeSwitchWarningDialog.qml:63
146#: qml/Components/ModeSwitchWarningDialog.qml:63
147msgid "Or force close now (unsaved data will be lost)."
147msgid "Or force close now (unsaved data will be lost)."
148−msgstr ""
148+msgstr "Ou force para fechar agora (dados não salvos serão perdidos)."
149
149
150#: qml/Components/ModeSwitchWarningDialog.qml:75
150#: qml/Components/ModeSwitchWarningDialog.qml:75
151msgid "OK, I will reconnect"
151msgid "OK, I will reconnect"
152−msgstr ""
152+msgstr "Ok, eu irei reconectar"
153
153
154#: qml/Components/ModeSwitchWarningDialog.qml:76
154#: qml/Components/ModeSwitchWarningDialog.qml:76
155msgid "Reconnect now!"
155msgid "Reconnect now!"
156−msgstr ""
156+msgstr "Reconecte agora!"
157
157
158#: qml/Components/ModeSwitchWarningDialog.qml:88
158#: qml/Components/ModeSwitchWarningDialog.qml:88
159msgid "Close all"
159msgid "Close all"
160−msgstr ""
160+msgstr "Fechar tudo"
161
161
162#: qml/Dash/DashPageHeader.qml:337
162#: qml/Dash/DashPageHeader.qml:337
163msgctxt "Button: Open the Ubuntu Store"
163msgctxt "Button: Open the Ubuntu Store"
@@ -188,7 +188,7 @@ msgstr ""
188
188
189#: qml/Dash/FiltersPopover.qml:69
189#: qml/Dash/FiltersPopover.qml:69
190msgid "Reset"
190msgid "Reset"
191−msgstr ""
191+msgstr "Redefinir"
192
192
193#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
193#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
194msgid "See less"
194msgid "See less"
@@ -205,11 +205,11 @@ msgstr "Pesquisar"
205
205
206#: qml/Dash/PageHeaderExtraPanel.qml:55
206#: qml/Dash/PageHeaderExtraPanel.qml:55
207msgid "Recent Searches"
207msgid "Recent Searches"
208−msgstr ""
208+msgstr "Pesquisas recentes"
209
209
210#: qml/Dash/PageHeaderExtraPanel.qml:66
210#: qml/Dash/PageHeaderExtraPanel.qml:66
211msgid "Clear All"
211msgid "Clear All"
212−msgstr ""
212+msgstr "Limpar tudo"
213
213
214#: qml/Dash/Previews/PreviewActionCombo.qml:35
214#: qml/Dash/Previews/PreviewActionCombo.qml:35
215msgid "More..."
215msgid "More..."
@@ -226,7 +226,7 @@ msgstr "Enviar"
226
226
227#: qml/Dash/Previews/PreviewRatingInput.qml:84
227#: qml/Dash/Previews/PreviewRatingInput.qml:84
228msgid "Rate this"
228msgid "Rate this"
229−msgstr "Avaliar isto"
229+msgstr "Avalie"
230
230
231#: qml/Dash/Previews/PreviewRatingInput.qml:129
231#: qml/Dash/Previews/PreviewRatingInput.qml:129
232msgid "Add a review"
232msgid "Add a review"
@@ -234,7 +234,7 @@ msgstr "Adicionar uma análise"
234
234
235#: qml/Dash/Previews/PreviewSharing.qml:66
235#: qml/Dash/Previews/PreviewSharing.qml:66
236msgid "Preview Share Item"
236msgid "Preview Share Item"
237−msgstr ""
237+msgstr "Visualizar item compartilhado"
238
238
239#: qml/Dash/PullToRefreshScopeStyle.qml:55
239#: qml/Dash/PullToRefreshScopeStyle.qml:55
240msgid "Pull to refresh…"
240msgid "Pull to refresh…"
@@ -331,7 +331,7 @@ msgstr "Desculpe, senha incorreta"
331#: qml/Greeter/NarrowView.qml:121
331#: qml/Greeter/NarrowView.qml:121
332msgctxt "passphrase"
332msgctxt "passphrase"
333msgid "Please re-enter"
333msgid "Please re-enter"
334−msgstr ""
334+msgstr "Por favor, digite novamente"
335
335
336#: qml/Greeter/NarrowView.qml:122
336#: qml/Greeter/NarrowView.qml:122
337msgid "Sorry, incorrect passcode"
337msgid "Sorry, incorrect passcode"
@@ -412,7 +412,7 @@ msgstr "Falhou, toque para tentar novamente"
412#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
412#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
413msgctxt "Button: Send a reply message"
413msgctxt "Button: Send a reply message"
414msgid "Send"
414msgid "Send"
415−msgstr ""
415+msgstr "Enviar"
416
416
417#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
417#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
418msgctxt "Label: Hint in message indicator line edit"
418msgctxt "Label: Hint in message indicator line edit"
@@ -422,7 +422,7 @@ msgstr "Responder"
422#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
422#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
423msgctxt "Button: Call back on phone"
423msgctxt "Button: Call back on phone"
424msgid "Call back"
424msgid "Call back"
425−msgstr ""
425+msgstr "Retornar chamada"
426
426
427#: qml/Stages/SideStage.qml:76
427#: qml/Stages/SideStage.qml:76
428msgid "Drag using 3 fingers any application from one window to the other"
428msgid "Drag using 3 fingers any application from one window to the other"
@@ -448,19 +448,19 @@ msgstr ""
448msgid "Swipe up to manage the app"
448msgid "Swipe up to manage the app"
449msgstr ""
449msgstr ""
450
450
451−#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Swipe from the left edge to open the launcher"
453−msgstr ""
454−
455#: qml/Tutorial/TutorialLeftLong.qml:47
451#: qml/Tutorial/TutorialLeftLong.qml:47
456msgid "Long swipe from the left edge to open the Today scope"
452msgid "Long swipe from the left edge to open the Today scope"
457msgstr ""
453msgstr ""
458
454
459−#: qml/Tutorial/TutorialRight.qml:54
455+#: qml/Tutorial/TutorialLeft.qml:47
460−msgid "Hover your mouse on the right edge to view your open apps"
456+msgid "Swipe from the left edge to open the launcher"
461msgstr ""
457msgstr ""
462
458
463#: qml/Tutorial/TutorialRight.qml:55
459#: qml/Tutorial/TutorialRight.qml:55
460+msgid "Push your mouse against the right edge to view your open apps"
461+msgstr ""
462+
463+#: qml/Tutorial/TutorialRight.qml:56
464msgid "Short or long swipe from the right edge to view your open apps"
464msgid "Short or long swipe from the right edge to view your open apps"
465msgstr ""
465msgstr ""
466
466
po/ro.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-06 17:47+0000\n"
11"PO-Revision-Date: 2015-07-06 17:47+0000\n"
12"Last-Translator: Meriuță Cornel <meriutacornel@neacornel.eu>\n"
12"Last-Translator: Meriuță Cornel <meriutacornel@neacornel.eu>\n"
13"Language-Team: Romanian <ro@li.org>\n"
13"Language-Team: Romanian <ro@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
18"== 0) && (n != 0))) ? 2: 1));\n"
18"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -456,19 +456,19 @@ msgstr ""
456msgid "Swipe up to manage the app"
456msgid "Swipe up to manage the app"
457msgstr ""
457msgstr ""
458
458
459−#: qml/Tutorial/TutorialLeft.qml:47
460−msgid "Swipe from the left edge to open the launcher"
461−msgstr ""
462−
463#: qml/Tutorial/TutorialLeftLong.qml:47
459#: qml/Tutorial/TutorialLeftLong.qml:47
464msgid "Long swipe from the left edge to open the Today scope"
460msgid "Long swipe from the left edge to open the Today scope"
465msgstr ""
461msgstr ""
466
462
467−#: qml/Tutorial/TutorialRight.qml:54
463+#: qml/Tutorial/TutorialLeft.qml:47
468−msgid "Hover your mouse on the right edge to view your open apps"
464+msgid "Swipe from the left edge to open the launcher"
469msgstr ""
465msgstr ""
470
466
471#: qml/Tutorial/TutorialRight.qml:55
467#: qml/Tutorial/TutorialRight.qml:55
468+msgid "Push your mouse against the right edge to view your open apps"
469+msgstr ""
470+
471+#: qml/Tutorial/TutorialRight.qml:56
472msgid "Short or long swipe from the right edge to view your open apps"
472msgid "Short or long swipe from the right edge to view your open apps"
473msgstr ""
473msgstr ""
474
474
po/ru.po+36−30
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-06 05:33+0000\n"
11"PO-Revision-Date: 2015-07-06 05:33+0000\n"
12"Last-Translator: ☠Jay ZDLin☠ <Unknown>\n"
12"Last-Translator: ☠Jay ZDLin☠ <Unknown>\n"
13"Language-Team: Russian <ru@li.org>\n"
13"Language-Team: Russian <ru@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -190,7 +190,7 @@ msgstr ""
190
190
191#: qml/Dash/FiltersPopover.qml:69
191#: qml/Dash/FiltersPopover.qml:69
192msgid "Reset"
192msgid "Reset"
193−msgstr ""
193+msgstr "Сбросить"
194
194
195#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
195#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
196msgid "See less"
196msgid "See less"
@@ -207,11 +207,11 @@ msgstr "Поиск"
207
207
208#: qml/Dash/PageHeaderExtraPanel.qml:55
208#: qml/Dash/PageHeaderExtraPanel.qml:55
209msgid "Recent Searches"
209msgid "Recent Searches"
210−msgstr ""
210+msgstr "Недавние поиски"
211
211
212#: qml/Dash/PageHeaderExtraPanel.qml:66
212#: qml/Dash/PageHeaderExtraPanel.qml:66
213msgid "Clear All"
213msgid "Clear All"
214−msgstr ""
214+msgstr "Очистить всё"
215
215
216#: qml/Dash/Previews/PreviewActionCombo.qml:35
216#: qml/Dash/Previews/PreviewActionCombo.qml:35
217msgid "More..."
217msgid "More..."
@@ -267,6 +267,8 @@ msgid ""
267"Your device is now connected to an external display. Use this screen as a "
267"Your device is now connected to an external display. Use this screen as a "
268"touch pad to interact with the pointer."
268"touch pad to interact with the pointer."
269msgstr ""
269msgstr ""
270+"Ваше устройство подключено к внешнему дисплею. Используйте этот экран как "
271+"сенсорную панель для управления указателем."
270
272
271#: qml/Greeter/CoverPage.qml:118
273#: qml/Greeter/CoverPage.qml:118
272msgid "Unlock"
274msgid "Unlock"
@@ -453,19 +455,19 @@ msgstr ""
453msgid "Swipe up to manage the app"
455msgid "Swipe up to manage the app"
454msgstr ""
456msgstr ""
455
457
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
459−
460#: qml/Tutorial/TutorialLeftLong.qml:47
458#: qml/Tutorial/TutorialLeftLong.qml:47
461msgid "Long swipe from the left edge to open the Today scope"
459msgid "Long swipe from the left edge to open the Today scope"
462msgstr ""
460msgstr ""
463
461
464−#: qml/Tutorial/TutorialRight.qml:54
462+#: qml/Tutorial/TutorialLeft.qml:47
465−msgid "Hover your mouse on the right edge to view your open apps"
463+msgid "Swipe from the left edge to open the launcher"
466msgstr ""
464msgstr ""
467
465
468#: qml/Tutorial/TutorialRight.qml:55
466#: qml/Tutorial/TutorialRight.qml:55
467+msgid "Push your mouse against the right edge to view your open apps"
468+msgstr ""
469+
470+#: qml/Tutorial/TutorialRight.qml:56
469msgid "Short or long swipe from the right edge to view your open apps"
471msgid "Short or long swipe from the right edge to view your open apps"
470msgstr ""
472msgstr ""
471
473
@@ -484,7 +486,7 @@ msgstr "Назад"
484
486
485#: qml/Wizard/Pages/10-welcome.qml:27
487#: qml/Wizard/Pages/10-welcome.qml:27
486msgid "Language"
488msgid "Language"
487−msgstr ""
489+msgstr "Язык"
488
490
489#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
491#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
490#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
492#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -501,7 +503,7 @@ msgstr "Подключение к Wi‑Fi"
501
503
502#: qml/Wizard/Pages/30-wifi.qml:130
504#: qml/Wizard/Pages/30-wifi.qml:130
503msgid "Connected"
505msgid "Connected"
504−msgstr ""
506+msgstr "Подключено"
505
507
506#: qml/Wizard/Pages/30-wifi.qml:163
508#: qml/Wizard/Pages/30-wifi.qml:163
507msgid "Available Wi-Fi networks"
509msgid "Available Wi-Fi networks"
@@ -538,7 +540,7 @@ msgstr ""
538
540
539#: qml/Wizard/Pages/40-location.qml:160
541#: qml/Wizard/Pages/40-location.qml:160
540msgid "GPS only"
542msgid "GPS only"
541−msgstr ""
543+msgstr "Только GPS"
542
544
543#: qml/Wizard/Pages/40-location.qml:214
545#: qml/Wizard/Pages/40-location.qml:214
544msgid "Don't use my location"
546msgid "Don't use my location"
@@ -550,11 +552,11 @@ msgstr ""
550
552
551#: qml/Wizard/Pages/50-timezone.qml:29
553#: qml/Wizard/Pages/50-timezone.qml:29
552msgid "Time Zone"
554msgid "Time Zone"
553−msgstr ""
555+msgstr "Часовой пояс"
554
556
555#: qml/Wizard/Pages/50-timezone.qml:178
557#: qml/Wizard/Pages/50-timezone.qml:178
556msgid "Enter your city"
558msgid "Enter your city"
557−msgstr ""
559+msgstr "Введите ваш город"
558
560
559#: qml/Wizard/Pages/60-account.qml:24
561#: qml/Wizard/Pages/60-account.qml:24
560msgid "Personalize Your Device"
562msgid "Personalize Your Device"
@@ -571,7 +573,7 @@ msgstr ""
571#: qml/Wizard/Pages/70-passwd-type.qml:101
573#: qml/Wizard/Pages/70-passwd-type.qml:101
572msgctxt "Label: Type of security method"
574msgctxt "Label: Type of security method"
573msgid "Create new password"
575msgid "Create new password"
574−msgstr ""
576+msgstr "Создать новый пароль"
575
577
576#: qml/Wizard/Pages/70-passwd-type.qml:103
578#: qml/Wizard/Pages/70-passwd-type.qml:103
577msgctxt "Label: Type of security method"
579msgctxt "Label: Type of security method"
@@ -601,7 +603,7 @@ msgstr ""
601
603
602#: qml/Wizard/Pages/80-finished.qml:89
604#: qml/Wizard/Pages/80-finished.qml:89
603msgid "Welcome to Ubuntu"
605msgid "Welcome to Ubuntu"
604−msgstr ""
606+msgstr "Добро пожаловать в Ubuntu"
605
607
606#: qml/Wizard/Pages/80-finished.qml:104
608#: qml/Wizard/Pages/80-finished.qml:104
607msgid "You are ready to use your device now"
609msgid "You are ready to use your device now"
@@ -653,7 +655,7 @@ msgstr ""
653#: qml/Wizard/Pages/passcode-confirm.qml:45
655#: qml/Wizard/Pages/passcode-confirm.qml:45
654msgctxt "Enter the passcode again"
656msgctxt "Enter the passcode again"
655msgid "Please re-enter."
657msgid "Please re-enter."
656−msgstr ""
658+msgstr "Введите заново."
657
659
658#: qml/Wizard/Pages/passcode-desktop.qml:30
660#: qml/Wizard/Pages/passcode-desktop.qml:30
659msgid "Lock Screen Passcode"
661msgid "Lock Screen Passcode"
@@ -682,7 +684,7 @@ msgstr ""
682
684
683#: qml/Wizard/Pages/passcode-set.qml:62
685#: qml/Wizard/Pages/passcode-set.qml:62
684msgid "Passcode must be 4 characters long"
686msgid "Passcode must be 4 characters long"
685−msgstr ""
687+msgstr "Код должен содержать 4 символа"
686
688
687#: qml/Wizard/Pages/password-set.qml:30
689#: qml/Wizard/Pages/password-set.qml:30
688msgid "Lock Screen Password"
690msgid "Lock Screen Password"
@@ -690,7 +692,7 @@ msgstr ""
690
692
691#: qml/Wizard/Pages/password-set.qml:61
693#: qml/Wizard/Pages/password-set.qml:61
692msgid "Enter at least 8 characters"
694msgid "Enter at least 8 characters"
693−msgstr ""
695+msgstr "Введите не менее 8 символов"
694
696
695#: qml/Wizard/Pages/password-set.qml:73
697#: qml/Wizard/Pages/password-set.qml:73
696msgid "Choose password"
698msgid "Choose password"
@@ -698,19 +700,19 @@ msgstr ""
698
700
699#: qml/Wizard/Pages/password-set.qml:103
701#: qml/Wizard/Pages/password-set.qml:103
700msgid "Confirm password"
702msgid "Confirm password"
701−msgstr ""
703+msgstr "Подтвердите пароль"
702
704
703#: qml/Wizard/Pages/sim.qml:27
705#: qml/Wizard/Pages/sim.qml:27
704msgid "No SIM card installed"
706msgid "No SIM card installed"
705−msgstr ""
707+msgstr "SIM-карта не вставлена"
706
708
707#: qml/Wizard/Pages/sim.qml:54
709#: qml/Wizard/Pages/sim.qml:54
708msgid "SIM card added"
710msgid "SIM card added"
709−msgstr ""
711+msgstr "Добавлена SIM-карта"
710
712
711#: qml/Wizard/Pages/sim.qml:55
713#: qml/Wizard/Pages/sim.qml:55
712msgid "You must restart the device to access the mobile network."
714msgid "You must restart the device to access the mobile network."
713−msgstr ""
715+msgstr "Необходимо перезапустить устройство для доступа к мобильной сети."
714
716
715#: qml/Wizard/Pages/sim.qml:59
717#: qml/Wizard/Pages/sim.qml:59
716msgid "Restart"
718msgid "Restart"
@@ -719,6 +721,7 @@ msgstr "Перезагрузить"
719#: qml/Wizard/Pages/sim.qml:78
721#: qml/Wizard/Pages/sim.qml:78
720msgid "You won’t be able to make calls or use text messaging without a SIM."
722msgid "You won’t be able to make calls or use text messaging without a SIM."
721msgstr ""
723msgstr ""
724+"Без SIM-карты невозможно делать звонки или отправлять текстовые сообщения."
722
725
723#: qml/Wizard/Pages/sim.qml:90
726#: qml/Wizard/Pages/sim.qml:90
724msgid "To proceed with no SIM tap Skip."
727msgid "To proceed with no SIM tap Skip."
@@ -726,11 +729,11 @@ msgstr ""
726
729
727#: qml/Wizard/PasswordMeter.qml:87
730#: qml/Wizard/PasswordMeter.qml:87
728msgid "Passwords match"
731msgid "Passwords match"
729−msgstr ""
732+msgstr "Пароли совпадают"
730
733
731#: qml/Wizard/PasswordMeter.qml:89
734#: qml/Wizard/PasswordMeter.qml:89
732msgid "Passwords do not match"
735msgid "Passwords do not match"
733−msgstr ""
736+msgstr "Пароли не совпадают"
734
737
735#: qml/Wizard/PasswordMeter.qml:93
738#: qml/Wizard/PasswordMeter.qml:93
736msgid "Strong password"
739msgid "Strong password"
@@ -742,11 +745,11 @@ msgstr ""
742
745
743#: qml/Wizard/PasswordMeter.qml:97
746#: qml/Wizard/PasswordMeter.qml:97
744msgid "Weak password"
747msgid "Weak password"
745−msgstr ""
748+msgstr "Слабый пароль"
746
749
747#: qml/Wizard/PasswordMeter.qml:99
750#: qml/Wizard/PasswordMeter.qml:99
748msgid "Very weak password"
751msgid "Very weak password"
749−msgstr ""
752+msgstr "Very weak password"
750
753
751#~ msgid "Type or say a command"
754#~ msgid "Type or say a command"
752#~ msgstr "Введите или произнесите команду"
755#~ msgstr "Введите или произнесите команду"
@@ -1067,3 +1070,6 @@ msgstr ""
1067
1070
1068#~ msgid "Call back"
1071#~ msgid "Call back"
1069#~ msgstr "Позвонить"
1072#~ msgstr "Позвонить"
1073+
1074+#~ msgid "Hover your mouse on the right edge to view your open apps"
1075+#~ msgstr "Наведите указатель на правый угол, чтобы увидеть открытые приложения"
po/shn.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-11-10 12:09+0000\n"
11"PO-Revision-Date: 2015-11-10 12:09+0000\n"
12"Last-Translator: Rockworld <sumoisrock@gmail.com>\n"
12"Last-Translator: Rockworld <sumoisrock@gmail.com>\n"
13"Language-Team: Shan <shn@li.org>\n"
13"Language-Team: Shan <shn@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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) ? 0 : 1;\n"
17"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/si.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -442,19 +442,19 @@ msgstr ""
442msgid "Swipe up to manage the app"
442msgid "Swipe up to manage the app"
443msgstr ""
443msgstr ""
444
444
445−#: qml/Tutorial/TutorialLeft.qml:47
446−msgid "Swipe from the left edge to open the launcher"
447−msgstr ""
448−
449#: qml/Tutorial/TutorialLeftLong.qml:47
445#: qml/Tutorial/TutorialLeftLong.qml:47
450msgid "Long swipe from the left edge to open the Today scope"
446msgid "Long swipe from the left edge to open the Today scope"
451msgstr ""
447msgstr ""
452
448
453−#: qml/Tutorial/TutorialRight.qml:54
449+#: qml/Tutorial/TutorialLeft.qml:47
454−msgid "Hover your mouse on the right edge to view your open apps"
450+msgid "Swipe from the left edge to open the launcher"
455msgstr ""
451msgstr ""
456
452
457#: qml/Tutorial/TutorialRight.qml:55
453#: qml/Tutorial/TutorialRight.qml:55
454+msgid "Push your mouse against the right edge to view your open apps"
455+msgstr ""
456+
457+#: qml/Tutorial/TutorialRight.qml:56
458msgid "Short or long swipe from the right edge to view your open apps"
458msgid "Short or long swipe from the right edge to view your open apps"
459msgstr ""
459msgstr ""
460
460
po/sk.po+13−10
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-26 15:29+0000\n"
11"PO-Revision-Date: 2016-03-26 15:29+0000\n"
12"Last-Translator: P_E_T_O <Unknown>\n"
12"Last-Translator: P_E_T_O <Unknown>\n"
13"Language-Team: Slovak <sk@li.org>\n"
13"Language-Team: Slovak <sk@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
18−"X-Launchpad-Export-Date: 2016-03-27 05:47+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20"Language: sk\n"
20"Language: sk\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -459,19 +459,19 @@ msgstr "Potiahnuť dohora pre vytvorenie správy"
459msgid "Swipe up to manage the app"
459msgid "Swipe up to manage the app"
460msgstr "Potiahnuť dohora pre spravovanie aplikácie"
460msgstr "Potiahnuť dohora pre spravovanie aplikácie"
461
461
462−#: qml/Tutorial/TutorialLeft.qml:47
463−msgid "Swipe from the left edge to open the launcher"
464−msgstr "Potiahnite od ľavého okraja pre otvorenie spúšťača"
465−
466#: qml/Tutorial/TutorialLeftLong.qml:47
462#: qml/Tutorial/TutorialLeftLong.qml:47
467msgid "Long swipe from the left edge to open the Today scope"
463msgid "Long swipe from the left edge to open the Today scope"
468msgstr "Dlhé potiahnutie od ľavého okraja pre otvorenie scope Dnes"
464msgstr "Dlhé potiahnutie od ľavého okraja pre otvorenie scope Dnes"
469
465
470−#: qml/Tutorial/TutorialRight.qml:54
466+#: qml/Tutorial/TutorialLeft.qml:47
471−msgid "Hover your mouse on the right edge to view your open apps"
467+msgid "Swipe from the left edge to open the launcher"
472−msgstr "Prejdite myšou od pravého okraja pre zobrazenie otvorených aplikácií"
468+msgstr "Potiahnite od ľavého okraja pre otvorenie spúšťača"
473
469
474#: qml/Tutorial/TutorialRight.qml:55
470#: qml/Tutorial/TutorialRight.qml:55
471+msgid "Push your mouse against the right edge to view your open apps"
472+msgstr ""
473+
474+#: qml/Tutorial/TutorialRight.qml:56
475msgid "Short or long swipe from the right edge to view your open apps"
475msgid "Short or long swipe from the right edge to view your open apps"
476msgstr ""
476msgstr ""
477"Krátke alebo dlhé potiahnutie od pravého okraja pre zobrazenie otvorených "
477"Krátke alebo dlhé potiahnutie od pravého okraja pre zobrazenie otvorených "
@@ -942,3 +942,6 @@ msgstr "Heslo je veľmi slabé"
942#, qt-format
942#, qt-format
943#~ msgid "%1 〉"
943#~ msgid "%1 〉"
944#~ msgstr "%1 〉"
944#~ msgstr "%1 〉"
945+
946+#~ msgid "Hover your mouse on the right edge to view your open apps"
947+#~ msgstr "Prejdite myšou od pravého okraja pre zobrazenie otvorených aplikácií"
po/sl.po+92−75
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-01-31 18:34+0000\n"
11"PO-Revision-Date: 2016-01-31 18:34+0000\n"
12"Last-Translator: Bernard Banko <Unknown>\n"
12"Last-Translator: Bernard Banko <Unknown>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
18"n%100==4 ? 3 : 0);\n"
18"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -143,6 +143,8 @@ msgctxt ""
143"Re-dock means connect the device again to an external screen/mouse/keyboard"
143"Re-dock means connect the device again to an external screen/mouse/keyboard"
144msgid "Re-dock, save your work and close these apps to continue."
144msgid "Re-dock, save your work and close these apps to continue."
145msgstr ""
145msgstr ""
146+"Za nadaljevanje ponovno usidrajte napravo, shranite svoje delo in zaprite te "
147+"programe"
146
148
147#: qml/Components/ModeSwitchWarningDialog.qml:63
149#: qml/Components/ModeSwitchWarningDialog.qml:63
148msgid "Or force close now (unsaved data will be lost)."
150msgid "Or force close now (unsaved data will be lost)."
@@ -185,11 +187,11 @@ msgstr "Dodaj med priljubljene"
185
187
186#: qml/Dash/FiltersPopover.qml:60
188#: qml/Dash/FiltersPopover.qml:60
187msgid "Refine your results"
189msgid "Refine your results"
188−msgstr ""
190+msgstr "Prečistite rezultate"
189
191
190#: qml/Dash/FiltersPopover.qml:69
192#: qml/Dash/FiltersPopover.qml:69
191msgid "Reset"
193msgid "Reset"
192−msgstr ""
194+msgstr "Ponastavi"
193
195
194#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
196#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
195msgid "See less"
197msgid "See less"
@@ -206,11 +208,11 @@ msgstr "Iskanje"
206
208
207#: qml/Dash/PageHeaderExtraPanel.qml:55
209#: qml/Dash/PageHeaderExtraPanel.qml:55
208msgid "Recent Searches"
210msgid "Recent Searches"
209−msgstr ""
211+msgstr "Zadnja iskanja"
210
212
211#: qml/Dash/PageHeaderExtraPanel.qml:66
213#: qml/Dash/PageHeaderExtraPanel.qml:66
212msgid "Clear All"
214msgid "Clear All"
213−msgstr ""
215+msgstr "Počisti vse"
214
216
215#: qml/Dash/Previews/PreviewActionCombo.qml:35
217#: qml/Dash/Previews/PreviewActionCombo.qml:35
216msgid "More..."
218msgid "More..."
@@ -266,6 +268,8 @@ msgid ""
266"Your device is now connected to an external display. Use this screen as a "
268"Your device is now connected to an external display. Use this screen as a "
267"touch pad to interact with the pointer."
269"touch pad to interact with the pointer."
268msgstr ""
270msgstr ""
271+"Vaša naprava je sedaj priključena na zunanji zaslon. S tem zaslonom pa lahko "
272+"upravljate kazalko, kot da bi imeli sledilno ploščico."
269
273
270#: qml/Greeter/CoverPage.qml:118
274#: qml/Greeter/CoverPage.qml:118
271msgid "Unlock"
275msgid "Unlock"
@@ -433,51 +437,51 @@ msgstr "Pokliči nazaj"
433
437
434#: qml/Stages/SideStage.qml:76
438#: qml/Stages/SideStage.qml:76
435msgid "Drag using 3 fingers any application from one window to the other"
439msgid "Drag using 3 fingers any application from one window to the other"
436−msgstr ""
440+msgstr "S tremi prsti povlecite program iz enega v drugo okno"
437
441
438#: qml/Tutorial/TutorialBottom.qml:78
442#: qml/Tutorial/TutorialBottom.qml:78
439msgid "Swipe up to add a contact"
443msgid "Swipe up to add a contact"
440−msgstr ""
444+msgstr "Za dodajanje stika potegnite navzgor"
441
445
442#: qml/Tutorial/TutorialBottom.qml:80
446#: qml/Tutorial/TutorialBottom.qml:80
443msgid "Swipe up for favorite calculations"
447msgid "Swipe up for favorite calculations"
444−msgstr ""
448+msgstr "Za priljubljene izračune potegnite navzgor"
445
449
446#: qml/Tutorial/TutorialBottom.qml:82
450#: qml/Tutorial/TutorialBottom.qml:82
447msgid "Swipe up for recent calls"
451msgid "Swipe up for recent calls"
448−msgstr ""
452+msgstr "Za zadnje klice potegnite navzgor"
449
453
450#: qml/Tutorial/TutorialBottom.qml:84
454#: qml/Tutorial/TutorialBottom.qml:84
451msgid "Swipe up to create a message"
455msgid "Swipe up to create a message"
452−msgstr ""
456+msgstr "Za ustvarjanje sporočila potegnite navzgor"
453
457
454#: qml/Tutorial/TutorialBottom.qml:85
458#: qml/Tutorial/TutorialBottom.qml:85
455msgid "Swipe up to manage the app"
459msgid "Swipe up to manage the app"
456−msgstr ""
460+msgstr "Za upravljanje programa potegnite navzgor"
457−
458−#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Swipe from the left edge to open the launcher"
460−msgstr ""
461
461
462#: qml/Tutorial/TutorialLeftLong.qml:47
462#: qml/Tutorial/TutorialLeftLong.qml:47
463msgid "Long swipe from the left edge to open the Today scope"
463msgid "Long swipe from the left edge to open the Today scope"
464−msgstr ""
464+msgstr "Nadolgo potegnite levi rob za odpiranje vira Danes"
465
465
466−#: qml/Tutorial/TutorialRight.qml:54
466+#: qml/Tutorial/TutorialLeft.qml:47
467−msgid "Hover your mouse on the right edge to view your open apps"
467+msgid "Swipe from the left edge to open the launcher"
468−msgstr ""
468+msgstr "Potegnite levi rob za prikaz zaganjalnika"
469
469
470#: qml/Tutorial/TutorialRight.qml:55
470#: qml/Tutorial/TutorialRight.qml:55
471−msgid "Short or long swipe from the right edge to view your open apps"
471+msgid "Push your mouse against the right edge to view your open apps"
472msgstr ""
472msgstr ""
473
473
474+#: qml/Tutorial/TutorialRight.qml:56
475+msgid "Short or long swipe from the right edge to view your open apps"
476+msgstr "Za prikaz odprtih programov nakratko ali nadolgo potegnite desni rob"
477+
474#: qml/Tutorial/TutorialTop.qml:53
478#: qml/Tutorial/TutorialTop.qml:53
475msgid "Swipe from the top right edge to open the notification bar"
479msgid "Swipe from the top right edge to open the notification bar"
476−msgstr ""
480+msgstr "Za odpiranje obvestilne plošče potegnite desni del zgornjega roba"
477
481
478#: qml/Tutorial/TutorialTop.qml:54
482#: qml/Tutorial/TutorialTop.qml:54
479msgid "Swipe from the top edge to open the notification bar"
483msgid "Swipe from the top edge to open the notification bar"
480−msgstr ""
484+msgstr "Za odpiranje obvestilne plošče potegnite zgornji rob"
481
485
482#: qml/Wizard/Page.qml:54
486#: qml/Wizard/Page.qml:54
483msgctxt "Button: Go back one page in the Wizard"
487msgctxt "Button: Go back one page in the Wizard"
@@ -486,7 +490,7 @@ msgstr "Nazaj"
486
490
487#: qml/Wizard/Pages/10-welcome.qml:27
491#: qml/Wizard/Pages/10-welcome.qml:27
488msgid "Language"
492msgid "Language"
489−msgstr ""
493+msgstr "Jezik"
490
494
491#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
495#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
492#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
496#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -495,7 +499,7 @@ msgstr ""
495#: qml/Wizard/Pages/passcode-desktop.qml:124
499#: qml/Wizard/Pages/passcode-desktop.qml:124
496#: qml/Wizard/Pages/password-set.qml:141
500#: qml/Wizard/Pages/password-set.qml:141
497msgid "Next"
501msgid "Next"
498−msgstr ""
502+msgstr "Naslednji"
499
503
500#: qml/Wizard/Pages/30-wifi.qml:29
504#: qml/Wizard/Pages/30-wifi.qml:29
501msgid "Connect to Wi‑Fi"
505msgid "Connect to Wi‑Fi"
@@ -503,15 +507,15 @@ msgstr "Poveži se z Wi-Fi-jem"
503
507
504#: qml/Wizard/Pages/30-wifi.qml:130
508#: qml/Wizard/Pages/30-wifi.qml:130
505msgid "Connected"
509msgid "Connected"
506−msgstr ""
510+msgstr "Povezano"
507
511
508#: qml/Wizard/Pages/30-wifi.qml:163
512#: qml/Wizard/Pages/30-wifi.qml:163
509msgid "Available Wi-Fi networks"
513msgid "Available Wi-Fi networks"
510−msgstr ""
514+msgstr "Razpoložljiva omrežja Wi-Fi"
511
515
512#: qml/Wizard/Pages/30-wifi.qml:164
516#: qml/Wizard/Pages/30-wifi.qml:164
513msgid "No available Wi-Fi networks"
517msgid "No available Wi-Fi networks"
514−msgstr ""
518+msgstr "Ni razpoložljivih omrežij Wi-Fi"
515
519
516#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
520#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
517#: qml/Wizard/Pages/sim.qml:101
521#: qml/Wizard/Pages/sim.qml:101
@@ -520,98 +524,100 @@ msgstr "Preskoči"
520
524
521#: qml/Wizard/Pages/40-location.qml:27
525#: qml/Wizard/Pages/40-location.qml:27
522msgid "Location Services"
526msgid "Location Services"
523−msgstr ""
527+msgstr "Storitve odkrivanja položaja"
524
528
525#: qml/Wizard/Pages/40-location.qml:83
529#: qml/Wizard/Pages/40-location.qml:83
526msgid ""
530msgid ""
527"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
531"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
528"(recommended)"
532"(recommended)"
529msgstr ""
533msgstr ""
534+"Za odkrivanje položaja anonimno uporabi GPS, vstopne točke Wi-Fi in mobilna "
535+"omrežja (priporočeno)"
530
536
531#: qml/Wizard/Pages/40-location.qml:105
537#: qml/Wizard/Pages/40-location.qml:105
532#, qt-format
538#, qt-format
533msgid "By selecting this option you agree to the Nokia HERE %1."
539msgid "By selecting this option you agree to the Nokia HERE %1."
534−msgstr ""
540+msgstr "Z izbiro te možnosti se strinjate z Nokia HERE %1."
535
541
536#: qml/Wizard/Pages/40-location.qml:106
542#: qml/Wizard/Pages/40-location.qml:106
537msgctxt "part of: Nokia HERE terms and conditions"
543msgctxt "part of: Nokia HERE terms and conditions"
538msgid "terms and conditions"
544msgid "terms and conditions"
539−msgstr ""
545+msgstr "pogoji uporabe"
540
546
541#: qml/Wizard/Pages/40-location.qml:160
547#: qml/Wizard/Pages/40-location.qml:160
542msgid "GPS only"
548msgid "GPS only"
543−msgstr ""
549+msgstr "Samo GPS"
544
550
545#: qml/Wizard/Pages/40-location.qml:214
551#: qml/Wizard/Pages/40-location.qml:214
546msgid "Don't use my location"
552msgid "Don't use my location"
547−msgstr ""
553+msgstr "Ne uporabljaj mojega položaja"
548
554
549#: qml/Wizard/Pages/40-location.qml:260
555#: qml/Wizard/Pages/40-location.qml:260
550msgid "You can change it later in System Settings."
556msgid "You can change it later in System Settings."
551−msgstr ""
557+msgstr "Izbiro lahko kasneje spremenite v Sistemskih nastavitvah."
552
558
553#: qml/Wizard/Pages/50-timezone.qml:29
559#: qml/Wizard/Pages/50-timezone.qml:29
554msgid "Time Zone"
560msgid "Time Zone"
555−msgstr ""
561+msgstr "Časovni pas"
556
562
557#: qml/Wizard/Pages/50-timezone.qml:178
563#: qml/Wizard/Pages/50-timezone.qml:178
558msgid "Enter your city"
564msgid "Enter your city"
559−msgstr ""
565+msgstr "Vnesite svoje mesto"
560
566
561#: qml/Wizard/Pages/60-account.qml:24
567#: qml/Wizard/Pages/60-account.qml:24
562msgid "Personalize Your Device"
568msgid "Personalize Your Device"
563−msgstr ""
569+msgstr "Prilagodite si svojo napravo"
564
570
565#: qml/Wizard/Pages/60-account.qml:48
571#: qml/Wizard/Pages/60-account.qml:48
566msgid "Preferred Name"
572msgid "Preferred Name"
567−msgstr ""
573+msgstr "Najljubše ime"
568
574
569#: qml/Wizard/Pages/70-passwd-type.qml:39
575#: qml/Wizard/Pages/70-passwd-type.qml:39
570msgid "Lock Screen"
576msgid "Lock Screen"
571−msgstr ""
577+msgstr "Zakleni zaslon"
572
578
573#: qml/Wizard/Pages/70-passwd-type.qml:101
579#: qml/Wizard/Pages/70-passwd-type.qml:101
574msgctxt "Label: Type of security method"
580msgctxt "Label: Type of security method"
575msgid "Create new password"
581msgid "Create new password"
576−msgstr ""
582+msgstr "Ustvari novo geslo"
577
583
578#: qml/Wizard/Pages/70-passwd-type.qml:103
584#: qml/Wizard/Pages/70-passwd-type.qml:103
579msgctxt "Label: Type of security method"
585msgctxt "Label: Type of security method"
580msgid "Create passcode (numbers only)"
586msgid "Create passcode (numbers only)"
581−msgstr ""
587+msgstr "Ustvari kodo (samo številke)"
582
588
583#: qml/Wizard/Pages/70-passwd-type.qml:105
589#: qml/Wizard/Pages/70-passwd-type.qml:105
584msgctxt "Label: Type of security method"
590msgctxt "Label: Type of security method"
585msgid "No lock code"
591msgid "No lock code"
586−msgstr ""
592+msgstr "Brez kode za zaklep"
587
593
588#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
594#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
589msgid "Privacy Policy"
595msgid "Privacy Policy"
590−msgstr ""
596+msgstr "Pravila zasebnosti"
591
597
592#: qml/Wizard/Pages/75-report-check.qml:26
598#: qml/Wizard/Pages/75-report-check.qml:26
593msgid "Help Us Improve"
599msgid "Help Us Improve"
594−msgstr ""
600+msgstr "Pomagajte nam izboljšati"
595
601
596#: qml/Wizard/Pages/75-report-check.qml:59
602#: qml/Wizard/Pages/75-report-check.qml:59
597msgid "Improve system performance by sending us crashes and error reports."
603msgid "Improve system performance by sending us crashes and error reports."
598−msgstr ""
604+msgstr "Izboljšajte delovanje sistema s poročanjem o sesutjih in napakah."
599
605
600#: qml/Wizard/Pages/75-report-check.qml:60
606#: qml/Wizard/Pages/75-report-check.qml:60
601msgid "Privacy policy"
607msgid "Privacy policy"
602−msgstr ""
608+msgstr "Pravila zasebnosti"
603
609
604#: qml/Wizard/Pages/80-finished.qml:89
610#: qml/Wizard/Pages/80-finished.qml:89
605msgid "Welcome to Ubuntu"
611msgid "Welcome to Ubuntu"
606−msgstr ""
612+msgstr "Dobrodošli v Ubuntuju"
607
613
608#: qml/Wizard/Pages/80-finished.qml:104
614#: qml/Wizard/Pages/80-finished.qml:104
609msgid "You are ready to use your device now"
615msgid "You are ready to use your device now"
610−msgstr ""
616+msgstr "Sedaj imate vse pripravljeno za uporabo svoje naprave"
611
617
612#: qml/Wizard/Pages/80-finished.qml:124
618#: qml/Wizard/Pages/80-finished.qml:124
613msgid "Get Started"
619msgid "Get Started"
614−msgstr ""
620+msgstr "Začnite"
615
621
616#: qml/Wizard/Pages/here-terms.qml:25
622#: qml/Wizard/Pages/here-terms.qml:25
617msgid "Terms & Conditions"
623msgid "Terms & Conditions"
@@ -620,6 +626,8 @@ msgstr "Pogoji uporabe"
620#: qml/Wizard/Pages/here-terms.qml:69
626#: qml/Wizard/Pages/here-terms.qml:69
621msgid "Your device uses positioning technologies provided by HERE."
627msgid "Your device uses positioning technologies provided by HERE."
622msgstr ""
628msgstr ""
629+"Vaša naprava uporablja tehnologije določanja položaja, ki jih zagotavlja "
630+"HERE."
623
631
624#: qml/Wizard/Pages/here-terms.qml:81
632#: qml/Wizard/Pages/here-terms.qml:81
625msgid ""
633msgid ""
@@ -627,21 +635,26 @@ msgid ""
627"collects information about nearby cell towers and Wi-Fi hotspots around your "
635"collects information about nearby cell towers and Wi-Fi hotspots around your "
628"current location whenever your position is being found."
636"current location whenever your position is being found."
629msgstr ""
637msgstr ""
638+"Za storitve določanja položaja in izboljševanje njihove kakovosti HERE ob "
639+"vsakokratni določitvi položaja zbira podatke o bližnjih oddajnikih mobilnega "
640+"omrežja in vstopnih točkah Wi-Fi."
630
641
631#: qml/Wizard/Pages/here-terms.qml:93
642#: qml/Wizard/Pages/here-terms.qml:93
632msgid ""
643msgid ""
633"The information collected is used to analyze the service and to improve the "
644"The information collected is used to analyze the service and to improve the "
634"use of service, but not to identify you personally."
645"use of service, but not to identify you personally."
635msgstr ""
646msgstr ""
647+"Ti podatki se zbirajo z namenom analize storitve in njene boljše izrabe in "
648+"ne za ugotavljanje vaše istovetnosti."
636
649
637#: qml/Wizard/Pages/here-terms.qml:106
650#: qml/Wizard/Pages/here-terms.qml:106
638#, qt-format
651#, qt-format
639msgid "By continuing, you agree to the HERE platform %1 and %2."
652msgid "By continuing, you agree to the HERE platform %1 and %2."
640−msgstr ""
653+msgstr "Ča nadaljujete, se strinjate s platformo HERE %1 in %2."
641
654
642#: qml/Wizard/Pages/here-terms.qml:107
655#: qml/Wizard/Pages/here-terms.qml:107
643msgid "Service Terms"
656msgid "Service Terms"
644−msgstr ""
657+msgstr "Pogoji uporabe"
645
658
646#: qml/Wizard/Pages/passcode-confirm.qml:43
659#: qml/Wizard/Pages/passcode-confirm.qml:43
647#: qml/Wizard/Pages/passcode-desktop.qml:80
660#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -650,69 +663,69 @@ msgstr "Potrdite geslo"
650
663
651#: qml/Wizard/Pages/passcode-confirm.qml:45
664#: qml/Wizard/Pages/passcode-confirm.qml:45
652msgid "Incorrect passcode."
665msgid "Incorrect passcode."
653−msgstr ""
666+msgstr "Napačna koda"
654
667
655#: qml/Wizard/Pages/passcode-confirm.qml:45
668#: qml/Wizard/Pages/passcode-confirm.qml:45
656msgctxt "Enter the passcode again"
669msgctxt "Enter the passcode again"
657msgid "Please re-enter."
670msgid "Please re-enter."
658−msgstr ""
671+msgstr "Vnesite ponovno."
659
672
660#: qml/Wizard/Pages/passcode-desktop.qml:30
673#: qml/Wizard/Pages/passcode-desktop.qml:30
661msgid "Lock Screen Passcode"
674msgid "Lock Screen Passcode"
662−msgstr ""
675+msgstr "Koda za zaklep zaslona"
663
676
664#: qml/Wizard/Pages/passcode-desktop.qml:56
677#: qml/Wizard/Pages/passcode-desktop.qml:56
665msgid "Enter 4 numbers to setup your passcode"
678msgid "Enter 4 numbers to setup your passcode"
666−msgstr ""
679+msgstr "Za določitev kode vnesite 4 številke"
667
680
668#: qml/Wizard/Pages/passcode-desktop.qml:65
681#: qml/Wizard/Pages/passcode-desktop.qml:65
669#: qml/Wizard/Pages/passcode-set.qml:54
682#: qml/Wizard/Pages/passcode-set.qml:54
670msgid "Choose passcode"
683msgid "Choose passcode"
671−msgstr ""
684+msgstr "Izberite kodo"
672
685
673#: qml/Wizard/Pages/passcode-desktop.qml:105
686#: qml/Wizard/Pages/passcode-desktop.qml:105
674msgid "Passcode too short"
687msgid "Passcode too short"
675−msgstr ""
688+msgstr "Koda prekratka"
676
689
677#: qml/Wizard/Pages/passcode-desktop.qml:107
690#: qml/Wizard/Pages/passcode-desktop.qml:107
678msgid "Passcodes match"
691msgid "Passcodes match"
679−msgstr ""
692+msgstr "Kodi se ujemata"
680
693
681#: qml/Wizard/Pages/passcode-desktop.qml:109
694#: qml/Wizard/Pages/passcode-desktop.qml:109
682msgid "Passcodes do not match"
695msgid "Passcodes do not match"
683−msgstr ""
696+msgstr "Kodi se ne ujemata"
684
697
685#: qml/Wizard/Pages/passcode-set.qml:62
698#: qml/Wizard/Pages/passcode-set.qml:62
686msgid "Passcode must be 4 characters long"
699msgid "Passcode must be 4 characters long"
687−msgstr ""
700+msgstr "Koda mora biti dolga 4 znake"
688
701
689#: qml/Wizard/Pages/password-set.qml:30
702#: qml/Wizard/Pages/password-set.qml:30
690msgid "Lock Screen Password"
703msgid "Lock Screen Password"
691−msgstr ""
704+msgstr "Geslo za zaklep zaslona"
692
705
693#: qml/Wizard/Pages/password-set.qml:61
706#: qml/Wizard/Pages/password-set.qml:61
694msgid "Enter at least 8 characters"
707msgid "Enter at least 8 characters"
695−msgstr ""
708+msgstr "Vnesite najmanj 8 znakov"
696
709
697#: qml/Wizard/Pages/password-set.qml:73
710#: qml/Wizard/Pages/password-set.qml:73
698msgid "Choose password"
711msgid "Choose password"
699−msgstr ""
712+msgstr "Izberite geslo"
700
713
701#: qml/Wizard/Pages/password-set.qml:103
714#: qml/Wizard/Pages/password-set.qml:103
702msgid "Confirm password"
715msgid "Confirm password"
703−msgstr ""
716+msgstr "Potrdite geslo"
704
717
705#: qml/Wizard/Pages/sim.qml:27
718#: qml/Wizard/Pages/sim.qml:27
706msgid "No SIM card installed"
719msgid "No SIM card installed"
707−msgstr ""
720+msgstr "Kartica SIM ni nameščena"
708
721
709#: qml/Wizard/Pages/sim.qml:54
722#: qml/Wizard/Pages/sim.qml:54
710msgid "SIM card added"
723msgid "SIM card added"
711−msgstr ""
724+msgstr "Kartica SIM dodana"
712
725
713#: qml/Wizard/Pages/sim.qml:55
726#: qml/Wizard/Pages/sim.qml:55
714msgid "You must restart the device to access the mobile network."
727msgid "You must restart the device to access the mobile network."
715−msgstr ""
728+msgstr "Za dostop do mobilnega omrežja morate napravo ponovno zagnati."
716
729
717#: qml/Wizard/Pages/sim.qml:59
730#: qml/Wizard/Pages/sim.qml:59
718msgid "Restart"
731msgid "Restart"
@@ -721,34 +734,35 @@ msgstr "Ponovni zagon"
721#: qml/Wizard/Pages/sim.qml:78
734#: qml/Wizard/Pages/sim.qml:78
722msgid "You won’t be able to make calls or use text messaging without a SIM."
735msgid "You won’t be able to make calls or use text messaging without a SIM."
723msgstr ""
736msgstr ""
737+"Brez kartice SIM ne boste mogli klicati ali uporabljati kratkih sporočil."
724
738
725#: qml/Wizard/Pages/sim.qml:90
739#: qml/Wizard/Pages/sim.qml:90
726msgid "To proceed with no SIM tap Skip."
740msgid "To proceed with no SIM tap Skip."
727−msgstr ""
741+msgstr "Za nadaljevanje brez kartice SIM tapnite Preskoči"
728
742
729#: qml/Wizard/PasswordMeter.qml:87
743#: qml/Wizard/PasswordMeter.qml:87
730msgid "Passwords match"
744msgid "Passwords match"
731−msgstr ""
745+msgstr "Gesli se ujemata"
732
746
733#: qml/Wizard/PasswordMeter.qml:89
747#: qml/Wizard/PasswordMeter.qml:89
734msgid "Passwords do not match"
748msgid "Passwords do not match"
735−msgstr ""
749+msgstr "Gesli se ne ujemata"
736
750
737#: qml/Wizard/PasswordMeter.qml:93
751#: qml/Wizard/PasswordMeter.qml:93
738msgid "Strong password"
752msgid "Strong password"
739−msgstr ""
753+msgstr "Močno geslo"
740
754
741#: qml/Wizard/PasswordMeter.qml:95
755#: qml/Wizard/PasswordMeter.qml:95
742msgid "Fair password"
756msgid "Fair password"
743−msgstr ""
757+msgstr "Sprejemljivo geslo"
744
758
745#: qml/Wizard/PasswordMeter.qml:97
759#: qml/Wizard/PasswordMeter.qml:97
746msgid "Weak password"
760msgid "Weak password"
747−msgstr ""
761+msgstr "Šibko geslo"
748
762
749#: qml/Wizard/PasswordMeter.qml:99
763#: qml/Wizard/PasswordMeter.qml:99
750msgid "Very weak password"
764msgid "Very weak password"
751−msgstr ""
765+msgstr "Zelo šibko geslo"
752
766
753#~ msgid "Confirm"
767#~ msgid "Confirm"
754#~ msgstr "Potrdi"
768#~ msgstr "Potrdi"
@@ -1059,3 +1073,6 @@ msgstr ""
1059
1073
1060#~ msgid "%a %d %b %l:%M %p"
1074#~ msgid "%a %d %b %l:%M %p"
1061#~ msgstr "%a %d %b %l:%M %p"
1075#~ msgstr "%a %d %b %l:%M %p"
1076+
1077+#~ msgid "Hover your mouse on the right edge to view your open apps"
1078+#~ msgstr "Za prikaz odprtih programov pridržite miško na desnem robu"
po/sq.po+36−35
@@ -2,21 +2,22 @@
2# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
2# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3# This file is distributed under the same license as the unity8 package.
3# This file is distributed under the same license as the unity8 package.
4# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
4# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5−#
5+# Indrit Bashkimi <indrit.bashkimi@gmail.com>, 2016.
6msgid ""
6msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11−"PO-Revision-Date: 2015-11-30 21:05+0000\n"
11+"PO-Revision-Date: 2016-04-21 06:03+0000\n"
12"Last-Translator: Indrit Bashkimi <indrit.bashkimi@gmail.com>\n"
12"Last-Translator: Indrit Bashkimi <indrit.bashkimi@gmail.com>\n"
13−"Language-Team: Albanian <sq@li.org>\n"
13+"Language-Team: sq\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-03-24 06:07+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20+"Language: sq\n"
20
21
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
23msgid "Password: "
@@ -180,11 +181,11 @@ msgstr "Shto në të preferuarit"
180
181
181#: qml/Dash/FiltersPopover.qml:60
182#: qml/Dash/FiltersPopover.qml:60
182msgid "Refine your results"
183msgid "Refine your results"
183−msgstr ""
184+msgstr "Përmirëso rezultatet"
184
185
185#: qml/Dash/FiltersPopover.qml:69
186#: qml/Dash/FiltersPopover.qml:69
186msgid "Reset"
187msgid "Reset"
187−msgstr ""
188+msgstr "Rivendos"
188
189
189#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190msgid "See less"
191msgid "See less"
@@ -201,7 +202,7 @@ msgstr "Kërko"
201
202
202#: qml/Dash/PageHeaderExtraPanel.qml:55
203#: qml/Dash/PageHeaderExtraPanel.qml:55
203msgid "Recent Searches"
204msgid "Recent Searches"
204−msgstr ""
205+msgstr "Kërkimet e fundit"
205
206
206#: qml/Dash/PageHeaderExtraPanel.qml:66
207#: qml/Dash/PageHeaderExtraPanel.qml:66
207msgid "Clear All"
208msgid "Clear All"
@@ -209,11 +210,11 @@ msgstr ""
209
210
210#: qml/Dash/Previews/PreviewActionCombo.qml:35
211#: qml/Dash/Previews/PreviewActionCombo.qml:35
211msgid "More..."
212msgid "More..."
212−msgstr "Më Tepër..."
213+msgstr "Më tepër..."
213
214
214#: qml/Dash/Previews/PreviewActionCombo.qml:35
215#: qml/Dash/Previews/PreviewActionCombo.qml:35
215msgid "Less..."
216msgid "Less..."
216−msgstr "Më Pak..."
217+msgstr "Më pak..."
217
218
218#: qml/Dash/Previews/PreviewCommentInput.qml:68
219#: qml/Dash/Previews/PreviewCommentInput.qml:68
219#: qml/Dash/Previews/PreviewRatingInput.qml:174
220#: qml/Dash/Previews/PreviewRatingInput.qml:174
@@ -378,7 +379,7 @@ msgstr "Koha e mbetur: %1"
378
379
379#: qml/Panel/Indicators/MenuItemFactory.qml:910
380#: qml/Panel/Indicators/MenuItemFactory.qml:910
380msgid "In queue…"
381msgid "In queue…"
381−msgstr "Në pritje..."
382+msgstr "Në pritje…"
382
383
383#: qml/Panel/Indicators/MenuItemFactory.qml:914
384#: qml/Panel/Indicators/MenuItemFactory.qml:914
384msgid "Downloading"
385msgid "Downloading"
@@ -440,19 +441,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
441msgid "Swipe up to manage the app"
441msgstr ""
442msgstr ""
442
443
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
444#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
445msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
446msgstr ""
450
447
451−#: qml/Tutorial/TutorialRight.qml:54
448+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
449+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
450msgstr ""
454
451
455#: qml/Tutorial/TutorialRight.qml:55
452#: qml/Tutorial/TutorialRight.qml:55
453+msgid "Push your mouse against the right edge to view your open apps"
454+msgstr ""
455+
456+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
457msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
458msgstr ""
458
459
@@ -471,7 +472,7 @@ msgstr "Prapa"
471
472
472#: qml/Wizard/Pages/10-welcome.qml:27
473#: qml/Wizard/Pages/10-welcome.qml:27
473msgid "Language"
474msgid "Language"
474−msgstr ""
475+msgstr "Gjuha"
475
476
476#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
477#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
477#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
478#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -525,11 +526,11 @@ msgstr ""
525
526
526#: qml/Wizard/Pages/40-location.qml:160
527#: qml/Wizard/Pages/40-location.qml:160
527msgid "GPS only"
528msgid "GPS only"
528−msgstr ""
529+msgstr "vetëm GPS"
529
530
530#: qml/Wizard/Pages/40-location.qml:214
531#: qml/Wizard/Pages/40-location.qml:214
531msgid "Don't use my location"
532msgid "Don't use my location"
532−msgstr ""
533+msgstr "Mos përdor vendodhjen time"
533
534
534#: qml/Wizard/Pages/40-location.qml:260
535#: qml/Wizard/Pages/40-location.qml:260
535msgid "You can change it later in System Settings."
536msgid "You can change it later in System Settings."
@@ -549,7 +550,7 @@ msgstr ""
549
550
550#: qml/Wizard/Pages/60-account.qml:48
551#: qml/Wizard/Pages/60-account.qml:48
551msgid "Preferred Name"
552msgid "Preferred Name"
552−msgstr ""
553+msgstr "Emri i preferuar"
553
554
554#: qml/Wizard/Pages/70-passwd-type.qml:39
555#: qml/Wizard/Pages/70-passwd-type.qml:39
555msgid "Lock Screen"
556msgid "Lock Screen"
@@ -558,7 +559,7 @@ msgstr ""
558#: qml/Wizard/Pages/70-passwd-type.qml:101
559#: qml/Wizard/Pages/70-passwd-type.qml:101
559msgctxt "Label: Type of security method"
560msgctxt "Label: Type of security method"
560msgid "Create new password"
561msgid "Create new password"
561−msgstr ""
562+msgstr "Krijo fjalëkalim të ri"
562
563
563#: qml/Wizard/Pages/70-passwd-type.qml:103
564#: qml/Wizard/Pages/70-passwd-type.qml:103
564msgctxt "Label: Type of security method"
565msgctxt "Label: Type of security method"
@@ -588,11 +589,11 @@ msgstr ""
588
589
589#: qml/Wizard/Pages/80-finished.qml:89
590#: qml/Wizard/Pages/80-finished.qml:89
590msgid "Welcome to Ubuntu"
591msgid "Welcome to Ubuntu"
591−msgstr ""
592+msgstr "Mirëserdhe në Ubuntu"
592
593
593#: qml/Wizard/Pages/80-finished.qml:104
594#: qml/Wizard/Pages/80-finished.qml:104
594msgid "You are ready to use your device now"
595msgid "You are ready to use your device now"
595−msgstr ""
596+msgstr "Tani je gati për të përdorur pajisjen"
596
597
597#: qml/Wizard/Pages/80-finished.qml:124
598#: qml/Wizard/Pages/80-finished.qml:124
598msgid "Get Started"
599msgid "Get Started"
@@ -681,11 +682,11 @@ msgstr ""
681
682
682#: qml/Wizard/Pages/password-set.qml:73
683#: qml/Wizard/Pages/password-set.qml:73
683msgid "Choose password"
684msgid "Choose password"
684−msgstr ""
685+msgstr "Zgjidh fjalëkalimin"
685
686
686#: qml/Wizard/Pages/password-set.qml:103
687#: qml/Wizard/Pages/password-set.qml:103
687msgid "Confirm password"
688msgid "Confirm password"
688−msgstr ""
689+msgstr "Konfirmo fjalëkalimin"
689
690
690#: qml/Wizard/Pages/sim.qml:27
691#: qml/Wizard/Pages/sim.qml:27
691msgid "No SIM card installed"
692msgid "No SIM card installed"
@@ -693,7 +694,7 @@ msgstr ""
693
694
694#: qml/Wizard/Pages/sim.qml:54
695#: qml/Wizard/Pages/sim.qml:54
695msgid "SIM card added"
696msgid "SIM card added"
696−msgstr ""
697+msgstr "Skeda SIM u shtua"
697
698
698#: qml/Wizard/Pages/sim.qml:55
699#: qml/Wizard/Pages/sim.qml:55
699msgid "You must restart the device to access the mobile network."
700msgid "You must restart the device to access the mobile network."
@@ -705,7 +706,7 @@ msgstr ""
705
706
706#: qml/Wizard/Pages/sim.qml:78
707#: qml/Wizard/Pages/sim.qml:78
707msgid "You won’t be able to make calls or use text messaging without a SIM."
708msgid "You won’t be able to make calls or use text messaging without a SIM."
708−msgstr ""
709+msgstr "Nuk është e mundur të bëhen thirrje apo të përdoren SMS pa një SIM."
709
710
710#: qml/Wizard/Pages/sim.qml:90
711#: qml/Wizard/Pages/sim.qml:90
711msgid "To proceed with no SIM tap Skip."
712msgid "To proceed with no SIM tap Skip."
@@ -713,27 +714,27 @@ msgstr ""
713
714
714#: qml/Wizard/PasswordMeter.qml:87
715#: qml/Wizard/PasswordMeter.qml:87
715msgid "Passwords match"
716msgid "Passwords match"
716−msgstr ""
717+msgstr "Fjalëkalimet përputhen"
717
718
718#: qml/Wizard/PasswordMeter.qml:89
719#: qml/Wizard/PasswordMeter.qml:89
719msgid "Passwords do not match"
720msgid "Passwords do not match"
720−msgstr ""
721+msgstr "Fjalëkalimet nuk përputhen"
721
722
722#: qml/Wizard/PasswordMeter.qml:93
723#: qml/Wizard/PasswordMeter.qml:93
723msgid "Strong password"
724msgid "Strong password"
724−msgstr ""
725+msgstr "Fjalëkalim i fuqishëm"
725
726
726#: qml/Wizard/PasswordMeter.qml:95
727#: qml/Wizard/PasswordMeter.qml:95
727msgid "Fair password"
728msgid "Fair password"
728−msgstr ""
729+msgstr "Fjalëkalim çka"
729
730
730#: qml/Wizard/PasswordMeter.qml:97
731#: qml/Wizard/PasswordMeter.qml:97
731msgid "Weak password"
732msgid "Weak password"
732−msgstr ""
733+msgstr "Fjalëkalim i dobët"
733
734
734#: qml/Wizard/PasswordMeter.qml:99
735#: qml/Wizard/PasswordMeter.qml:99
735msgid "Very weak password"
736msgid "Very weak password"
736−msgstr ""
737+msgstr "Fjalëkalim shumë i dobët"
737
738
738#~ msgid "Top edge"
739#~ msgid "Top edge"
739#~ msgstr "Cepi i sipërm"
740#~ msgstr "Cepi i sipërm"
po/sr.po+13−19
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity\n"
9"Project-Id-Version: unity\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
12"PO-Revision-Date: 2016-03-24 12:36+0000\n"
12"PO-Revision-Date: 2016-03-24 12:36+0000\n"
13"Last-Translator: Bojan Bogdanović <Unknown>\n"
13"Last-Translator: Bojan Bogdanović <Unknown>\n"
14"Language-Team: српски <xfce4@xfce4.org>\n"
14"Language-Team: српски <xfce4@xfce4.org>\n"
@@ -17,8 +17,8 @@ msgstr ""
17"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
19"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
20−"X-Launchpad-Export-Date: 2016-03-25 05:55+0000\n"
20+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
21−"X-Generator: Launchpad (build 17967)\n"
21+"X-Generator: Launchpad (build 17995)\n"
22"Language: sr\n"
22"Language: sr\n"
23
23
24#: plugins/IntegratedLightDM/Greeter.cpp:112
24#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -456,19 +456,19 @@ msgstr "Превуците нагоре да креирате поруку"
456msgid "Swipe up to manage the app"
456msgid "Swipe up to manage the app"
457msgstr "Превуците нагоре да урављате програмом"
457msgstr "Превуците нагоре да урављате програмом"
458
458
459−#: qml/Tutorial/TutorialLeft.qml:47
460−msgid "Swipe from the left edge to open the launcher"
461−msgstr "Превуците са леве ивице да отворите покретач"
462−
463#: qml/Tutorial/TutorialLeftLong.qml:47
459#: qml/Tutorial/TutorialLeftLong.qml:47
464msgid "Long swipe from the left edge to open the Today scope"
460msgid "Long swipe from the left edge to open the Today scope"
465msgstr "Дуго превлачење са леве ивице да отворите опсег Данас"
461msgstr "Дуго превлачење са леве ивице да отворите опсег Данас"
466
462
467−#: qml/Tutorial/TutorialRight.qml:54
463+#: qml/Tutorial/TutorialLeft.qml:47
468−msgid "Hover your mouse on the right edge to view your open apps"
464+msgid "Swipe from the left edge to open the launcher"
469−msgstr "Задржите миша инад десне ивице да видите отворене програме"
465+msgstr "Превуците са леве ивице да отворите покретач"
470
466
471#: qml/Tutorial/TutorialRight.qml:55
467#: qml/Tutorial/TutorialRight.qml:55
468+msgid "Push your mouse against the right edge to view your open apps"
469+msgstr ""
470+
471+#: qml/Tutorial/TutorialRight.qml:56
472msgid "Short or long swipe from the right edge to view your open apps"
472msgid "Short or long swipe from the right edge to view your open apps"
473msgstr ""
473msgstr ""
474"Каратко или дуго превлачење са десне ивице да видите ваше отворене програме"
474"Каратко или дуго превлачење са десне ивице да видите ваше отворене програме"
@@ -1029,12 +1029,6 @@ msgstr "Веома слаба лозинка"
1029#~ msgid "View all your running tasks."
1029#~ msgid "View all your running tasks."
1030#~ msgstr "Прегледајте све покренуте задатке."
1030#~ msgstr "Прегледајте све покренуте задатке."
1031
1031
1032−#~ msgid "Welcome to your Ubuntu device."
1033−#~ msgstr "Добро дошли у Убунту уређај."
1034−
1035−#~ msgid "Please select how you’d like to unlock your device."
1036−#~ msgstr "Изаберите како желите да откључате уређај."
1037−
1038#~ msgid "Let the phone detect your location:"
1032#~ msgid "Let the phone detect your location:"
1039#~ msgstr "Допустите да телефон препозна ваш положај:"
1033#~ msgstr "Допустите да телефон препозна ваш положај:"
1040
1034
@@ -1069,11 +1063,11 @@ msgstr "Веома слаба лозинка"
1069#~ "Ово можете да искључите у <b>Подешавањима система</b> под ставком "
1063#~ "Ово можете да искључите у <b>Подешавањима система</b> под ставком "
1070#~ "<b>Безбедност и приватност</b>"
1064#~ "<b>Безбедност и приватност</b>"
1071
1065
1072−#~ msgid "Your device is now ready to use."
1073−#~ msgstr "Ваш уређај је сада спреман за употребу."
1074−
1075#~ msgid "Please try again."
1066#~ msgid "Please try again."
1076#~ msgstr "Покушајте поново."
1067#~ msgstr "Покушајте поново."
1077
1068
1078#~ msgid "Choose your passcode"
1069#~ msgid "Choose your passcode"
1079#~ msgstr "Изаберите приступни код"
1070#~ msgstr "Изаберите приступни код"
1071+
1072+#~ msgid "Hover your mouse on the right edge to view your open apps"
1073+#~ msgstr "Задржите миша инад десне ивице да видите отворене програме"
po/sv.po+13−10
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-03-25 05:01+0000\n"
11"PO-Revision-Date: 2016-03-25 05:01+0000\n"
12"Last-Translator: Josef Andersson <Unknown>\n"
12"Last-Translator: Josef Andersson <Unknown>\n"
13"Language-Team: Swedish\n"
13"Language-Team: Swedish\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-26 05:44+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20"Language: sv\n"
20"Language: sv\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -450,19 +450,19 @@ msgstr "Svep uppåt för att skapa ett meddelande"
450msgid "Swipe up to manage the app"
450msgid "Swipe up to manage the app"
451msgstr "Svep uppåt för att hantera programmet"
451msgstr "Svep uppåt för att hantera programmet"
452
452
453−#: qml/Tutorial/TutorialLeft.qml:47
454−msgid "Swipe from the left edge to open the launcher"
455−msgstr "Svep från vänstra kanten för att öppna programstartaren"
456−
457#: qml/Tutorial/TutorialLeftLong.qml:47
453#: qml/Tutorial/TutorialLeftLong.qml:47
458msgid "Long swipe from the left edge to open the Today scope"
454msgid "Long swipe from the left edge to open the Today scope"
459msgstr "Gör ett lång svep från vänstra kanten för öppna vyn Idag"
455msgstr "Gör ett lång svep från vänstra kanten för öppna vyn Idag"
460
456
461−#: qml/Tutorial/TutorialRight.qml:54
457+#: qml/Tutorial/TutorialLeft.qml:47
462−msgid "Hover your mouse on the right edge to view your open apps"
458+msgid "Swipe from the left edge to open the launcher"
463−msgstr "Hovra din mus över högra kanten för att se dina öppna program"
459+msgstr "Svep från vänstra kanten för att öppna programstartaren"
464
460
465#: qml/Tutorial/TutorialRight.qml:55
461#: qml/Tutorial/TutorialRight.qml:55
462+msgid "Push your mouse against the right edge to view your open apps"
463+msgstr ""
464+
465+#: qml/Tutorial/TutorialRight.qml:56
466msgid "Short or long swipe from the right edge to view your open apps"
466msgid "Short or long swipe from the right edge to view your open apps"
467msgstr ""
467msgstr ""
468"Svep kort eller långt från högra kanten för att visa dina öppna program"
468"Svep kort eller långt från högra kanten för att visa dina öppna program"
@@ -1068,3 +1068,6 @@ msgstr "Väldigt svagt lösenord"
1068
1068
1069#~ msgid "Call back"
1069#~ msgid "Call back"
1070#~ msgstr "Ring upp"
1070#~ msgstr "Ring upp"
1071+
1072+#~ msgid "Hover your mouse on the right edge to view your open apps"
1073+#~ msgstr "Hovra din mus över högra kanten för att se dina öppna program"
po/sw.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-17 20:02+0000\n"
11"PO-Revision-Date: 2015-07-17 20:02+0000\n"
12"Last-Translator: Valentine <mwangi_valentino@yahoo.com>\n"
12"Last-Translator: Valentine <mwangi_valentino@yahoo.com>\n"
13"Language-Team: Swahili <sw@li.org>\n"
13"Language-Team: Swahili <sw@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -446,19 +446,19 @@ msgstr ""
446msgid "Swipe up to manage the app"
446msgid "Swipe up to manage the app"
447msgstr ""
447msgstr ""
448
448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr ""
452−
453#: qml/Tutorial/TutorialLeftLong.qml:47
449#: qml/Tutorial/TutorialLeftLong.qml:47
454msgid "Long swipe from the left edge to open the Today scope"
450msgid "Long swipe from the left edge to open the Today scope"
455msgstr ""
451msgstr ""
456
452
457−#: qml/Tutorial/TutorialRight.qml:54
453+#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Hover your mouse on the right edge to view your open apps"
454+msgid "Swipe from the left edge to open the launcher"
459msgstr ""
455msgstr ""
460
456
461#: qml/Tutorial/TutorialRight.qml:55
457#: qml/Tutorial/TutorialRight.qml:55
458+msgid "Push your mouse against the right edge to view your open apps"
459+msgstr ""
460+
461+#: qml/Tutorial/TutorialRight.qml:56
462msgid "Short or long swipe from the right edge to view your open apps"
462msgid "Short or long swipe from the right edge to view your open apps"
463msgstr ""
463msgstr ""
464
464
po/ta.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
12"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
12"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20"Language: ta\n"
20"Language: ta\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -441,19 +441,19 @@ msgstr ""
441msgid "Swipe up to manage the app"
441msgid "Swipe up to manage the app"
442msgstr ""
442msgstr ""
443
443
444−#: qml/Tutorial/TutorialLeft.qml:47
445−msgid "Swipe from the left edge to open the launcher"
446−msgstr ""
447−
448#: qml/Tutorial/TutorialLeftLong.qml:47
444#: qml/Tutorial/TutorialLeftLong.qml:47
449msgid "Long swipe from the left edge to open the Today scope"
445msgid "Long swipe from the left edge to open the Today scope"
450msgstr ""
446msgstr ""
451
447
452−#: qml/Tutorial/TutorialRight.qml:54
448+#: qml/Tutorial/TutorialLeft.qml:47
453−msgid "Hover your mouse on the right edge to view your open apps"
449+msgid "Swipe from the left edge to open the launcher"
454msgstr ""
450msgstr ""
455
451
456#: qml/Tutorial/TutorialRight.qml:55
452#: qml/Tutorial/TutorialRight.qml:55
453+msgid "Push your mouse against the right edge to view your open apps"
454+msgstr ""
455+
456+#: qml/Tutorial/TutorialRight.qml:56
457msgid "Short or long swipe from the right edge to view your open apps"
457msgid "Short or long swipe from the right edge to view your open apps"
458msgstr ""
458msgstr ""
459
459
po/te.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-07-19 10:04+0000\n"
11"PO-Revision-Date: 2014-07-19 10:04+0000\n"
12"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
12"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
13"Language-Team: Telugu <te@li.org>\n"
13"Language-Team: Telugu <te@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/th.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-10-02 04:55+0000\n"
11"PO-Revision-Date: 2014-10-02 04:55+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Thai <th@li.org>\n"
13"Language-Team: Thai <th@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/tr.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-03-22 15:56+0000\n"
11"PO-Revision-Date: 2015-03-22 15:56+0000\n"
12"Last-Translator: Arda Ünlü <aarda.uunlu@gmail.com>\n"
12"Last-Translator: Arda Ünlü <aarda.uunlu@gmail.com>\n"
13"Language-Team: Turkish <tr@li.org>\n"
13"Language-Team: Turkish <tr@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -444,19 +444,19 @@ msgstr ""
444msgid "Swipe up to manage the app"
444msgid "Swipe up to manage the app"
445msgstr ""
445msgstr ""
446
446
447−#: qml/Tutorial/TutorialLeft.qml:47
448−msgid "Swipe from the left edge to open the launcher"
449−msgstr ""
450−
451#: qml/Tutorial/TutorialLeftLong.qml:47
447#: qml/Tutorial/TutorialLeftLong.qml:47
452msgid "Long swipe from the left edge to open the Today scope"
448msgid "Long swipe from the left edge to open the Today scope"
453msgstr ""
449msgstr ""
454
450
455−#: qml/Tutorial/TutorialRight.qml:54
451+#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Hover your mouse on the right edge to view your open apps"
452+msgid "Swipe from the left edge to open the launcher"
457msgstr ""
453msgstr ""
458
454
459#: qml/Tutorial/TutorialRight.qml:55
455#: qml/Tutorial/TutorialRight.qml:55
456+msgid "Push your mouse against the right edge to view your open apps"
457+msgstr ""
458+
459+#: qml/Tutorial/TutorialRight.qml:56
460msgid "Short or long swipe from the right edge to view your open apps"
460msgid "Short or long swipe from the right edge to view your open apps"
461msgstr ""
461msgstr ""
462
462
po/ug.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-12-01 07:37+0000\n"
11"PO-Revision-Date: 2015-12-01 07:37+0000\n"
12"Last-Translator: Eltikin <eltikinuyghur@hotmail.com>\n"
12"Last-Translator: Eltikin <eltikinuyghur@hotmail.com>\n"
13"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
13"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -442,19 +442,19 @@ msgstr ""
442msgid "Swipe up to manage the app"
442msgid "Swipe up to manage the app"
443msgstr ""
443msgstr ""
444
444
445−#: qml/Tutorial/TutorialLeft.qml:47
446−msgid "Swipe from the left edge to open the launcher"
447−msgstr ""
448−
449#: qml/Tutorial/TutorialLeftLong.qml:47
445#: qml/Tutorial/TutorialLeftLong.qml:47
450msgid "Long swipe from the left edge to open the Today scope"
446msgid "Long swipe from the left edge to open the Today scope"
451msgstr ""
447msgstr ""
452
448
453−#: qml/Tutorial/TutorialRight.qml:54
449+#: qml/Tutorial/TutorialLeft.qml:47
454−msgid "Hover your mouse on the right edge to view your open apps"
450+msgid "Swipe from the left edge to open the launcher"
455msgstr ""
451msgstr ""
456
452
457#: qml/Tutorial/TutorialRight.qml:55
453#: qml/Tutorial/TutorialRight.qml:55
454+msgid "Push your mouse against the right edge to view your open apps"
455+msgstr ""
456+
457+#: qml/Tutorial/TutorialRight.qml:56
458msgid "Short or long swipe from the right edge to view your open apps"
458msgid "Short or long swipe from the right edge to view your open apps"
459msgstr ""
459msgstr ""
460
460
po/uk.po+13−10
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-04-01 17:32+0000\n"
11"PO-Revision-Date: 2016-04-01 17:32+0000\n"
12"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
12"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
17"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-04-02 06:24+0000\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20−"X-Generator: Launchpad (build 17972)\n"
20+"X-Generator: Launchpad (build 17995)\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -459,19 +459,19 @@ msgstr "Проведіть догори, щоб написати нове пов
459msgid "Swipe up to manage the app"
459msgid "Swipe up to manage the app"
460msgstr "Проведіть пальцем догори, щоб керувати додатком"
460msgstr "Проведіть пальцем догори, щоб керувати додатком"
461
461
462−#: qml/Tutorial/TutorialLeft.qml:47
463−msgid "Swipe from the left edge to open the launcher"
464−msgstr "Проведіть від лівого краю екрану, щоб відкрити меню запуску"
465−
466#: qml/Tutorial/TutorialLeftLong.qml:47
462#: qml/Tutorial/TutorialLeftLong.qml:47
467msgid "Long swipe from the left edge to open the Today scope"
463msgid "Long swipe from the left edge to open the Today scope"
468msgstr "Довге проведення від лівого краю відкриває область «Сьогодні»"
464msgstr "Довге проведення від лівого краю відкриває область «Сьогодні»"
469
465
470−#: qml/Tutorial/TutorialRight.qml:54
466+#: qml/Tutorial/TutorialLeft.qml:47
471−msgid "Hover your mouse on the right edge to view your open apps"
467+msgid "Swipe from the left edge to open the launcher"
472−msgstr "Наведіть вказівник на правий кут, щоб побачити відкриті застосунки"
468+msgstr "Проведіть від лівого краю екрану, щоб відкрити меню запуску"
473
469
474#: qml/Tutorial/TutorialRight.qml:55
470#: qml/Tutorial/TutorialRight.qml:55
471+msgid "Push your mouse against the right edge to view your open apps"
472+msgstr ""
473+
474+#: qml/Tutorial/TutorialRight.qml:56
475msgid "Short or long swipe from the right edge to view your open apps"
475msgid "Short or long swipe from the right edge to view your open apps"
476msgstr ""
476msgstr ""
477"Коротке або довге проведення від правого краю відкриває перегляд списку "
477"Коротке або довге проведення від правого краю відкриває перегляд списку "
@@ -1086,3 +1086,6 @@ msgstr "Дуже слабкий пароль"
1086
1086
1087#~ msgid "Call back"
1087#~ msgid "Call back"
1088#~ msgstr "Зворотний виклик"
1088#~ msgstr "Зворотний виклик"
1089+
1090+#~ msgid "Hover your mouse on the right edge to view your open apps"
1091+#~ msgstr "Наведіть вказівник на правий кут, щоб побачити відкриті застосунки"
po/unity8.pot+8−8
@@ -1,6 +1,6 @@
1# SOME DESCRIPTIVE TITLE.
1# SOME DESCRIPTIVE TITLE.
2# Copyright (C) YEAR Canonical Ltd.
2# Copyright (C) YEAR Canonical Ltd.
3−# This file is distributed under the same license as the unity8 package.
3+# This file is distributed under the same license as the PACKAGE package.
4# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
4# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5#
5#
6#, fuzzy
6#, fuzzy
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
10"Report-Msgid-Bugs-To: \n"
10"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/ur.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-05-05 03:12+0000\n"
11"PO-Revision-Date: 2015-05-05 03:12+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Urdu <ur@li.org>\n"
13"Language-Team: Urdu <ur@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/uz.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-07-04 16:03+0000\n"
11"PO-Revision-Date: 2015-07-04 16:03+0000\n"
12"Last-Translator: Learner <muzaffar.habibullayev@yandex.ru>\n"
12"Last-Translator: Learner <muzaffar.habibullayev@yandex.ru>\n"
13"Language-Team: Uzbek <uz@li.org>\n"
13"Language-Team: Uzbek <uz@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/vi.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/wo.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2015-10-29 11:16+0000\n"
11"PO-Revision-Date: 2015-10-29 11:16+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Wolof <wo@li.org>\n"
13"Language-Team: Wolof <wo@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -444,19 +444,19 @@ msgstr ""
444msgid "Swipe up to manage the app"
444msgid "Swipe up to manage the app"
445msgstr ""
445msgstr ""
446
446
447−#: qml/Tutorial/TutorialLeft.qml:47
448−msgid "Swipe from the left edge to open the launcher"
449−msgstr ""
450−
451#: qml/Tutorial/TutorialLeftLong.qml:47
447#: qml/Tutorial/TutorialLeftLong.qml:47
452msgid "Long swipe from the left edge to open the Today scope"
448msgid "Long swipe from the left edge to open the Today scope"
453msgstr ""
449msgstr ""
454
450
455−#: qml/Tutorial/TutorialRight.qml:54
451+#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Hover your mouse on the right edge to view your open apps"
452+msgid "Swipe from the left edge to open the launcher"
457msgstr ""
453msgstr ""
458
454
459#: qml/Tutorial/TutorialRight.qml:55
455#: qml/Tutorial/TutorialRight.qml:55
456+msgid "Push your mouse against the right edge to view your open apps"
457+msgstr ""
458+
459+#: qml/Tutorial/TutorialRight.qml:56
460msgid "Short or long swipe from the right edge to view your open apps"
460msgid "Short or long swipe from the right edge to view your open apps"
461msgstr ""
461msgstr ""
462
462
po/xh.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/zh_CN.po+13−10
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-04-13 06:27+0000\n"
11"PO-Revision-Date: 2016-04-13 06:27+0000\n"
12"Last-Translator: YunQiang Su <wzssyqa@gmail.com>\n"
12"Last-Translator: YunQiang Su <wzssyqa@gmail.com>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-04-14 06:22+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17990)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -438,19 +438,19 @@ msgstr "上滑创建一条信息"
438msgid "Swipe up to manage the app"
438msgid "Swipe up to manage the app"
439msgstr "上滑管理应用"
439msgstr "上滑管理应用"
440
440
441−#: qml/Tutorial/TutorialLeft.qml:47
442−msgid "Swipe from the left edge to open the launcher"
443−msgstr "从左侧边缘滑动打开启动器"
444−
445#: qml/Tutorial/TutorialLeftLong.qml:47
441#: qml/Tutorial/TutorialLeftLong.qml:47
446msgid "Long swipe from the left edge to open the Today scope"
442msgid "Long swipe from the left edge to open the Today scope"
447msgstr "从左侧边缘长距离滑动打开“今日”分类"
443msgstr "从左侧边缘长距离滑动打开“今日”分类"
448
444
449−#: qml/Tutorial/TutorialRight.qml:54
445+#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Hover your mouse on the right edge to view your open apps"
446+msgid "Swipe from the left edge to open the launcher"
451−msgstr "将鼠标悬停在右侧边缘查看打开的应用"
447+msgstr "从左侧边缘滑动打开启动器"
452
448
453#: qml/Tutorial/TutorialRight.qml:55
449#: qml/Tutorial/TutorialRight.qml:55
450+msgid "Push your mouse against the right edge to view your open apps"
451+msgstr ""
452+
453+#: qml/Tutorial/TutorialRight.qml:56
454msgid "Short or long swipe from the right edge to view your open apps"
454msgid "Short or long swipe from the right edge to view your open apps"
455msgstr "从右侧边缘短距离或长距离滑动查看打开的应用"
455msgstr "从右侧边缘短距离或长距离滑动查看打开的应用"
456
456
@@ -1018,3 +1018,6 @@ msgstr "密码强度:非常弱"
1018
1018
1019#~ msgid "Call back"
1019#~ msgid "Call back"
1020#~ msgstr "回电"
1020#~ msgstr "回电"
1021+
1022+#~ msgid "Hover your mouse on the right edge to view your open apps"
1023+#~ msgstr "将鼠标悬停在右侧边缘查看打开的应用"
po/zh_HK.po+9−9
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2014-08-10 11:45+0000\n"
11"PO-Revision-Date: 2014-08-10 11:45+0000\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20
20
21#: plugins/IntegratedLightDM/Greeter.cpp:112
21#: plugins/IntegratedLightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440msgid "Swipe up to manage the app"
440msgid "Swipe up to manage the app"
441msgstr ""
441msgstr ""
442
442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447#: qml/Tutorial/TutorialLeftLong.qml:47
443#: qml/Tutorial/TutorialLeftLong.qml:47
448msgid "Long swipe from the left edge to open the Today scope"
444msgid "Long swipe from the left edge to open the Today scope"
449msgstr ""
445msgstr ""
450
446
451−#: qml/Tutorial/TutorialRight.qml:54
447+#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Hover your mouse on the right edge to view your open apps"
448+msgid "Swipe from the left edge to open the launcher"
453msgstr ""
449msgstr ""
454
450
455#: qml/Tutorial/TutorialRight.qml:55
451#: qml/Tutorial/TutorialRight.qml:55
452+msgid "Push your mouse against the right edge to view your open apps"
453+msgstr ""
454+
455+#: qml/Tutorial/TutorialRight.qml:56
456msgid "Short or long swipe from the right edge to view your open apps"
456msgid "Short or long swipe from the right edge to view your open apps"
457msgstr ""
457msgstr ""
458
458
po/zh_TW.po+11−20
@@ -7,7 +7,7 @@ msgid ""
7msgstr ""
7msgstr ""
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-03-23 10:01+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11"PO-Revision-Date: 2016-02-24 04:40+0000\n"
11"PO-Revision-Date: 2016-02-24 04:40+0000\n"
12"Last-Translator: Po-Hsu Lin <po-hsu.lin@canonical.com>\n"
12"Last-Translator: Po-Hsu Lin <po-hsu.lin@canonical.com>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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=1; plural=0;\n"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
19+"X-Generator: Launchpad (build 17995)\n"
20"Language: zh_TW\n"
20"Language: zh_TW\n"
21
21
22#: plugins/IntegratedLightDM/Greeter.cpp:112
22#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -184,7 +184,7 @@ msgstr ""
184
184
185#: qml/Dash/FiltersPopover.qml:69
185#: qml/Dash/FiltersPopover.qml:69
186msgid "Reset"
186msgid "Reset"
187−msgstr ""
187+msgstr "重設"
188
188
189#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
189#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190msgid "See less"
190msgid "See less"
@@ -437,19 +437,19 @@ msgstr ""
437msgid "Swipe up to manage the app"
437msgid "Swipe up to manage the app"
438msgstr ""
438msgstr ""
439
439
440−#: qml/Tutorial/TutorialLeft.qml:47
441−msgid "Swipe from the left edge to open the launcher"
442−msgstr ""
443−
444#: qml/Tutorial/TutorialLeftLong.qml:47
440#: qml/Tutorial/TutorialLeftLong.qml:47
445msgid "Long swipe from the left edge to open the Today scope"
441msgid "Long swipe from the left edge to open the Today scope"
446msgstr ""
442msgstr ""
447
443
448−#: qml/Tutorial/TutorialRight.qml:54
444+#: qml/Tutorial/TutorialLeft.qml:47
449−msgid "Hover your mouse on the right edge to view your open apps"
445+msgid "Swipe from the left edge to open the launcher"
450msgstr ""
446msgstr ""
451
447
452#: qml/Tutorial/TutorialRight.qml:55
448#: qml/Tutorial/TutorialRight.qml:55
449+msgid "Push your mouse against the right edge to view your open apps"
450+msgstr ""
451+
452+#: qml/Tutorial/TutorialRight.qml:56
453msgid "Short or long swipe from the right edge to view your open apps"
453msgid "Short or long swipe from the right edge to view your open apps"
454msgstr ""
454msgstr ""
455
455
@@ -468,7 +468,7 @@ msgstr "返回"
468
468
469#: qml/Wizard/Pages/10-welcome.qml:27
469#: qml/Wizard/Pages/10-welcome.qml:27
470msgid "Language"
470msgid "Language"
471−msgstr ""
471+msgstr "語言"
472
472
473#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
473#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
474#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
474#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -1035,12 +1035,3 @@ msgstr ""
1035
1035
1036#~ msgid "%a %d %b %l:%M %p"
1036#~ msgid "%a %d %b %l:%M %p"
1037#~ msgstr "(%a) %d月%b日 %p %l:%M"
1037#~ msgstr "(%a) %d月%b日 %p %l:%M"
1038−
1039−#~ msgid "Welcome to your Ubuntu device."
1040−#~ msgstr "歡迎使用您的 Ubuntu 裝置"
1041−
1042−#~ msgid "Please select how you’d like to unlock your device."
1043−#~ msgstr "請選擇您想要的裝置解鎖方式。"
1044−
1045−#~ msgid "Your device is now ready to use."
1046−#~ msgstr "您的裝置已準備就緒。"
qml/Components/Dialogs.qml+2−2
@@ -51,8 +51,8 @@ Item {
51 var comp = Qt.createComponent(Qt.resolvedUrl("ModeSwitchWarningDialog.qml"))
51 var comp = Qt.createComponent(Qt.resolvedUrl("ModeSwitchWarningDialog.qml"))
52 d.modeSwitchWarningPopup = comp.createObject(root, {model: legacyAppsModel});
52 d.modeSwitchWarningPopup = comp.createObject(root, {model: legacyAppsModel});
53 d.modeSwitchWarningPopup.forceClose.connect(function() {
53 d.modeSwitchWarningPopup.forceClose.connect(function() {
54− while (legacyAppsModel.count > 0) {
54+ for (var i = legacyAppsModel.count - 1; i >= 0; i--) {
55− ApplicationManager.stopApplication(legacyAppsModel.get(0).appId);
55+ ApplicationManager.stopApplication(legacyAppsModel.get(i).appId);
56 }
56 }
57 d.modeSwitchWarningPopup.hide();
57 d.modeSwitchWarningPopup.hide();
58 d.modeSwitchWarningPopup.destroy();
58 d.modeSwitchWarningPopup.destroy();
qml/Components/KeymapSwitcher.qmlnew file+65
@@ -0,0 +1,65 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4
18+import AccountsService 0.1
19+import GlobalShortcut 1.0
20+import Unity.Application 0.1
21+
22+QtObject {
23+ id: root
24+
25+ property GlobalShortcut shortcutNext: GlobalShortcut {
26+ shortcut: Qt.MetaModifier|Qt.Key_Space
27+ onTriggered: root.nextKeymap()
28+ active: root.keymapCount > 1
29+ }
30+
31+ property GlobalShortcut shortcutPrevious: GlobalShortcut {
32+ shortcut: Qt.MetaModifier|Qt.ShiftModifier|Qt.Key_Space
33+ onTriggered: root.previousKeymap()
34+ active: root.keymapCount > 1
35+ }
36+
37+ readonly property var keymaps: AccountsService.keymaps
38+ readonly property int keymapCount: keymaps.length
39+ property int currentKeymapIndex: 0
40+ readonly property string currentKeymap: keymaps[currentKeymapIndex]
41+
42+ function nextKeymap() {
43+ var nextIndex = 0;
44+
45+ if (currentKeymapIndex !== -1 && currentKeymapIndex < keymapCount - 1) {
46+ nextIndex = currentKeymapIndex + 1;
47+ }
48+ currentKeymapIndex = nextIndex;
49+ }
50+
51+ function previousKeymap() {
52+ var prevIndex = keymapCount - 1;
53+
54+ if (currentKeymapIndex > 0) {
55+ prevIndex = currentKeymapIndex - 1;
56+ }
57+ currentKeymapIndex = prevIndex;
58+ }
59+
60+ property Binding surfaceKeymapBinding: Binding {
61+ target: MirFocusController.focusedSurface
62+ property: "keymap"
63+ value: root.currentKeymap
64+ }
65+}
qml/Greeter/Greeter.qml+5−4
@@ -64,7 +64,7 @@ Showable {
64 d.selectUser(d.currentIndex, true);
64 d.selectUser(d.currentIndex, true);
65 }
65 }
66
66
67− function notifyAppFocused(appId) {
67+ function notifyAppFocusRequested(appId) {
68 if (!active) {
68 if (!active) {
69 return;
69 return;
70 }
70 }
@@ -81,19 +81,20 @@ Showable {
81 }
81 }
82 }
82 }
83
83
84− function notifyAboutToFocusApp(appId) {
84+ // Notify that the user has explicitly requested the given app through unity8 GUI.
85+ function notifyUserRequestedApp(appId) {
85 if (!active) {
86 if (!active) {
86 return;
87 return;
87 }
88 }
88
89
89 // A hint that we're about to focus an app. This way we can look
90 // A hint that we're about to focus an app. This way we can look
90 // a little more responsive, rather than waiting for the above
91 // a little more responsive, rather than waiting for the above
91− // notifyAppFocused call. We also need this in case we have a locked
92+ // notifyAppFocusRequested call. We also need this in case we have a locked
92 // app, in order to show lockscreen instead of new app.
93 // app, in order to show lockscreen instead of new app.
93 d.startUnlock(false /* toTheRight */);
94 d.startUnlock(false /* toTheRight */);
94 }
95 }
95
96
96− // This is a just a glorified notifyAboutToFocusApp(), but it does one
97+ // This is a just a glorified notifyUserRequestedApp(), but it does one
97 // other thing: it hides any cover pages to the RIGHT, because the user
98 // other thing: it hides any cover pages to the RIGHT, because the user
98 // just came from a launcher drag starting on the left.
99 // just came from a launcher drag starting on the left.
99 // It also returns a boolean value, indicating whether there was a visual
100 // It also returns a boolean value, indicating whether there was a visual
qml/Launcher/LauncherPanel.qml+1
@@ -98,6 +98,7 @@ Rectangle {
98 AbstractButton {
98 AbstractButton {
99 id: dashItem
99 id: dashItem
100 anchors.fill: parent
100 anchors.fill: parent
101+ activeFocusOnPress: false
101 onClicked: root.showDashHome()
102 onClicked: root.showDashHome()
102 }
103 }
103 Rectangle {
104 Rectangle {
qml/Shell.qml+68−101
@@ -42,6 +42,7 @@ import Unity.Session 0.1
42import Unity.DashCommunicator 0.1
42import Unity.DashCommunicator 0.1
43import Unity.Indicators 0.1 as Indicators
43import Unity.Indicators 0.1 as Indicators
44import Cursor 1.0
44import Cursor 1.0
45+import WindowManager 0.1
45
46
46
47
47Item {
48Item {
@@ -96,14 +97,44 @@ Item {
96 }
97 }
97 }
98 }
98
99
99− // For autopilot consumption
100− readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
101−
102− // internal props from here onwards
103 readonly property var mainApp:
100 readonly property var mainApp:
104 applicationsDisplayLoader.item ? applicationsDisplayLoader.item.mainApp : null
101 applicationsDisplayLoader.item ? applicationsDisplayLoader.item.mainApp : null
105− readonly property var mainAppWindow:
102+ onMainAppChanged: {
106− applicationsDisplayLoader.item ? applicationsDisplayLoader.item.mainAppWindow : null
103+ if (mainApp) {
104+ _onMainAppChanged(mainApp.appId);
105+ }
106+ }
107+ Connections {
108+ target: ApplicationManager
109+ onFocusRequested: {
110+ if (shell.mainApp && shell.mainApp.appId === appId) {
111+ _onMainAppChanged(appId);
112+ }
113+ }
114+ }
115+ function _onMainAppChanged(appId) {
116+ if (wizard.active && appId != "" && appId != "unity8-dash") {
117+ // If this happens on first boot, we may be in edge
118+ // tutorial or wizard while receiving a call. But a call
119+ // is more important than wizard so just bail out of those.
120+ tutorial.finish();
121+ wizard.hide();
122+ }
123+
124+ if (appId === "dialer-app" && callManager.hasCalls && greeter.locked) {
125+ // If we are in the middle of a call, make dialer lockedApp and show it.
126+ // This can happen if user backs out of dialer back to greeter, then
127+ // launches dialer again.
128+ greeter.lockedApp = appId;
129+ }
130+ greeter.notifyAppFocusRequested(appId);
131+
132+ panel.indicators.hide();
133+ launcher.hide();
134+ }
135+
136+ // For autopilot consumption
137+ readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
107
138
108 // Disable everything while greeter is waiting, so that the user can't swipe
139 // Disable everything while greeter is waiting, so that the user can't swipe
109 // the greeter or launcher until we know whether the session is locked.
140 // the greeter or launcher until we know whether the session is locked.
@@ -141,9 +172,6 @@ Item {
141
172
142 Component.onCompleted: {
173 Component.onCompleted: {
143 theme.name = "Ubuntu.Components.Themes.SuruDark"
174 theme.name = "Ubuntu.Components.Themes.SuruDark"
144− if (ApplicationManager.count > 0) {
145− ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
146− }
147 finishStartUpTimer.start();
175 finishStartUpTimer.start();
148 }
176 }
149
177
@@ -200,36 +228,10 @@ Item {
200 width: parent.width
228 width: parent.width
201 height: parent.height
229 height: parent.height
202
230
203− Connections {
231+ TopLevelSurfaceList {
204− target: ApplicationManager
232+ id: topLevelSurfaceList
205−
233+ objectName: "topLevelSurfaceList"
206− // This signal is also fired when we try to focus the current app
234+ applicationsModel: ApplicationManager
207− // again. We rely on this!
208− onFocusedApplicationIdChanged: {
209− var appId = ApplicationManager.focusedApplicationId;
210−
211− if (wizard.active && appId != "" && appId != "unity8-dash") {
212− // If this happens on first boot, we may be in edge
213− // tutorial or wizard while receiving a call. But a call
214− // is more important than wizard so just bail out of those.
215− tutorial.finish();
216− wizard.hide();
217− }
218−
219− if (appId === "dialer-app" && callManager.hasCalls && greeter.locked) {
220− // If we are in the middle of a call, make dialer lockedApp and show it.
221− // This can happen if user backs out of dialer back to greeter, then
222− // launches dialer again.
223− greeter.lockedApp = appId;
224− }
225− greeter.notifyAppFocused(appId);
226−
227− panel.indicators.hide();
228− }
229−
230− onApplicationAdded: {
231− launcher.hide();
232− }
233 }
235 }
234
236
235 Loader {
237 Loader {
@@ -260,6 +262,10 @@ Item {
260 return "Stages/DesktopStage.qml";
262 return "Stages/DesktopStage.qml";
261 }
263 }
262 }
264 }
265+ // TODO: Ensure the current stage is destroyed before the new one gets loaded.
266+ // Currently the new one will get loaded while the old is still hanging
267+ // around for a bit, which might lead to conflicts where both stages
268+ // change the model simultaneously.
263 onQmlComponentChanged: {
269 onQmlComponentChanged: {
264 if (item) item.stageAboutToBeUnloaded();
270 if (item) item.stageAboutToBeUnloaded();
265 source = qmlComponent;
271 source = qmlComponent;
@@ -272,6 +278,11 @@ Item {
272
278
273 onInteractiveChanged: { if (interactive) { focus = true; } }
279 onInteractiveChanged: { if (interactive) { focus = true; } }
274
280
281+ Binding {
282+ target: applicationsDisplayLoader.item
283+ property: "focus"
284+ value: true
285+ }
275 Binding {
286 Binding {
276 target: applicationsDisplayLoader.item
287 target: applicationsDisplayLoader.item
277 property: "objectName"
288 property: "objectName"
@@ -358,6 +369,16 @@ Item {
358 property: "leftMargin"
369 property: "leftMargin"
359 value: shell.usageScenario == "desktop" && !settings.autohideLauncher ? launcher.panelWidth: 0
370 value: shell.usageScenario == "desktop" && !settings.autohideLauncher ? launcher.panelWidth: 0
360 }
371 }
372+ Binding {
373+ target: applicationsDisplayLoader.item
374+ property: "applicationManager"
375+ value: ApplicationManager
376+ }
377+ Binding {
378+ target: applicationsDisplayLoader.item
379+ property: "topLevelSurfaceList"
380+ value: topLevelSurfaceList
381+ }
361 }
382 }
362 }
383 }
363
384
@@ -372,16 +393,6 @@ Item {
372 z: notifications.useModal || panel.indicators.shown || wizard.active || tutorial.running ? overlay.z + 1 : overlay.z - 1
393 z: notifications.useModal || panel.indicators.shown || wizard.active || tutorial.running ? overlay.z + 1 : overlay.z - 1
373 }
394 }
374
395
375− Connections {
376− target: SessionManager
377− onSessionStopping: {
378− if (!session.parentSession && !session.application) {
379− // nothing is using it. delete it right away
380− session.release();
381− }
382− }
383− }
384−
385 Loader {
396 Loader {
386 id: greeterLoader
397 id: greeterLoader
387 anchors.fill: parent
398 anchors.fill: parent
@@ -473,7 +484,7 @@ Item {
473 }
484 }
474
485
475 function showHome() {
486 function showHome() {
476− greeter.notifyAboutToFocusApp("unity8-dash");
487+ greeter.notifyUserRequestedApp("unity8-dash");
477
488
478 var animate = !lightDM.greeter.active && !stages.shown
489 var animate = !lightDM.greeter.active && !stages.shown
479 dash.setCurrentScope(0, animate, false)
490 dash.setCurrentScope(0, animate, false)
@@ -522,9 +533,10 @@ Item {
522 greeterShown: greeter.shown
533 greeterShown: greeter.shown
523 }
534 }
524
535
525− readonly property bool topmostApplicationIsFullscreen: mainApp && mainApp.fullscreen
536+ readonly property bool focusedSurfaceIsFullscreen: MirFocusController.focusedSurface
526−
537+ ? MirFocusController.focusedSurface.state === Mir.FullscreenState
538+ : false
527− fullscreenMode: (topmostApplicationIsFullscreen && !lightDM.greeter.active && launcher.progress == 0)
539+ fullscreenMode: (focusedSurfaceIsFullscreen && !lightDM.greeter.active && launcher.progress == 0)
528 || greeter.hasLockedApp
540 || greeter.hasLockedApp
529 locked: greeter && greeter.active
541 locked: greeter && greeter.active
530 }
542 }
@@ -557,7 +569,7 @@ Item {
557 }
569 }
558 }
570 }
559 onLauncherApplicationSelected: {
571 onLauncherApplicationSelected: {
560− greeter.notifyAboutToFocusApp(appId);
572+ greeter.notifyUserRequestedApp(appId);
561 shell.activateApplication(appId);
573 shell.activateApplication(appId);
562 }
574 }
563 onShownChanged: {
575 onShownChanged: {
@@ -721,53 +733,8 @@ Item {
721 onMouseMoved: { cursor.opacity = 1; }
733 onMouseMoved: { cursor.opacity = 1; }
722 }
734 }
723
735
724− // keymap switching
736+ // non-visual object
725− GlobalShortcut {
737+ KeymapSwitcher {}
726− shortcut: Qt.MetaModifier|Qt.Key_Space
727− onTriggered: keymapPriv.nextKeymap()
728− active: keymapPriv.keymapCount > 1
729− }
730−
731− GlobalShortcut {
732− shortcut: Qt.MetaModifier|Qt.ShiftModifier|Qt.Key_Space
733− onTriggered: keymapPriv.previousKeymap()
734− active: keymapPriv.keymapCount > 1
735− }
736−
737− QtObject {
738− id: keymapPriv
739−
740− readonly property var keymaps: AccountsService.keymaps
741− readonly property int keymapCount: keymaps.length
742− property int currentKeymapIndex: 0 // the new one that we're setting
743− onCurrentKeymapIndexChanged: switchToKeymap();
744−
745− function nextKeymap() {
746− var nextIndex = 0;
747−
748− if (currentKeymapIndex !== -1 && currentKeymapIndex < keymapCount - 1) {
749− nextIndex = currentKeymapIndex + 1;
750− }
751− currentKeymapIndex = nextIndex;
752− }
753−
754− function previousKeymap() {
755− var prevIndex = keymapCount - 1;
756−
757− if (currentKeymapIndex > 0) {
758− prevIndex = currentKeymapIndex - 1;
759− }
760− currentKeymapIndex = prevIndex;
761− }
762−
763− function switchToKeymap() {
764− if (mainAppWindow) {
765− mainAppWindow.switchToKeymap(keymaps[currentKeymapIndex]);
766− }
767− }
768− }
769−
770− onMainAppWindowChanged: keymapPriv.switchToKeymap()
771
738
772 Rectangle {
739 Rectangle {
773 id: shutdownFadeOutRectangle
740 id: shutdownFadeOutRectangle
qml/Stages/AbstractStage.qml+9−3
@@ -18,12 +18,19 @@ import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19import GSettings 1.0
19import GSettings 1.0
20
20
21−Rectangle {
21+FocusScope {
22 id: root
22 id: root
23
23
24+ property alias color: backRect.color
25+ Rectangle {
26+ id: backRect
24− color: "#060606"
27+ color: "#060606"
28+ anchors.fill: parent
29+ }
25
30
26 // Controls to be set from outside
31 // Controls to be set from outside
32+ property QtObject applicationManager
33+ property QtObject topLevelSurfaceList
27 property bool altTabPressed
34 property bool altTabPressed
28 property url background
35 property url background
29 property bool beingResized
36 property bool beingResized
@@ -45,7 +52,6 @@ Rectangle {
45
52
46 // To be read from outside
53 // To be read from outside
47 property var mainApp: null
54 property var mainApp: null
48− property var mainAppWindow: null
49 property int mainAppWindowOrientationAngle: 0
55 property int mainAppWindowOrientationAngle: 0
50 property bool orientationChangesEnabled
56 property bool orientationChangesEnabled
51 property int supportedOrientations: Qt.PortraitOrientation
57 property int supportedOrientations: Qt.PortraitOrientation
qml/Stages/Animations/BaseSessionAnimation.qmldeleted−96
@@ -1,96 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.4
18−
19−/* This is the base case for surface animations, used when adding/removing * child surfaces.
20− * The class is meant to be overridden and changes/animations provided for state changes.
21− * NB. It is important to release the surface at the end of the "out" animation.
22− *
23− * Example - Simple fade in/out
24− *
25− * BaseSurfaceAnimation {
26− * outChanges: [ PropertyChanges { target: animation.surface; opacity: 0.0 } ]
27− * outAnimations: [
28− SequentialAnimation {
29− * NumberAnimation { target: animation.surface; property: "opacity"; duration: 300 }
30− * ScriptAction { script: { if (animation.parent.removing) animation.surface.release(); } }
31− * }
32− * ]
33− *
34− * inChanges: [ PropertyChanges { target: animation.surface; opacity: 1.0 } ]
35− * inAnimations: [ NumberAnimation { target: animation.surface; property: "opacity"; duration: 300 } ]
36− * }
37− */
38−Item {
39− id: base
40− property var container
41− objectName: "sessionAnimation"
42−
43− // changes applied when state changes to "from"
44− property list<QtObject> fromChanges
45− // transition animations when changing state to "from"
46− property list<QtObject> fromAnimations
47−
48− // changes applied when state changes to "to"
49− property list<QtObject> toChanges
50− // transition animations when changing state to "to"
51− property list<QtObject> toAnimations
52−
53− function start() {
54− // "prep" state forces toChanges without transition animations.
55− state = "prep"
56− state = "to";
57− }
58− function end() {
59− state = "from";
60− }
61−
62− signal completed()
63−
64− states: [
65− State {
66− name: "baseAnimation"
67− PropertyChanges { target: container; anchors.fill: undefined }
68− },
69−
70− State {
71− name: "prep"
72− extend: "baseAnimation"
73− changes: fromChanges
74− },
75− State {
76− name: "from"
77− extend: "prep"
78− },
79− State {
80− name: "in"
81− extend: "baseAnimation"
82− changes: toChanges
83− }
84− ]
85−
86− transitions: [
87− Transition {
88− to: "from"
89− animations: fromAnimations
90− },
91− Transition {
92− to: "to"
93− animations: toAnimations
94− }
95− ]
96−}
qml/Stages/Animations/SwipeFromBottomAnimation.qmldeleted−53
@@ -1,53 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.4
18−import Ubuntu.Components 1.3
19−
20−BaseSessionAnimation {
21− id: animation
22−
23− fromChanges: [
24− AnchorChanges {
25− target: container;
26− anchors.top: container.parent.bottom
27− }
28− ]
29− fromAnimations: [
30− SequentialAnimation {
31− // clip so we don't go out of parent's bounds during spread
32− PropertyAction { target: container.parent; property: "clip"; value: true }
33− AnchorAnimation { easing: UbuntuAnimation.StandardEasing; duration: UbuntuAnimation.BriskDuration }
34− PropertyAction { target: container.parent; property: "clip"; value: false }
35− ScriptAction { script: { animation.completed(); } }
36− }
37− ]
38−
39− toChanges: [
40− AnchorChanges {
41− target: container;
42− anchors.top: container.parent.top
43− }
44− ]
45− toAnimations: [
46− SequentialAnimation {
47− // clip so we don't go out of parent's bounds during spread
48− PropertyAction { target: container.parent; property: "clip"; value: true }
49− AnchorAnimation { easing: UbuntuAnimation.StandardEasing; duration: UbuntuAnimation.BriskDuration }
50− PropertyAction { target: container.parent; property: "clip"; value: false }
51− }
52− ]
53−}
qml/Stages/ApplicationWindow.qml+113−77
@@ -20,39 +20,77 @@ import Unity.Application 0.1
20
20
21FocusScope {
21FocusScope {
22 id: root
22 id: root
23− implicitWidth: sessionContainer.implicitWidth
23+ implicitWidth: surfaceContainer.implicitWidth
24− implicitHeight: sessionContainer.implicitHeight
24+ implicitHeight: surfaceContainer.implicitHeight
25
25
26 // to be read from outside
26 // to be read from outside
27− property alias interactive: sessionContainer.interactive
27+ property alias interactive: surfaceContainer.interactive
28 property bool orientationChangesEnabled: d.supportsSurfaceResize ? d.surfaceOldEnoughToBeResized : true
28 property bool orientationChangesEnabled: d.supportsSurfaceResize ? d.surfaceOldEnoughToBeResized : true
29− readonly property string title: sessionContainer.surface && sessionContainer.surface.name !== "" ?
29+ readonly property string title: surface && surface.name !== "" ? surface.name : d.name
30− sessionContainer.surface.name : d.name
31
30
32 // overridable from outside
31 // overridable from outside
33− property bool fullscreen: application ? application.fullscreen : false
32+ property bool fullscreen: {
33+ if (surface) {
34+ return surface.state === Mir.FullscreenState;
35+ } else if (application) {
36+ return application.fullscreen;
37+ } else {
38+ return false;
39+ }
40+ }
34
41
35 // to be set from outside
42 // to be set from outside
43+ property QtObject surface
36 property QtObject application
44 property QtObject application
37 property int surfaceOrientationAngle
45 property int surfaceOrientationAngle
38− property alias resizeSurface: sessionContainer.resizeSurface
46+ property alias resizeSurface: surfaceContainer.resizeSurface
39 property int requestedWidth: -1
47 property int requestedWidth: -1
40 property int requestedHeight: -1
48 property int requestedHeight: -1
41
49
42− function switchToKeymap(keymap) {
50+ readonly property int minimumWidth: surface ? surface.minimumWidth : 0
43− sessionContainer.surfaceContainer.switchToKeymap(keymap);
51+ readonly property int minimumHeight: surface ? surface.minimumHeight : 0
44− }
52+ readonly property int maximumWidth: surface ? surface.maximumWidth : 0
53+ readonly property int maximumHeight: surface ? surface.maximumHeight : 0
54+ readonly property int widthIncrement: surface ? surface.widthIncrement : 0
55+ readonly property int heightIncrement: surface ? surface.heightIncrement : 0
45
56
46− readonly property int minimumWidth: sessionContainer.surface ? sessionContainer.surface.minimumWidth : 0
57+ onSurfaceChanged: {
47− readonly property int minimumHeight: sessionContainer.surface ? sessionContainer.surface.minimumHeight : 0
58+ // The order in which the instructions are executed here matters, to that the correct state
48− readonly property int maximumWidth: sessionContainer.surface ? sessionContainer.surface.maximumWidth : 0
59+ // transitions in stateGroup take place.
49− readonly property int maximumHeight: sessionContainer.surface ? sessionContainer.surface.maximumHeight : 0
60+ // More specifically, the moment surfaceContainer.surface gets updated relative to the
50− readonly property int widthIncrement: sessionContainer.surface ? sessionContainer.surface.widthIncrement : 0
61+ // other instructions.
51− readonly property int heightIncrement: sessionContainer.surface ? sessionContainer.surface.heightIncrement : 0
62+ if (surface) {
63+ surfaceContainer.surface = surface;
64+ d.liveSurface = surface.live;
65+ d.hadSurface = false;
66+ surfaceInitTimer.start();
67+ } else {
68+ if (d.surfaceInitialized) {
69+ d.hadSurface = true;
70+ }
71+ d.surfaceInitialized = false;
72+ surfaceContainer.surface = null;
73+ }
74+ }
52
75
53 QtObject {
76 QtObject {
54 id: d
77 id: d
55
78
79+ property bool liveSurface: false;
80+ property var con: Connections {
81+ target: root.surface
82+ onLiveChanged: d.liveSurface = root.surface.live
83+ }
84+ // using liveSurface instead of root.surface.live because with the latter
85+ // this expression is not reevaluated when root.surface changes
86+ readonly property bool needToTakeScreenshot: root.surface && d.surfaceInitialized && !d.liveSurface
87+ && applicationState !== ApplicationInfoInterface.Running
88+ onNeedToTakeScreenshotChanged: {
89+ if (needToTakeScreenshot && screenshotImage.status === Image.Null) {
90+ screenshotImage.take();
91+ }
92+ }
93+
56 // helpers so that we don't have to check for the existence of an application everywhere
94 // helpers so that we don't have to check for the existence of an application everywhere
57 // (in order to avoid breaking qml binding due to a javascript exception)
95 // (in order to avoid breaking qml binding due to a javascript exception)
58 readonly property string name: root.application ? root.application.name : ""
96 readonly property string name: root.application ? root.application.name : ""
@@ -66,17 +104,7 @@ FocusScope {
66 readonly property color splashColorFooter: root.application ? root.application.splashColorFooter : "#00000000"
104 readonly property color splashColorFooter: root.application ? root.application.splashColorFooter : "#00000000"
67
105
68 // Whether the Application had a surface before but lost it.
106 // Whether the Application had a surface before but lost it.
69− property bool hadSurface: sessionContainer.surfaceContainer.hadSurface
107+ property bool hadSurface: false
70−
71− readonly property bool needToTakeScreenshot:
72− ((sessionContainer.surface && d.surfaceInitialized) || d.hadSurface)
73− && screenshotImage.status === Image.Null
74− && d.applicationState === ApplicationInfoInterface.Stopped
75− onNeedToTakeScreenshotChanged: {
76− if (needToTakeScreenshot) {
77− screenshotImage.take();
78− }
79− }
80
108
81 //FIXME - this is a hack to avoid the first few rendered frames as they
109 //FIXME - this is a hack to avoid the first few rendered frames as they
82 // might show the UI accommodating due to surface resizes on startup.
110 // might show the UI accommodating due to surface resizes on startup.
@@ -103,7 +131,9 @@ FocusScope {
103 Timer {
131 Timer {
104 id: surfaceInitTimer
132 id: surfaceInitTimer
105 interval: 100
133 interval: 100
134+ onTriggered: {
106− onTriggered: { if (sessionContainer.surface) {d.surfaceInitialized = true;} }
135+ if (root.surface && root.surface.live) {d.surfaceInitialized = true;}
136+ }
107 }
137 }
108
138
109 Timer {
139 Timer {
@@ -121,13 +151,11 @@ FocusScope {
121 function take() {
151 function take() {
122 // Save memory by using a half-resolution (thus quarter size) screenshot.
152 // Save memory by using a half-resolution (thus quarter size) screenshot.
123 // Do not make this a binding, we can only take the screenshot once!
153 // Do not make this a binding, we can only take the screenshot once!
124− sourceSize.width = root.width / 2;
154+ surfaceContainer.grabToImage(
125− sourceSize.height = root.height / 2;
155+ function(result) {
126−
156+ screenshotImage.source = result.url;
127− // Format: "image://application/$APP_ID/$CURRENT_TIME_MS"
157+ },
128− // eg: "image://application/calculator-app/123456"
158+ Qt.size(root.width / 2, root.height / 2));
129− var timeMs = new Date().getTime();
130− source = "image://application/" + root.application.appId + "/" + timeMs;
131 }
159 }
132 }
160 }
133
161
@@ -150,46 +178,33 @@ FocusScope {
150 }
178 }
151 }
179 }
152
180
153− SessionContainer {
181+ SurfaceContainer {
154− id: sessionContainer
182+ id: surfaceContainer
155− // A fake application might not even have a session property.
156− session: application && application.session ? application.session : null
157−
158 requestedWidth: root.requestedWidth
183 requestedWidth: root.requestedWidth
159 requestedHeight: root.requestedHeight
184 requestedHeight: root.requestedHeight
160−
161 surfaceOrientationAngle: application && application.rotatesWindowContents ? root.surfaceOrientationAngle : 0
185 surfaceOrientationAngle: application && application.rotatesWindowContents ? root.surfaceOrientationAngle : 0
162−
163− onSurfaceChanged: {
164− if (sessionContainer.surface) {
165− surfaceInitTimer.start();
166− } else {
167− d.surfaceInitialized = false;
168− }
169− }
170−
171 focus: true
186 focus: true
172 }
187 }
173
188
174− // SessionContainer size drives ApplicationWindow size
189+ // SurfaceContainer size drives ApplicationWindow size
175 Binding {
190 Binding {
176 target: root; property: "width"
191 target: root; property: "width"
177− value: stateGroup.state === "surface" ? sessionContainer.width : root.requestedWidth
192+ value: stateGroup.state === "surface" ? surfaceContainer.width : root.requestedWidth
178 when: root.requestedWidth >= 0
193 when: root.requestedWidth >= 0
179 }
194 }
180 Binding {
195 Binding {
181 target: root; property: "height"
196 target: root; property: "height"
182− value: stateGroup.state === "surface" ? sessionContainer.height : root.requestedHeight
197+ value: stateGroup.state === "surface" ? surfaceContainer.height : root.requestedHeight
183 when: root.requestedHeight >= 0
198 when: root.requestedHeight >= 0
184 }
199 }
185
200
186− // ApplicationWindow size drives SessionContainer size
201+ // ApplicationWindow size drives SurfaceContainer size
187 Binding {
202 Binding {
188− target: sessionContainer; property: "width"; value: root.width
203+ target: surfaceContainer; property: "width"; value: root.width
189 when: root.requestedWidth < 0
204 when: root.requestedWidth < 0
190 }
205 }
191 Binding {
206 Binding {
192− target: sessionContainer; property: "height"; value: root.height
207+ target: surfaceContainer; property: "height"; value: root.height
193 when: root.requestedHeight < 0
208 when: root.requestedHeight < 0
194 }
209 }
195
210
@@ -200,32 +215,43 @@ FocusScope {
200 State {
215 State {
201 name: "void"
216 name: "void"
202 when:
217 when:
203− d.hadSurface && (!sessionContainer.surface || !d.surfaceInitialized)
218+ d.hadSurface && (!root.surface || !d.surfaceInitialized)
204 &&
219 &&
205 screenshotImage.status !== Image.Ready
220 screenshotImage.status !== Image.Ready
206 },
221 },
207 State {
222 State {
208 name: "splashScreen"
223 name: "splashScreen"
209 when:
224 when:
210− !d.hadSurface && (!sessionContainer.surface || !d.surfaceInitialized)
225+ !d.hadSurface && (!root.surface || !d.surfaceInitialized)
211 &&
226 &&
212 screenshotImage.status !== Image.Ready
227 screenshotImage.status !== Image.Ready
213 },
228 },
214 State {
229 State {
215 name: "surface"
230 name: "surface"
216 when:
231 when:
217− (sessionContainer.surface && d.surfaceInitialized)
232+ (root.surface && d.surfaceInitialized)
218 &&
233 &&
234+ (d.liveSurface ||
219− (d.applicationState !== ApplicationInfoInterface.Stopped
235+ (d.applicationState !== ApplicationInfoInterface.Running
220− || screenshotImage.status !== Image.Ready)
236+ && screenshotImage.status !== Image.Ready))
221 },
237 },
222 State {
238 State {
223 name: "screenshot"
239 name: "screenshot"
224 when:
240 when:
225 screenshotImage.status === Image.Ready
241 screenshotImage.status === Image.Ready
226 &&
242 &&
227− (d.applicationState === ApplicationInfoInterface.Stopped
243+ (d.applicationState !== ApplicationInfoInterface.Running
228− || !sessionContainer.surface || !d.surfaceInitialized)
244+ || !root.surface || !d.surfaceInitialized)
245+ },
246+ State {
247+ // This is a dead end. From here we expect the surface to be removed from the model
248+ // shortly after we stop referencing to it in our SurfaceContainer.
249+ name: "closed"
250+ when:
251+ // The surface died while the application is running. It must have been closed
252+ // by the shell or the application decided to destroy it by itself
253+ root.surface && d.surfaceInitialized && !d.liveSurface
254+ && d.applicationState === ApplicationInfoInterface.Running
229 }
255 }
230 ]
256 ]
231
257
@@ -233,17 +259,17 @@ FocusScope {
233 Transition {
259 Transition {
234 from: ""; to: "splashScreen"
260 from: ""; to: "splashScreen"
235 PropertyAction { target: splashLoader; property: "active"; value: true }
261 PropertyAction { target: splashLoader; property: "active"; value: true }
236− PropertyAction { target: sessionContainer.surfaceContainer
262+ PropertyAction { target: surfaceContainer
237 property: "visible"; value: false }
263 property: "visible"; value: false }
238 },
264 },
239 Transition {
265 Transition {
240 from: "splashScreen"; to: "surface"
266 from: "splashScreen"; to: "surface"
241 SequentialAnimation {
267 SequentialAnimation {
242− PropertyAction { target: sessionContainer.surfaceContainer
268+ PropertyAction { target: surfaceContainer
243 property: "opacity"; value: 0.0 }
269 property: "opacity"; value: 0.0 }
244− PropertyAction { target: sessionContainer.surfaceContainer
270+ PropertyAction { target: surfaceContainer
245 property: "visible"; value: true }
271 property: "visible"; value: true }
246− UbuntuNumberAnimation { target: sessionContainer.surfaceContainer; property: "opacity";
272+ UbuntuNumberAnimation { target: surfaceContainer; property: "opacity";
247 from: 0.0; to: 1.0
273 from: 0.0; to: 1.0
248 duration: UbuntuAnimation.BriskDuration }
274 duration: UbuntuAnimation.BriskDuration }
249 ScriptAction { script: {
275 ScriptAction { script: {
@@ -259,12 +285,12 @@ FocusScope {
259 surfaceIsOldTimer.stop();
285 surfaceIsOldTimer.stop();
260 d.surfaceOldEnoughToBeResized = false;
286 d.surfaceOldEnoughToBeResized = false;
261 splashLoader.active = true;
287 splashLoader.active = true;
262− sessionContainer.surfaceContainer.visible = true;
288+ surfaceContainer.visible = true;
263 } }
289 } }
264 UbuntuNumberAnimation { target: splashLoader; property: "opacity";
290 UbuntuNumberAnimation { target: splashLoader; property: "opacity";
265 from: 0.0; to: 1.0
291 from: 0.0; to: 1.0
266 duration: UbuntuAnimation.BriskDuration }
292 duration: UbuntuAnimation.BriskDuration }
267− PropertyAction { target: sessionContainer.surfaceContainer
293+ PropertyAction { target: surfaceContainer
268 property: "visible"; value: false }
294 property: "visible"; value: false }
269 }
295 }
270 },
296 },
@@ -280,15 +306,16 @@ FocusScope {
280 from: 0.0; to: 1.0
306 from: 0.0; to: 1.0
281 duration: UbuntuAnimation.BriskDuration }
307 duration: UbuntuAnimation.BriskDuration }
282 ScriptAction { script: {
308 ScriptAction { script: {
283− sessionContainer.surfaceContainer.visible = false;
309+ surfaceContainer.visible = false;
284− if (sessionContainer.session) { sessionContainer.session.release(); }
310+ surfaceContainer.surface = null;
311+ d.hadSurface = true;
285 } }
312 } }
286 }
313 }
287 },
314 },
288 Transition {
315 Transition {
289 from: "screenshot"; to: "surface"
316 from: "screenshot"; to: "surface"
290 SequentialAnimation {
317 SequentialAnimation {
291− PropertyAction { target: sessionContainer.surfaceContainer
318+ PropertyAction { target: surfaceContainer
292 property: "visible"; value: true }
319 property: "visible"; value: true }
293 UbuntuNumberAnimation { target: screenshotImage; property: "opacity";
320 UbuntuNumberAnimation { target: screenshotImage; property: "opacity";
294 from: 1.0; to: 0.0
321 from: 1.0; to: 0.0
@@ -316,22 +343,31 @@ FocusScope {
316 ScriptAction { script: {
343 ScriptAction { script: {
317 surfaceIsOldTimer.stop();
344 surfaceIsOldTimer.stop();
318 d.surfaceOldEnoughToBeResized = false;
345 d.surfaceOldEnoughToBeResized = false;
319− sessionContainer.surfaceContainer.visible = false;
346+ surfaceContainer.visible = false;
320− if (sessionContainer.session) { sessionContainer.session.release(); }
321 } }
347 } }
322 },
348 },
323 Transition {
349 Transition {
324 from: "void"; to: "surface"
350 from: "void"; to: "surface"
325 SequentialAnimation {
351 SequentialAnimation {
326− PropertyAction { target: sessionContainer.surfaceContainer; property: "opacity"; value: 0.0 }
352+ PropertyAction { target: surfaceContainer; property: "opacity"; value: 0.0 }
327− PropertyAction { target: sessionContainer.surfaceContainer; property: "visible"; value: true }
353+ PropertyAction { target: surfaceContainer; property: "visible"; value: true }
328− UbuntuNumberAnimation { target: sessionContainer.surfaceContainer; property: "opacity";
354+ UbuntuNumberAnimation { target: surfaceContainer; property: "opacity";
329 from: 0.0; to: 1.0
355 from: 0.0; to: 1.0
330 duration: UbuntuAnimation.BriskDuration }
356 duration: UbuntuAnimation.BriskDuration }
331 ScriptAction { script: {
357 ScriptAction { script: {
332 surfaceIsOldTimer.start();
358 surfaceIsOldTimer.start();
333 } }
359 } }
334 }
360 }
361+ },
362+ Transition {
363+ to: "closed"
364+ SequentialAnimation {
365+ ScriptAction { script: {
366+ surfaceContainer.visible = false;
367+ surfaceContainer.surface = null;
368+ d.hadSurface = true;
369+ } }
370+ }
335 }
371 }
336 ]
372 ]
337 }
373 }
qml/Stages/DecoratedWindow.qml+5−5
@@ -26,10 +26,10 @@ FocusScope {
26 width: applicationWindow.width
26 width: applicationWindow.width
27 height: (decorationShown ? decoration.height : 0) + applicationWindow.height
27 height: (decorationShown ? decoration.height : 0) + applicationWindow.height
28
28
29− property alias window: applicationWindow
30 property alias application: applicationWindow.application
29 property alias application: applicationWindow.application
30+ property alias surface: applicationWindow.surface
31 property alias active: decoration.active
31 property alias active: decoration.active
32− property alias title: decoration.title
32+ readonly property alias title: applicationWindow.title
33 property alias fullscreen: applicationWindow.fullscreen
33 property alias fullscreen: applicationWindow.fullscreen
34
34
35 readonly property bool decorationShown: !fullscreen
35 readonly property bool decorationShown: !fullscreen
@@ -79,11 +79,11 @@ FocusScope {
79 WindowDecoration {
79 WindowDecoration {
80 id: decoration
80 id: decoration
81 target: root.parent
81 target: root.parent
82− objectName: application ? "appWindowDecoration_" + application.appId : "appWindowDecoration_null"
82+ objectName: "appWindowDecoration"
83 anchors { left: parent.left; top: parent.top; right: parent.right }
83 anchors { left: parent.left; top: parent.top; right: parent.right }
84 height: units.gu(3)
84 height: units.gu(3)
85 width: root.width
85 width: root.width
86− title: window.title
86+ title: applicationWindow.title
87 visible: root.decorationShown
87 visible: root.decorationShown
88
88
89 onClose: root.close();
89 onClose: root.close();
@@ -94,7 +94,7 @@ FocusScope {
94
94
95 ApplicationWindow {
95 ApplicationWindow {
96 id: applicationWindow
96 id: applicationWindow
97− objectName: application ? "appWindow_" + application.appId : "appWindow_null"
97+ objectName: "appWindow"
98 anchors.top: parent.top
98 anchors.top: parent.top
99 anchors.topMargin: decoration.height
99 anchors.topMargin: decoration.height
100 anchors.left: parent.left
100 anchors.left: parent.left
qml/Stages/DesktopSpread.qml+22−18
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.3
20import Ubuntu.Gestures 0.1
20import Ubuntu.Gestures 0.1
21import Unity.Application 0.1
21import Unity.Application 0.1
22import "../Components"
22import "../Components"
23+import Utils 0.1
23
24
24FocusScope {
25FocusScope {
25 id: root
26 id: root
@@ -69,12 +70,12 @@ FocusScope {
69 }
70 }
70
71
71 function selectNext(isAutoRepeat) {
72 function selectNext(isAutoRepeat) {
72− if (isAutoRepeat && spreadRepeater.highlightedIndex >= ApplicationManager.count -1) {
73+ if (isAutoRepeat && spreadRepeater.highlightedIndex >= topLevelSurfaceList.count -1) {
73 return; // AutoRepeat is not allowed to wrap around
74 return; // AutoRepeat is not allowed to wrap around
74 }
75 }
75
76
76− spreadRepeater.highlightedIndex = (spreadRepeater.highlightedIndex + 1) % ApplicationManager.count;
77+ spreadRepeater.highlightedIndex = (spreadRepeater.highlightedIndex + 1) % topLevelSurfaceList.count;
77− var newContentX = ((spreadFlickable.contentWidth) / (ApplicationManager.count + 1)) * Math.max(0, Math.min(ApplicationManager.count - 5, spreadRepeater.highlightedIndex - 3));
78+ var newContentX = ((spreadFlickable.contentWidth) / (topLevelSurfaceList.count + 1)) * Math.max(0, Math.min(topLevelSurfaceList.count - 5, spreadRepeater.highlightedIndex - 3));
78 if (spreadFlickable.contentX < newContentX || spreadRepeater.highlightedIndex == 0) {
79 if (spreadFlickable.contentX < newContentX || spreadRepeater.highlightedIndex == 0) {
79 spreadFlickable.snapTo(newContentX)
80 spreadFlickable.snapTo(newContentX)
80 }
81 }
@@ -85,10 +86,10 @@ FocusScope {
85 return; // AutoRepeat is not allowed to wrap around
86 return; // AutoRepeat is not allowed to wrap around
86 }
87 }
87
88
88− var newIndex = spreadRepeater.highlightedIndex - 1 >= 0 ? spreadRepeater.highlightedIndex - 1 : ApplicationManager.count - 1;
89+ var newIndex = spreadRepeater.highlightedIndex - 1 >= 0 ? spreadRepeater.highlightedIndex - 1 : topLevelSurfaceList.count - 1;
89 spreadRepeater.highlightedIndex = newIndex;
90 spreadRepeater.highlightedIndex = newIndex;
90− var newContentX = ((spreadFlickable.contentWidth) / (ApplicationManager.count + 1)) * Math.max(0, Math.min(ApplicationManager.count - 5, spreadRepeater.highlightedIndex - 1));
91+ var newContentX = ((spreadFlickable.contentWidth) / (topLevelSurfaceList.count + 1)) * Math.max(0, Math.min(topLevelSurfaceList.count - 5, spreadRepeater.highlightedIndex - 1));
91− if (spreadFlickable.contentX > newContentX || newIndex == ApplicationManager.count -1) {
92+ if (spreadFlickable.contentX > newContentX || newIndex == topLevelSurfaceList.count -1) {
92 spreadFlickable.snapTo(newContentX)
93 spreadFlickable.snapTo(newContentX)
93 }
94 }
94 }
95 }
@@ -98,8 +99,8 @@ FocusScope {
98 if (spreadContainer.visible) {
99 if (spreadContainer.visible) {
99 root.playFocusAnimation(spreadRepeater.highlightedIndex)
100 root.playFocusAnimation(spreadRepeater.highlightedIndex)
100 }
101 }
101− var application = ApplicationManager.get(spreadRepeater.highlightedIndex);
102+ var surface = topLevelSurfaceList.surfaceAt(spreadRepeater.highlightedIndex);
102− ApplicationManager.requestFocusApplication(application.appId);
103+ surface.requestFocus();
103 }
104 }
104 }
105 }
105
106
@@ -144,7 +145,7 @@ FocusScope {
144 Repeater {
145 Repeater {
145 id: spreadRepeater
146 id: spreadRepeater
146 objectName: "spreadRepeater"
147 objectName: "spreadRepeater"
147− model: ApplicationManager
148+ model: topLevelSurfaceList
148
149
149 property int highlightedIndex: -1
150 property int highlightedIndex: -1
150 property int closingIndex: -1
151 property int closingIndex: -1
@@ -182,7 +183,8 @@ FocusScope {
182 objectName: "clippedSpreadDelegate"
183 objectName: "clippedSpreadDelegate"
183 anchors.left: parent.left
184 anchors.left: parent.left
184 anchors.top: parent.top
185 anchors.top: parent.top
185− application: ApplicationManager.get(index)
186+ application: model.application
187+ surface: model.surface
186 width: spreadMaths.spreadHeight
188 width: spreadMaths.spreadHeight
187 height: spreadMaths.spreadHeight
189 height: spreadMaths.spreadHeight
188
190
@@ -216,7 +218,7 @@ FocusScope {
216 id: spreadMaths
218 id: spreadMaths
217 flickable: spreadFlickable
219 flickable: spreadFlickable
218 itemIndex: index
220 itemIndex: index
219− totalItems: Math.max(6, ApplicationManager.count)
221+ totalItems: Math.max(6, topLevelSurfaceList.count)
220 sceneHeight: root.height
222 sceneHeight: root.height
221 itemHeight: spreadDelegate.height
223 itemHeight: spreadDelegate.height
222 }
224 }
@@ -310,7 +312,7 @@ FocusScope {
310 Layout.preferredWidth: height * 8 / 7.6
312 Layout.preferredWidth: height * 8 / 7.6
311 image: Image {
313 image: Image {
312 anchors.fill: parent
314 anchors.fill: parent
313− source: model.icon
315+ source: model.application.icon
314 Rectangle {
316 Rectangle {
315 anchors.fill: parent
317 anchors.fill: parent
316 color: "black"
318 color: "black"
@@ -324,7 +326,9 @@ FocusScope {
324 Label {
326 Label {
325 Layout.fillWidth: true
327 Layout.fillWidth: true
326 Layout.preferredHeight: units.gu(6)
328 Layout.preferredHeight: units.gu(6)
327− text: model.name
329+ property string surfaceName: model.surface ? model.surface.name : ""
330+ property string applicationName: model.application ? model.application.name : ""
331+ text: surfaceName ? surfaceName : applicationName
328 wrapMode: Text.WordWrap
332 wrapMode: Text.WordWrap
329 elide: Text.ElideRight
333 elide: Text.ElideRight
330 maximumLineCount: 2
334 maximumLineCount: 2
@@ -354,7 +358,7 @@ FocusScope {
354 anchors.margins: -units.gu(2)
358 anchors.margins: -units.gu(2)
355 onClicked: {
359 onClicked: {
356 spreadRepeater.closingIndex = index;
360 spreadRepeater.closingIndex = index;
357− ApplicationManager.stopApplication(model.appId)
361+ model.surface.close();
358 }
362 }
359 }
363 }
360 }
364 }
@@ -421,7 +425,7 @@ FocusScope {
421 objectName: "spreadFlickable"
425 objectName: "spreadFlickable"
422 anchors.fill: parent
426 anchors.fill: parent
423 property int minContentWidth: 6 * Math.min(height / 4, width / 5)
427 property int minContentWidth: 6 * Math.min(height / 4, width / 5)
424− contentWidth: Math.max(6, ApplicationManager.count) * Math.min(height / 4, width / 5)
428+ contentWidth: Math.max(6, topLevelSurfaceList.count) * Math.min(height / 4, width / 5)
425 enabled: false
429 enabled: false
426
430
427 function snapTo(contentX) {
431 function snapTo(contentX) {
@@ -523,7 +527,7 @@ FocusScope {
523 Label {
527 Label {
524 id: currentSelectedLabel
528 id: currentSelectedLabel
525 anchors { bottom: parent.bottom; bottomMargin: root.height * 0.625; horizontalCenter: parent.horizontalCenter }
529 anchors { bottom: parent.bottom; bottomMargin: root.height * 0.625; horizontalCenter: parent.horizontalCenter }
526− text: spreadRepeater.highlightedIndex >= 0 ? ApplicationManager.get(spreadRepeater.highlightedIndex).name : ""
530+ text: spreadRepeater.highlightedIndex >= 0 ? topLevelSurfaceList.surfaceAt(spreadRepeater.highlightedIndex).name : ""
527 visible: false
531 visible: false
528 fontSize: "large"
532 fontSize: "large"
529 }
533 }
@@ -545,7 +549,7 @@ FocusScope {
545 from: "*"
549 from: "*"
546 to: "altTab"
550 to: "altTab"
547 SequentialAnimation {
551 SequentialAnimation {
548− PropertyAction { target: spreadRepeater; property: "highlightedIndex"; value: Math.min(ApplicationManager.count - 1, 1) }
552+ PropertyAction { target: spreadRepeater; property: "highlightedIndex"; value: Math.min(topLevelSurfaceList.count - 1, 1) }
549 PauseAnimation { duration: spreadContainer.animateIn ? 0 : 140 }
553 PauseAnimation { duration: spreadContainer.animateIn ? 0 : 140 }
550 PropertyAction { target: workspaceSelector; property: "visible" }
554 PropertyAction { target: workspaceSelector; property: "visible" }
551 PropertyAction { target: spreadContainer; property: "visible" }
555 PropertyAction { target: spreadContainer; property: "visible" }
qml/Stages/DesktopSpreadDelegate.qml+4−3
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -25,12 +25,13 @@ Item {
25
25
26 property alias window: applicationWindow
26 property alias window: applicationWindow
27 property alias application: applicationWindow.application
27 property alias application: applicationWindow.application
28+ property alias surface: applicationWindow.surface
28
29
29 property bool highlightShown: false
30 property bool highlightShown: false
30 property real shadowOpacity: 1
31 property real shadowOpacity: 1
31
32
32− property int windowWidth: application && application.session && application.session.lastSurface ? application.session.lastSurface.size.width : 0
33+ property int windowWidth: surface ? surface.size.width : 0
33− property int windowHeight: application && application.session && application.session.lastSurface ? application.session.lastSurface.size.height : 0
34+ property int windowHeight: surface ? surface.size.height : 0
34
35
35 state: "normal"
36 state: "normal"
36 states: [
37 states: [
qml/Stages/DesktopStage.qml+158−101
@@ -39,47 +39,18 @@ AbstractStage {
39 // Used by TutorialRight
39 // Used by TutorialRight
40 property bool spreadShown: spread.state == "altTab"
40 property bool spreadShown: spread.state == "altTab"
41
41
42− mainApp: ApplicationManager.focusedApplicationId
43− ? ApplicationManager.findApplication(ApplicationManager.focusedApplicationId)
44− : null
45−
46− mainAppWindow: priv.focusedAppDelegate ? priv.focusedAppDelegate.appWindow : null
42+ mainApp: priv.focusedAppDelegate ? priv.focusedAppDelegate.application : null
47
43
48 // application windows never rotate independently
44 // application windows never rotate independently
49 mainAppWindowOrientationAngle: shellOrientationAngle
45 mainAppWindowOrientationAngle: shellOrientationAngle
50
46
51 orientationChangesEnabled: true
47 orientationChangesEnabled: true
52
48
53− Connections {
54− target: ApplicationManager
55− onApplicationAdded: {
56− if (spread.state == "altTab") {
57− spread.state = "";
58− }
59−
60− ApplicationManager.focusApplication(appId);
61− }
62−
63− onApplicationRemoved: {
64− priv.focusNext();
65− }
66−
67− onFocusRequested: {
68− var appIndex = priv.indexOf(appId);
69− var appDelegate = appRepeater.itemAt(appIndex);
70− appDelegate.restore();
71−
72− if (spread.state == "altTab") {
73− spread.cancel();
74− }
75− }
76− }
77−
78 GlobalShortcut {
49 GlobalShortcut {
79 id: closeWindowShortcut
50 id: closeWindowShortcut
80 shortcut: Qt.AltModifier|Qt.Key_F4
51 shortcut: Qt.AltModifier|Qt.Key_F4
81− onTriggered: ApplicationManager.stopApplication(priv.focusedAppId)
52+ onTriggered: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.close(); } }
82− active: priv.focusedAppId !== ""
53+ active: priv.focusedAppDelegate !== null
83 }
54 }
84
55
85 GlobalShortcut {
56 GlobalShortcut {
@@ -123,40 +94,40 @@ AbstractStage {
123 active: priv.focusedAppDelegate !== null
94 active: priv.focusedAppDelegate !== null
124 }
95 }
125
96
97+ Connections {
98+ target: root.topLevelSurfaceList
99+ onCountChanged: {
100+ if (spread.state == "altTab") {
101+ spread.cancel();
102+ }
103+ }
104+ }
105+
126 QtObject {
106 QtObject {
127 id: priv
107 id: priv
108+ objectName: "DesktopStagePrivate"
128
109
129− readonly property string focusedAppId: ApplicationManager.focusedApplicationId
130− readonly property var focusedAppDelegate: {
110+ property var focusedAppDelegate: null
131− var index = indexOf(focusedAppId);
111+ onFocusedAppDelegateChanged: {
132− return index >= 0 && index < appRepeater.count ? appRepeater.itemAt(index) : null
112+ if (spread.state == "altTab") {
113+ spread.state = "";
114+ }
133 }
115 }
134− onFocusedAppDelegateChanged: updateForegroundMaximizedApp();
135
116
136− property int foregroundMaximizedAppZ: -1
137− property int foregroundMaximizedAppIndex: -1 // for stuff like drop shadow and focusing maximized app by clicking panel
117+ property var foregroundMaximizedAppDelegate: null // for stuff like drop shadow and focusing maximized app by clicking panel
138
118
139 function updateForegroundMaximizedApp() {
119 function updateForegroundMaximizedApp() {
140− var tmp = -1;
120+ var found = false;
141− var tmpAppId = -1;
142− for (var i = appRepeater.count - 1; i >= 0; i--) {
121+ for (var i = 0; i < appRepeater.count && !found; i++) {
143 var item = appRepeater.itemAt(i);
122 var item = appRepeater.itemAt(i);
144 if (item && item.visuallyMaximized) {
123 if (item && item.visuallyMaximized) {
145− tmpAppId = i;
124+ foregroundMaximizedAppDelegate = item;
146− tmp = Math.max(tmp, item.normalZ);
125+ found = true;
147 }
126 }
148 }
127 }
149− foregroundMaximizedAppZ = tmp;
128+ if (!found) {
150− foregroundMaximizedAppIndex = tmpAppId;
129+ foregroundMaximizedAppDelegate = null;
151− }
152−
153− function indexOf(appId) {
154− for (var i = 0; i < ApplicationManager.count; i++) {
155− if (ApplicationManager.get(i).appId == appId) {
156− return i;
157− }
158 }
130 }
159− return -1;
160 }
131 }
161
132
162 function minimizeAllWindows() {
133 function minimizeAllWindows() {
@@ -166,16 +137,13 @@ AbstractStage {
166 appDelegate.minimize();
137 appDelegate.minimize();
167 }
138 }
168 }
139 }
169−
170− ApplicationManager.unfocusCurrentApplication(); // no app should have focus at this point
171 }
140 }
172
141
173 function focusNext() {
142 function focusNext() {
174− ApplicationManager.unfocusCurrentApplication();
175 for (var i = 0; i < appRepeater.count; i++) {
143 for (var i = 0; i < appRepeater.count; i++) {
176 var appDelegate = appRepeater.itemAt(i);
144 var appDelegate = appRepeater.itemAt(i);
177 if (appDelegate && !appDelegate.minimized) {
145 if (appDelegate && !appDelegate.minimized) {
178− ApplicationManager.focusApplication(appDelegate.appId);
146+ appDelegate.focus = true;
179 return;
147 return;
180 }
148 }
181 }
149 }
@@ -184,15 +152,14 @@ AbstractStage {
184
152
185 Connections {
153 Connections {
186 target: PanelState
154 target: PanelState
187− onClose: {
155+ onClose: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.close(); } }
188− ApplicationManager.stopApplication(ApplicationManager.focusedApplicationId)
156+ onMinimize: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.minimize(); } }
157+ onMaximize: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.restoreFromMaximized(); } }
158+ onFocusMaximizedApp: {
159+ if (priv.foregroundMaximizedAppDelegate) {
160+ priv.foregroundMaximizedAppDelegate.focus = true;
161+ }
189 }
162 }
190− onMinimize: priv.focusedAppDelegate && priv.focusedAppDelegate.minimize();
191− onMaximize: priv.focusedAppDelegate // don't restore minimized apps when double clicking the panel
192− && priv.focusedAppDelegate.restoreFromMaximized();
193− onFocusMaximizedApp: if (priv.foregroundMaximizedAppIndex != -1) {
194− ApplicationManager.focusApplication(appRepeater.itemAt(priv.foregroundMaximizedAppIndex).appId);
195− }
196 }
163 }
197
164
198 Binding {
165 Binding {
@@ -220,7 +187,7 @@ AbstractStage {
220 Binding {
187 Binding {
221 target: PanelState
188 target: PanelState
222 property: "dropShadow"
189 property: "dropShadow"
223− value: priv.focusedAppDelegate && !priv.focusedAppDelegate.maximized && priv.foregroundMaximizedAppIndex !== -1
190+ value: priv.focusedAppDelegate && !priv.focusedAppDelegate.maximized && priv.foregroundMaximizedAppDelegate !== null
224 }
191 }
225
192
226 Component.onDestruction: {
193 Component.onDestruction: {
@@ -229,6 +196,27 @@ AbstractStage {
229 PanelState.dropShadow = false;
196 PanelState.dropShadow = false;
230 }
197 }
231
198
199+ Instantiator {
200+ model: root.applicationManager
201+ delegate: Binding {
202+ target: model.application
203+ property: "requestedState"
204+
205+ // TODO: figure out some lifecycle policy, like suspending minimized apps
206+ // if running on a tablet or something.
207+ // TODO: If the device has a dozen suspended apps because it was running
208+ // in staged mode, when it switches to Windowed mode it will suddenly
209+ // resume all those apps at once. We might want to avoid that.
210+ value: ApplicationInfoInterface.RequestedRunning // Always running for now
211+ }
212+ }
213+
214+ Binding {
215+ target: MirFocusController
216+ property: "focusedSurface"
217+ value: priv.focusedAppDelegate ? priv.focusedAppDelegate.surface : null
218+ when: !appRepeater.startingUp && root.parent
219+ }
232
220
233 FocusScope {
221 FocusScope {
234 id: appContainer
222 id: appContainer
@@ -244,20 +232,25 @@ AbstractStage {
244 fillMode: Image.PreserveAspectCrop
232 fillMode: Image.PreserveAspectCrop
245 }
233 }
246
234
247− Repeater {
235+ TopLevelSurfaceRepeater {
248 id: appRepeater
236 id: appRepeater
249− model: ApplicationManager
237+ model: topLevelSurfaceList
250 objectName: "appRepeater"
238 objectName: "appRepeater"
251
239
252 delegate: FocusScope {
240 delegate: FocusScope {
253 id: appDelegate
241 id: appDelegate
254− objectName: "appDelegate_" + appId
242+ objectName: "appDelegate_" + model.id
255 // z might be overriden in some cases by effects, but we need z ordering
243 // z might be overriden in some cases by effects, but we need z ordering
256 // to calculate occlusion detection
244 // to calculate occlusion detection
257− property int normalZ: ApplicationManager.count - index
245+ property int normalZ: topLevelSurfaceList.count - index
246+ onNormalZChanged: {
247+ if (visuallyMaximized) {
248+ priv.updateForegroundMaximizedApp();
249+ }
250+ }
258 z: normalZ
251 z: normalZ
259 y: PanelState.panelHeight
252 y: PanelState.panelHeight
260− focus: appId === priv.focusedAppId
253+
261 width: decoratedWindow.width
254 width: decoratedWindow.width
262 height: decoratedWindow.height
255 height: decoratedWindow.height
263 property int requestedWidth: -1
256 property int requestedWidth: -1
@@ -282,38 +275,99 @@ AbstractStage {
282 readonly property alias minimized: appDelegatePrivate.minimized
275 readonly property alias minimized: appDelegatePrivate.minimized
283 readonly property alias fullscreen: decoratedWindow.fullscreen
276 readonly property alias fullscreen: decoratedWindow.fullscreen
284
277
285− readonly property string appId: model.appId
278+ readonly property var application: model.application
286 property bool animationsEnabled: true
279 property bool animationsEnabled: true
287 property alias title: decoratedWindow.title
280 property alias title: decoratedWindow.title
288− readonly property string appName: model.name
281+ readonly property string appName: model.application ? model.application.name : ""
289 property bool visuallyMaximized: false
282 property bool visuallyMaximized: false
290 property bool visuallyMinimized: false
283 property bool visuallyMinimized: false
291
284
292− readonly property alias appWindow: decoratedWindow.window
285+ readonly property var surface: model.surface
286+
287+ function claimFocus() {
288+ if (spread.state == "altTab") {
289+ spread.cancel();
290+ }
291+ appDelegate.restore();
292+ }
293+ Connections {
294+ target: model.surface
295+ onFocusRequested: claimFocus();
296+ }
297+ Connections {
298+ target: model.application
299+ onFocusRequested: {
300+ if (!model.surface) {
301+ // when an app has no surfaces, we assume there's only one entry representing it:
302+ // this delegate.
303+ claimFocus();
304+ } else {
305+ // if the application has surfaces, focus request should be at surface-level.
306+ }
307+ }
308+ }
293
309
294 onFocusChanged: {
310 onFocusChanged: {
295− if (focus && ApplicationManager.focusedApplicationId !== appId) {
311+ if (appRepeater.startingUp)
296− ApplicationManager.focusApplication(appId);
312+ return;
313+
314+ if (focus) {
315+ priv.focusedAppDelegate = appDelegate;
316+
317+ // If we're orphan (!parent) it means this stage is no longer the current one
318+ // and will be deleted shortly. So we should no longer have a say over the model
319+ if (root.parent) {
320+ topLevelSurfaceList.raiseId(model.id);
321+ }
322+ } else if (!focus && priv.focusedAppDelegate === appDelegate) {
323+ priv.focusedAppDelegate = null;
324+ // FIXME: No idea why the Binding{} doens't update when focusedAppDelegate turns null
325+ MirFocusController.focusedSurface = null;
326+ }
327+ }
328+ Component.onCompleted: {
329+ // NB: We're differentiating if this delegate was created in response to a new entry in the model
330+ // or if the Repeater is just populating itself with delegates to match the model it received.
331+ if (!appRepeater.startingUp) {
332+ // a top level window is always the focused one when it first appears, unfocusing
333+ // any preexisting one
334+ focus = true;
335+ }
336+ }
337+ Component.onDestruction: {
338+ if (!root.parent) {
339+ // This stage is about to be destroyed. Don't mess up with the model at this point
340+ return;
341+ }
342+
343+ if (visuallyMaximized) {
344+ priv.updateForegroundMaximizedApp();
345+ }
346+
347+ if (focus) {
348+ // focus some other window
349+ for (var i = 0; i < appRepeater.count; i++) {
350+ var appDelegate = appRepeater.itemAt(i);
351+ if (appDelegate && !appDelegate.minimized && i != index) {
352+ appDelegate.focus = true;
353+ return;
354+ }
355+ }
297 }
356 }
298 }
357 }
299
358
300 onVisuallyMaximizedChanged: priv.updateForegroundMaximizedApp()
359 onVisuallyMaximizedChanged: priv.updateForegroundMaximizedApp()
301
360
361+ visible: (
302− visible: !visuallyMinimized &&
362+ !visuallyMinimized
303− !greeter.fullyShown &&
363+ && !greeter.fullyShown
304− (priv.foregroundMaximizedAppZ === -1 || priv.foregroundMaximizedAppZ <= z) ||
364+ && (priv.foregroundMaximizedAppDelegate === null || priv.foregroundMaximizedAppDelegate.normalZ <= z)
365+ )
305− decoratedWindow.fullscreen ||
366+ || decoratedWindow.fullscreen
306− (spread.state == "altTab" && index === spread.highlightedIndex)
367+ || (spread.state == "altTab" && index === spread.highlightedIndex)
307
368
308− Binding {
369+ function close() {
309− target: ApplicationManager.get(index)
370+ model.surface.close();
310− property: "requestedState"
311− // TODO: figure out some lifecycle policy, like suspending minimized apps
312− // if running on a tablet or something.
313− // TODO: If the device has a dozen suspended apps because it was running
314− // in staged mode, when it switches to Windowed mode it will suddenly
315− // resume all those apps at once. We might want to avoid that.
316− value: ApplicationInfoInterface.RequestedRunning // Always running for now
317 }
371 }
318
372
319 function maximize(animated) {
373 function maximize(animated) {
@@ -355,7 +409,8 @@ AbstractStage {
355 maximizeLeft();
409 maximizeLeft();
356 else if (maximizedRight)
410 else if (maximizedRight)
357 maximizeRight();
411 maximizeRight();
358− ApplicationManager.focusApplication(appId);
412+
413+ focus = true;
359 }
414 }
360
415
361 function playFocusAnimation() {
416 function playFocusAnimation() {
@@ -373,7 +428,7 @@ AbstractStage {
373
428
374 states: [
429 states: [
375 State {
430 State {
376− name: "fullscreen"; when: decoratedWindow.fullscreen
431+ name: "fullscreen"; when: decoratedWindow.fullscreen && !appDelegate.minimized
377 PropertyChanges {
432 PropertyChanges {
378 target: appDelegate;
433 target: appDelegate;
379 x: 0;
434 x: 0;
@@ -466,6 +521,7 @@ AbstractStage {
466 ScriptAction {
521 ScriptAction {
467 script: {
522 script: {
468 if (appDelegate.minimized) {
523 if (appDelegate.minimized) {
524+ appDelegate.focus = false;
469 priv.focusNext();
525 priv.focusNext();
470 }
526 }
471 }
527 }
@@ -490,7 +546,7 @@ AbstractStage {
490 id: previewBinding
546 id: previewBinding
491 target: appDelegate
547 target: appDelegate
492 property: "z"
548 property: "z"
493− value: ApplicationManager.count + 1
549+ value: topLevelSurfaceList.count + 1
494 when: index == spread.highlightedIndex && spread.ready
550 when: index == spread.highlightedIndex && spread.ready
495 }
551 }
496
552
@@ -501,12 +557,12 @@ AbstractStage {
501 minWidth: units.gu(10)
557 minWidth: units.gu(10)
502 minHeight: units.gu(10)
558 minHeight: units.gu(10)
503 borderThickness: units.gu(2)
559 borderThickness: units.gu(2)
504− windowId: model.appId // FIXME: Change this to point to windowId once we have such a thing
560+ windowId: model.application.appId // FIXME: Change this to point to windowId once we have such a thing
505 screenWidth: appContainer.width
561 screenWidth: appContainer.width
506 screenHeight: appContainer.height
562 screenHeight: appContainer.height
507 leftMargin: root.leftMargin
563 leftMargin: root.leftMargin
508
564
509− onPressed: { ApplicationManager.focusApplication(model.appId) }
565+ onPressed: { appDelegate.focus = true; }
510
566
511 Component.onCompleted: {
567 Component.onCompleted: {
512 loadWindowState();
568 loadWindowState();
@@ -533,24 +589,25 @@ AbstractStage {
533 objectName: "decoratedWindow"
589 objectName: "decoratedWindow"
534 anchors.left: appDelegate.left
590 anchors.left: appDelegate.left
535 anchors.top: appDelegate.top
591 anchors.top: appDelegate.top
536− application: ApplicationManager.get(index)
592+ application: model.application
537− active: ApplicationManager.focusedApplicationId === model.appId
593+ surface: model.surface
594+ active: appDelegate.focus
538 focus: true
595 focus: true
539
596
540 requestedWidth: appDelegate.requestedWidth
597 requestedWidth: appDelegate.requestedWidth
541 requestedHeight: appDelegate.requestedHeight
598 requestedHeight: appDelegate.requestedHeight
542
599
543− onClose: ApplicationManager.stopApplication(model.appId)
600+ onClose: { appDelegate.close(); }
544 onMaximize: appDelegate.maximized || appDelegate.maximizedLeft || appDelegate.maximizedRight
601 onMaximize: appDelegate.maximized || appDelegate.maximizedLeft || appDelegate.maximizedRight
545 ? appDelegate.restoreFromMaximized() : appDelegate.maximize()
602 ? appDelegate.restoreFromMaximized() : appDelegate.maximize()
546 onMinimize: appDelegate.minimize()
603 onMinimize: appDelegate.minimize()
547− onDecorationPressed: { ApplicationManager.focusApplication(model.appId) }
604+ onDecorationPressed: { appDelegate.focus = true; }
548 }
605 }
549
606
550 WindowedFullscreenPolicy {
607 WindowedFullscreenPolicy {
551 id: fullscreenPolicy
608 id: fullscreenPolicy
552 active: true
609 active: true
553− application: decoratedWindow.application
610+ surface: model.surface
554 }
611 }
555 }
612 }
556 }
613 }
qml/Stages/PhoneStage.qml+152−91
@@ -26,7 +26,6 @@ import "../Components"
26AbstractStage {
26AbstractStage {
27 id: root
27 id: root
28
28
29− property QtObject applicationManager: ApplicationManager
30 property bool focusFirstApp: true // If false, focused app will appear on right edge like other apps
29 property bool focusFirstApp: true // If false, focused app will appear on right edge like other apps
31 property bool altTabEnabled: true
30 property bool altTabEnabled: true
32 property real startScale: 1.1
31 property real startScale: 1.1
@@ -107,11 +106,7 @@ AbstractStage {
107 }
106 }
108 }
107 }
109
108
110− mainApp: applicationManager.focusedApplicationId
111− ? applicationManager.findApplication(applicationManager.focusedApplicationId)
112− : null
113−
114− mainAppWindow: priv.focusedAppDelegate ? priv.focusedAppDelegate.appWindow : null
109+ mainApp: priv.focusedAppDelegate ? priv.focusedAppDelegate.application : null
115
110
116 orientationChangesEnabled: priv.focusedAppOrientationChangesEnabled
111 orientationChangesEnabled: priv.focusedAppOrientationChangesEnabled
117 && !priv.focusedAppDelegateIsDislocated
112 && !priv.focusedAppDelegateIsDislocated
@@ -160,72 +155,27 @@ AbstractStage {
160 onTriggered: { root.beingResized = false; }
155 onTriggered: { root.beingResized = false; }
161 }
156 }
162
157
163− Connections {
164− target: applicationManager
165−
166− onFocusRequested: {
167− if (spreadView.phase > 0) {
168− spreadView.snapTo(priv.indexOf(appId));
169− } else {
170− applicationManager.focusApplication(appId);
171− }
172− }
173−
174− onApplicationAdded: {
175− if (spreadView.phase == 2) {
176− spreadView.snapTo(applicationManager.count - 1);
177− } else {
178− spreadView.phase = 0;
179− spreadView.contentX = -spreadView.shift;
180− applicationManager.focusApplication(appId);
181− }
182− }
183−
184− onApplicationRemoved: {
185− // Unless we're closing the app ourselves in the spread,
186− // lets make sure the spread doesn't mess up by the changing app list.
187− if (spreadView.closingIndex == -1) {
188− spreadView.phase = 0;
189− spreadView.contentX = -spreadView.shift;
190− focusTopMostApp();
191− }
192− }
193−
194− function focusTopMostApp() {
195− if (applicationManager.count > 0) {
196− var topmostApp = applicationManager.get(0);
197− applicationManager.focusApplication(topmostApp.appId);
198− }
199− }
200− }
201−
202 QtObject {
158 QtObject {
203 id: priv
159 id: priv
204
160
205− property string focusedAppId: root.applicationManager.focusedApplicationId
206 property bool focusedAppOrientationChangesEnabled: false
161 property bool focusedAppOrientationChangesEnabled: false
207 readonly property int firstSpreadIndex: root.focusFirstApp ? 1 : 0
162 readonly property int firstSpreadIndex: root.focusFirstApp ? 1 : 0
208− readonly property var focusedAppDelegate: {
163+ property var focusedAppDelegate
209− var index = indexOf(focusedAppId);
164+ // NB! This may differ from applicationManager.focusedApplicationId if focusedAppDelegate
210− return index >= 0 && index < spreadRepeater.count ? spreadRepeater.itemAt(index) : null
165+ // contains a screenshot instead of a surface.
211− }
166+ property string focusedAppId: focusedAppDelegate ? focusedAppDelegate.application.appId : ""
212
167
213 property real oldInverseProgress: 0
168 property real oldInverseProgress: 0
214 property bool animateX: false
169 property bool animateX: false
215 property int highlightIndex: 0
170 property int highlightIndex: 0
216
171
217− onFocusedAppDelegateChanged: {
218− if (focusedAppDelegate) {
219− focusedAppDelegate.focus = true;
220− }
221− }
222−
223− property bool focusedAppDelegateIsDislocated: focusedAppDelegate &&
172+ property bool focusedAppDelegateIsDislocated: focusedAppDelegate ?
224 (focusedAppDelegate.x !== 0 || focusedAppDelegate.xBehavior.running)
173 (focusedAppDelegate.x !== 0 || focusedAppDelegate.xBehavior.running)
174+ : false
225
175
226 function indexOf(appId) {
176 function indexOf(appId) {
227− for (var i = 0; i < root.applicationManager.count; i++) {
177+ for (var i = 0; i < spreadRepeater.count; i++) {
228− if (root.applicationManager.get(i).appId == appId) {
178+ if (spreadRepeater.itemAt(i).application.appId == appId) {
229 return i;
179 return i;
230 }
180 }
231 }
181 }
@@ -239,8 +189,8 @@ AbstractStage {
239 function reset() {
189 function reset() {
240 // The app that's about to go to foreground has to be focused, otherwise
190 // The app that's about to go to foreground has to be focused, otherwise
241 // it would leave us in an inconsistent state.
191 // it would leave us in an inconsistent state.
242− if (!root.applicationManager.focusedApplicationId && root.applicationManager.count > 0) {
192+ if (!MirFocusController.focusedSurface && spreadRepeater.count > 0) {
243− root.applicationManager.focusApplication(root.applicationManager.get(0).appId);
193+ spreadRepeater.itemAt(0).focus = true;
244 }
194 }
245
195
246 spreadView.selectedIndex = -1;
196 spreadView.selectedIndex = -1;
@@ -260,6 +210,36 @@ AbstractStage {
260 }
210 }
261 }
211 }
262
212
213+ Instantiator {
214+ model: root.applicationManager
215+ delegate: QtObject {
216+ property var stateBinding: Binding {
217+ readonly property bool isDash: model.application ? model.application.appId == "unity8-dash" : false
218+ target: model.application
219+ property: "requestedState"
220+ value: (isDash && root.keepDashRunning)
221+ || (!root.suspended && model.application && priv.focusedAppId === model.application.appId)
222+ ? ApplicationInfoInterface.RequestedRunning
223+ : ApplicationInfoInterface.RequestedSuspended
224+ }
225+
226+ property var lifecycleBinding: Binding {
227+ target: model.application
228+ property: "exemptFromLifecycle"
229+ value: model.application
230+ ? (!model.application.isTouchApp || isExemptFromLifecycle(model.application.appId))
231+ : false
232+ }
233+ }
234+ }
235+
236+ Binding {
237+ target: MirFocusController
238+ property: "focusedSurface"
239+ value: priv.focusedAppDelegate ? priv.focusedAppDelegate.surface : null
240+ when: root.parent && !spreadRepeater.startingUp
241+ }
242+
263 Flickable {
243 Flickable {
264 id: spreadView
244 id: spreadView
265 objectName: "spreadView"
245 objectName: "spreadView"
@@ -310,13 +290,38 @@ AbstractStage {
310 // rely on having Flickable.contentX keeping an out-of-bounds value when it's set programatically
290 // rely on having Flickable.contentX keeping an out-of-bounds value when it's set programatically
311 // (as opposed to having contentX reaching an out-of-bounds value through dragging, which will trigger
291 // (as opposed to having contentX reaching an out-of-bounds value through dragging, which will trigger
312 // the Flickable.boundsBehavior upon release).
292 // the Flickable.boundsBehavior upon release).
293+ onContentXChanged: {
294+ if (!undoContentXReset()) {
313− onContentXChanged: { forceItToRemainStillIfBeingResized(); }
295+ forceItToRemainStillIfBeingResized();
296+ }
297+ }
314 onShiftChanged: { forceItToRemainStillIfBeingResized(); }
298 onShiftChanged: { forceItToRemainStillIfBeingResized(); }
315 function forceItToRemainStillIfBeingResized() {
299 function forceItToRemainStillIfBeingResized() {
316 if (root.beingResized && contentX != -spreadView.shift) {
300 if (root.beingResized && contentX != -spreadView.shift) {
317 contentX = -spreadView.shift;
301 contentX = -spreadView.shift;
318 }
302 }
319 }
303 }
304+ function undoContentXReset() {
305+ if (contentWidth <= 0) {
306+ contentWidthOnLastContentXChange = contentWidth;
307+ lastContentX = contentX;
308+ return false;
309+ }
310+
311+ if (contentWidth !== contentWidthOnLastContentXChange
312+ && lastContentX === -shift && contentX === 0) {
313+ // Flickable is resetting contentX because contentWidth has changed. Undo it.
314+ contentX = -shift;
315+ return true;
316+ }
317+
318+ contentWidthOnLastContentXChange = contentWidth;
319+ lastContentX = contentX;
320+ return false;
321+ }
322+ property real contentWidthOnLastContentXChange: -1
323+ property real lastContentX: 0
324+ // </FIXME-contentX>
320
325
321 Behavior on contentX {
326 Behavior on contentX {
322 enabled: root.altTabPressed
327 enabled: root.altTabPressed
@@ -379,7 +384,7 @@ AbstractStage {
379 snapAnimation.start();
384 snapAnimation.start();
380 return;
385 return;
381 }
386 }
382− if (root.applicationManager.count <= index) {
387+ if (topLevelSurfaceList.count <= index) {
383 // In case we're trying to snap to some non existing app, lets snap back to the first one
388 // In case we're trying to snap to some non existing app, lets snap back to the first one
384 index = 0;
389 index = 0;
385 }
390 }
@@ -416,7 +421,8 @@ AbstractStage {
416 ScriptAction {
421 ScriptAction {
417 script: {
422 script: {
418 if (spreadView.selectedIndex >= 0) {
423 if (spreadView.selectedIndex >= 0) {
419− root.applicationManager.focusApplication(root.applicationManager.get(spreadView.selectedIndex).appId);
424+ var delegate = spreadRepeater.itemAt(spreadView.selectedIndex)
425+ delegate.focus = true;
420
426
421 spreadView.selectedIndex = -1;
427 spreadView.selectedIndex = -1;
422 spreadView.phase = 0;
428 spreadView.phase = 0;
@@ -431,7 +437,7 @@ AbstractStage {
431 // This width controls how much the spread can be flicked left/right. It's composed of:
437 // This width controls how much the spread can be flicked left/right. It's composed of:
432 // tileDistance * app count (with a minimum of 3 apps, in order to also allow moving 1 and 2 apps a bit)
438 // tileDistance * app count (with a minimum of 3 apps, in order to also allow moving 1 and 2 apps a bit)
433 // + some constant value (still scales with the screen width) which looks good and somewhat fills the screen
439 // + some constant value (still scales with the screen width) which looks good and somewhat fills the screen
434− width: Math.max(3, root.applicationManager.count) * spreadView.tileDistance + (spreadView.width - spreadView.tileDistance) * 1.5
440+ width: Math.max(3, topLevelSurfaceList.count) * spreadView.tileDistance + (spreadView.width - spreadView.tileDistance) * 1.5
435 height: parent.height
441 height: parent.height
436 Behavior on width {
442 Behavior on width {
437 enabled: spreadView.closingIndex >= 0
443 enabled: spreadView.closingIndex >= 0
@@ -451,13 +457,30 @@ AbstractStage {
451 }
457 }
452 }
458 }
453
459
454− Repeater {
460+ TopLevelSurfaceRepeater {
455 id: spreadRepeater
461 id: spreadRepeater
456 objectName: "spreadRepeater"
462 objectName: "spreadRepeater"
457− model: root.applicationManager
463+ model: topLevelSurfaceList
464+
465+ onItemRemoved: {
466+ // Unless we're closing the app ourselves in the spread,
467+ // lets make sure the spread doesn't mess up by the changing app list.
468+ if (spreadView.closingIndex == -1) {
469+ spreadView.phase = 0;
470+ spreadView.contentX = -spreadView.shift;
471+ focusTopMostApp();
472+ }
473+ }
474+ function focusTopMostApp() {
475+ if (spreadRepeater.count > 0) {
476+ var topmostDelegate = spreadRepeater.itemAt(0);
477+ topmostDelegate.focus = true;
478+ }
479+ }
480+
458 delegate: TransformedSpreadDelegate {
481 delegate: TransformedSpreadDelegate {
459 id: appDelegate
482 id: appDelegate
460− objectName: "appDelegate" + index
483+ objectName: "spreadDelegate_" + model.id
461 startAngle: 45
484 startAngle: 45
462 endAngle: 5
485 endAngle: 5
463 startScale: root.startScale
486 startScale: root.startScale
@@ -469,28 +492,61 @@ AbstractStage {
469 selected: spreadView.selectedIndex == index
492 selected: spreadView.selectedIndex == index
470 otherSelected: spreadView.selectedIndex >= 0 && !selected
493 otherSelected: spreadView.selectedIndex >= 0 && !selected
471 interactive: !spreadView.interactive && spreadView.phase === 0
494 interactive: !spreadView.interactive && spreadView.phase === 0
472− && priv.fullyShowingFocusedApp && root.interactive && isFocused
495+ && priv.fullyShowingFocusedApp && root.interactive && focus
473 swipeToCloseEnabled: spreadView.interactive && root.interactive && !snapAnimation.running
496 swipeToCloseEnabled: spreadView.interactive && root.interactive && !snapAnimation.running
474 maximizedAppTopMargin: root.maximizedAppTopMargin
497 maximizedAppTopMargin: root.maximizedAppTopMargin
475 dropShadow: spreadView.active || priv.focusedAppDelegateIsDislocated
498 dropShadow: spreadView.active || priv.focusedAppDelegateIsDislocated
476 focusFirstApp: root.focusFirstApp
499 focusFirstApp: root.focusFirstApp
477 highlightShown: root.altTabPressed && index === priv.highlightIndex
500 highlightShown: root.altTabPressed && index === priv.highlightIndex
478
501
479− readonly property bool isDash: model.appId == "unity8-dash"
502+ readonly property bool isDash: model.application.appId == "unity8-dash"
480−
503+
481− Binding {
504+ Component.onCompleted: {
482− target: appDelegate.application
505+ // NB: We're differentiating if this delegate was created in response to a new entry in the model
483− property: "exemptFromLifecycle"
506+ // or if the Repeater is just populating itself with delegates to match the model it received.
484− value: !model.isTouchApp || isExemptFromLifecycle(model.appId)
507+ if (!spreadRepeater.startingUp) {
508+ // a top level window is always the focused one when it first appears, unfocusing
509+ // any preexisting one
510+ //
511+ // new items are appended and must be manually brought to front.
512+ // that's how it *must* be in order to get the animation for new
513+ // surfaces working
514+ claimFocus();
515+ }
485 }
516 }
486
517
487− Binding {
518+ onFocusChanged: {
519+ if (focus && !spreadRepeater.startingUp) {
520+ priv.focusedAppDelegate = appDelegate;
521+ // If we're orphan (!parent) it means this stage is no longer the current one
522+ // and will be deleted shortly. So we should no longer have a say over the model
523+ if (root.parent) {
524+ topLevelSurfaceList.raiseId(model.id);
525+ }
526+ }
527+ }
528+ function claimFocus() {
529+ if (spreadView.phase > 0) {
530+ spreadView.snapTo(model.index);
531+ } else {
488− target: appDelegate.application
532+ appDelegate.focus = true;
489− property: "requestedState"
533+ }
490− value: (isDash && root.keepDashRunning)
534+ }
491− || (!root.suspended && appDelegate.focus)
535+ Connections {
492− ? ApplicationInfoInterface.RequestedRunning
536+ target: model.surface
493− : ApplicationInfoInterface.RequestedSuspended
537+ onFocusRequested: claimFocus()
538+ }
539+ Connections {
540+ target: model.application
541+ onFocusRequested: {
542+ if (!model.surface) {
543+ // when an app has no surfaces, we assume there's only one entry representing it:
544+ // this delegate.
545+ claimFocus();
546+ } else {
547+ // if the application has surfaces, focus request should be at surface-level.
548+ }
549+ }
494 }
550 }
495
551
496 z: isDash && !spreadView.active ? -1 : behavioredIndex
552 z: isDash && !spreadView.active ? -1 : behavioredIndex
@@ -511,7 +567,8 @@ AbstractStage {
511 return spreadView.width + spreadIndex * spreadView.tileDistance;
567 return spreadView.width + spreadIndex * spreadView.tileDistance;
512 }
568 }
513
569
514− application: root.applicationManager.get(index)
570+ application: model.application
571+ surface: model.surface
515 closeable: !isDash
572 closeable: !isDash
516
573
517 property real behavioredIndex: index
574 property real behavioredIndex: index
@@ -595,11 +652,7 @@ AbstractStage {
595
652
596 onClicked: {
653 onClicked: {
597 if (root.altTabEnabled && spreadView.phase == 2) {
654 if (root.altTabEnabled && spreadView.phase == 2) {
598− if (root.applicationManager.focusedApplicationId == root.applicationManager.get(index).appId) {
599− spreadView.snapTo(index);
655+ spreadView.snapTo(index);
600− } else {
601− root.applicationManager.requestFocusApplication(root.applicationManager.get(index).appId);
602− }
603 }
656 }
604 }
657 }
605
658
@@ -613,7 +666,15 @@ AbstractStage {
613
666
614 onClosed: {
667 onClosed: {
615 spreadView.closingIndex = index;
668 spreadView.closingIndex = index;
669+ if (appDelegate.surface) {
670+ appDelegate.surface.close();
671+ } else if (appDelegate.application) {
616− root.applicationManager.stopApplication(root.applicationManager.get(index).appId);
672+ root.applicationManager.stopApplication(appDelegate.application.appId);
673+ } else {
674+ // should never happen
675+ console.warn("Can't close topLevelSurfaceList entry as it has neither"
676+ + " a surface nor an application");
677+ }
617 }
678 }
618
679
619 Binding {
680 Binding {
@@ -631,7 +692,7 @@ AbstractStage {
631
692
632 StagedFullscreenPolicy {
693 StagedFullscreenPolicy {
633 id: fullscreenPolicy
694 id: fullscreenPolicy
634− application: appDelegate.application
695+ surface: model.surface
635 }
696 }
636
697
637 Connections {
698 Connections {
@@ -639,7 +700,7 @@ AbstractStage {
639 onStageAboutToBeUnloaded: fullscreenPolicy.active = false
700 onStageAboutToBeUnloaded: fullscreenPolicy.active = false
640 }
701 }
641 }
702 }
642− }
703+ } // Repeater {
643 }
704 }
644 }
705 }
645
706
qml/Stages/PromptSurfaceAnimations.qmlnew file+81
@@ -0,0 +1,81 @@
1+/*
2+ * Copyright 2016 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+*/
16+
17+import QtQuick 2.4
18+import Ubuntu.Components 1.3
19+
20+StateGroup {
21+ id: root
22+ property var container
23+ property var surfaceItem
24+
25+ states: [
26+ State {
27+ name: "blank"
28+ when: !root.surfaceItem.surface
29+ },
30+ State {
31+ name: "ready"
32+ when: root.surfaceItem.surface && root.surfaceItem.live
33+ },
34+ State {
35+ name: "zombie"
36+ when: root.surfaceItem.surface && !root.surfaceItem.live
37+ }
38+ ]
39+ transitions: [
40+ Transition {
41+ from: "*"; to: "zombie"
42+ // Slide downwards until it's out of view, through the bottom of the window
43+ SequentialAnimation {
44+ // clip so we don't go out of parent's bounds during spread
45+ PropertyAction { target: root.container.parent; property: "clip"; value: true }
46+ UbuntuNumberAnimation { target: root.surfaceItem; property: "y"; to: root.container.height
47+ duration: UbuntuAnimation.BriskDuration }
48+ PropertyAction { target: root.surfaceItem; property: "visible"; value: false }
49+ PropertyAction { target: container.parent; property: "clip"; value: false }
50+ ScriptAction { script: {
51+ // Unity.Application can't destroy a zombie MirSurface if it's still being
52+ // referenced by a MirSurfaceItem.
53+ root.surfaceItem.surface = null;
54+ } }
55+ }
56+ },
57+ Transition {
58+ from: "*"; to: "ready"
59+ // Slide upwards into view, from the bottom of the window
60+ SequentialAnimation {
61+ // clip so we don't go out of parent's bounds during spread
62+ PropertyAction { target: root.container.parent; property: "clip"; value: true }
63+ ScriptAction { script: {
64+ root.surfaceItem.y = root.container.height;
65+ root.surfaceItem.visible = true;
66+ } }
67+ UbuntuNumberAnimation {
68+ target: root.surfaceItem; property: "y"; to: 0
69+ duration: UbuntuAnimation.BriskDuration
70+ }
71+ PropertyAction { target: container.parent; property: "clip"; value: false }
72+ }
73+ },
74+ Transition {
75+ from: "*"; to: "blank"
76+ ScriptAction { script: {
77+ root.surfaceItem.visible = false;
78+ } }
79+ }
80+ ]
81+}
qml/Stages/SessionContainer.qmldeleted−180
@@ -1,180 +0,0 @@
1−/*
2− * Copyright 2014-2015 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15−*/
16−
17−import QtQuick 2.4
18−import "Animations"
19−
20−FocusScope {
21− id: root
22− objectName: "sessionContainer"
23− implicitWidth: _surfaceContainer.implicitWidth
24− implicitHeight: _surfaceContainer.implicitHeight
25− property QtObject session
26− readonly property var childSessions: session ? session.childSessions : null
27− readonly property alias surface: _surfaceContainer.surface
28− property alias interactive: _surfaceContainer.interactive
29− property alias surfaceOrientationAngle: _surfaceContainer.surfaceOrientationAngle
30− property alias resizeSurface: _surfaceContainer.resizeSurface
31−
32− property int requestedWidth: -1
33− property int requestedHeight: -1
34−
35− readonly property alias surfaceContainer: _surfaceContainer
36− SurfaceContainer {
37− id: _surfaceContainer
38− requestedWidth: root.requestedWidth
39− requestedHeight: root.requestedHeight
40− surface: session ? session.lastSurface : null
41− }
42−
43− // SurfaceContainer size drives SessionContainer size
44− Binding {
45− target: root; property: "width"; value: _surfaceContainer.width
46− when: root.requestedWidth >= 0
47− }
48− Binding {
49− target: root; property: "height"; value: _surfaceContainer.height
50− when: root.requestedHeight >= 0
51− }
52−
53− // SessionContainer size drives SurfaceContainer size
54− Binding {
55− target: _surfaceContainer; property: "width"; value: root.width
56− when: root.requestedWidth < 0
57− }
58− Binding {
59− target: _surfaceContainer; property: "height"; value: root.height
60− when: root.requestedHeight < 0
61− }
62−
63− Repeater {
64− id: childSessionsRepeater
65− model: root.childSessions
66−
67− delegate: Loader {
68− objectName: "childDelegate" + index
69− anchors.fill: surfaceContainer
70−
71− // Only way to do recursive qml items.
72− source: Qt.resolvedUrl("SessionContainer.qml")
73−
74− z: index
75−
76− // Since a Loader is a FocusScope, propagate its focus to the loaded Item
77− Binding {
78− target: item; when: item
79− property: "focus"; value: focus
80− }
81−
82− Binding {
83− target: item; when: item
84− property: "interactive"; value: index == (childSessionsRepeater.count - 1) && root.interactive
85− }
86−
87− Binding {
88− target: item; when: item
89− property: "session"; value: modelData
90− }
91−
92− Binding {
93− target: item; when: item
94− property: "width"; value: root.width
95− }
96−
97− Binding {
98− target: item; when: item
99− property: "height"; value: root.height
100− }
101− }
102− }
103−
104− states: [
105− State {
106− name: "rootSession"
107− when: root.session && !root.session.parentSession
108− },
109−
110− State {
111− name: "childSession"
112− when: root.session && root.session.parentSession !== null && root.session.live
113− && !root.session.lastSurface
114− },
115−
116− State {
117− name: "childSessionReady"
118− when: root.session && root.session.parentSession !== null && root.session.live
119− && root.session.lastSurface !== null
120− },
121−
122− State {
123− name: "childSessionZombie"
124− when: root.session && root.session.parentSession !== null && !root.session.live
125− }
126− ]
127−
128− transitions: [
129− Transition {
130− to: "childSessionReady"
131− ScriptAction { script: { if (!surfaceContainer.hadSurface) { animateIn(swipeFromBottom); } } }
132− },
133− Transition {
134− to: "childSessionZombie"
135− ScriptAction { script: { animateOut(); } }
136− }
137− ]
138−
139− function animateIn(component) {
140− var animation = component.createObject(root, { "container": root, });
141− animation.start();
142−
143− var tmp = d.animations;
144− tmp.push(animation);
145− d.animations = tmp;
146− }
147−
148− function animateOut() {
149− if (d.animations.length > 0) {
150− var tmp = d.animations;
151− var popped = tmp.pop();
152− popped.completed.connect(function() { root.session.release(); } );
153− popped.end();
154− d.animations = tmp;
155− } else {
156− root.session.release();
157− }
158− }
159−
160− Component {
161− id: swipeFromBottom
162− SwipeFromBottomAnimation {}
163− }
164−
165− QtObject {
166− id: d
167− property var animations: []
168−
169− property var focusedChild: {
170− if (childSessionsRepeater.count == 0) {
171− return _surfaceContainer;
172− } else {
173− return childSessionsRepeater.itemAt(childSessionsRepeater.count - 1);
174− }
175− }
176− onFocusedChildChanged: {
177− focusedChild.focus = true;
178− }
179− }
180−}
qml/Stages/SpreadDelegate.qml+4−4
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2014-2015 Canonical Ltd.
2+ * Copyright 2014-2016 Canonical Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
5 * it under the terms of the GNU Lesser General Public License as published by
@@ -37,7 +37,6 @@ FocusScope {
37 | Qt.LandscapeOrientation
37 | Qt.LandscapeOrientation
38 | Qt.InvertedPortraitOrientation
38 | Qt.InvertedPortraitOrientation
39 | Qt.InvertedLandscapeOrientation
39 | Qt.InvertedLandscapeOrientation
40− readonly property alias appWindow: appWindow
41
40
42 // to be set from outside
41 // to be set from outside
43 property bool interactive: true
42 property bool interactive: true
@@ -46,6 +45,7 @@ FocusScope {
46 property alias swipeToCloseEnabled: dragArea.enabled
45 property alias swipeToCloseEnabled: dragArea.enabled
47 property bool closeable
46 property bool closeable
48 property alias application: appWindow.application
47 property alias application: appWindow.application
48+ property alias surface: appWindow.surface
49 property int shellOrientationAngle
49 property int shellOrientationAngle
50 property int shellOrientation
50 property int shellOrientation
51 property QtObject orientations
51 property QtObject orientations
@@ -251,7 +251,7 @@ FocusScope {
251 }
251 }
252 PropertyChanges {
252 PropertyChanges {
253 target: appWindow
253 target: appWindow
254− surfaceOrientationAngle: orientationAngle
254+ surfaceOrientationAngle: appWindowWithShadow.orientationAngle
255 }
255 }
256 },
256 },
257 State {
257 State {
@@ -293,7 +293,7 @@ FocusScope {
293
293
294 ApplicationWindow {
294 ApplicationWindow {
295 id: appWindow
295 id: appWindow
296− objectName: application ? "appWindow_" + application.appId : "appWindow_null"
296+ objectName: "appWindow"
297 focus: true
297 focus: true
298 anchors {
298 anchors {
299 fill: parent
299 fill: parent
qml/Stages/StagedFullscreenPolicy.qml+12−14
@@ -27,31 +27,29 @@ import Unity.Application 0.1
27// Chrome not set and state change to fulscreen -> client window stays "fullscreen"
27// Chrome not set and state change to fulscreen -> client window stays "fullscreen"
28QtObject {
28QtObject {
29 property bool active: true
29 property bool active: true
30− property QtObject application: null
31
30
32− readonly property var lastSurface: application && application.session ?
31+ property var surface: null
33− application.session.lastSurface : null
32+ onSurfaceChanged: {
34− onLastSurfaceChanged: {
35− if (!active || !lastSurface) return;
33+ if (!active || !surface) return;
36− if (lastSurface.shellChrome === Mir.LowChrome) {
34+ if (surface.shellChrome === Mir.LowChrome) {
37− lastSurface.state = Mir.FullscreenState;
35+ surface.state = Mir.FullscreenState;
38 }
36 }
39 }
37 }
40
38
41 property var _connections: Connections {
39 property var _connections: Connections {
42− target: lastSurface
40+ target: surface
43 onShellChromeChanged: {
41 onShellChromeChanged: {
44− if (!active || !lastSurface) return;
42+ if (!active || !surface) return;
45− if (lastSurface.shellChrome === Mir.LowChrome) {
43+ if (surface.shellChrome === Mir.LowChrome) {
46− lastSurface.state = Mir.FullscreenState;
44+ surface.state = Mir.FullscreenState;
47 } else {
45 } else {
48− lastSurface.state = Mir.RestoredState;
46+ surface.state = Mir.RestoredState;
49 }
47 }
50 }
48 }
51 onStateChanged: {
49 onStateChanged: {
52 if (!active) return;
50 if (!active) return;
53− if (lastSurface.state === Mir.RestoredState && lastSurface.shellChrome === Mir.LowChrome) {
51+ if (surface.state === Mir.RestoredState && surface.shellChrome === Mir.LowChrome) {
54− lastSurface.state = Mir.FullscreenState;
52+ surface.state = Mir.FullscreenState;
55 }
53 }
56 }
54 }
57 }
55 }
qml/Stages/SurfaceContainer.qml+97−53
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2014-2015 Canonical Ltd.
2+ * Copyright 2014-2016 Canonical Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
5 * it under the terms of the GNU Lesser General Public License as published by
@@ -19,39 +19,27 @@ import Ubuntu.Components 1.3
19import Ubuntu.Gestures 0.1 // For TouchGate
19import Ubuntu.Gestures 0.1 // For TouchGate
20import Utils 0.1 // for InputWatcher
20import Utils 0.1 // for InputWatcher
21import Unity.Application 0.1 // for MirSurfaceItem
21import Unity.Application 0.1 // for MirSurfaceItem
22−import AccountsService 0.1
23
22
24FocusScope {
23FocusScope {
25 id: root
24 id: root
26 objectName: "surfaceContainer"
25 objectName: "surfaceContainer"
27
26
27+ // Must be set from outside
28 property var surface: null
28 property var surface: null
29− property bool hadSurface: false
30− property bool interactive
31− property int surfaceOrientationAngle: 0
32− property string name: surface ? surface.name : ""
33− property bool resizeSurface: true
34
29
30+ // Might be changed from outside
35 property int requestedWidth: -1
31 property int requestedWidth: -1
36 property int requestedHeight: -1
32 property int requestedHeight: -1
37−
33+ property bool interactive
38− property string savedKeymap: AccountsService.keymaps[0] // start with the user default
34+ property int surfaceOrientationAngle: 0
35+ property bool resizeSurface: true
36+ property bool inPromptSession: false
39
37
40 onSurfaceChanged: {
38 onSurfaceChanged: {
41− if (surface) {
39+ // Not a binding because animations might remove the surface from the surfaceItem
42− surfaceItem.surface = surface;
40+ // programatically (in order to signal that a zombie surface is free for deletion),
43− root.hadSurface = false;
41+ // even though root.surface is still !null.
44− switchToKeymap(savedKeymap);
42+ surfaceItem.surface = surface;
45− }
46− }
47−
48− function switchToKeymap(keymap) {
49− var finalKeymap = keymap.split("+");
50− savedKeymap = keymap; // save the keymap in case the surface changes later
51−
52− if (surface) {
53− surface.setKeymap(finalKeymap[0], finalKeymap[1] || "");
54− }
55 }
43 }
56
44
57 InputWatcher {
45 InputWatcher {
@@ -96,11 +84,16 @@ FocusScope {
96 }
84 }
97
85
98 enabled: root.interactive
86 enabled: root.interactive
99− focus: true
100 antialiasing: !root.interactive
87 antialiasing: !root.interactive
101 orientationAngle: root.surfaceOrientationAngle
88 orientationAngle: root.surfaceOrientationAngle
102 }
89 }
103
90
91+ TouchGate {
92+ targetItem: surfaceItem
93+ anchors.fill: root
94+ enabled: surfaceItem.enabled
95+ }
96+
104 // MirSurface size drives SurfaceContainer size
97 // MirSurface size drives SurfaceContainer size
105 Binding {
98 Binding {
106 target: surfaceItem; property: "width"; value: root.surface ? root.surface.size.width : 0
99 target: surfaceItem; property: "width"; value: root.surface ? root.surface.size.width : 0
@@ -129,39 +122,90 @@ FocusScope {
129 when: root.requestedHeight < 0
122 when: root.requestedHeight < 0
130 }
123 }
131
124
125+ Repeater {
126+ id: childSurfacesRepeater
127+ objectName: "childSurfacesRepeater"
128+ model: root.surface ? root.surface.promptSurfaceList : null
132
129
133− TouchGate {
130+ delegate: Loader {
134− objectName: "touchGate-"+name
131+ objectName: "childDelegate" + index
135− targetItem: surfaceItem
136− anchors.fill: root
132+ anchors.fill: root
137− enabled: surfaceItem.enabled
133+
134+ // Only way to do recursive qml items.
135+ source: Qt.resolvedUrl("SurfaceContainer.qml")
136+
137+ z: index
138+
139+ // Since a Loader is a FocusScope, propagate its focus to the loaded Item
140+ Binding {
141+ target: item; when: item
142+ property: "focus"; value: focus
143+ }
144+
145+ Binding {
146+ target: item; when: item
147+ property: "interactive"; value: index == (childSurfacesRepeater.count - 1) && root.interactive
148+ }
149+
150+ Binding {
151+ target: item; when: item
152+ property: "surface"; value: model.surface
153+ }
154+
155+ Binding {
156+ target: item; when: item
157+ property: "width"; value: root.width
158+ }
159+
160+ Binding {
161+ target: item; when: item
162+ property: "height"; value: root.height
163+ }
164+
165+ Binding {
166+ target: item; when: item
167+ property: "inPromptSession"; value: true
168+ }
169+ }
138 }
170 }
139
171
140− states: [
172+ Loader {
141− State {
173+ id: animationsLoader
142− name: "zombie"
174+ objectName: "animationsLoader"
175+ active: root.surface
176+ source: {
177+ if (root.inPromptSession) {
178+ return "PromptSurfaceAnimations.qml";
179+ } else {
180+ // Let ApplicationWindow do the animations
181+ return "";
182+ }
183+ }
184+ Binding {
185+ target: animationsLoader.item
186+ when: animationsLoader.item
187+ property: "surfaceItem"
143− when: surfaceItem.surface && !surfaceItem.live
188+ value: surfaceItem
189+ }
190+ Binding {
191+ target: animationsLoader.item
192+ when: animationsLoader.item
193+ property: "container"
194+ value: root
144 }
195 }
145− ]
196+ }
146− transitions: [
197+
147− Transition {
198+ QtObject {
148− from: ""; to: "zombie"
199+ id: d
149− SequentialAnimation {
200+ property var focusedChild: {
150− UbuntuNumberAnimation { target: surfaceItem; property: "opacity"; to: 0.0
201+ if (childSurfacesRepeater.count == 0) {
151− duration: UbuntuAnimation.BriskDuration }
202+ return surfaceItem;
152− PropertyAction { target: surfaceItem; property: "visible"; value: false }
203+ } else {
153− ScriptAction { script: {
204+ return childSurfacesRepeater.itemAt(childSurfacesRepeater.count - 1);
154− surfaceItem.surface = null;
155− root.hadSurface = true;
156− } }
157 }
205 }
158− },
159− Transition {
160− from: "zombie"; to: ""
161− ScriptAction { script: {
162− surfaceItem.opacity = 1.0;
163− surfaceItem.visible = true;
164− } }
165 }
206 }
166− ]
207+ onFocusedChildChanged: {
208+ focusedChild.focus = true;
209+ }
210+ }
167}
211}
qml/Stages/TabletStage.qml+300−239
@@ -27,19 +27,24 @@ AbstractStage {
27 objectName: "stages"
27 objectName: "stages"
28 anchors.fill: parent
28 anchors.fill: parent
29
29
30+ // <tutorial-hacks> The Tutorial looks into our implementation details
30 property alias sideStageVisible: spreadView.sideStageVisible
31 property alias sideStageVisible: spreadView.sideStageVisible
31 property alias sideStageWidth: spreadView.sideStageWidth
32 property alias sideStageWidth: spreadView.sideStageWidth
33+ // The stage the currently focused surface is in
34+ property int stageFocusedSurface: priv.focusedAppDelegate ? priv.focusedAppDelegate.stage : ApplicationInfoInterface.MainStage
35+ // </tutorial-hacks>
32
36
33 // Functions to be called from outside
37 // Functions to be called from outside
34 function updateFocusedAppOrientation() {
38 function updateFocusedAppOrientation() {
35− var mainStageAppIndex = priv.indexOf(priv.mainStageAppId);
39+ var mainStageIndex = root.topLevelSurfaceList.indexForId(priv.mainStageItemId);
36− if (mainStageAppIndex >= 0 && mainStageAppIndex < spreadRepeater.count) {
40+
41+ if (priv.mainStageItemId && mainStageIndex >= 0 && mainStageIndex < spreadRepeater.count) {
37− spreadRepeater.itemAt(mainStageAppIndex).matchShellOrientation();
42+ spreadRepeater.itemAt(mainStageIndex).matchShellOrientation();
38 }
43 }
39
44
40 for (var i = 0; i < spreadRepeater.count; ++i) {
45 for (var i = 0; i < spreadRepeater.count; ++i) {
41
46
42− if (i === mainStageAppIndex) {
47+ if (i === mainStageIndex) {
43 continue;
48 continue;
44 }
49 }
45
50
@@ -60,16 +65,14 @@ AbstractStage {
60 }
65 }
61 }
66 }
62 function updateFocusedAppOrientationAnimated() {
67 function updateFocusedAppOrientationAnimated() {
63− var mainStageAppIndex = priv.indexOf(priv.mainStageAppId);
68+ var mainStageIndex = root.topLevelSurfaceList.indexForId(priv.mainStageItemId);
64− if (mainStageAppIndex >= 0 && mainStageAppIndex < spreadRepeater.count) {
69+ if (priv.mainStageItemId && mainStageIndex >= 0 && mainStageIndex < spreadRepeater.count) {
65− spreadRepeater.itemAt(mainStageAppIndex).animateToShellOrientation();
70+ spreadRepeater.itemAt(mainStageIndex).animateToShellOrientation();
66 }
71 }
67
72
68− if (priv.sideStageAppId) {
73+ var sideStageIndex = root.topLevelSurfaceList.indexForId(priv.sideStageItemId);
69− var sideStageAppIndex = priv.indexOf(priv.sideStageAppId);
70− if (sideStageAppIndex >= 0 && sideStageAppIndex < spreadRepeater.count) {
74+ if (sideStageIndex >= 0 && sideStageIndex < spreadRepeater.count) {
71− spreadRepeater.itemAt(sideStageAppIndex).matchShellOrientation();
75+ spreadRepeater.itemAt(sideStageIndex).matchShellOrientation();
72− }
73 }
76 }
74 }
77 }
75
78
@@ -79,15 +82,22 @@ AbstractStage {
79 }
82 }
80 }
83 }
81
84
82− mainAppWindow: priv.focusedAppDelegate ? priv.focusedAppDelegate.appWindow : null
83−
84 orientationChangesEnabled: priv.mainAppOrientationChangesEnabled
85 orientationChangesEnabled: priv.mainAppOrientationChangesEnabled
85
86
87+ mainApp: {
88+ if (priv.mainStageItemId > 0) {
89+ var index = root.topLevelSurfaceList.indexForId(priv.mainStageItemId);
90+ return root.topLevelSurfaceList.applicationAt(index);
91+ } else {
92+ return null;
93+ }
94+ }
95+
86 supportedOrientations: {
96 supportedOrientations: {
87 if (mainApp) {
97 if (mainApp) {
88 var orientations = mainApp.supportedOrientations;
98 var orientations = mainApp.supportedOrientations;
89 orientations |= Qt.LandscapeOrientation | Qt.InvertedLandscapeOrientation;
99 orientations |= Qt.LandscapeOrientation | Qt.InvertedLandscapeOrientation;
90− if (priv.sideStageAppId && !spreadView.surfaceDragging) {
100+ if (priv.sideStageItemId && !spreadView.surfaceDragging) {
91 // If we have a sidestage app, support Portrait orientation
101 // If we have a sidestage app, support Portrait orientation
92 // so that it will switch the sidestage app to mainstage on rotate
102 // so that it will switch the sidestage app to mainstage on rotate
93 orientations |= Qt.PortraitOrientation|Qt.InvertedPortraitOrientation;
103 orientations |= Qt.PortraitOrientation|Qt.InvertedPortraitOrientation;
@@ -118,7 +128,7 @@ AbstractStage {
118 if (inverseProgress == 0 && priv.oldInverseProgress > 0) {
128 if (inverseProgress == 0 && priv.oldInverseProgress > 0) {
119 // left edge drag released. Minimum distance is given by design.
129 // left edge drag released. Minimum distance is given by design.
120 if (priv.oldInverseProgress > units.gu(22)) {
130 if (priv.oldInverseProgress > units.gu(22)) {
121− ApplicationManager.requestFocusApplication("unity8-dash");
131+ root.applicationManager.requestFocusApplication("unity8-dash");
122 }
132 }
123 }
133 }
124 priv.oldInverseProgress = inverseProgress;
134 priv.oldInverseProgress = inverseProgress;
@@ -156,17 +166,51 @@ AbstractStage {
156 }
166 }
157 }
167 }
158
168
169+ Connections {
170+ target: root.topLevelSurfaceList
171+ onListChanged: priv.updateMainAndSideStageIndexes()
172+ }
173+
159 QtObject {
174 QtObject {
160 id: priv
175 id: priv
161 objectName: "stagesPriv"
176 objectName: "stagesPriv"
162
177
163− property string focusedAppId: ApplicationManager.focusedApplicationId
178+ function updateMainAndSideStageIndexes() {
164− readonly property var focusedAppDelegate: {
179+ var choseMainStage = false;
165− var index = indexOf(focusedAppId);
180+ var choseSideStage = false;
166− return index >= 0 && index < spreadRepeater.count ? spreadRepeater.itemAt(index) : null
181+
182+ if (!root.topLevelSurfaceList)
183+ return;
184+
185+ for (var i = 0; i < spreadRepeater.count && (!choseMainStage || !choseSideStage); ++i) {
186+ var spreadDelegate = spreadRepeater.itemAt(i);
187+ if (sideStage.shown && spreadDelegate.stage == ApplicationInfoInterface.SideStage
188+ && !choseSideStage) {
189+ priv.sideStageDelegate = spreadDelegate
190+ priv.sideStageItemId = root.topLevelSurfaceList.idAt(i);
191+ priv.sideStageAppId = root.topLevelSurfaceList.applicationAt(i).appId;
192+ choseSideStage = true;
193+ } else if (!choseMainStage && spreadDelegate.stage == ApplicationInfoInterface.MainStage) {
194+ priv.mainStageDelegate = spreadDelegate;
195+ priv.mainStageItemId = root.topLevelSurfaceList.idAt(i);
196+ priv.mainStageAppId = root.topLevelSurfaceList.applicationAt(i).appId;
197+ choseMainStage = true;
198+ }
199+ }
200+ if (!choseMainStage) {
201+ priv.mainStageDelegate = null;
202+ priv.mainStageItemId = 0;
203+ priv.mainStageAppId = "";
204+ }
205+ if (!choseSideStage) {
206+ priv.sideStageDelegate = null;
207+ priv.sideStageItemId = 0;
208+ priv.sideStageAppId = "";
209+ }
167 }
210 }
168
211
169− property string oldFocusedAppId: ""
212+ property var focusedAppDelegate: null
213+
170 property bool mainAppOrientationChangesEnabled: false
214 property bool mainAppOrientationChangesEnabled: false
171
215
172 property real landscapeHeight: root.orientations.native_ == Qt.LandscapeOrientation ?
216 property real landscapeHeight: root.orientations.native_ == Qt.LandscapeOrientation ?
@@ -175,36 +219,21 @@ AbstractStage {
175 property bool shellIsLandscape: root.shellOrientation === Qt.LandscapeOrientation
219 property bool shellIsLandscape: root.shellOrientation === Qt.LandscapeOrientation
176 || root.shellOrientation === Qt.InvertedLandscapeOrientation
220 || root.shellOrientation === Qt.InvertedLandscapeOrientation
177
221
178− property string mainStageAppId
222+ property var mainStageDelegate: null
179− property string sideStageAppId
223+ property var sideStageDelegate: null
224+
225+ property int mainStageItemId: 0
226+ property int sideStageItemId: 0
180
227
181− // For convenience, keep properties of the first two apps in the model
228+ property string mainStageAppId: ""
182− property string appId0
229+ property string sideStageAppId: ""
183− property string appId1
184
230
185 property int oldInverseProgress: 0
231 property int oldInverseProgress: 0
186
232
187 property int highlightIndex: 0
233 property int highlightIndex: 0
188
234
189− onFocusedAppIdChanged: updateStageApps()
190−
191− onFocusedAppDelegateChanged: {
192− if (focusedAppDelegate) {
193− focusedAppDelegate.focus = true;
194− }
195− }
196−
197 property bool focusedAppDelegateIsDislocated: focusedAppDelegate &&
235 property bool focusedAppDelegateIsDislocated: focusedAppDelegate &&
198 (focusedAppDelegate.dragOffset !== 0 || focusedAppDelegate.xTranslateAnimating)
236 (focusedAppDelegate.dragOffset !== 0 || focusedAppDelegate.xTranslateAnimating)
199− function indexOf(appId) {
200− for (var i = 0; i < ApplicationManager.count; i++) {
201− if (ApplicationManager.get(i).appId == appId) {
202− return i;
203− }
204− }
205− return -1;
206− }
207−
208 function evaluateOneWayFlick(gesturePoints) {
237 function evaluateOneWayFlick(gesturePoints) {
209 // Need to have at least 3 points to recognize it as a flick
238 // Need to have at least 3 points to recognize it as a flick
210 if (gesturePoints.length < 3) {
239 if (gesturePoints.length < 3) {
@@ -233,88 +262,45 @@ AbstractStage {
233 spreadView.contentX = highlightIndex * spreadView.contentWidth / (spreadRepeater.count + 2)
262 spreadView.contentX = highlightIndex * spreadView.contentWidth / (spreadRepeater.count + 2)
234 }
263 }
235
264
236− function getTopApp(stage) {
237− for (var i = 0; i < ApplicationManager.count; i++) {
238− var app = ApplicationManager.get(i)
239− if (app.stage === stage) {
240− return app;
241− }
242− }
243− return null;
244− }
245−
246− function setAppStage(appId, stage, save) {
247− var app = ApplicationManager.findApplication(appId);
248− if (app) {
249− app.stage = stage;
250− if (save) {
251− WindowStateStorage.saveStage(appId, stage);
252− }
253− }
254− }
255−
256− function updateStageApps() {
257− var app = priv.getTopApp(ApplicationInfoInterface.MainStage);
258− priv.mainStageAppId = app ? app.appId : ""
259− root.mainApp = app;
260−
261− if (sideStage.shown) {
262− app = priv.getTopApp(ApplicationInfoInterface.SideStage);
263− priv.sideStageAppId = app ? app.appId : ""
264− } else {
265− priv.sideStageAppId = "";
266− }
267−
268− appId0 = ApplicationManager.count >= 1 ? ApplicationManager.get(0).appId : "";
269− appId1 = ApplicationManager.count > 1 ? ApplicationManager.get(1).appId : "";
270− }
271−
272 readonly property bool sideStageEnabled: root.shellOrientation == Qt.LandscapeOrientation ||
265 readonly property bool sideStageEnabled: root.shellOrientation == Qt.LandscapeOrientation ||
273 root.shellOrientation == Qt.InvertedLandscapeOrientation
266 root.shellOrientation == Qt.InvertedLandscapeOrientation
274− Component.onCompleted: updateStageApps();
275 }
267 }
276
268
277− Connections {
269+ Instantiator {
278− target: ApplicationManager
270+ model: root.applicationManager
279− onFocusRequested: {
271+ delegate: QtObject {
280− if (spreadView.interactive) {
272+ property var stateBinding: Binding {
281− spreadView.snapTo(priv.indexOf(appId));
273+ readonly property bool isDash: model.application ? model.application.appId == "unity8-dash" : false
282− } else {
274+ target: model.application
283− ApplicationManager.focusApplication(appId);
275+ property: "requestedState"
276+
277+ // NB: the first application clause is just to ensure we never get warnings for trying to access
278+ // members of a null variable.
279+ value: model.application &&
280+ (
281+ (isDash && root.keepDashRunning)
282+ || (!root.suspended && (model.application.appId === priv.mainStageAppId
283+ || model.application.appId === priv.sideStageAppId))
284+ )
285+ ? ApplicationInfoInterface.RequestedRunning
286+ : ApplicationInfoInterface.RequestedSuspended
284 }
287 }
285− }
286
288
287− onApplicationAdded: {
289+ property var lifecycleBinding: Binding {
288− if (spreadView.phase == 2) {
290+ target: model.application
289− spreadView.snapTo(ApplicationManager.count - 1);
291+ property: "exemptFromLifecycle"
290− } else {
292+ value: model.application
291− spreadView.phase = 0;
293+ ? (!model.application.isTouchApp || isExemptFromLifecycle(model.application.appId))
292− spreadView.contentX = -spreadView.shift;
294+ : false
293− ApplicationManager.focusApplication(appId);
294 }
295 }
295 }
296 }
297+ }
296
298
297− onApplicationRemoved: {
299+ Binding {
298− if (priv.mainStageAppId == appId) {
300+ target: MirFocusController
299− ApplicationManager.focusApplication("unity8-dash")
301+ property: "focusedSurface"
300− }
302+ value: priv.focusedAppDelegate ? priv.focusedAppDelegate.surface : null
301− if (priv.sideStageAppId == appId) {
303+ when: root.parent && !spreadRepeater.startingUp
302− var app = priv.getTopApp(ApplicationInfoInterface.SideStage);
303− priv.sideStageAppId = app === null ? "" : app.appId;
304− }
305−
306− if (ApplicationManager.count == 0) {
307− spreadView.phase = 0;
308− spreadView.contentX = -spreadView.shift;
309− } else if (spreadView.closingIndex == -1) {
310− // Unless we're closing the app ourselves in the spread,
311− // lets make sure the spread doesn't mess up by the changing app list.
312− spreadView.phase = 0;
313− spreadView.contentX = -spreadView.shift;
314−
315− ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
316− }
317− }
318 }
304 }
319
305
320 Flickable {
306 Flickable {
@@ -365,16 +351,45 @@ AbstractStage {
365 property int selectedIndex: -1
351 property int selectedIndex: -1
366 property int draggedDelegateCount: 0
352 property int draggedDelegateCount: 0
367 property int closingIndex: -1
353 property int closingIndex: -1
368− property var selectedApplication: selectedIndex !== -1 ? ApplicationManager.get(selectedIndex) : null
354+ property var selectedDelegate: selectedIndex !== -1 ? spreadRepeater.itemAt(selectedIndex) : null
369−
355+
370− // FIXME: Workaround Flickable's not keepping its contentX still when resized
356+ // <FIXME-contentX> Workaround Flickable's behavior of bringing contentX back between valid boundaries
357+ // when resized. The proper way to fix this is refactoring PhoneStage so that it doesn't
358+ // rely on having Flickable.contentX keeping an out-of-bounds value when it's set programatically
359+ // (as opposed to having contentX reaching an out-of-bounds value through dragging, which will trigger
360+ // the Flickable.boundsBehavior upon release).
361+ onContentXChanged: {
362+ if (!undoContentXReset()) {
371− onContentXChanged: { forceItToRemainStillIfBeingResized(); }
363+ forceItToRemainStillIfBeingResized();
364+ }
365+ }
372 onShiftChanged: { forceItToRemainStillIfBeingResized(); }
366 onShiftChanged: { forceItToRemainStillIfBeingResized(); }
373 function forceItToRemainStillIfBeingResized() {
367 function forceItToRemainStillIfBeingResized() {
374− if (root.beingResized && contentX != -shift) {
368+ if (root.beingResized && contentX != -spreadView.shift) {
369+ contentX = -spreadView.shift;
370+ }
371+ }
372+ function undoContentXReset() {
373+ if (contentWidth <= 0) {
374+ contentWidthOnLastContentXChange = contentWidth;
375+ lastContentX = contentX;
376+ return false;
377+ }
378+
379+ if (contentWidth != contentWidthOnLastContentXChange
380+ && lastContentX == -shift && contentX == 0) {
381+ // Flickable is resetting contentX because contentWidth has changed. Undo it.
375 contentX = -shift;
382 contentX = -shift;
383+ return true;
376 }
384 }
385+
386+ contentWidthOnLastContentXChange = contentWidth;
387+ lastContentX = contentX;
388+ return false;
377 }
389 }
390+ property real contentWidthOnLastContentXChange: -1
391+ property real lastContentX: 0
392+ // </FIXME-contentX>
378
393
379 property bool animateX: true
394 property bool animateX: true
380 property bool beingResized: root.beingResized
395 property bool beingResized: root.beingResized
@@ -387,31 +402,33 @@ AbstractStage {
387 }
402 }
388 }
403 }
389
404
390− property real sideStageDragProgress: sideStage.progress
391− property bool sideStageVisible: priv.sideStageAppId
392 property real sideStageWidth: units.gu(40)
405 property real sideStageWidth: units.gu(40)
393
406
394 property bool surfaceDragging: triGestureArea.recognisedDrag
407 property bool surfaceDragging: triGestureArea.recognisedDrag
395
408
409+ readonly property bool sideStageVisible: priv.sideStageItemId != 0
410+
396− // In case the ApplicationManager already holds an app when starting up we're missing animations
411+ // In case applicationManager already holds an app when starting up we're missing animations
397 // Make sure we end up in the same state
412 // Make sure we end up in the same state
398 Component.onCompleted: {
413 Component.onCompleted: {
399 spreadView.contentX = -spreadView.shift
414 spreadView.contentX = -spreadView.shift
400 }
415 }
401
416
402 property int nextInStack: {
417 property int nextInStack: {
418+ var mainStageIndex = priv.mainStageDelegate ? priv.mainStageDelegate.index : -1;
419+ var sideStageIndex = priv.sideStageDelegate ? priv.sideStageDelegate.index : -1;
403 switch (state) {
420 switch (state) {
404 case "main":
421 case "main":
405− if (ApplicationManager.count > 1) {
422+ if (root.topLevelSurfaceList.count > 1) {
406 return 1;
423 return 1;
407 }
424 }
408 return -1;
425 return -1;
409 case "mainAndOverlay":
426 case "mainAndOverlay":
410− if (ApplicationManager.count <= 2) {
427+ if (root.topLevelSurfaceList.count <= 2) {
411 return -1;
428 return -1;
412 }
429 }
413− if (priv.appId0 == priv.mainStageAppId || priv.appId0 == priv.sideStageAppId) {
430+ if (mainStageIndex == 0 || sideStageIndex == 0) {
414− if (priv.appId1 == priv.mainStageAppId || priv.appId1 == priv.sideStageAppId) {
431+ if (mainStageIndex == 1 || sideStageIndex == 1) {
415 return 2;
432 return 2;
416 }
433 }
417 return 1;
434 return 1;
@@ -422,7 +439,7 @@ AbstractStage {
422 }
439 }
423 return -1;
440 return -1;
424 }
441 }
425− property int nextZInStack: indexToZIndex(nextInStack)
442+ property int nextZInStack
426
443
427 states: [
444 states: [
428 State {
445 State {
@@ -442,13 +459,13 @@ AbstractStage {
442 }
459 }
443 ]
460 ]
444 state: {
461 state: {
445− if ((priv.mainStageAppId && !priv.sideStageAppId) || !priv.sideStageEnabled) {
462+ if ((priv.mainStageItemId && !priv.sideStageItemId) || !priv.sideStageEnabled) {
446 return "main";
463 return "main";
447 }
464 }
448− if (!priv.mainStageAppId && priv.sideStageAppId) {
465+ if (!priv.mainStageItemId && priv.sideStageItemId) {
449 return "overlay";
466 return "overlay";
450 }
467 }
451− if (priv.mainStageAppId && priv.sideStageAppId) {
468+ if (priv.mainStageItemId && priv.sideStageItemId) {
452 return "mainAndOverlay";
469 return "mainAndOverlay";
453 }
470 }
454 return "empty";
471 return "empty";
@@ -513,38 +530,41 @@ AbstractStage {
513 // only shuffle when we've got a main and overlay
530 // only shuffle when we've got a main and overlay
514 if (state !== "mainAndOverlay") return index;
531 if (state !== "mainAndOverlay") return index;
515
532
516− var app = ApplicationManager.get(index);
533+ var app = root.topLevelSurfaceList.applicationAt(index);
517 if (!app) {
534 if (!app) {
518 return index;
535 return index;
519 }
536 }
537+ var stage = spreadRepeater.itemAt(index) ? spreadRepeater.itemAt(index).stage : app.stage;
520
538
521 // don't shuffle indexes greater than "actives or next"
539 // don't shuffle indexes greater than "actives or next"
522 if (index > 2) return index;
540 if (index > 2) return index;
523
541
524− if (app.appId === priv.mainStageAppId) {
542+ var mainStageIndex = root.topLevelSurfaceList.indexForId(priv.mainStageItemId);
543+
544+ if (index == mainStageIndex) {
525 // Active main stage always at 0
545 // Active main stage always at 0
526 return 0;
546 return 0;
527 }
547 }
528
548
529 if (spreadView.nextInStack > 0) {
549 if (spreadView.nextInStack > 0) {
530− var nextAppInStack = ApplicationManager.get(spreadView.nextInStack);
550+ var stageOfNextInStack = spreadRepeater.itemAt(spreadView.nextInStack).stage;
531
551
532 if (index === spreadView.nextInStack) {
552 if (index === spreadView.nextInStack) {
533 // this is the next app in stack.
553 // this is the next app in stack.
534
554
535− if (app.stage === ApplicationInfoInterface.SideStage) {
555+ if (stage === ApplicationInfoInterface.SideStage) {
536 // if the next app in stack is a sidestage app, it must order on top of other side stage app
556 // if the next app in stack is a sidestage app, it must order on top of other side stage app
537− return Math.min(2, ApplicationManager.count-1);
557+ return Math.min(2, root.topLevelSurfaceList.count-1);
538 }
558 }
539 return 1;
559 return 1;
540 }
560 }
541− if (nextAppInStack.stage === ApplicationInfoInterface.SideStage) {
561+ if (stageOfNextInStack === ApplicationInfoInterface.SideStage) {
542 // if the next app in stack is a sidestage app, it must order on top of other side stage app
562 // if the next app in stack is a sidestage app, it must order on top of other side stage app
543 return 1;
563 return 1;
544 }
564 }
545− return Math.min(2, ApplicationManager.count-1);
565+ return Math.min(2, root.topLevelSurfaceList.count-1);
546 }
566 }
547− return Math.min(index+1, ApplicationManager.count-1);
567+ return Math.min(index+1, root.topLevelSurfaceList.count-1);
548 }
568 }
549
569
550 SequentialAnimation {
570 SequentialAnimation {
@@ -562,12 +582,13 @@ AbstractStage {
562 script: {
582 script: {
563 if (spreadView.selectedIndex >= 0) {
583 if (spreadView.selectedIndex >= 0) {
564 var newIndex = spreadView.selectedIndex;
584 var newIndex = spreadView.selectedIndex;
565− var application = ApplicationManager.get(newIndex);
585+ var application = root.topLevelSurfaceList.applicationAt(newIndex);
586+ var spreadDelegate = spreadRepeater.itemAt(newIndex);
566− if (application.stage === ApplicationInfoInterface.SideStage) {
587+ if (spreadDelegate.stage === ApplicationInfoInterface.SideStage) {
567 sideStage.showNow();
588 sideStage.showNow();
568 }
589 }
569 spreadView.selectedIndex = -1;
590 spreadView.selectedIndex = -1;
570− ApplicationManager.focusApplication(application.appId);
591+ spreadDelegate.focus = true;
571 spreadView.phase = 0;
592 spreadView.phase = 0;
572 spreadView.contentX = -spreadView.shift;
593 spreadView.contentX = -spreadView.shift;
573 }
594 }
@@ -583,7 +604,7 @@ AbstractStage {
583 MouseArea {
604 MouseArea {
584 id: spreadRow
605 id: spreadRow
585 x: spreadView.contentX
606 x: spreadView.contentX
586− width: spreadView.width + Math.max(spreadView.width, ApplicationManager.count * spreadView.tileDistance)
607+ width: spreadView.width + Math.max(spreadView.width, root.topLevelSurfaceList.count * spreadView.tileDistance)
587 height: root.height
608 height: root.height
588
609
589 onClicked: {
610 onClicked: {
@@ -601,8 +622,8 @@ AbstractStage {
601 enabled: priv.sideStageEnabled
622 enabled: priv.sideStageEnabled
602
623
603 onDropped: {
624 onDropped: {
604− priv.setAppStage(drag.source.appId, ApplicationInfoInterface.MainStage, true);
625+ drop.source.spreadDelegate.stage = ApplicationInfoInterface.MainStage;
605− ApplicationManager.focusApplication(drag.source.appId);
626+ drop.source.spreadDelegate.focus = true;
606 }
627 }
607 keys: "SideStage"
628 keys: "SideStage"
608 }
629 }
@@ -613,12 +634,12 @@ AbstractStage {
613 height: priv.landscapeHeight
634 height: priv.landscapeHeight
614 x: spreadView.width - width
635 x: spreadView.width - width
615 z: {
636 z: {
616− if (!priv.mainStageAppId) return 0;
637+ if (!priv.mainStageItemId) return 0;
617
638
618− if (priv.sideStageAppId && spreadView.nextInStack > 0) {
639+ if (priv.sideStageItemId && spreadView.nextInStack > 0) {
619− var nextAppInStack = ApplicationManager.get(spreadView.nextInStack);
640+ var nextDelegateInStack = spreadRepeater.itemAt(spreadView.nextInStack);
620
641
621− if (nextAppInStack.stage === ApplicationInfoInterface.MainStage) {
642+ if (nextDelegateInStack.stage === ApplicationInfoInterface.MainStage) {
622 // if the next app in stack is a main stage app, put the sidestage on top of it.
643 // if the next app in stack is a main stage app, put the sidestage on top of it.
623 return 2;
644 return 2;
624 }
645 }
@@ -633,12 +654,11 @@ AbstractStage {
633 Behavior on opacity { UbuntuNumberAnimation {} }
654 Behavior on opacity { UbuntuNumberAnimation {} }
634
655
635 onShownChanged: {
656 onShownChanged: {
636− if (!shown && ApplicationManager.focusedApplicationId == priv.sideStageAppId) {
657+ if (!shown && priv.sideStageDelegate && priv.focusedAppDelegate === priv.sideStageDelegate
637− ApplicationManager.requestFocusApplication(priv.mainStageAppId);
658+ && priv.mainStageDelegate) {
638− }
659+ priv.mainStageDelegate.focus = true;
639− priv.updateStageApps();
660+ } else if (shown && priv.sideStageDelegate) {
640− if (shown && priv.sideStageAppId) {
661+ priv.sideStageDelegate.focus = true;
641− ApplicationManager.requestFocusApplication(priv.sideStageAppId);
642 }
662 }
643 }
663 }
644
664
@@ -657,8 +677,8 @@ AbstractStage {
657 }
677 }
658 onDropped: {
678 onDropped: {
659 if (drop.keys == "MainStage") {
679 if (drop.keys == "MainStage") {
660− priv.setAppStage(drop.source.appId, ApplicationInfoInterface.SideStage, true);
680+ drop.source.spreadDelegate.stage = ApplicationInfoInterface.SideStage;
661− ApplicationManager.requestFocusApplication(drop.source.appId);
681+ drop.source.spreadDelegate.focus = true;
662 }
682 }
663 }
683 }
664 drag {
684 drag {
@@ -671,41 +691,102 @@ AbstractStage {
671 }
691 }
672 }
692 }
673
693
674− Repeater {
694+ TopLevelSurfaceRepeater {
675 id: spreadRepeater
695 id: spreadRepeater
676 objectName: "spreadRepeater"
696 objectName: "spreadRepeater"
677− model: ApplicationManager
697+ model: root.topLevelSurfaceList
698+
699+ onItemAdded: {
700+ priv.updateMainAndSideStageIndexes();
701+ if (spreadView.phase == 2) {
702+ spreadView.snapTo(index);
703+ }
704+ }
705+
706+ onItemRemoved: {
707+ priv.updateMainAndSideStageIndexes();
708+ // Unless we're closing the app ourselves in the spread,
709+ // lets make sure the spread doesn't mess up by the changing app list.
710+ if (spreadView.closingIndex == -1) {
711+ spreadView.phase = 0;
712+ spreadView.contentX = -spreadView.shift;
713+ focusTopMostApp();
714+ }
715+ }
716+ function focusTopMostApp() {
717+ if (spreadRepeater.count > 0) {
718+ var topmostDelegate = spreadRepeater.itemAt(0);
719+ topmostDelegate.focus = true;
720+ }
721+ }
678
722
679 delegate: TransformedTabletSpreadDelegate {
723 delegate: TransformedTabletSpreadDelegate {
680 id: spreadTile
724 id: spreadTile
681− objectName: model.appId ? "tabletSpreadDelegate_" + model.appId
725+ objectName: "spreadDelegate_" + model.id
682− : "tabletSpreadDelegate_null";
726+
727+ readonly property int index: model.index
683 width: spreadView.width
728 width: spreadView.width
684 height: spreadView.height
729 height: spreadView.height
685− active: appId == priv.mainStageAppId || appId == priv.sideStageAppId
730+ active: model.id == priv.mainStageItemId || model.id == priv.sideStageItemId
686 zIndex: selected && stage == ApplicationInfoInterface.MainStage ? 0 : spreadView.indexToZIndex(index)
731 zIndex: selected && stage == ApplicationInfoInterface.MainStage ? 0 : spreadView.indexToZIndex(index)
732+ onZIndexChanged: {
733+ if (spreadView.nextInStack == model.index) {
734+ spreadView.nextZInStack = zIndex;
735+ }
736+ }
687 selected: spreadView.selectedIndex == index
737 selected: spreadView.selectedIndex == index
688 otherSelected: spreadView.selectedIndex >= 0 && !selected
738 otherSelected: spreadView.selectedIndex >= 0 && !selected
689− isInSideStage: priv.sideStageAppId === appId
739+ isInSideStage: priv.sideStageItemId == model.id
690 interactive: !spreadView.interactive && spreadView.phase === 0 && root.interactive
740 interactive: !spreadView.interactive && spreadView.phase === 0 && root.interactive
691 swipeToCloseEnabled: spreadView.interactive && !snapAnimation.running
741 swipeToCloseEnabled: spreadView.interactive && !snapAnimation.running
692 maximizedAppTopMargin: root.maximizedAppTopMargin
742 maximizedAppTopMargin: root.maximizedAppTopMargin
743+ dragOffset: !isDash && model.id == priv.mainStageItemId && root.inverseProgress > 0
693− dragOffset: !isDash && appId == priv.mainStageAppId && root.inverseProgress > 0 && spreadView.phase === 0 ? root.inverseProgress : 0
744+ && spreadView.phase === 0 ? root.inverseProgress : 0
694− application: ApplicationManager.get(index)
745+ application: model.application
746+ surface: model.surface
695 closeable: !isDash
747 closeable: !isDash
696 highlightShown: root.altTabPressed && priv.highlightIndex == zIndex
748 highlightShown: root.altTabPressed && priv.highlightIndex == zIndex
697
749
698− readonly property bool wantsMainStage: model.stage == ApplicationInfoInterface.MainStage
750+ readonly property bool wantsMainStage: stage == ApplicationInfoInterface.MainStage
699
751
700− readonly property string appId: model.appId
701− readonly property bool isDash: model.appId == "unity8-dash"
752+ readonly property bool isDash: model.application.appId == "unity8-dash"
753+
754+ onFocusChanged: {
755+ if (focus && !spreadRepeater.startingUp) {
756+ priv.focusedAppDelegate = spreadTile;
757+ root.topLevelSurfaceList.raiseId(model.id);
758+ }
759+ if (focus && priv.sideStageEnabled && stage === ApplicationInfoInterface.SideStage) {
760+ sideStage.show();
761+ }
762+ }
763+ Connections {
764+ target: model.surface
765+ onFocusRequested: spreadTile.focus = true;
766+ }
767+ Connections {
768+ target: model.application
769+ onFocusRequested: {
770+ if (!model.surface) {
771+ // when an app has no surfaces, we assume there's only one entry representing it:
772+ // this delegate.
773+ spreadTile.focus = true;
774+ } else {
775+ // if the application has surfaces, focus request should be at surface-level.
776+ }
777+ }
778+ }
702
779
703− stage: model.stage
704 fullscreen: {
780 fullscreen: {
705− if (mainApp && stage === ApplicationInfoInterface.SideStage) {
781+ if (priv.mainStageDelegate && stage === ApplicationInfoInterface.SideStage) {
706− return mainApp.fullscreen;
782+ return priv.mainStageDelegate.fullscreen;
783+ } else if (surface) {
784+ return surface.state === Mir.FullscreenState;
785+ } else if (application) {
786+ return application.fullscreen;
787+ } else {
788+ return false;
707 }
789 }
708− return application ? application.fullscreen : false;
709 }
790 }
710
791
711 supportedOrientations: {
792 supportedOrientations: {
@@ -726,23 +807,6 @@ AbstractStage {
726 }
807 }
727 }
808 }
728
809
729−
730− Binding {
731− target: spreadTile.application
732− property: "exemptFromLifecycle"
733− value: !model.isTouchApp || isExemptFromLifecycle(model.appId)
734− }
735−
736− Binding {
737− target: spreadTile.application
738− property: "requestedState"
739− value: (isDash && root.keepDashRunning)
740− || (!root.suspended && (model.appId == priv.mainStageAppId
741− || model.appId == priv.sideStageAppId))
742− ? ApplicationInfoInterface.RequestedRunning
743− : ApplicationInfoInterface.RequestedSuspended
744− }
745−
746 // FIXME: A regular binding doesn't update any more after closing an app.
810 // FIXME: A regular binding doesn't update any more after closing an app.
747 // Using a Binding for now.
811 // Using a Binding for now.
748 Binding {
812 Binding {
@@ -762,34 +826,33 @@ AbstractStage {
762 onSideStageEnabledChanged: refreshStage()
826 onSideStageEnabledChanged: refreshStage()
763 }
827 }
764
828
829+ property bool _constructing: true;
830+ onStageChanged: {
831+ if (!_constructing) {
832+ priv.updateMainAndSideStageIndexes();
833+ }
834+ }
835+
765 Component.onCompleted: {
836 Component.onCompleted: {
837+ // a top level window is always the focused one when it first appears, unfocusing
838+ // any preexisting one
839+ focus = true;
766− refreshStage()
840+ refreshStage();
767− stageChanged.connect(priv.updateStageApps);
841+ _constructing = false;
842+ }
843+ Component.onDestruction: {
844+ WindowStateStorage.saveStage(model.application.appId, stage);
768 }
845 }
769
846
770 function refreshStage() {
847 function refreshStage() {
771− var stage = ApplicationInfoInterface.MainStage;
848+ var newStage = ApplicationInfoInterface.MainStage;
772 if (priv.sideStageEnabled) {
849 if (priv.sideStageEnabled) {
773 if (application && application.supportedOrientations & (Qt.PortraitOrientation|Qt.InvertedPortraitOrientation)) {
850 if (application && application.supportedOrientations & (Qt.PortraitOrientation|Qt.InvertedPortraitOrientation)) {
774− stage = WindowStateStorage.getStage(appId);
851+ newStage = WindowStateStorage.getStage(application.appId);
775 }
852 }
776 }
853 }
777
854
778− if (model.stage !== stage) {
855+ stage = newStage;
779− priv.setAppStage(appId, stage, false);
780− }
781− }
782−
783− // This is required because none of the bindings are triggered in some cases:
784− // When an app is closed, it might happen that ApplicationManager.get(nextInStack)
785− // returns a different app even though the nextInStackIndex and all the related
786− // bindings (index, mainStageApp, sideStageApp, etc) don't change. Let's force a
787− // binding update in that case.
788− Connections {
789− target: ApplicationManager
790− onApplicationRemoved: spreadTile.z = Qt.binding(function() {
791− return spreadView.indexToZIndex(index);
792− })
793 }
856 }
794
857
795 progress: {
858 progress: {
@@ -875,13 +938,10 @@ AbstractStage {
875 script: {
938 script: {
876 // rotate immediately.
939 // rotate immediately.
877 spreadTile.matchShellOrientation();
940 spreadTile.matchShellOrientation();
878− if (ApplicationManager.focusedApplicationId === spreadTile.appId &&
941+ if (priv.focusedAppDelegate === spreadTile &&
879 priv.sideStageEnabled && !sideStage.shown) {
942 priv.sideStageEnabled && !sideStage.shown) {
880 // Sidestage was focused, so show the side stage.
943 // Sidestage was focused, so show the side stage.
881 sideStage.show();
944 sideStage.show();
882− // if we've switched to a main app which doesnt support portrait, hide the side stage.
883− } else if (mainApp && (mainApp.supportedOrientations & (Qt.PortraitOrientation|Qt.InvertedPortraitOrientation)) == 0) {
884− sideStage.hideNow();
885 }
945 }
886 }
946 }
887 }
947 }
@@ -892,10 +952,10 @@ AbstractStage {
892 SequentialAnimation {
952 SequentialAnimation {
893 ScriptAction {
953 ScriptAction {
894 script: {
954 script: {
895− if (priv.sideStageAppId === spreadTile.appId &&
955+ if (priv.sideStageDelegate === spreadTile &&
896 mainApp && (mainApp.supportedOrientations & (Qt.PortraitOrientation|Qt.InvertedPortraitOrientation)) == 0) {
956 mainApp && (mainApp.supportedOrientations & (Qt.PortraitOrientation|Qt.InvertedPortraitOrientation)) == 0) {
897 // The mainstage app did not natively support portrait orientation, so focus the sidestage.
957 // The mainstage app did not natively support portrait orientation, so focus the sidestage.
898− ApplicationManager.requestFocusApplication(spreadTile.appId);
958+ spreadTile.focus = true;
899 }
959 }
900 }
960 }
901 }
961 }
@@ -924,28 +984,26 @@ AbstractStage {
924
984
925 onClosed: {
985 onClosed: {
926 spreadView.closingIndex = index;
986 spreadView.closingIndex = index;
927− ApplicationManager.stopApplication(ApplicationManager.get(index).appId);
987+ if (spreadTile.surface) {
928− }
988+ spreadTile.surface.close();
929−
989+ } else if (spreadTile.application) {
930− onFocusChanged: {
990+ root.applicationManager.stopApplication(spreadTile.application.appId);
931− if (focus && ApplicationManager.focusedApplicationId !== appId) {
991+ } else {
932− ApplicationManager.focusApplication(appId);
992+ // should never happen
933− }
993+ console.warn("Can't close topLevelSurfaceList entry as it has neither"
934−
994+ + " a surface nor an application");
935− if (focus && priv.sideStageEnabled && stage === ApplicationInfoInterface.SideStage) {
936− sideStage.show();
937 }
995 }
938 }
996 }
939
997
940 Binding {
998 Binding {
941 target: root
999 target: root
942− when: model.appId == priv.mainStageAppId
1000+ when: model.id == priv.mainStageItemId
943 property: "mainAppWindowOrientationAngle"
1001 property: "mainAppWindowOrientationAngle"
944 value: appWindowOrientationAngle
1002 value: appWindowOrientationAngle
945 }
1003 }
946 Binding {
1004 Binding {
947 target: priv
1005 target: priv
948− when: model.appId == priv.mainStageAppId
1006+ when: model.id == priv.mainStageItemId
949 property: "mainAppOrientationChangesEnabled"
1007 property: "mainAppOrientationChangesEnabled"
950 value: orientationChangesEnabled
1008 value: orientationChangesEnabled
951 }
1009 }
@@ -959,7 +1017,7 @@ AbstractStage {
959
1017
960 StagedFullscreenPolicy {
1018 StagedFullscreenPolicy {
961 id: fullscreenPolicy
1019 id: fullscreenPolicy
962− application: spreadTile.application
1020+ surface: model.surface
963 }
1021 }
964 Connections {
1022 Connections {
965 target: root
1023 target: root
@@ -975,17 +1033,19 @@ AbstractStage {
975 anchors.fill: parent
1033 anchors.fill: parent
976 enabled: priv.sideStageEnabled && !spreadView.active
1034 enabled: priv.sideStageEnabled && !spreadView.active
977 property var dragObject: null
1035 property var dragObject: null
978− property string appId: ""
1036+
1037+ property Item spreadDelegate
1038+
979 dragComponent: dragComponent
1039 dragComponent: dragComponent
980− dragComponentProperties: { "appId": appId }
1040+ dragComponentProperties: { "spreadDelegate": spreadDelegate }
981
1041
982 onPressed: {
1042 onPressed: {
983− function matchDelegate(obj) { return String(obj.objectName).indexOf("tabletSpreadDelegate") >= 0; }
1043+ function matchDelegate(obj) { return String(obj.objectName).indexOf("spreadDelegate") >= 0; }
984
1044
985 var delegateAtCenter = Functions.itemAt(spreadRow, x, y, matchDelegate);
1045 var delegateAtCenter = Functions.itemAt(spreadRow, x, y, matchDelegate);
986 if (!delegateAtCenter) return;
1046 if (!delegateAtCenter) return;
987
1047
988− appId = delegateAtCenter.appId;
1048+ spreadDelegate = delegateAtCenter;
989 }
1049 }
990
1050
991 onClicked: {
1051 onClicked: {
@@ -1005,11 +1065,11 @@ AbstractStage {
1005
1065
1006 Component {
1066 Component {
1007 id: dragComponent
1067 id: dragComponent
1008− SessionContainer {
1068+ SurfaceContainer {
1009− property string appId: ""
1069+ property Item spreadDelegate
1010− property var application: ApplicationManager.findApplication(appId)
1070+
1071+ surface: spreadDelegate ? spreadDelegate.surface : null
1011
1072
1012− session: application ? application.session : null
1013 interactive: false
1073 interactive: false
1014 resizeSurface: false
1074 resizeSurface: false
1015 focus: false
1075 focus: false
@@ -1021,10 +1081,11 @@ AbstractStage {
1021 Drag.hotSpot.y: height/2
1081 Drag.hotSpot.y: height/2
1022 // only accept opposite stage.
1082 // only accept opposite stage.
1023 Drag.keys: {
1083 Drag.keys: {
1024− if (!application) return "Disabled";
1084+ if (!surface) return "Disabled";
1025
1085
1026− if (application.stage === ApplicationInfo.MainStage) {
1086+ if (spreadDelegate.stage === ApplicationInfo.MainStage) {
1087+ if (spreadDelegate.application.supportedOrientations
1027− if (application.supportedOrientations & (Qt.PortraitOrientation|Qt.InvertedPortraitOrientation)) {
1088+ & (Qt.PortraitOrientation|Qt.InvertedPortraitOrientation)) {
1028 return "MainStage";
1089 return "MainStage";
1029 }
1090 }
1030 return "Disabled";
1091 return "Disabled";
qml/Stages/TopLevelSurfaceRepeater.qmlnew file+52
@@ -0,0 +1,52 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4
18+
19+Repeater {
20+ id: root
21+ // FIXME: This is a hack around us not knowing whether the Repeater has finished creating its
22+ // delegates on start up.
23+ // This is a problem when the stage gets a TopLevelSurfaceList already populated with several
24+ // rows.
25+ property bool startingUp: true
26+ onStartingUpChanged: {
27+ if (!startingUp) {
28+ // the top-most surface must be the focused one.
29+ var topmostDelegate = itemAt(0);
30+ topmostDelegate.focus = true;
31+ }
32+ }
33+
34+ onItemAdded: {
35+ if (startingUp) {
36+ checkIfStillStartingUp();
37+ }
38+ }
39+
40+ function checkIfStillStartingUp() {
41+ var i = 0;
42+ var missingDelegate = false;
43+ for (i = 0; i < model.count && !missingDelegate; ++i) {
44+ if (!itemAt(i)) {
45+ missingDelegate = true;
46+ }
47+ }
48+ if (!missingDelegate) {
49+ startingUp = false;
50+ }
51+ }
52+}
qml/Stages/TransformedSpreadDelegate.qml+4−4
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2014 Canonical Ltd.
2+ * Copyright 2014,2016 Canonical Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
5 * it under the terms of the GNU Lesser General Public License as published by
@@ -312,7 +312,7 @@ SpreadDelegate {
312 // non-fullscreen window when they're stacked on top of each other on the
312 // non-fullscreen window when they're stacked on top of each other on the
313 // far left of the spread.
313 // far left of the spread.
314 Translate {
314 Translate {
315− y: !fullscreen && appWindowRotation === 180
315+ y: !root.fullscreen && appWindowRotation === 180
316 ? priv.topMarginProgress * maximizedAppTopMargin
316 ? priv.topMarginProgress * maximizedAppTopMargin
317 : 0
317 : 0
318 },
318 },
@@ -326,7 +326,7 @@ SpreadDelegate {
326 switch (appWindowRotation) {
326 switch (appWindowRotation) {
327 case 90:
327 case 90:
328 case 270:
328 case 270:
329− if (fullscreen) {
329+ if (root.fullscreen) {
330 return 1;
330 return 1;
331 } else {
331 } else {
332 return 1 + priv.topMarginProgress * maximizedAppTopMargin / spreadView.width;
332 return 1 + priv.topMarginProgress * maximizedAppTopMargin / spreadView.width;
@@ -340,7 +340,7 @@ SpreadDelegate {
340 yScale: {
340 yScale: {
341 switch (appWindowRotation) {
341 switch (appWindowRotation) {
342 case 0:
342 case 0:
343− if (fullscreen) {
343+ if (root.fullscreen) {
344 return 1 - priv.topMarginProgress * maximizedAppTopMargin / spreadView.height;
344 return 1 - priv.topMarginProgress * maximizedAppTopMargin / spreadView.height;
345 } else {
345 } else {
346 return 1;
346 return 1;
qml/Stages/TransformedTabletSpreadDelegate.qml+29−23
@@ -31,7 +31,6 @@ SpreadDelegate {
31 // Set this to true when this tile a currently active on either the MS or the SS.
31 // Set this to true when this tile a currently active on either the MS or the SS.
32 property bool active: false
32 property bool active: false
33
33
34− property int stage
35 property int zIndex
34 property int zIndex
36 property real progress: 0
35 property real progress: 0
37 property real animatedProgress: 0
36 property real animatedProgress: 0
@@ -48,13 +47,15 @@ SpreadDelegate {
48
47
49 property bool isInSideStage: false
48 property bool isInSideStage: false
50
49
50+ property int stage: ApplicationInfoInterface.MainStage
51+
51 property int dragOffset: 0
52 property int dragOffset: 0
52 readonly property alias xTranslateAnimating: xTranslateAnimation.running
53 readonly property alias xTranslateAnimating: xTranslateAnimation.running
53 readonly property bool offScreen: priv.xTranslate >= 0
54 readonly property bool offScreen: priv.xTranslate >= 0
54
55
55 dropShadow: spreadView.active ||
56 dropShadow: spreadView.active ||
56 (active
57 (active
57− && (stage == ApplicationInfoInterface.MainStage || !priv.shellIsLandscape)
58+ && (root.stage == ApplicationInfoInterface.MainStage || !priv.shellIsLandscape)
58 && priv.xTranslate != 0)
59 && priv.xTranslate != 0)
59
60
60 onSelectedChanged: {
61 onSelectedChanged: {
@@ -90,7 +91,7 @@ SpreadDelegate {
90 id: priv
91 id: priv
91
92
92 // true if this is the next tile on the stack that comes in when dragging from the right
93 // true if this is the next tile on the stack that comes in when dragging from the right
93− property bool nextInStack: spreadView.nextZInStack == zIndex
94+ property bool nextInStack: spreadView.nextInStack == model.index
94 // true if the next tile in the stack is the nextInStack one. This one will be moved a bit to the left
95 // true if the next tile in the stack is the nextInStack one. This one will be moved a bit to the left
95 property bool movedActive: spreadView.nextZInStack == zIndex + 1
96 property bool movedActive: spreadView.nextZInStack == zIndex + 1
96 property real animatedEndDistance: linearAnimation(0, 2, root.endDistance, 0, root.progress)
97 property real animatedEndDistance: linearAnimation(0, 2, root.endDistance, 0, root.progress)
@@ -142,7 +143,7 @@ SpreadDelegate {
142 Behavior on xTranslate {
143 Behavior on xTranslate {
143 enabled: !spreadView.active &&
144 enabled: !spreadView.active &&
144 !snapAnimation.running &&
145 !snapAnimation.running &&
145− model.appId !== "unity8-dash" &&
146+ root.application.appId !== "unity8-dash" &&
146 spreadView.animateX &&
147 spreadView.animateX &&
147 !spreadView.beingResized &&
148 !spreadView.beingResized &&
148 priv.state !== "sideStage"
149 priv.state !== "sideStage"
@@ -156,8 +157,9 @@ SpreadDelegate {
156 var newTranslate = 0;
157 var newTranslate = 0;
157
158
158 // selected app or opposite stage active app.
159 // selected app or opposite stage active app.
159− if (isSelected || (otherSelected && root.active && spreadView.selectedApplication && spreadView.selectedApplication.stage !== stage)) {
160+ if (isSelected || (otherSelected && root.active && spreadView.selectedDelegate
161+ && spreadView.selectedDelegate.stage !== root.stage)) {
160− if (stage == ApplicationInfoInterface.MainStage) {
162+ if (root.stage == ApplicationInfoInterface.MainStage) {
161 return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.width, root.progress);
163 return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.width, root.progress);
162 } else {
164 } else {
163 return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.sideStageWidth, root.progress);
165 return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.sideStageWidth, root.progress);
@@ -168,8 +170,8 @@ SpreadDelegate {
168
170
169 // The tile should move a bit to the left if a new one comes on top of it, but not for the Side Stage and not
171 // The tile should move a bit to the left if a new one comes on top of it, but not for the Side Stage and not
170 // when we're only dragging the side stage in on top of a main stage app
172 // when we're only dragging the side stage in on top of a main stage app
171− var shouldMoveAway = spreadView.nextInStack >= 0 && priv.movedActive && stage === ApplicationInfoInterface.MainStage &&
173+ var shouldMoveAway = spreadView.nextInStack >= 0 && priv.movedActive && root.stage === ApplicationInfoInterface.MainStage &&
172− ApplicationManager.get(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage;
174+ topLevelSurfaceList.applicationAt(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage;
173
175
174 if (active) {
176 if (active) {
175 newTranslate -= root.width
177 newTranslate -= root.width
@@ -178,7 +180,7 @@ SpreadDelegate {
178 newTranslate += linearAnimation(0, spreadView.positionMarker2, 0, -units.gu(4), root.animatedProgress);
180 newTranslate += linearAnimation(0, spreadView.positionMarker2, 0, -units.gu(4), root.animatedProgress);
179 }
181 }
180 newTranslate += root.dragOffset;
182 newTranslate += root.dragOffset;
181− } else if (!spreadView.active && model.appId == "unity8-dash") {
183+ } else if (!spreadView.active && root.application.appId == "unity8-dash") {
182 newTranslate -= root.width;
184 newTranslate -= root.width;
183 }
185 }
184
186
@@ -190,14 +192,14 @@ SpreadDelegate {
190
192
191 if (spreadView.phase == 0) {
193 if (spreadView.phase == 0) {
192 if (nextInStack) {
194 if (nextInStack) {
193− if (stage == ApplicationInfoInterface.MainStage) {
195+ if (root.stage == ApplicationInfoInterface.MainStage) {
194 if (spreadView.sideStageVisible && root.progress > 0) {
196 if (spreadView.sideStageVisible && root.progress > 0) {
195 // Move it so it appears from behind the side stage immediately
197 // Move it so it appears from behind the side stage immediately
196 newTranslate += -spreadView.sideStageWidth;
198 newTranslate += -spreadView.sideStageWidth;
197 }
199 }
198 }
200 }
199
201
200− if (stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
202+ if (root.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
201 // This is when we only drag the side stage in, without rotation or snapping
203 // This is when we only drag the side stage in, without rotation or snapping
202 newTranslate = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.sideStageWidth, root.animatedProgress);
204 newTranslate = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.sideStageWidth, root.animatedProgress);
203 } else {
205 } else {
@@ -210,7 +212,7 @@ SpreadDelegate {
210
212
211 if (spreadView.phase == 1) {
213 if (spreadView.phase == 1) {
212 if (nextInStack) {
214 if (nextInStack) {
213− if (stage == ApplicationInfoInterface.MainStage) {
215+ if (root.stage == ApplicationInfoInterface.MainStage) {
214 var startValue = -spreadView.sideStageWidth * spreadView.snapPosition + (spreadView.sideStageVisible ? -spreadView.sideStageWidth : 0);
216 var startValue = -spreadView.sideStageWidth * spreadView.snapPosition + (spreadView.sideStageVisible ? -spreadView.sideStageWidth : 0);
215 newTranslate += linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, startValue, priv.phase2StartTranslate, root.animatedProgress);
217 newTranslate += linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, startValue, priv.phase2StartTranslate, root.animatedProgress);
216 } else {
218 } else {
@@ -250,7 +252,8 @@ SpreadDelegate {
250 }
252 }
251
253
252 // selected app or opposite stage active app.
254 // selected app or opposite stage active app.
253− if (isSelected || (otherSelected && root.active && spreadView.selectedApplication && spreadView.selectedApplication.stage !== stage)) {
255+ if (isSelected || (otherSelected && root.active && spreadView.selectedDelegate
256+ && spreadView.selectedDelegate.stage !== root.stage)) {
254 return linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress);
257 return linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress);
255 } else if (otherSelected) {
258 } else if (otherSelected) {
256 return selectedScale;
259 return selectedScale;
@@ -258,7 +261,7 @@ SpreadDelegate {
258
261
259 if (spreadView.phase == 0) {
262 if (spreadView.phase == 0) {
260 if (nextInStack) {
263 if (nextInStack) {
261− if (stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
264+ if (root.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
262 return 1;
265 return 1;
263 } else {
266 } else {
264 var targetScale = root.dragStartScale - ((root.dragStartScale - 1) * spreadView.snapPosition);
267 var targetScale = root.dragStartScale - ((root.dragStartScale - 1) * spreadView.snapPosition);
@@ -272,7 +275,7 @@ SpreadDelegate {
272 if (spreadView.phase == 1) {
275 if (spreadView.phase == 1) {
273 if (nextInStack) {
276 if (nextInStack) {
274 var startScale = 1;
277 var startScale = 1;
275− if (stage !== ApplicationInfoInterface.SideStage || spreadView.sideStageVisible) {
278+ if (root.stage !== ApplicationInfoInterface.SideStage || spreadView.sideStageVisible) {
276 startScale = root.dragStartScale - ((root.dragStartScale - 1) * spreadView.snapPosition);
279 startScale = root.dragStartScale - ((root.dragStartScale - 1) * spreadView.snapPosition);
277 }
280 }
278 return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, startScale, priv.phase2StartScale, root.animatedProgress);
281 return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, startScale, priv.phase2StartScale, root.animatedProgress);
@@ -295,7 +298,8 @@ SpreadDelegate {
295 }
298 }
296
299
297 // selected app or opposite stage active app.
300 // selected app or opposite stage active app.
298− if (isSelected || (otherSelected && root.active && spreadView.selectedApplication && spreadView.selectedApplication.stage !== stage)) {
301+ if (isSelected || (otherSelected && root.active && spreadView.selectedDelegate
302+ && spreadView.selectedDelegate.stage !== root.stage)) {
299 return linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress);
303 return linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress);
300 } else if (otherSelected) {
304 } else if (otherSelected) {
301 return selectedAngle;
305 return selectedAngle;
@@ -304,12 +308,12 @@ SpreadDelegate {
304 // The tile should rotate a bit when another one comes on top, but not when only dragging the side stage in
308 // The tile should rotate a bit when another one comes on top, but not when only dragging the side stage in
305 var shouldMoveAway = spreadView.nextInStack == -1 ||
309 var shouldMoveAway = spreadView.nextInStack == -1 ||
306 spreadView.nextInStack >= 0 && priv.movedActive &&
310 spreadView.nextInStack >= 0 && priv.movedActive &&
307− (ApplicationManager.get(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage ||
311+ (topLevelSurfaceList.applicationAt(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage ||
308− stage == ApplicationInfoInterface.SideStage);
312+ root.stage == ApplicationInfoInterface.SideStage);
309
313
310 if (spreadView.phase == 0) {
314 if (spreadView.phase == 0) {
311 if (nextInStack) {
315 if (nextInStack) {
312− if (stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
316+ if (root.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
313 return 0;
317 return 0;
314 } else {
318 } else {
315 return linearAnimation(0, spreadView.positionMarker2, root.startAngle, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress);
319 return linearAnimation(0, spreadView.positionMarker2, root.startAngle, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress);
@@ -321,7 +325,7 @@ SpreadDelegate {
321 }
325 }
322 if (spreadView.phase == 1) {
326 if (spreadView.phase == 1) {
323 if (nextInStack) {
327 if (nextInStack) {
324− if (stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
328+ if (root.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
325 return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 0, priv.phase2StartAngle, root.animatedProgress);
329 return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 0, priv.phase2StartAngle, root.animatedProgress);
326 } else {
330 } else {
327 return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), priv.phase2StartAngle, root.animatedProgress);
331 return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), priv.phase2StartAngle, root.animatedProgress);
@@ -345,7 +349,8 @@ SpreadDelegate {
345 if (root.isSelected) return 1;
349 if (root.isSelected) return 1;
346
350
347 if (otherSelected) {
351 if (otherSelected) {
348− if (root.active && spreadView.selectedApplication && spreadView.selectedApplication.stage !== stage) {
352+ if (root.active && spreadView.selectedDelegate
353+ && spreadView.selectedDelegate.stage !== root.stage) {
349 return 1;
354 return 1;
350 }
355 }
351 return linearAnimation(selectedProgress, negativeProgress, selectedOpacity, 0, root.progress);
356 return linearAnimation(selectedProgress, negativeProgress, selectedOpacity, 0, root.progress);
@@ -355,7 +360,8 @@ SpreadDelegate {
355
360
356 property real topMarginProgress: {
361 property real topMarginProgress: {
357 // selected app or opposite stage active app.
362 // selected app or opposite stage active app.
358− if (isSelected || (otherSelected && root.active && spreadView.selectedApplication && spreadView.selectedApplication.stage !== stage)) {
363+ if (isSelected || (otherSelected && root.active && spreadView.selectedDelegate
364+ && spreadView.selectedDelegate.stage !== root.stage)) {
359 return linearAnimation(selectedProgress, negativeProgress, selectedTopMarginProgress, 0, root.progress);
365 return linearAnimation(selectedProgress, negativeProgress, selectedTopMarginProgress, 0, root.progress);
360 }
366 }
361
367
@@ -379,7 +385,7 @@ SpreadDelegate {
379 when: root.isInSideStage && spreadView.shiftedContentX == 0 && spreadView.phase == 0
385 when: root.isInSideStage && spreadView.shiftedContentX == 0 && spreadView.phase == 0
380 PropertyChanges {
386 PropertyChanges {
381 target: priv;
387 target: priv;
382− xTranslate: -spreadView.sideStageWidth + spreadView.sideStageWidth * (1-spreadView.sideStageDragProgress)
388+ xTranslate: -spreadView.sideStageWidth + spreadView.sideStageWidth * (1-sideStage.progress)
383 }
389 }
384 }
390 }
385 ]
391 ]
qml/Stages/WindowedFullscreenPolicy.qml+5−7
@@ -23,19 +23,17 @@ import Unity.Application 0.1
23// state of the window is returned to restored.
23// state of the window is returned to restored.
24QtObject {
24QtObject {
25 property bool active: true
25 property bool active: true
26− property QtObject application: null
26+ property QtObject surface: null
27
27
28− readonly property var lastSurface: application && application.session ?
29− application.session.lastSurface : null
30 property bool _firstTimeSurface: true
28 property bool _firstTimeSurface: true
31
29
32− onLastSurfaceChanged: {
30+ onSurfaceChanged: {
33− if (!active || !lastSurface) return;
31+ if (!active || !surface) return;
34 if (!_firstTimeSurface) return;
32 if (!_firstTimeSurface) return;
35 _firstTimeSurface = false;
33 _firstTimeSurface = false;
36
34
37− if (lastSurface.state === Mir.FullscreenState && lastSurface.shellChrome === Mir.LowChrome) {
35+ if (surface.state === Mir.FullscreenState && surface.shellChrome === Mir.LowChrome) {
38− lastSurface.state = Mir.RestoredState;
36+ surface.state = Mir.RestoredState;
39 }
37 }
40 }
38 }
41}
39}
qml/Tutorial/TutorialBottom.qml+1−1
@@ -47,7 +47,7 @@ TutorialPage {
47 readonly property real sideStageWidth: root.usageScenario === "tablet" && stage.sideStageVisible ?
47 readonly property real sideStageWidth: root.usageScenario === "tablet" && stage.sideStageVisible ?
48 stage.sideStageWidth : 0
48 stage.sideStageWidth : 0
49 readonly property bool isMainStageApp: usageScenario !== "tablet" ||
49 readonly property bool isMainStageApp: usageScenario !== "tablet" ||
50− application.stage === ApplicationInfoInterface.MainStage
50+ stage.stageFocusedSurface === ApplicationInfoInterface.MainStage
51 readonly property real dragAreaHeight: units.gu(3) // based on PageWithBottomEdge.qml
51 readonly property real dragAreaHeight: units.gu(3) // based on PageWithBottomEdge.qml
52 readonly property real targetDistance: height * 0.2 + dragAreaHeight // based on PageWithBottomEdge.qml
52 readonly property real targetDistance: height * 0.2 + dragAreaHeight // based on PageWithBottomEdge.qml
53
53
tests/mocks/Unity/Application/ApplicationInfo.cpp+181−108
@@ -16,8 +16,7 @@
16
16
17#include "ApplicationInfo.h"
17#include "ApplicationInfo.h"
18#include "MirSurface.h"
18#include "MirSurface.h"
19−#include "Session.h"
19+#include "SurfaceManager.h"
20−#include "SessionManager.h"
21
20
22#include <paths.h>
21#include <paths.h>
23
22
@@ -25,97 +24,114 @@
25#include <QQuickItem>
24#include <QQuickItem>
26#include <QQuickView>
25#include <QQuickView>
27#include <QQmlComponent>
26#include <QQmlComponent>
28−#include <QTimer>
27+
28+#define APPLICATION_DEBUG 0
29+
30+#if APPLICATION_DEBUG
31+#define DEBUG_MSG(params) qDebug().nospace() << "Application["<<appId()<<"]::" << __func__ << " " << params
32+
33+QString stateToStr(ApplicationInfo::State state)
34+{
35+ switch (state) {
36+ case ApplicationInfo::Starting:
37+ return "starting";
38+ case ApplicationInfo::Running:
39+ return "running";
40+ case ApplicationInfo::Suspended:
41+ return "suspended";
42+ case ApplicationInfo::Stopped:
43+ return "stopped";
44+ default:
45+ return "???";
46+ };
47+}
48+
49+#else
50+#define DEBUG_MSG(params) ((void)0)
51+#endif
52+
53+#define WARNING_MSG(params) qWarning().nospace() << "Application["<<appId()<<"]::" << __func__ << " " << params
29
54
30ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
55ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
31 : ApplicationInfoInterface(appId, parent)
56 : ApplicationInfoInterface(appId, parent)
32 , m_appId(appId)
57 , m_appId(appId)
33− , m_stage(MainStage)
34− , m_state(Stopped)
35− , m_focused(false)
36− , m_fullscreen(false)
37− , m_session(0)
38− , m_supportedOrientations(Qt::PortraitOrientation |
39− Qt::LandscapeOrientation |
40− Qt::InvertedPortraitOrientation |
41− Qt::InvertedLandscapeOrientation)
42− , m_rotatesWindowContents(false)
43− , m_requestedState(RequestedRunning)
44− , m_isTouchApp(true)
45− , m_exemptFromLifecycle(false)
46− , m_manualSurfaceCreation(false)
47− , m_shellChrome(Mir::NormalChrome)
48{
58{
59+ connect(&m_surfaceList, &MirSurfaceListModel::countChanged,
60+ this, &ApplicationInfo::onSurfaceCountChanged, Qt::QueuedConnection);
61+
62+ m_surfaceCreationTimer.setSingleShot(true);
63+ m_surfaceCreationTimer.setInterval(500);
64+ connect(&m_surfaceCreationTimer, &QTimer::timeout, this, &ApplicationInfo::createSurface);
49}
65}
50
66
51ApplicationInfo::ApplicationInfo(QObject *parent)
67ApplicationInfo::ApplicationInfo(QObject *parent)
52− : ApplicationInfoInterface(QString(), parent)
68+ : ApplicationInfo(QString(), parent)
53− , m_stage(MainStage)
54− , m_state(Stopped)
55− , m_focused(false)
56− , m_fullscreen(false)
57− , m_session(0)
58− , m_supportedOrientations(Qt::PortraitOrientation |
59− Qt::LandscapeOrientation |
60− Qt::InvertedPortraitOrientation |
61− Qt::InvertedLandscapeOrientation)
62− , m_rotatesWindowContents(false)
63− , m_requestedState(RequestedRunning)
64− , m_isTouchApp(true)
65− , m_exemptFromLifecycle(false)
66− , m_manualSurfaceCreation(false)
67− , m_shellChrome(Mir::NormalChrome)
68{
69{
69}
70}
70
71
71ApplicationInfo::~ApplicationInfo()
72ApplicationInfo::~ApplicationInfo()
72{
73{
73− delete m_session;
74}
74}
75
75
76−void ApplicationInfo::createSession()
76+void ApplicationInfo::createSurface()
77{
77{
78− if (m_session || state() == ApplicationInfo::Stopped) { return; }
78+ if (state() == ApplicationInfo::Stopped) { return; }
79−
80− setSession(SessionManager::singleton()->createSession(appId(), m_screenshotFileName));
81−}
82
79
83−void ApplicationInfo::destroySession()
80+ QString surfaceName = name();
84−{
81+ if (m_surfaceList.count() > 0) {
85− Session *session = this->session();
82+ surfaceName.append(QString(" %1").arg(m_surfaceList.count()+1));
86− setSession(nullptr);
87− delete session;
88−}
83+ }
89
84
90−void ApplicationInfo::setSession(Session* session)
85+ auto surfaceManager = SurfaceManager::instance();
91−{
86+ if (!surfaceManager) {
92− if (m_session == session)
87+ WARNING_MSG("No SurfaceManager");
93 return;
88 return;
94−
95− if (m_session) {
96− disconnect(this, 0, m_session, 0);
97− m_session->setApplication(nullptr);
98− m_session->setParent(nullptr);
99− Q_EMIT m_session->deregister();
100 }
89 }
101
90
102− m_session = session;
91+ auto surface = surfaceManager->createSurface(surfaceName,
103−
92+ Mir::NormalType,
104− if (m_session) {
93+ fullscreen() ? Mir::FullscreenState : Mir::MaximizedState,
105− m_session->setApplication(this);
94+ m_screenshotFileName);
106− m_session->setParent(this);
95+
107− m_session->setFullscreen(m_fullscreen);
96+ surface->setShellChrome(m_shellChrome);
108− SessionManager::singleton()->registerSession(m_session);
97+
109− connect(m_session, &Session::surfaceAdded,
98+ m_surfaceList.appendSurface(surface);
110− this, &ApplicationInfo::onSessionSurfaceAdded);
99+
111− connect(m_session, &Session::fullscreenChanged, this, &ApplicationInfo::fullscreenChanged);
100+ ++m_liveSurfaceCount;
101+ connect(surface, &MirSurface::liveChanged, this, [this, surface](){
102+ if (!surface->live()) {
103+ --m_liveSurfaceCount;
104+ if (m_liveSurfaceCount == 0) {
105+ if (m_closingSurfaces.contains(surface)
106+ || (m_state == Running && m_requestedState == RequestedRunning)) {
107+ Q_EMIT closed();
108+ }
109+ setState(Stopped);
110+ } else {
111+ if (m_closingSurfaces.contains(surface) && m_requestedState == RequestedSuspended
112+ && m_closingSurfaces.count() == 1) {
113+ setState(Suspended);
114+ }
115+ }
116+ m_closingSurfaces.removeAll(surface);
117+ }
118+ });
119+ connect(surface, &MirSurface::closeRequested, this, [this, surface](){
120+ m_closingSurfaces.append(surface);
121+ if (m_state == Suspended) {
122+ // resume to allow application to close its surface
123+ setState(Running);
124+ }
125+ });
126+ connect(surface, &MirSurface::focusRequested, this, &ApplicationInfo::focusRequested);
112
127
113− if (!m_manualSurfaceCreation) {
128+ if (m_state == Starting) {
114− QTimer::singleShot(500, m_session, &Session::createSurface);
129+ if (m_requestedState == RequestedRunning) {
130+ setState(Running);
131+ } else {
132+ setState(Suspended);
115 }
133 }
116 }
134 }
117−
118− Q_EMIT sessionChanged(m_session);
119}
135}
120
136
121void ApplicationInfo::setIconId(const QString &iconId)
137void ApplicationInfo::setIconId(const QString &iconId)
@@ -138,10 +154,6 @@ void ApplicationInfo::setScreenshotId(const QString &screenshotId)
138
154
139 if (screenshotFileName != m_screenshotFileName) {
155 if (screenshotFileName != m_screenshotFileName) {
140 m_screenshotFileName = screenshotFileName;
156 m_screenshotFileName = screenshotFileName;
141−
142− if (m_session) {
143− m_session->setScreenshot(screenshotFileName);
144− }
145 }
157 }
146}
158}
147
159
@@ -172,38 +184,53 @@ void ApplicationInfo::setStage(Stage value)
172void ApplicationInfo::setState(State value)
184void ApplicationInfo::setState(State value)
173{
185{
174 if (value != m_state) {
186 if (value != m_state) {
187+ DEBUG_MSG(qPrintable(stateToStr(value)));
188+ if (!m_manualSurfaceCreation && value == ApplicationInfo::Starting) {
189+ Q_ASSERT(m_surfaceList.count() == 0);
190+ m_surfaceCreationTimer.start();
191+ } else if (value == ApplicationInfo::Stopped) {
192+ m_surfaceCreationTimer.stop();
193+ for (int i = 0; i < m_surfaceList.count(); ++i) {
194+ MirSurface *surface = static_cast<MirSurface*>(m_surfaceList.get(i));
195+ surface->setLive(false);
196+ }
197+ }
198+
175 m_state = value;
199 m_state = value;
176 Q_EMIT stateChanged(value);
200 Q_EMIT stateChanged(value);
177−
178− if (!m_manualSurfaceCreation && !m_session && m_state == ApplicationInfo::Starting) {
179− QTimer::singleShot(500, this, &ApplicationInfo::createSession);
180− } else if (m_state == ApplicationInfo::Stopped) {
181− Session *session = m_session;
182− setSession(nullptr);
183− delete session;
184− }
185 }
201 }
186}
202}
187
203
188−void ApplicationInfo::setFocused(bool value)
204+void ApplicationInfo::close()
189{
205{
190− if (value != m_focused) {
206+ DEBUG_MSG("");
191− m_focused = value;
207+
192− Q_EMIT focusedChanged(value);
208+ if (m_surfaceList.count() > 0) {
209+ for (int i = 0; i < m_surfaceList.count(); ++i) {
210+ MirSurface *surface = static_cast<MirSurface*>(m_surfaceList.get(i));
211+ surface->close();
212+ }
213+ } else {
214+ setState(Stopped);
215+ Q_EMIT closed();
193 }
216 }
194}
217}
195
218
196void ApplicationInfo::setFullscreen(bool value)
219void ApplicationInfo::setFullscreen(bool value)
197{
220{
198 m_fullscreen = value;
221 m_fullscreen = value;
199− if (m_session) {
222+ if (m_surfaceList.rowCount() > 0) {
200− m_session->setFullscreen(value);
223+ m_surfaceList.get(0)->setState(Mir::FullscreenState);
201 }
224 }
202}
225}
203
226
204bool ApplicationInfo::fullscreen() const
227bool ApplicationInfo::fullscreen() const
205{
228{
206− return m_session ? m_session->fullscreen() : m_fullscreen;
229+ if (m_surfaceList.rowCount() > 0) {
230+ return m_surfaceList.get(0)->state() == Mir::FullscreenState;
231+ } else {
232+ return m_fullscreen;
233+ }
207}
234}
208
235
209void ApplicationInfo::setManualSurfaceCreation(bool value)
236void ApplicationInfo::setManualSurfaceCreation(bool value)
@@ -241,15 +268,28 @@ ApplicationInfo::RequestedState ApplicationInfo::requestedState() const
241
268
242void ApplicationInfo::setRequestedState(RequestedState value)
269void ApplicationInfo::setRequestedState(RequestedState value)
243{
270{
244− if (m_requestedState != value) {
271+ if (m_requestedState == value) {
245− m_requestedState = value;
272+ return;
246− Q_EMIT requestedStateChanged(m_requestedState);
273+ }
274+ DEBUG_MSG((value == RequestedRunning ? "RequestedRunning" : "RequestedSuspended") );
247
275
276+ m_requestedState = value;
277+ Q_EMIT requestedStateChanged(m_requestedState);
278+
248− if (m_requestedState == RequestedRunning && m_state == Suspended) {
279+ if (m_requestedState == RequestedRunning) {
280+
281+ if (m_state == Suspended) {
282+ Q_ASSERT(m_liveSurfaceCount > 0);
249 setState(Running);
283 setState(Running);
250− } else if (m_requestedState == RequestedSuspended && m_state == Running) {
284+ } else if (m_state == Stopped) {
285+ Q_ASSERT(m_liveSurfaceCount == 0);
286+ // it's restarting
251− setState(Suspended);
287+ setState(Starting);
252 }
288 }
289+
290+ } else if (m_requestedState == RequestedSuspended && m_state == Running
291+ && m_closingSurfaces.isEmpty()) {
292+ setState(Suspended);
253 }
293 }
254}
294}
255
295
@@ -263,18 +303,6 @@ void ApplicationInfo::setIsTouchApp(bool isTouchApp)
263 m_isTouchApp = isTouchApp;
303 m_isTouchApp = isTouchApp;
264}
304}
265
305
266−void ApplicationInfo::onSessionSurfaceAdded(MirSurface* surface)
267−{
268− if (surface != nullptr && m_state == Starting) {
269− if (m_requestedState == RequestedRunning) {
270− setState(Running);
271− } else {
272− setState(Suspended);
273− }
274− surface->setShellChrome(m_shellChrome);
275− }
276−}
277−
278bool ApplicationInfo::exemptFromLifecycle() const
306bool ApplicationInfo::exemptFromLifecycle() const
279{
307{
280 return m_exemptFromLifecycle;
308 return m_exemptFromLifecycle;
@@ -305,7 +333,52 @@ void ApplicationInfo::setInitialSurfaceSize(const QSize &size)
305void ApplicationInfo::setShellChrome(Mir::ShellChrome shellChrome)
333void ApplicationInfo::setShellChrome(Mir::ShellChrome shellChrome)
306{
334{
307 m_shellChrome = shellChrome;
335 m_shellChrome = shellChrome;
308− if (m_session && m_session->lastSurface()) {
336+ if (m_surfaceList.rowCount() > 0) {
309− m_session->lastSurface()->setShellChrome(shellChrome);
337+ static_cast<MirSurface*>(m_surfaceList.get(0))->setShellChrome(shellChrome);
338+ }
339+}
340+
341+bool ApplicationInfo::focused() const
342+{
343+ bool someSurfaceHasFocus = false; // to be proven wrong
344+ for (int i = 0; i < m_surfaceList.count() && !someSurfaceHasFocus; ++i) {
345+ someSurfaceHasFocus = m_surfaceList.get(i)->focused();
346+ }
347+ return someSurfaceHasFocus;
348+}
349+
350+void ApplicationInfo::setFocused(bool value)
351+{
352+ if (focused() == value) {
353+ return;
354+ }
355+
356+ if (value) {
357+ if (m_surfaceList.count() > 0) {
358+ m_surfaceList.get(0)->requestFocus();
359+ }
360+ } else {
361+ for (int i = 0; i < m_surfaceList.count(); ++i) {
362+ MirSurface *surface = static_cast<MirSurface*>(m_surfaceList.get(i));
363+ if (surface->focused()) {
364+ surface->setFocused(false);
365+ }
366+ }
367+ }
368+}
369+
370+void ApplicationInfo::onSurfaceCountChanged()
371+{
372+ if (m_surfaceList.count() == 0 && m_state == Running) {
373+ setState(Stopped);
374+ }
375+}
376+
377+void ApplicationInfo::requestFocus()
378+{
379+ if (m_surfaceList.count() == 0) {
380+ Q_EMIT focusRequested();
381+ } else {
382+ m_surfaceList.get(0)->requestFocus();
310 }
383 }
311}
384}
tests/mocks/Unity/Application/ApplicationInfo.h+39−24
@@ -20,25 +20,32 @@
20#include <QObject>
20#include <QObject>
21
21
22class MirSurface;
22class MirSurface;
23−class Session;
24
23
25// unity-api
24// unity-api
26#include <unity/shell/application/ApplicationInfoInterface.h>
25#include <unity/shell/application/ApplicationInfoInterface.h>
27#include <unity/shell/application/Mir.h>
26#include <unity/shell/application/Mir.h>
28
27
28+#include "MirSurfaceListModel.h"
29+
30+#include <QList>
31+#include <QTimer>
32+
29using namespace unity::shell::application;
33using namespace unity::shell::application;
30
34
31class ApplicationInfo : public ApplicationInfoInterface {
35class ApplicationInfo : public ApplicationInfoInterface {
32 Q_OBJECT
36 Q_OBJECT
33
37
38+ ////
39+ // FIXME: Remove those
34 Q_PROPERTY(bool fullscreen READ fullscreen WRITE setFullscreen NOTIFY fullscreenChanged)
40 Q_PROPERTY(bool fullscreen READ fullscreen WRITE setFullscreen NOTIFY fullscreenChanged)
35− Q_PROPERTY(Session* session READ session NOTIFY sessionChanged)
36
41
37 // Only exists in this fake implementation
42 // Only exists in this fake implementation
38
43
39 // whether the test code will explicitly control the creation of the application surface
44 // whether the test code will explicitly control the creation of the application surface
40 Q_PROPERTY(bool manualSurfaceCreation READ manualSurfaceCreation WRITE setManualSurfaceCreation NOTIFY manualSurfaceCreationChanged)
45 Q_PROPERTY(bool manualSurfaceCreation READ manualSurfaceCreation WRITE setManualSurfaceCreation NOTIFY manualSurfaceCreationChanged)
41
46
47+ Q_PROPERTY(QString screenshot READ screenshot CONSTANT)
48+
42public:
49public:
43 ApplicationInfo(QObject *parent = nullptr);
50 ApplicationInfo(QObject *parent = nullptr);
44 ApplicationInfo(const QString &appId, QObject *parent = nullptr);
51 ApplicationInfo(const QString &appId, QObject *parent = nullptr);
@@ -66,8 +73,7 @@ public:
66 Q_INVOKABLE void setState(State value);
73 Q_INVOKABLE void setState(State value);
67 State state() const override { return m_state; }
74 State state() const override { return m_state; }
68
75
69− void setFocused(bool value);
70− bool focused() const override { return m_focused; }
76+ bool focused() const override;
71
77
72 QString splashTitle() const override { return QString(); }
78 QString splashTitle() const override { return QString(); }
73 QUrl splashImage() const override { return QUrl(); }
79 QUrl splashImage() const override { return QUrl(); }
@@ -100,21 +106,26 @@ public:
100 void setInitialSurfaceSize(const QSize &size) override;
106 void setInitialSurfaceSize(const QSize &size) override;
101
107
102 Q_INVOKABLE void setShellChrome(Mir::ShellChrome shellChrome);
108 Q_INVOKABLE void setShellChrome(Mir::ShellChrome shellChrome);
103−public:
109+
104− void setSession(Session* session);
110+ MirSurfaceListInterface* surfaceList() override { return &m_surfaceList; }
105− Session* session() const { return m_session; }
111+
112+ void setFocused(bool value);
113+
114+ //////
115+ // internal mock stuff
116+ void close();
117+ void requestFocus();
106
118
107Q_SIGNALS:
119Q_SIGNALS:
108− void sessionChanged(Session*);
109 void fullscreenChanged(bool value);
120 void fullscreenChanged(bool value);
110 void manualSurfaceCreationChanged(bool value);
121 void manualSurfaceCreationChanged(bool value);
122+ void closed();
111
123
112public Q_SLOTS:
124public Q_SLOTS:
113− Q_INVOKABLE void createSession();
125+ Q_INVOKABLE void createSurface();
114− Q_INVOKABLE void destroySession();
115
126
116private Q_SLOTS:
127private Q_SLOTS:
117− void onSessionSurfaceAdded(MirSurface*);
128+ void onSurfaceCountChanged();
118
129
119private:
130private:
120 void setIcon(const QUrl &value);
131 void setIcon(const QUrl &value);
@@ -124,20 +135,24 @@ private:
124 QString m_appId;
135 QString m_appId;
125 QString m_name;
136 QString m_name;
126 QUrl m_icon;
137 QUrl m_icon;
127− Stage m_stage;
138+ Stage m_stage{MainStage};
128− State m_state;
139+ State m_state{Stopped};
129− bool m_focused;
130− bool m_fullscreen;
140+ bool m_fullscreen{false};
131− Session* m_session;
132− Qt::ScreenOrientations m_supportedOrientations;
141+ Qt::ScreenOrientations m_supportedOrientations{Qt::PortraitOrientation |
142+ Qt::LandscapeOrientation |
143+ Qt::InvertedPortraitOrientation |
144+ Qt::InvertedLandscapeOrientation};
133− bool m_rotatesWindowContents;
145+ bool m_rotatesWindowContents{false};
134− RequestedState m_requestedState;
146+ RequestedState m_requestedState{RequestedRunning};
135− bool m_isTouchApp;
147+ bool m_isTouchApp{true};
136− bool m_exemptFromLifecycle;
148+ bool m_exemptFromLifecycle{false};
137 QSize m_initialSurfaceSize;
149 QSize m_initialSurfaceSize;
138−
150+ MirSurfaceListModel m_surfaceList;
151+ int m_liveSurfaceCount{0};
152+ QTimer m_surfaceCreationTimer;
153+ QList<MirSurface*> m_closingSurfaces;
139− bool m_manualSurfaceCreation;
154+ bool m_manualSurfaceCreation{false};
140− Mir::ShellChrome m_shellChrome;
155+ Mir::ShellChrome m_shellChrome{Mir::NormalChrome};
141};
156};
142
157
143Q_DECLARE_METATYPE(ApplicationInfo*)
158Q_DECLARE_METATYPE(ApplicationInfo*)
tests/mocks/Unity/Application/ApplicationManager.cpp+109−74
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013-2015 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -16,8 +16,7 @@
16
16
17#include "ApplicationManager.h"
17#include "ApplicationManager.h"
18#include "ApplicationInfo.h"
18#include "ApplicationInfo.h"
19−#include "Session.h"
19+#include "MirSurface.h"
20−#include "ApplicationTestInterface.h"
21
20
22#include <paths.h>
21#include <paths.h>
23#include <csignal>
22#include <csignal>
@@ -31,28 +30,20 @@
31#include <QDateTime>
30#include <QDateTime>
32#include <QtDBus/QtDBus>
31#include <QtDBus/QtDBus>
33
32
34−ApplicationManager *ApplicationManager::the_application_manager = nullptr;
33+#define APPLICATIONMANAGER_DEBUG 0
35
34
36−ApplicationManager *ApplicationManager::singleton()
35+#if APPLICATIONMANAGER_DEBUG
37−{
36+#define DEBUG_MSG(params) qDebug().nospace() << "ApplicationManager::" << __func__ << " " << params
38− if (!the_application_manager) {
37+#else
39− the_application_manager = new ApplicationManager();
38+#define DEBUG_MSG(params) ((void)0)
39+#endif
40
40
41− // Emit signal to notify Upstart that Mir is ready to receive client connections
41+namespace unityapi = unity::shell::application;
42− // see http://upstart.ubuntu.com/cookbook/#expect-stop
43− if (qgetenv("UNITY_MIR_EMITS_SIGSTOP") == "1") {
44− raise(SIGSTOP);
45− }
46− }
47− return the_application_manager;
48−}
49
42
50ApplicationManager::ApplicationManager(QObject *parent)
43ApplicationManager::ApplicationManager(QObject *parent)
51 : ApplicationManagerInterface(parent)
44 : ApplicationManagerInterface(parent)
52{
45{
53− m_roleNames.insert(RoleSession, "session");
46+ DEBUG_MSG("");
54− m_roleNames.insert(RoleFullscreen, "fullscreen");
55−
56 buildListOfAvailableApplications();
47 buildListOfAvailableApplications();
57
48
58 // polling to find out when the toplevel window has been created as there's
49 // polling to find out when the toplevel window has been created as there's
@@ -61,6 +52,19 @@ ApplicationManager::ApplicationManager(QObject *parent)
61 this, &ApplicationManager::onWindowCreatedTimerTimeout);
52 this, &ApplicationManager::onWindowCreatedTimerTimeout);
62 m_windowCreatedTimer.setSingleShot(false);
53 m_windowCreatedTimer.setSingleShot(false);
63 m_windowCreatedTimer.start(200);
54 m_windowCreatedTimer.start(200);
55+
56+ Q_ASSERT(MirFocusController::instance());
57+ connect(MirFocusController::instance(), &MirFocusController::focusedSurfaceChanged,
58+ this, &ApplicationManager::updateFocusedApplication, Qt::QueuedConnection);
59+
60+
61+ // Emit signal to notify Upstart that Mir is ready to receive client connections
62+ // see http://upstart.ubuntu.com/cookbook/#expect-stop
63+ // We do this because some autopilot tests actually use this mock Unity.Application module,
64+ // so we have to mimic what the real ApplicationManager does in that regard.
65+ if (qgetenv("UNITY_MIR_EMITS_SIGSTOP") == "1") {
66+ raise(SIGSTOP);
67+ }
64}
68}
65
69
66ApplicationManager::~ApplicationManager()
70ApplicationManager::~ApplicationManager()
@@ -78,7 +82,6 @@ void ApplicationManager::onWindowCreatedTimerTimeout()
78void ApplicationManager::onWindowCreated()
82void ApplicationManager::onWindowCreated()
79{
83{
80 startApplication("unity8-dash");
84 startApplication("unity8-dash");
81− focusApplication("unity8-dash");
82}
85}
83
86
84int ApplicationManager::rowCount(const QModelIndex& parent) const {
87int ApplicationManager::rowCount(const QModelIndex& parent) const {
@@ -109,10 +112,8 @@ QVariant ApplicationManager::data(const QModelIndex& index, int role) const {
109 return app->isTouchApp();
112 return app->isTouchApp();
110 case RoleExemptFromLifecycle:
113 case RoleExemptFromLifecycle:
111 return app->exemptFromLifecycle();
114 return app->exemptFromLifecycle();
112− case RoleSession:
115+ case RoleApplication:
113− return QVariant::fromValue(app->session());
116+ return QVariant::fromValue(static_cast<unityapi::ApplicationInfoInterface*>(app));
114− case RoleFullscreen:
115− return app->fullscreen();
116 default:
117 default:
117 return QVariant();
118 return QVariant();
118 }
119 }
@@ -144,19 +145,17 @@ QModelIndex ApplicationManager::findIndex(ApplicationInfo* application)
144 return QModelIndex();
145 return QModelIndex();
145}
146}
146
147
147−void ApplicationManager::add(ApplicationInfo *application) {
148+bool ApplicationManager::add(ApplicationInfo *application) {
148 if (!application || m_runningApplications.contains(application)) {
149 if (!application || m_runningApplications.contains(application)) {
149− return;
150+ return false;
150 }
151 }
152+ DEBUG_MSG(application->appId());
153+
154+ application->setState(ApplicationInfo::Starting);
151
155
152 beginInsertRows(QModelIndex(), m_runningApplications.size(), m_runningApplications.size());
156 beginInsertRows(QModelIndex(), m_runningApplications.size(), m_runningApplications.size());
153 m_runningApplications.append(application);
157 m_runningApplications.append(application);
154
158
155− connect(application, &ApplicationInfo::sessionChanged, this, [application, this]() {
156− QModelIndex appIndex = findIndex(application);
157− if (!appIndex.isValid()) return;
158− Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSession);
159− });
160 connect(application, &ApplicationInfo::focusedChanged, this, [application, this]() {
159 connect(application, &ApplicationInfo::focusedChanged, this, [application, this]() {
161 QModelIndex appIndex = findIndex(application);
160 QModelIndex appIndex = findIndex(application);
162 if (!appIndex.isValid()) return;
161 if (!appIndex.isValid()) return;
@@ -173,19 +172,27 @@ void ApplicationManager::add(ApplicationInfo *application) {
173 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleStage);
172 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleStage);
174 });
173 });
175
174
175+ connect(application, &ApplicationInfo::closed, this, [application, this]() {
176+ this->remove(application);
177+ });
178+ connect(application, &ApplicationInfo::focusRequested, this, [application, this]() {
179+ Q_EMIT this->focusRequested(application->appId());
180+ });
181+
176 endInsertRows();
182 endInsertRows();
177− Q_EMIT applicationAdded(application->appId());
178 Q_EMIT countChanged();
183 Q_EMIT countChanged();
179 if (count() == 1) Q_EMIT emptyChanged(isEmpty()); // was empty but not anymore
184 if (count() == 1) Q_EMIT emptyChanged(isEmpty()); // was empty but not anymore
185+
186+ return true;
180}
187}
181
188
182void ApplicationManager::remove(ApplicationInfo *application) {
189void ApplicationManager::remove(ApplicationInfo *application) {
183 int i = m_runningApplications.indexOf(application);
190 int i = m_runningApplications.indexOf(application);
184 if (i != -1) {
191 if (i != -1) {
192+ DEBUG_MSG(application->appId());
185 beginRemoveRows(QModelIndex(), i, i);
193 beginRemoveRows(QModelIndex(), i, i);
186 m_runningApplications.removeAt(i);
194 m_runningApplications.removeAt(i);
187 endRemoveRows();
195 endRemoveRows();
188− Q_EMIT applicationRemoved(application->appId());
189 Q_EMIT countChanged();
196 Q_EMIT countChanged();
190 if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
197 if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
191 }
198 }
@@ -209,18 +216,29 @@ void ApplicationManager::move(int from, int to) {
209ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
216ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
210 const QStringList &arguments)
217 const QStringList &arguments)
211{
218{
219+ DEBUG_MSG(appId);
212 Q_UNUSED(arguments)
220 Q_UNUSED(arguments)
221+
213− ApplicationInfo *application = add(appId);
222+ ApplicationInfo *application = findApplication(appId);
223+ if (application) {
224+ // the requested app is already running
225+ return application;
226+ } else {
227+ application = add(appId);
228+ }
229+
230+ // most likely not among the available ones
214 if (!application)
231 if (!application)
215− return 0;
232+ return nullptr;
216− application->setState(ApplicationInfo::Starting);
233+
234+ Q_EMIT application->focusRequested(); // we assume that an application that's starting up wants focus
217
235
218 return application;
236 return application;
219}
237}
220
238
221ApplicationInfo* ApplicationManager::add(QString appId)
239ApplicationInfo* ApplicationManager::add(QString appId)
222{
240{
223− ApplicationInfo *application = 0;
241+ ApplicationInfo *application = nullptr;
224
242
225 for (ApplicationInfo *availableApp : m_availableApplications) {
243 for (ApplicationInfo *availableApp : m_availableApplications) {
226 if (availableApp->appId() == appId) {
244 if (availableApp->appId() == appId) {
@@ -229,23 +247,23 @@ ApplicationInfo* ApplicationManager::add(QString appId)
229 }
247 }
230 }
248 }
231
249
232− if (application)
250+ if (application) {
233− add(application);
251+ if (!add(application)) {
252+ application = nullptr;
253+ }
254+ }
234
255
235 return application;
256 return application;
236}
257}
237
258
238bool ApplicationManager::stopApplication(const QString &appId)
259bool ApplicationManager::stopApplication(const QString &appId)
239{
260{
261+ DEBUG_MSG(appId);
240 ApplicationInfo *application = findApplication(appId);
262 ApplicationInfo *application = findApplication(appId);
241 if (application == nullptr)
263 if (application == nullptr)
242 return false;
264 return false;
243
265
244− if (application->appId() == focusedApplicationId()) {
266+ application->close();
245− unfocusCurrentApplication();
246− }
247− application->setState(ApplicationInfo::Stopped);
248− remove(application);
249 return true;
267 return true;
250}
268}
251
269
@@ -258,44 +276,17 @@ QString ApplicationManager::focusedApplicationId() const {
258 return QString();
276 return QString();
259}
277}
260
278
261−bool ApplicationManager::focusApplication(const QString &appId)
279+bool ApplicationManager::requestFocusApplication(const QString &appId)
262{
280{
263 ApplicationInfo *application = findApplication(appId);
281 ApplicationInfo *application = findApplication(appId);
264 if (application == nullptr)
282 if (application == nullptr)
265 return false;
283 return false;
266
284
267− // unfocus currently focused app
268− for (ApplicationInfo *app : m_runningApplications) {
269− if (app->focused()) {
270− app->setFocused(false);
271− }
272− }
273−
274− // focus this app
275− application->setFocused(true);
285+ application->requestFocus();
276
286
277− // move app to top of stack
278− move(m_runningApplications.indexOf(application), 0);
279− Q_EMIT focusedApplicationIdChanged();
280 return true;
287 return true;
281}
288}
282
289
283−bool ApplicationManager::requestFocusApplication(const QString &appId)
284−{
285− QMetaObject::invokeMethod(this, "focusRequested", Qt::QueuedConnection, Q_ARG(QString, appId));
286− return true;
287−}
288−
289−void ApplicationManager::unfocusCurrentApplication()
290−{
291− for (ApplicationInfo *app : m_runningApplications) {
292− if (app->focused()) {
293− app->setFocused(false);
294− }
295− }
296− Q_EMIT focusedApplicationIdChanged();
297−}
298−
299void ApplicationManager::buildListOfAvailableApplications()
290void ApplicationManager::buildListOfAvailableApplications()
300{
291{
301 /*
292 /*
@@ -328,7 +319,6 @@ void ApplicationManager::buildListOfAvailableApplications()
328 application->setName("Camera");
319 application->setName("Camera");
329 application->setScreenshotId("camera");
320 application->setScreenshotId("camera");
330 application->setIconId("camera");
321 application->setIconId("camera");
331− application->setShellChrome(Mir::LowChrome);
332 application->setFullscreen(true);
322 application->setFullscreen(true);
333 application->setSupportedOrientations(Qt::PortraitOrientation
323 application->setSupportedOrientations(Qt::PortraitOrientation
334 | Qt::LandscapeOrientation
324 | Qt::LandscapeOrientation
@@ -473,3 +463,48 @@ bool ApplicationManager::isEmpty() const
473{
463{
474 return m_runningApplications.isEmpty();
464 return m_runningApplications.isEmpty();
475}
465}
466+
467+void ApplicationManager::updateFocusedApplication()
468+{
469+ ApplicationInfo *focusedApplication = nullptr;
470+ ApplicationInfo *previouslyFocusedApplication = nullptr;
471+
472+ auto controller = MirFocusController::instance();
473+ if (!controller) {
474+ return;
475+ }
476+
477+ MirSurface *surface = static_cast<MirSurface*>(controller->focusedSurface());
478+ if (surface) {
479+ focusedApplication = findApplication(surface);
480+ }
481+
482+ surface = static_cast<MirSurface*>(controller->previouslyFocusedSurface());
483+ if (surface) {
484+ previouslyFocusedApplication = findApplication(surface);
485+ }
486+
487+ if (focusedApplication != previouslyFocusedApplication) {
488+ if (focusedApplication) {
489+ DEBUG_MSG("focused " << focusedApplication->appId());
490+ Q_EMIT focusedApplication->focusedChanged(true);
491+ this->move(this->m_runningApplications.indexOf(focusedApplication), 0);
492+ }
493+ if (previouslyFocusedApplication) {
494+ DEBUG_MSG("unfocused " << previouslyFocusedApplication->appId());
495+ Q_EMIT previouslyFocusedApplication->focusedChanged(false);
496+ }
497+ Q_EMIT focusedApplicationIdChanged();
498+ }
499+}
500+
501+ApplicationInfo *ApplicationManager::findApplication(MirSurface* surface)
502+{
503+ for (ApplicationInfo *app : m_runningApplications) {
504+ auto surfaceList = static_cast<MirSurfaceListModel*>(app->surfaceList());
505+ if (surfaceList->contains(surface)) {
506+ return app;
507+ }
508+ }
509+ return nullptr;
510+}
tests/mocks/Unity/Application/ApplicationManager.h+12−14
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013-2014 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -26,12 +26,19 @@
26// unity-api
26// unity-api
27#include <unity/shell/application/ApplicationManagerInterface.h>
27#include <unity/shell/application/ApplicationManagerInterface.h>
28
28
29+namespace unity {
30+ namespace shell {
31+ namespace application {
32+ class MirSurfaceInterface;
33+ }
34+ }
35+}
36+
29class QQuickItem;
37class QQuickItem;
30using namespace unity::shell::application;
38using namespace unity::shell::application;
31
39
32class ApplicationManager : public ApplicationManagerInterface {
40class ApplicationManager : public ApplicationManagerInterface {
33 Q_OBJECT
41 Q_OBJECT
34− Q_FLAGS(ExecFlags)
35
42
36 Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged)
43 Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged)
37 Q_PROPERTY(QStringList availableApplications READ availableApplications NOTIFY availableApplicationsChanged)
44 Q_PROPERTY(QStringList availableApplications READ availableApplications NOTIFY availableApplicationsChanged)
@@ -40,13 +47,6 @@ class ApplicationManager : public ApplicationManagerInterface {
40 ApplicationManager(QObject *parent = nullptr);
47 ApplicationManager(QObject *parent = nullptr);
41 virtual ~ApplicationManager();
48 virtual ~ApplicationManager();
42
49
43− static ApplicationManager *singleton();
44−
45− enum MoreRoles {
46− RoleSession = RoleExemptFromLifecycle+1,
47− RoleFullscreen,
48− };
49−
50 // QAbstractItemModel methods.
50 // QAbstractItemModel methods.
51 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
51 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
52 QVariant data(const QModelIndex& index, int role) const override;
52 QVariant data(const QModelIndex& index, int role) const override;
@@ -57,8 +57,6 @@ class ApplicationManager : public ApplicationManagerInterface {
57
57
58 // Application control methods
58 // Application control methods
59 Q_INVOKABLE bool requestFocusApplication(const QString &appId) override;
59 Q_INVOKABLE bool requestFocusApplication(const QString &appId) override;
60− Q_INVOKABLE bool focusApplication(const QString &appId) override;
61− Q_INVOKABLE void unfocusCurrentApplication() override;
62 Q_INVOKABLE ApplicationInfo *startApplication(const QString &appId, const QStringList &arguments = QStringList()) override;
60 Q_INVOKABLE ApplicationInfo *startApplication(const QString &appId, const QStringList &arguments = QStringList()) override;
63 Q_INVOKABLE bool stopApplication(const QString &appId) override;
61 Q_INVOKABLE bool stopApplication(const QString &appId) override;
64
62
@@ -79,17 +77,17 @@ class ApplicationManager : public ApplicationManagerInterface {
79
77
80 private Q_SLOTS:
78 private Q_SLOTS:
81 void onWindowCreatedTimerTimeout();
79 void onWindowCreatedTimerTimeout();
80+ void updateFocusedApplication();
82
81
83 private:
82 private:
84− void add(ApplicationInfo *application);
83+ bool add(ApplicationInfo *application);
85 void remove(ApplicationInfo* application);
84 void remove(ApplicationInfo* application);
86 void buildListOfAvailableApplications();
85 void buildListOfAvailableApplications();
87 void onWindowCreated();
86 void onWindowCreated();
87+ ApplicationInfo *findApplication(MirSurface* surface);
88 QList<ApplicationInfo*> m_runningApplications;
88 QList<ApplicationInfo*> m_runningApplications;
89 QList<ApplicationInfo*> m_availableApplications;
89 QList<ApplicationInfo*> m_availableApplications;
90 QTimer m_windowCreatedTimer;
90 QTimer m_windowCreatedTimer;
91−
92− static ApplicationManager *the_application_manager;
93};
91};
94
92
95Q_DECLARE_METATYPE(ApplicationManager*)
93Q_DECLARE_METATYPE(ApplicationManager*)
tests/mocks/Unity/Application/ApplicationScreenshotProvider.cppdeleted−79
@@ -1,79 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it under
5− * the terms of the GNU Lesser General Public License version 3, as published by
6− * the Free Software Foundation.
7− *
8− * This program is distributed in the hope that it will be useful, but WITHOUT
9− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11− * Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "ApplicationScreenshotProvider.h"
18−#include "ApplicationManager.h"
19−#include "ApplicationInfo.h"
20−
21−#include "paths.h"
22−
23−#include <QDebug>
24−#include <QGuiApplication>
25−#include <QWindow>
26−#include <QQuickWindow>
27−
28−ApplicationScreenshotProvider::ApplicationScreenshotProvider(ApplicationManager *appManager)
29− : QQuickImageProvider(QQuickImageProvider::Image)
30− , m_appManager(appManager)
31−{
32−}
33−
34−QImage ApplicationScreenshotProvider::requestImage(const QString &imageId, QSize * size,
35− const QSize &requestedSize)
36−{
37− // We ignore requestedSize here intentionally to avoid keeping scaled copies around
38− Q_UNUSED(requestedSize)
39−
40− QString appId = imageId.split('/').first();
41−
42− ApplicationInfo* app = static_cast<ApplicationInfo*>(m_appManager->findApplication(appId));
43− if (app == nullptr) {
44− return QImage();
45− }
46−
47− QString screenshot = app->screenshot();
48− // QImage doesn't understand qrc:/// but we have QUrls in use which don't like the empty protcol ":/"
49− screenshot.replace("qrc:///", ":/");
50−
51− QImage image;
52− if (!image.load(screenshot)) {
53− qWarning() << "failed loading app image" << screenshot;
54− }
55−
56−
57− if (app->stage() == ApplicationInfo::SideStage) {
58− QByteArray gus = qgetenv("GRID_UNIT_PX");
59− if (gus.isEmpty() || gus.toInt() == 0) {
60− gus = "8";
61− }
62− image = image.scaledToWidth(gus.toInt() * 48);
63− } else {
64− // Lets scale main stage applications to be the size of the screen/window.
65− QGuiApplication *unity = qobject_cast<QGuiApplication*>(qApp);
66− Q_FOREACH (QWindow *win, unity->allWindows()) {
67− QQuickWindow *quickWin = qobject_cast<QQuickWindow*>(win);
68− if (quickWin) {
69− image = image.scaledToWidth(quickWin->width());
70− break;
71− }
72− }
73− }
74−
75− size->setWidth(image.width());
76− size->setHeight(image.height());
77−
78− return image;
79−}
tests/mocks/Unity/Application/ApplicationScreenshotProvider.hdeleted−34
@@ -1,34 +0,0 @@
1−/*
2− * Copyright (C) 201 Canonical, Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it under
5− * the terms of the GNU Lesser General Public License version 3, as published by
6− * the Free Software Foundation.
7− *
8− * This program is distributed in the hope that it will be useful, but WITHOUT
9− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11− * Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef APPLICATIONSCREENSHOTPROVIDER_H
18−#define APPLICATIONSCREENSHOTPROVIDER_H
19−
20−#include <QQuickImageProvider>
21−
22−class ApplicationManager;
23−class ApplicationScreenshotProvider : public QQuickImageProvider
24−{
25−public:
26− explicit ApplicationScreenshotProvider(ApplicationManager *appManager);
27−
28− QImage requestImage(const QString &appId, QSize *size, const QSize &requestedSize) override;
29−
30−private:
31− ApplicationManager* m_appManager;
32−};
33−
34−#endif // APPLICATIONSCREENSHOTPROVIDER_H
tests/mocks/Unity/Application/ApplicationTestInterface.cppdeleted−117
@@ -1,117 +0,0 @@
1−/*
2− * Copyright (C) 2014,2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "ApplicationInfo.h"
18−#include "ApplicationTestInterface.h"
19−#include "ApplicationManager.h"
20−#include "SessionManager.h"
21−#include "SurfaceManager.h"
22−#include "Session.h"
23−#include "MirSurface.h"
24−
25−#include <paths.h>
26−
27−#include <QtDBus/QtDBus>
28−
29−quint32 nextId = 0;
30−
31−ApplicationTestInterface::ApplicationTestInterface(QObject* parent)
32− : QDBusAbstractAdaptor(parent)
33−{
34− QDBusConnection connection = QDBusConnection::sessionBus();
35− connection.registerService("com.canonical.Unity8");
36− connection.registerObject("/com/canonical/Unity8/Mocks", parent);
37−}
38−
39−Session* ApplicationTestInterface::addChildSession(Session* existingSession, const QString& surfaceImage, bool addSurface)
40−{
41− if (!existingSession) return nullptr;
42−
43− QUrl screenshotUrl = QString("qrc:///Unity/Application/screenshots/%2@12.png")
44− .arg(qmlDirectory())
45− .arg(surfaceImage);
46−
47− Session* session = SessionManager::singleton()->createSession(
48− QString("%1-Child%2").arg(existingSession->name())
49− .arg(existingSession->childSessions()->count()),
50− screenshotUrl);
51− existingSession->addChildSession(session);
52− if (addSurface) session->createSurface();
53−
54− return session;
55−}
56−
57−void ApplicationTestInterface::removeSession(Session* existingSession)
58−{
59− qDebug() << "ApplicationTestInterface::removeSession - " << existingSession;
60−
61− if (existingSession)
62− existingSession->setLive(false);
63−}
64−
65−void ApplicationTestInterface::removeSurface(MirSurface* existingSurface)
66−{
67− qDebug() << "ApplicationTestInterface::removeSurface - " << existingSurface;
68−
69− if (existingSurface)
70− existingSurface->setLive(false);
71−}
72−
73−quint32 ApplicationTestInterface::addChildSession(const QString& appId, quint32 existingSessionId, const QString& surfaceImage, bool addSurface)
74−{
75− qDebug() << "ApplicationTestInterface::addChildSession to " << appId;
76−
77− ApplicationInfo* application = ApplicationManager::singleton()->findApplication(appId);
78− if (!application) {
79− qDebug() << "ApplicationTestInterface::addChildSession - No application found for " << appId;
80− return 0;
81− }
82−
83− Session* parentSession = nullptr;
84− if (m_childSessions.contains(existingSessionId)) {
85− parentSession = m_childSessions[existingSessionId];
86− } else if (application->session()) {
87− parentSession = application->session();
88− } else {
89− qDebug() << "ApplicationTestInterface::addChildSession - No session for " << appId << ":" << existingSessionId;
90− return 0;
91− }
92−
93− QUrl screenshotUrl = QString("qrc:///Unity/Application/screenshots/%2@12.png")
94− .arg(qmlDirectory())
95− .arg(surfaceImage);
96−
97− quint32 sessionId = ++nextId;
98− Session* session = SessionManager::singleton()->createSession(
99− QString("%1-Child%2").arg(parentSession->name())
100− .arg(parentSession->childSessions()->count()),
101− screenshotUrl);
102− parentSession->addChildSession(session);
103− if (addSurface) { session->createSurface(); }
104− m_childSessions[sessionId] = session;
105−
106− return sessionId;
107−}
108−
109−void ApplicationTestInterface::removeSession(quint32 sessionId)
110−{
111− if (!m_childSessions.contains(sessionId)) {
112− qDebug() << "ApplicationTestInterface::removeSession - No added session for " << sessionId;
113− return;
114− }
115− Session* session = m_childSessions.take(sessionId);
116− removeSession(session);
117−}
tests/mocks/Unity/Application/ApplicationTestInterface.hdeleted−45
@@ -1,45 +0,0 @@
1−/*
2− * Copyright (C) 2014,2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef APPLICATIONTESTINTERFACE_H
18−#define APPLICATIONTESTINTERFACE_H
19−
20−#include <QtDBus/QtDBus>
21−
22−class ApplicationManager;
23−class Session;
24−class MirSurface;
25−
26−class ApplicationTestInterface : public QDBusAbstractAdaptor
27−{
28− Q_OBJECT
29− Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity8.Mocks.Application")
30−public:
31− ApplicationTestInterface(QObject* parent = 0);
32−
33− Q_INVOKABLE Session* addChildSession(Session* existingSession, const QString& surfaceImage, bool addSurface);
34− Q_INVOKABLE void removeSession(Session* existingSession);
35− Q_INVOKABLE void removeSurface(MirSurface* existingSurface);
36−
37−public Q_SLOTS:
38− quint32 addChildSession(const QString& appId, quint32 existingSessionId, const QString& surfaceImage, bool addSurface);
39− void removeSession(quint32 sessionId);
40−
41−private:
42− QHash<quint32, Session*> m_childSessions;
43−};
44−
45−#endif // APPLICATIONTESTINTERFACE_H
tests/mocks/Unity/Application/CMakeLists.txt+3−5
@@ -2,15 +2,11 @@ set(FakeUnityApplicationQml_SOURCES
2 plugin.cpp
2 plugin.cpp
3 ApplicationInfo.cpp
3 ApplicationInfo.cpp
4 ApplicationManager.cpp
4 ApplicationManager.cpp
5− ApplicationScreenshotProvider.cpp
6− ApplicationTestInterface.cpp
7 MirSurface.cpp
5 MirSurface.cpp
8 MirSurfaceItem.cpp
6 MirSurfaceItem.cpp
7+ MirSurfaceListModel.cpp
9 ObjectListModel.h
8 ObjectListModel.h
10− Session.cpp
11− SessionManager.cpp
12 SurfaceManager.cpp
9 SurfaceManager.cpp
13− SessionModel.h
14 UbuntuKeyboardInfo.cpp
10 UbuntuKeyboardInfo.cpp
15 VirtualKeyboard.cpp
11 VirtualKeyboard.cpp
16 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
12 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
@@ -18,6 +14,8 @@ set(FakeUnityApplicationQml_SOURCES
18 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
14 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
19 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
15 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
20 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceItemInterface.h
16 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceItemInterface.h
17+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceListInterface.h
18+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirFocusControllerInterface.h
21 resources/surfaces.qrc
19 resources/surfaces.qrc
22)
20)
23
21
tests/mocks/Unity/Application/MirSurface.cpp+191−30
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -19,13 +19,49 @@
19#include <QDebug>
19#include <QDebug>
20#include <QQmlEngine>
20#include <QQmlEngine>
21
21
22+#define MIRSURFACE_DEBUG 0
23+
24+#if MIRSURFACE_DEBUG
25+#define DEBUG_MSG(params) qDebug().nospace() << "MirSurface[" << (void*)this << "," << m_name << "]::" << __func__ << " " << params
26+
27+const char *stateToStr(Mir::State state)
28+{
29+ switch(state) {
30+ case Mir::UnknownState:
31+ return "unknown";
32+ case Mir::RestoredState:
33+ return "restored";
34+ case Mir::MinimizedState:
35+ return "minimized";
36+ case Mir::MaximizedState:
37+ return "maximized";
38+ case Mir::VertMaximizedState:
39+ return "vert-maximized";
40+ case Mir::FullscreenState:
41+ return "fullscreen";
42+ case Mir::HorizMaximizedState:
43+ return "horiz-maximized";
44+ case Mir::HiddenState:
45+ return "hidden";
46+ default:
47+ return "???";
48+ };
49+}
50+
51+#else
52+#define DEBUG_MSG(params) ((void)0)
53+#endif
54+
55+using namespace unity::shell::application;
56+
57+MirFocusController *MirFocusController::m_instance = nullptr;
58+
22MirSurface::MirSurface(const QString& name,
59MirSurface::MirSurface(const QString& name,
23 Mir::Type type,
60 Mir::Type type,
24 Mir::State state,
61 Mir::State state,
25 const QUrl& screenshot,
62 const QUrl& screenshot,
26− const QUrl &qmlFilePath,
63+ const QUrl &qmlFilePath)
27− QObject *parent)
28− : unity::shell::application::MirSurfaceInterface(parent)
64+ : unity::shell::application::MirSurfaceInterface(nullptr)
29 , m_name(name)
65 , m_name(name)
30 , m_type(type)
66 , m_type(type)
31 , m_state(state)
67 , m_state(state)
@@ -40,17 +76,28 @@ MirSurface::MirSurface(const QString& name,
40 , m_slowToResize(false)
76 , m_slowToResize(false)
41 , m_shellChrome(Mir::NormalChrome)
77 , m_shellChrome(Mir::NormalChrome)
42{
78{
43−// qDebug() << "MirSurface::MirSurface() " << name;
79+ DEBUG_MSG("");
80+
44 QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
81 QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
45
82
46 m_delayedResizeTimer.setInterval(600);
83 m_delayedResizeTimer.setInterval(600);
47 m_delayedResizeTimer.setSingleShot(true);
84 m_delayedResizeTimer.setSingleShot(true);
48 connect(&m_delayedResizeTimer, &QTimer::timeout, this, &MirSurface::applyDelayedResize);
85 connect(&m_delayedResizeTimer, &QTimer::timeout, this, &MirSurface::applyDelayedResize);
86+
87+ m_zombieTimer.setInterval(100);
88+ m_zombieTimer.setSingleShot(true);
89+ connect(&m_zombieTimer, &QTimer::timeout, this, [this](){ this->setLive(false); });
49}
90}
50
91
51MirSurface::~MirSurface()
92MirSurface::~MirSurface()
52{
93{
53−// qDebug() << "MirSurface::~MirSurface() " << name();
94+ DEBUG_MSG("");
95+
96+ // controller instance might have been already destroyed by QQmlEngine destructor
97+ auto controller = MirFocusController::instance();
98+ if (controller && controller->focusedSurface() == this) {
99+ controller->clear();
100+ }
54}
101}
55
102
56QString MirSurface::name() const
103QString MirSurface::name() const
@@ -73,6 +120,7 @@ void MirSurface::setState(Mir::State state)
73 if (state == m_state)
120 if (state == m_state)
74 return;
121 return;
75
122
123+ DEBUG_MSG(stateToStr(state));
76 m_state = state;
124 m_state = state;
77 Q_EMIT stateChanged(state);
125 Q_EMIT stateChanged(state);
78}
126}
@@ -89,10 +137,10 @@ bool MirSurface::visible() const
89
137
90void MirSurface::setLive(bool live)
138void MirSurface::setLive(bool live)
91{
139{
92−// qDebug().nospace() << "MirSurface::setLive("<<live<<") " << name();
93 if (live == m_live)
140 if (live == m_live)
94 return;
141 return;
95
142
143+ DEBUG_MSG(live);
96 m_live = live;
144 m_live = live;
97 Q_EMIT liveChanged(live);
145 Q_EMIT liveChanged(live);
98
146
@@ -134,6 +182,20 @@ void MirSurface::setOrientationAngle(Mir::OrientationAngle angle)
134 Q_EMIT orientationAngleChanged(angle);
182 Q_EMIT orientationAngleChanged(angle);
135}
183}
136
184
185+void MirSurface::setKeymap(const QString &value)
186+{
187+ if (value != m_keymap) {
188+ DEBUG_MSG(value);
189+ m_keymap = value;
190+ Q_EMIT keymapChanged(m_keymap);
191+ }
192+}
193+
194+QString MirSurface::keymap() const
195+{
196+ return m_keymap;
197+}
198+
137Mir::ShellChrome MirSurface::shellChrome() const
199Mir::ShellChrome MirSurface::shellChrome() const
138{
200{
139 return m_shellChrome;
201 return m_shellChrome;
@@ -144,41 +206,21 @@ void MirSurface::setShellChrome(Mir::ShellChrome shellChrome)
144 if (shellChrome == m_shellChrome)
206 if (shellChrome == m_shellChrome)
145 return;
207 return;
146
208
209+ DEBUG_MSG(shellChrome);
147 m_shellChrome = shellChrome;
210 m_shellChrome = shellChrome;
148 Q_EMIT shellChromeChanged(shellChrome);
211 Q_EMIT shellChromeChanged(shellChrome);
149}
212}
150
213
151−QString MirSurface::keymapLayout() const
152−{
153− return m_keyMap.first;
154−}
155−
156−QString MirSurface::keymapVariant() const
157−{
158− return m_keyMap.second;
159−}
160−
161−void MirSurface::setKeymap(const QString &layout, const QString &variant)
162−{
163− if (layout.isEmpty()) {
164− return;
165− }
166− m_keyMap = qMakePair(layout, variant);
167− Q_EMIT keymapChanged(layout, variant);
168−}
169−
170void MirSurface::registerView(qintptr viewId)
214void MirSurface::registerView(qintptr viewId)
171{
215{
172 m_views.insert(viewId, MirSurface::View{false});
216 m_views.insert(viewId, MirSurface::View{false});
173−// qDebug().nospace() << "MirSurface[" << name() << "]::registerView(" << viewId << ")"
174−// << " after=" << m_views.count();
217+ DEBUG_MSG(viewId << " after=" << m_views.count());
175}
218}
176
219
177void MirSurface::unregisterView(qintptr viewId)
220void MirSurface::unregisterView(qintptr viewId)
178{
221{
179−// qDebug().nospace() << "MirSurface[" << name() << "]::unregisterView(" << viewId << ")"
180−// << " after=" << m_views.count() << " live=" << m_live;
181 m_views.remove(viewId);
222 m_views.remove(viewId);
223+ DEBUG_MSG(viewId << " after=" << m_views.count() << " live=" << m_live);
182 if (!m_live && m_views.count() == 0) {
224 if (!m_live && m_views.count() == 0) {
183 deleteLater();
225 deleteLater();
184 }
226 }
@@ -294,6 +336,7 @@ bool MirSurface::isSlowToResize() const
294void MirSurface::setSlowToResize(bool value)
336void MirSurface::setSlowToResize(bool value)
295{
337{
296 if (m_slowToResize != value) {
338 if (m_slowToResize != value) {
339+ DEBUG_MSG(value);
297 m_slowToResize = value;
340 m_slowToResize = value;
298 Q_EMIT slowToResizeChanged();
341 Q_EMIT slowToResizeChanged();
299 if (!m_slowToResize && m_delayedResizeTimer.isActive()) {
342 if (!m_slowToResize && m_delayedResizeTimer.isActive()) {
@@ -350,3 +393,121 @@ void MirSurface::setHeightIncrement(int value)
350 Q_EMIT heightIncrementChanged(m_heightIncrement);
393 Q_EMIT heightIncrementChanged(m_heightIncrement);
351 }
394 }
352}
395}
396+
397+void MirSurface::raise()
398+{
399+ Q_EMIT raiseRequested();
400+}
401+
402+void MirSurface::close()
403+{
404+ DEBUG_MSG("");
405+ if (!m_zombieTimer.isActive()) {
406+ m_zombieTimer.start();
407+ Q_EMIT closeRequested();
408+ }
409+}
410+
411+void MirSurface::createPromptSurface()
412+{
413+ QStringList screenshotIds = {"gallery", "map", "facebook", "camera", "browser", "music", "twitter"};
414+ int i = rand() % screenshotIds.count();
415+
416+ QUrl screenshotUrl = QString("qrc:///Unity/Application/screenshots/%1@12.png")
417+ .arg(screenshotIds[i]);
418+
419+ auto surface = new MirSurface(QString("prompt foo"),
420+ Mir::NormalType,
421+ Mir::RestoredState,
422+ screenshotUrl);
423+
424+ m_promptSurfaceList.appendSurface(surface);
425+}
426+
427+MirSurfaceListInterface* MirSurface::promptSurfaceList()
428+{
429+ return &m_promptSurfaceList;
430+}
431+
432+void MirSurface::requestFocus()
433+{
434+ DEBUG_MSG("");
435+ Q_EMIT focusRequested();
436+}
437+
438+void MirSurface::setFocused(bool value)
439+{
440+ DEBUG_MSG(value);
441+
442+ auto controller = MirFocusController::instance();
443+ // controller instance might have been already destroyed by QQmlEngine destructor
444+ if (!controller) {
445+ return;
446+ }
447+
448+ if (value) {
449+ controller->setFocusedSurface(this);
450+ } else if (controller->focusedSurface() == this) {
451+ controller->setFocusedSurface(nullptr);
452+ }
453+}
454+
455+bool MirSurface::focused() const
456+{
457+ auto controller = MirFocusController::instance();
458+
459+ // controller instance might have been already destroyed by QQmlEngine destructor
460+ return controller ? controller->focusedSurface() == this : false;
461+}
462+
463+#if MIRSURFACE_DEBUG
464+#undef DEBUG_MSG
465+#define DEBUG_MSG(params) qDebug().nospace() << "MirFocusController::" << __func__ << " " << params
466+#endif
467+
468+void MirFocusController::setFocusedSurface(MirSurfaceInterface *surface)
469+{
470+ if (m_focusedSurface == surface) {
471+ return;
472+ }
473+ DEBUG_MSG("MirSurface[" << (void*)surface << "," << (surface?surface->name():"") << "]");
474+
475+ m_previouslyFocusedSurface = m_focusedSurface;
476+ m_focusedSurface = surface;
477+
478+ if (m_previouslyFocusedSurface != m_focusedSurface) {
479+ Q_EMIT focusedSurfaceChanged();
480+ }
481+
482+ if (m_previouslyFocusedSurface) {
483+ Q_EMIT m_previouslyFocusedSurface->focusedChanged(false);
484+ }
485+
486+ if (m_focusedSurface) {
487+ Q_EMIT m_focusedSurface->focusedChanged(true);
488+ }
489+}
490+
491+MirFocusController* MirFocusController::instance()
492+{
493+ return m_instance;
494+}
495+
496+MirFocusController::MirFocusController()
497+{
498+ DEBUG_MSG("");
499+ Q_ASSERT(m_instance == nullptr);
500+ m_instance = this;
501+}
502+
503+MirFocusController::~MirFocusController()
504+{
505+ Q_ASSERT(m_instance == this);
506+ m_instance = nullptr;
507+}
508+
509+void MirFocusController::clear()
510+{
511+ m_focusedSurface = m_previouslyFocusedSurface = nullptr;
512+ Q_EMIT focusedSurfaceChanged();
513+}
tests/mocks/Unity/Application/MirSurface.h+56−12
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -23,8 +23,31 @@
23#include <QHash>
23#include <QHash>
24
24
25// unity-api
25// unity-api
26+#include <unity/shell/application/MirFocusControllerInterface.h>
26#include <unity/shell/application/MirSurfaceInterface.h>
27#include <unity/shell/application/MirSurfaceInterface.h>
27
28
29+#include "MirSurfaceListModel.h"
30+
31+class MirSurface;
32+
33+class MirFocusController : public unity::shell::application::MirFocusControllerInterface
34+{
35+ Q_OBJECT
36+public:
37+ MirFocusController();
38+ virtual ~MirFocusController();
39+ static MirFocusController* instance();
40+
41+ void setFocusedSurface(unity::shell::application::MirSurfaceInterface *surface) override;
42+ unity::shell::application::MirSurfaceInterface* focusedSurface() const override { return m_focusedSurface; }
43+ unity::shell::application::MirSurfaceInterface* previouslyFocusedSurface() { return m_previouslyFocusedSurface; }
44+ void clear();
45+private:
46+ static MirFocusController *m_instance;
47+ unity::shell::application::MirSurfaceInterface* m_previouslyFocusedSurface{nullptr};
48+ unity::shell::application::MirSurfaceInterface* m_focusedSurface{nullptr};
49+};
50+
28class MirSurface : public unity::shell::application::MirSurfaceInterface
51class MirSurface : public unity::shell::application::MirSurfaceInterface
29{
52{
30 Q_OBJECT
53 Q_OBJECT
@@ -41,8 +64,7 @@ public:
41 Mir::Type type,
64 Mir::Type type,
42 Mir::State state,
65 Mir::State state,
43 const QUrl& screenshot,
66 const QUrl& screenshot,
44− const QUrl &qmlFilePath = QUrl(),
67+ const QUrl &qmlFilePath = QUrl());
45− QObject *parent = nullptr);
46 virtual ~MirSurface();
68 virtual ~MirSurface();
47
69
48 ////
70 ////
@@ -74,10 +96,20 @@ public:
74 int widthIncrement() const override { return m_widthIncrement; }
96 int widthIncrement() const override { return m_widthIncrement; }
75 int heightIncrement() const override { return m_heightIncrement; }
97 int heightIncrement() const override { return m_heightIncrement; }
76
98
99+ virtual void setKeymap(const QString &);
100+ virtual QString keymap() const;
101+
77 Mir::ShellChrome shellChrome() const override;
102 Mir::ShellChrome shellChrome() const override;
103+
78− QString keymapLayout() const override;
104+ bool focused() const override;
79− QString keymapVariant() const override;
105+
80− Q_INVOKABLE void setKeymap(const QString &layout, const QString &variant) override;
106+ Q_INVOKABLE void requestFocus() override;
107+
108+ Q_INVOKABLE void close() override;
109+
110+ unity::shell::application::MirSurfaceListInterface* promptSurfaceList() override;
111+
112+ Q_INVOKABLE void raise() override;
81
113
82 ////
114 ////
83 // API for tests
115 // API for tests
@@ -85,11 +117,6 @@ public:
85 Q_INVOKABLE void setLive(bool live);
117 Q_INVOKABLE void setLive(bool live);
86 Q_INVOKABLE void setShellChrome(Mir::ShellChrome shellChrome);
118 Q_INVOKABLE void setShellChrome(Mir::ShellChrome shellChrome);
87
119
88− void registerView(qintptr viewId);
89− void unregisterView(qintptr viewId);
90− void setViewVisibility(qintptr viewId, bool visible);
91− int viewCount() const { return m_views.count(); }
92−
93 int width() const;
120 int width() const;
94 int height() const;
121 int height() const;
95
122
@@ -103,6 +130,8 @@ public:
103 Q_INVOKABLE void setWidthIncrement(int);
130 Q_INVOKABLE void setWidthIncrement(int);
104 Q_INVOKABLE void setHeightIncrement(int);
131 Q_INVOKABLE void setHeightIncrement(int);
105
132
133+ Q_INVOKABLE void createPromptSurface();
134+
106 /////
135 /////
107 // internal mock stuff
136 // internal mock stuff
108
137
@@ -114,7 +143,16 @@ public:
114 bool activeFocus() const;
143 bool activeFocus() const;
115 void setActiveFocus(bool);
144 void setActiveFocus(bool);
116
145
146+ void registerView(qintptr viewId);
147+ void unregisterView(qintptr viewId);
148+ void setViewVisibility(qintptr viewId, bool visible);
149+ int viewCount() const { return m_views.count(); }
150+
151+ void setFocused(bool value);
152+
117Q_SIGNALS:
153Q_SIGNALS:
154+ ////
155+ // API for tests
118 void widthChanged();
156 void widthChanged();
119 void heightChanged();
157 void heightChanged();
120 void slowToResizeChanged();
158 void slowToResizeChanged();
@@ -123,6 +161,8 @@ Q_SIGNALS:
123 // internal mock stuff
161 // internal mock stuff
124 void screenshotUrlChanged(QUrl);
162 void screenshotUrlChanged(QUrl);
125 void activeFocusChanged(bool);
163 void activeFocusChanged(bool);
164+ void raiseRequested();
165+ void closeRequested();
126
166
127private Q_SLOTS:
167private Q_SLOTS:
128 void applyDelayedResize();
168 void applyDelayedResize();
@@ -135,6 +175,7 @@ private:
135 const Mir::Type m_type;
175 const Mir::Type m_type;
136 Mir::State m_state;
176 Mir::State m_state;
137 Mir::OrientationAngle m_orientationAngle;
177 Mir::OrientationAngle m_orientationAngle;
178+
138 QUrl m_screenshotUrl;
179 QUrl m_screenshotUrl;
139 QUrl m_qmlFilePath;
180 QUrl m_qmlFilePath;
140 bool m_live;
181 bool m_live;
@@ -150,19 +191,22 @@ private:
150 int m_widthIncrement{0};
191 int m_widthIncrement{0};
151 int m_heightIncrement{0};
192 int m_heightIncrement{0};
152
193
194+ QString m_keymap;
195+
153 bool m_slowToResize;
196 bool m_slowToResize;
154 QTimer m_delayedResizeTimer;
197 QTimer m_delayedResizeTimer;
155 QSize m_delayedResize;
198 QSize m_delayedResize;
156 QSize m_pendingResize;
199 QSize m_pendingResize;
157
200
158 Mir::ShellChrome m_shellChrome;
201 Mir::ShellChrome m_shellChrome;
202+ MirSurfaceListModel m_promptSurfaceList;
159
203
160 struct View {
204 struct View {
161 bool visible;
205 bool visible;
162 };
206 };
163 QHash<qintptr, View> m_views;
207 QHash<qintptr, View> m_views;
164
208
165− QPair<QString,QString> m_keyMap; // pair of layout+variant
209+ QTimer m_zombieTimer;
166};
210};
167
211
168#endif // MOCK_MIR_SURFACE_H
212#endif // MOCK_MIR_SURFACE_H
tests/mocks/Unity/Application/MirSurfaceItem.cpp+13−7
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -29,6 +29,14 @@
29
29
30using namespace unity::shell::application;
30using namespace unity::shell::application;
31
31
32+#define MIRSURFACEITEM_DEBUG 0
33+
34+#if MIRSURFACEITEM_DEBUG
35+#define DEBUG_MSG(params) qDebug().nospace() << "MirSurfaceItem::" << __func__ << " " << params
36+#else
37+#define DEBUG_MSG(params) ((void)0)
38+#endif
39+
32MirSurfaceItem::MirSurfaceItem(QQuickItem *parent)
40MirSurfaceItem::MirSurfaceItem(QQuickItem *parent)
33 : MirSurfaceItemInterface(parent)
41 : MirSurfaceItemInterface(parent)
34 , m_qmlSurface(nullptr)
42 , m_qmlSurface(nullptr)
@@ -41,7 +49,7 @@ MirSurfaceItem::MirSurfaceItem(QQuickItem *parent)
41 , m_mousePressCount(0)
49 , m_mousePressCount(0)
42 , m_mouseReleaseCount(0)
50 , m_mouseReleaseCount(0)
43{
51{
44−// qDebug() << "MirSurfaceItem::MirSurfaceItem() " << (void*)(this) << name();
52+ DEBUG_MSG((void*)(this) << name());
45 setAcceptedMouseButtons(Qt::LeftButton | Qt::MiddleButton | Qt::RightButton |
53 setAcceptedMouseButtons(Qt::LeftButton | Qt::MiddleButton | Qt::RightButton |
46 Qt::ExtraButton1 | Qt::ExtraButton2 | Qt::ExtraButton3 | Qt::ExtraButton4 |
54 Qt::ExtraButton1 | Qt::ExtraButton2 | Qt::ExtraButton3 | Qt::ExtraButton4 |
47 Qt::ExtraButton5 | Qt::ExtraButton6 | Qt::ExtraButton7 | Qt::ExtraButton8 |
55 Qt::ExtraButton5 | Qt::ExtraButton6 | Qt::ExtraButton7 | Qt::ExtraButton8 |
@@ -53,7 +61,7 @@ MirSurfaceItem::MirSurfaceItem(QQuickItem *parent)
53
61
54MirSurfaceItem::~MirSurfaceItem()
62MirSurfaceItem::~MirSurfaceItem()
55{
63{
56−// qDebug() << "MirSurfaceItem::~MirSurfaceItem() " << (void*)(this) << name();
64+ DEBUG_MSG((void*)(this) << name());
57 setSurface(nullptr);
65 setSurface(nullptr);
58}
66}
59
67
@@ -150,7 +158,7 @@ void MirSurfaceItem::onComponentStatusChanged(QQmlComponent::Status status)
150
158
151void MirSurfaceItem::createQmlContentItem()
159void MirSurfaceItem::createQmlContentItem()
152{
160{
153−// qDebug() << "MirSurfaceItem::createQmlContentItem()";
161+ DEBUG_MSG("");
154
162
155 m_qmlItem = qobject_cast<QQuickItem*>(m_qmlContentComponent->create());
163 m_qmlItem = qobject_cast<QQuickItem*>(m_qmlContentComponent->create());
156 m_qmlItem->setParentItem(this);
164 m_qmlItem->setParentItem(this);
@@ -213,9 +221,7 @@ void MirSurfaceItem::mouseReleaseEvent(QMouseEvent * event)
213
221
214void MirSurfaceItem::setSurface(MirSurfaceInterface* surface)
222void MirSurfaceItem::setSurface(MirSurfaceInterface* surface)
215{
223{
216−// qDebug().nospace() << "MirSurfaceItem::setSurface() this=" << (void*)(this)
217−// << " name=" << name()
218−// << " surface=" << surface;
224+ DEBUG_MSG("this=" << (void*)(this) << " name=" << name() << " surface=" << surface);
219
225
220 if (m_qmlSurface == surface) {
226 if (m_qmlSurface == surface) {
221 return;
227 return;
tests/mocks/Unity/Application/MirSurfaceListModel.cppnew file+121
@@ -0,0 +1,121 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "MirSurfaceListModel.h"
18+#include "ApplicationInfo.h"
19+
20+#include "MirSurface.h"
21+
22+#define MIRSURFACELISTMODEL_DEBUG 0
23+
24+#ifdef MIRSURFACELISTMODEL_DEBUG
25+#define DEBUG_MSG(params) qDebug().nospace() << "MirSurfaceListModel::" << __func__ << " " << params
26+#else
27+#define DEBUG_MSG(params) ((void)0)
28+#endif
29+
30+using namespace unity::shell::application;
31+
32+MirSurfaceListModel::MirSurfaceListModel(QObject *parent) :
33+ MirSurfaceListInterface(parent)
34+{
35+}
36+
37+int MirSurfaceListModel::rowCount(const QModelIndex &parent) const
38+{
39+ return !parent.isValid() ? m_surfaceList.size() : 0;
40+}
41+
42+QVariant MirSurfaceListModel::data(const QModelIndex& index, int role) const
43+{
44+ if (index.row() < 0 || index.row() >= m_surfaceList.size())
45+ return QVariant();
46+
47+ if (role == SurfaceRole) {
48+ MirSurface *surface = m_surfaceList.at(index.row());
49+ return QVariant::fromValue(static_cast<unity::shell::application::MirSurfaceInterface*>(surface));
50+ } else {
51+ return QVariant();
52+ }
53+}
54+
55+void MirSurfaceListModel::raise(MirSurface *surface)
56+{
57+ int i = m_surfaceList.indexOf(surface);
58+ if (i != -1) {
59+ moveSurface(i, 0);
60+ }
61+}
62+
63+void MirSurfaceListModel::appendSurface(MirSurface *surface)
64+{
65+ beginInsertRows(QModelIndex(), m_surfaceList.size(), m_surfaceList.size());
66+ m_surfaceList.append(surface);
67+ connectSurface(surface);
68+ endInsertRows();
69+ Q_EMIT countChanged();
70+}
71+
72+void MirSurfaceListModel::connectSurface(MirSurface *surface)
73+{
74+ connect(surface, &MirSurface::raiseRequested, this, [this, surface](){ this->raise(surface); });
75+ connect(surface, &QObject::destroyed, this, [this, surface](){ this->removeSurface(surface); });
76+}
77+
78+void MirSurfaceListModel::removeSurface(MirSurface *surface)
79+{
80+ int i = m_surfaceList.indexOf(surface);
81+ if (i != -1) {
82+ beginRemoveRows(QModelIndex(), i, i);
83+ m_surfaceList.removeAt(i);
84+ endRemoveRows();
85+ Q_EMIT countChanged();
86+ }
87+}
88+
89+void MirSurfaceListModel::moveSurface(int from, int to)
90+{
91+ if (from == to) return;
92+
93+ if (from >= 0 && from < m_surfaceList.size() && to >= 0 && to < m_surfaceList.size()) {
94+ QModelIndex parent;
95+ /* When moving an item down, the destination index needs to be incremented
96+ by one, as explained in the documentation:
97+ http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html#beginMoveRows */
98+
99+ beginMoveRows(parent, from, from, parent, to + (to > from ? 1 : 0));
100+ m_surfaceList.move(from, to);
101+ endMoveRows();
102+ }
103+}
104+
105+MirSurfaceInterface *MirSurfaceListModel::get(int index)
106+{
107+ if (index >=0 && index < m_surfaceList.count()) {
108+ return m_surfaceList[index];
109+ } else {
110+ return nullptr;
111+ }
112+}
113+
114+const MirSurfaceInterface *MirSurfaceListModel::get(int index) const
115+{
116+ if (index >=0 && index < m_surfaceList.count()) {
117+ return m_surfaceList.at(index);
118+ } else {
119+ return nullptr;
120+ }
121+}
tests/mocks/Unity/Application/MirSurfaceListModel.hnew file+56
@@ -0,0 +1,56 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef MIRSURFACELISTMODEL_H
18+#define MIRSURFACELISTMODEL_H
19+
20+// unity-api
21+#include <unity/shell/application/MirSurfaceListInterface.h>
22+
23+#include <QAbstractListModel>
24+#include <QList>
25+
26+class MirSurface;
27+
28+class MirSurfaceListModel : public unity::shell::application::MirSurfaceListInterface
29+{
30+ Q_OBJECT
31+public:
32+ explicit MirSurfaceListModel(QObject *parent = 0);
33+
34+ Q_INVOKABLE unity::shell::application::MirSurfaceInterface *get(int index) override;
35+ const unity::shell::application::MirSurfaceInterface *get(int index) const;
36+
37+ // QAbstractItemModel methods
38+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
39+ QVariant data(const QModelIndex& index, int role) const override;
40+
41+ void appendSurface(MirSurface *surface);
42+ void removeSurface(MirSurface *surface);
43+
44+ bool contains(MirSurface *surface) const { return m_surfaceList.contains(surface); }
45+
46+private:
47+ void raise(MirSurface *surface);
48+ void moveSurface(int from, int to);
49+ void connectSurface(MirSurface *surface);
50+
51+ QList<MirSurface*> m_surfaceList;
52+};
53+
54+Q_DECLARE_METATYPE(MirSurfaceListModel*)
55+
56+#endif // MIRSURFACELISTMODEL_H
tests/mocks/Unity/Application/ObjectListModel.h+2
@@ -20,6 +20,8 @@
20// Qt
20// Qt
21#include <QAbstractListModel>
21#include <QAbstractListModel>
22
22
23+#include <QDebug>
24+
23template<class TYPE>
25template<class TYPE>
24class ObjectListModel : public QAbstractListModel
26class ObjectListModel : public QAbstractListModel
25{
27{
tests/mocks/Unity/Application/Session.cppdeleted−209
@@ -1,209 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "Session.h"
18−#include "ApplicationInfo.h"
19−#include "SessionManager.h"
20−#include "SurfaceManager.h"
21−
22−#include <QPainter>
23−#include <QQmlEngine>
24−#include <QTimer>
25−
26−Session::Session(const QString &name,
27− const QUrl& screenshot,
28− QObject *parent)
29− : QObject(parent)
30− , m_name(name)
31− , m_live(true)
32− , m_screenshot(screenshot)
33− , m_application(nullptr)
34− , m_surface(nullptr)
35− , m_parentSession(nullptr)
36− , m_children(new SessionModel(this))
37− , m_fullscreen(false)
38−{
39−// qDebug() << "Session::Session() " << this->name();
40−
41− QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
42−}
43−
44−Session::~Session()
45−{
46−// qDebug() << "Session::~Session() " << name();
47−
48− QList<Session*> children(m_children->list());
49− for (Session* child : children) {
50− delete child;
51− }
52− if (m_parentSession) {
53− m_parentSession->removeChildSession(this);
54− }
55− if (m_application) {
56− m_application->setSession(nullptr);
57− }
58− delete m_children;
59−
60− if (m_surface) {
61− if (m_surface->viewCount() == 0) {
62− delete m_surface;
63− } else {
64− m_surface->setLive(false);
65− }
66− }
67−}
68−
69−void Session::release()
70−{
71−// qDebug() << "Session::release " << name();
72− deleteLater();
73−}
74−
75−void Session::updateFullscreenProperty()
76−{
77− if (m_surfaces.rowCount() > 0) {
78− // TODO: Figure out something better
79− setFullscreen(lastSurface()->state() == Mir::FullscreenState);
80− } else {
81− // Keep the current value of the fullscreen property until we get a new
82− // surface
83− }
84−}
85−
86−void Session::setFullscreen(bool fullscreen)
87−{
88− if (m_fullscreen != fullscreen) {
89− m_fullscreen = fullscreen;
90− Q_EMIT fullscreenChanged(m_fullscreen);
91− }
92−}
93−
94−void Session::setApplication(ApplicationInfo* application)
95−{
96− if (m_application == application)
97− return;
98−
99− m_application = application;
100− Q_EMIT applicationChanged(application);
101−}
102−
103−void Session::appendSurface(MirSurface* surface)
104−{
105− qDebug() << "Session::appendSurface - session=" << name() << "surface=" << surface;
106−
107− m_surfaces.insert(m_surfaces.rowCount(), surface);
108−
109− connect(surface, &MirSurfaceInterface::stateChanged, this, &Session::updateFullscreenProperty);
110− connect(surface, &QObject::destroyed,
111− this, [this, surface]() { this->removeSurface(surface); });
112−
113− Q_EMIT lastSurfaceChanged(surface);
114− Q_EMIT surfaceAdded(surface);
115−
116− updateFullscreenProperty();
117−}
118−
119−void Session::removeSurface(MirSurface* surface)
120−{
121− disconnect(surface, nullptr, this, nullptr);
122− if (m_surfaces.contains(surface)) {
123− m_surfaces.remove(surface);
124− }
125−
126− updateFullscreenProperty();
127−}
128−
129−void Session::setScreenshot(const QUrl& screenshot)
130−{
131− if (screenshot != m_screenshot) {
132− m_screenshot = screenshot;
133− if (m_surface) {
134− m_surface->setScreenshotUrl(m_screenshot);
135− }
136− }
137−}
138−
139−void Session::setLive(bool live)
140−{
141− if (m_live != live) {
142− m_live = live;
143− Q_EMIT liveChanged(m_live);
144− }
145−}
146−
147−void Session::setParentSession(Session* session)
148−{
149− if (m_parentSession == session || session == this)
150− return;
151−
152− m_parentSession = session;
153− Q_EMIT parentSessionChanged(session);
154−}
155−
156−void Session::createSurface()
157−{
158− if (m_surface) return;
159−
160− appendSurface(SurfaceManager::singleton()->createSurface(name(),
161− Mir::NormalType,
162− m_application && m_application->fullscreen() ? Mir::FullscreenState :
163− Mir::MaximizedState,
164− m_screenshot));
165−}
166−
167−void Session::addChildSession(Session* session)
168−{
169− insertChildSession(m_children->rowCount(), session);
170−}
171−
172−void Session::insertChildSession(uint index, Session* session)
173−{
174− qDebug() << "Session::insertChildSession - " << session->name() << " to " << name() << " @ " << index;
175−
176− session->setParentSession(this);
177− m_children->insert(index, session);
178− SessionManager::singleton()->registerSession(session);
179−}
180−
181−void Session::removeChildSession(Session* session)
182−{
183− qDebug() << "Session::removeChildSession - " << session->name() << " from " << name();
184−
185− if (m_children->contains(session)) {
186− m_children->remove(session);
187− session->setParentSession(nullptr);
188− Q_EMIT session->deregister();
189− }
190−}
191−
192−SessionModel* Session::childSessions() const
193−{
194− return m_children;
195−}
196−
197−ObjectListModel<MirSurface>* Session::surfaces() const
198−{
199− return const_cast<ObjectListModel<MirSurface>*>(&m_surfaces);
200−}
201−
202−MirSurface *Session::lastSurface() const
203−{
204− if (m_surfaces.rowCount() > 0) {
205− return m_surfaces.list().last();
206− } else {
207− return nullptr;
208− }
209−}
tests/mocks/Unity/Application/Session.hdeleted−104
@@ -1,104 +0,0 @@
1−/*
2− * Copyright (C) 2014,2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef SESSION_H
18−#define SESSION_H
19−
20−#include "ObjectListModel.h"
21−#include "SessionModel.h"
22−
23−#include <QQuickItem>
24−
25−class ApplicationInfo;
26−class MirSurface;
27−
28−class Session : public QObject
29−{
30− Q_OBJECT
31− Q_PROPERTY(QString name READ name CONSTANT)
32− Q_PROPERTY(MirSurface* lastSurface READ lastSurface NOTIFY lastSurfaceChanged)
33− Q_PROPERTY(ObjectListModel<MirSurface>* surfaces READ surfaces CONSTANT)
34− Q_PROPERTY(ApplicationInfo* application READ application NOTIFY applicationChanged)
35− Q_PROPERTY(Session* parentSession READ parentSession NOTIFY parentSessionChanged DESIGNABLE false)
36− Q_PROPERTY(SessionModel* childSessions READ childSessions DESIGNABLE false CONSTANT)
37− Q_PROPERTY(bool live READ live NOTIFY liveChanged)
38−
39−public:
40− explicit Session(const QString &name,
41− const QUrl& screenshot,
42− QObject *parent = 0);
43− ~Session();
44−
45− Q_INVOKABLE void release();
46−
47− //getters
48− QString name() const { return m_name; }
49− bool live() const { return m_live; }
50− bool fullscreen() const { return m_fullscreen; }
51− ApplicationInfo* application() const { return m_application; }
52− MirSurface *lastSurface() const;
53− ObjectListModel<MirSurface>* surfaces() const;
54− Session* parentSession() const { return m_parentSession; }
55−
56− void setApplication(ApplicationInfo* item);
57− void appendSurface(MirSurface* surface);
58− void removeSurface(MirSurface* surface);
59− void setScreenshot(const QUrl& m_screenshot);
60− void setLive(bool live);
61− void setFullscreen(bool fullscreen);
62−
63− Q_INVOKABLE void addChildSession(Session* session);
64− void insertChildSession(uint index, Session* session);
65− Q_INVOKABLE void removeChildSession(Session* session);
66−
67−Q_SIGNALS:
68− void applicationChanged(ApplicationInfo*);
69− void parentSessionChanged(Session*);
70− void liveChanged(bool live);
71− void surfaceAdded(MirSurface *surface);
72− void lastSurfaceChanged(MirSurface *surface);
73− void fullscreenChanged(bool fullscreen);
74−
75− // internal mock use
76− void deregister();
77−
78−public Q_SLOTS:
79− Q_INVOKABLE void createSurface();
80−
81−private Q_SLOTS:
82− void updateFullscreenProperty();
83−
84−private:
85− SessionModel* childSessions() const;
86− void setParentSession(Session* session);
87−
88− QString m_name;
89− bool m_live;
90− QUrl m_screenshot;
91− ApplicationInfo* m_application;
92− MirSurface* m_surface;
93− Session* m_parentSession;
94− SessionModel* m_children;
95− ObjectListModel<MirSurface> m_surfaces;
96− bool m_fullscreen;
97−
98− friend class ApplicationTestInterface;
99−};
100−
101−Q_DECLARE_METATYPE(Session*)
102−Q_DECLARE_METATYPE(ObjectListModel<MirSurface>*)
103−
104−#endif // SESSION_H
tests/mocks/Unity/Application/SessionManager.cppdeleted−55
@@ -1,55 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "SessionManager.h"
18−
19−#include "Session.h"
20−
21−SessionManager *SessionManager::the_session_manager = nullptr;
22−
23−SessionManager *SessionManager::singleton()
24−{
25− if (!the_session_manager) {
26− the_session_manager = new SessionManager();
27− }
28− return the_session_manager;
29−}
30−
31−SessionManager::SessionManager(QObject *parent) :
32− QObject(parent)
33−{
34−}
35−
36−
37−Session *SessionManager::createSession(const QString& name,
38− const QUrl& screenshot)
39−{
40− Session* session = new Session(name, screenshot);
41− Q_EMIT sessionStarting(session);
42− return session;
43−}
44−
45−void SessionManager::registerSession(Session *session)
46−{
47− connect(session, &Session::deregister, this, [this] {
48− Session* session = qobject_cast<Session*>(sender());
49−
50− disconnect(session, 0, this, 0);
51−
52− session->setLive(false);
53− Q_EMIT sessionStopping(session);
54− });
55−}
tests/mocks/Unity/Application/SessionModel.hdeleted−35
@@ -1,35 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software: you can redistribute it and/or modify it under
5− * the terms of the GNU Lesser General Public License version 3, as published by
6− * the Free Software Foundation.
7− *
8− * This program is distributed in the hope that it will be useful, but WITHOUT
9− * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10− * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11− * Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef SESSIONMODEL_H
18−#define SESSIONMODEL_H
19−
20−// Local
21−#include "ObjectListModel.h"
22−
23−class Session;
24−class SessionModel: public ObjectListModel<Session>
25−{
26− Q_OBJECT
27−public:
28− SessionModel(QObject *parent = 0): ObjectListModel(parent) {}
29−
30− Q_INVOKABLE int count() const { return rowCount(); }
31−};
32−
33−Q_DECLARE_METATYPE(SessionModel*)
34−
35−#endif // SESSIONMODEL_H
tests/mocks/Unity/Application/SurfaceManager.cpp+16−9
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -16,17 +16,15 @@
16
16
17#include "SurfaceManager.h"
17#include "SurfaceManager.h"
18
18
19+#include "ApplicationInfo.h"
19#include "VirtualKeyboard.h"
20#include "VirtualKeyboard.h"
20
21
21#include <paths.h>
22#include <paths.h>
22
23
23SurfaceManager *SurfaceManager::the_surface_manager = nullptr;
24SurfaceManager *SurfaceManager::the_surface_manager = nullptr;
24
25
25−SurfaceManager *SurfaceManager::singleton()
26+SurfaceManager *SurfaceManager::instance()
26{
27{
27− if (!the_surface_manager) {
28− the_surface_manager = new SurfaceManager();
29− }
30 return the_surface_manager;
28 return the_surface_manager;
31}
29}
32
30
@@ -34,7 +32,10 @@ SurfaceManager::SurfaceManager(QObject *parent) :
34 QObject(parent)
32 QObject(parent)
35 , m_virtualKeyboard(nullptr)
33 , m_virtualKeyboard(nullptr)
36{
34{
35+ Q_ASSERT(the_surface_manager == nullptr);
36+ the_surface_manager = this;
37+
37− m_virtualKeyboard = new VirtualKeyboard(this);
38+ m_virtualKeyboard = new VirtualKeyboard;
38 connect(m_virtualKeyboard, &QObject::destroyed, this, [this](QObject *obj) {
39 connect(m_virtualKeyboard, &QObject::destroyed, this, [this](QObject *obj) {
39 MirSurface* surface = qobject_cast<MirSurface*>(obj);
40 MirSurface* surface = qobject_cast<MirSurface*>(obj);
40 m_virtualKeyboard = nullptr;
41 m_virtualKeyboard = nullptr;
@@ -43,10 +44,16 @@ SurfaceManager::SurfaceManager(QObject *parent) :
43 });
44 });
44}
45}
45
46
47+SurfaceManager::~SurfaceManager()
48+{
49+ Q_ASSERT(the_surface_manager == this);
50+ the_surface_manager = nullptr;
51+}
52+
46MirSurface *SurfaceManager::createSurface(const QString& name,
53MirSurface *SurfaceManager::createSurface(const QString& name,
47− Mir::Type type,
54+ Mir::Type type,
48− Mir::State state,
55+ Mir::State state,
49− const QUrl& screenshot)
56+ const QUrl& screenshot)
50{
57{
51 MirSurface* surface = new MirSurface(name, type, state, screenshot);
58 MirSurface* surface = new MirSurface(name, type, state, screenshot);
52 connect(surface, &QObject::destroyed, this, [this](QObject *obj) {
59 connect(surface, &QObject::destroyed, this, [this](QObject *obj) {
tests/mocks/Unity/Application/SurfaceManager.h+5−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -22,6 +22,8 @@
22#include "MirSurface.h"
22#include "MirSurface.h"
23#include "VirtualKeyboard.h"
23#include "VirtualKeyboard.h"
24
24
25+class ApplicationInfo;
26+
25class SurfaceManager : public QObject
27class SurfaceManager : public QObject
26{
28{
27 Q_OBJECT
29 Q_OBJECT
@@ -35,8 +37,9 @@ class SurfaceManager : public QObject
35
37
36public:
38public:
37 explicit SurfaceManager(QObject *parent = 0);
39 explicit SurfaceManager(QObject *parent = 0);
40+ virtual ~SurfaceManager();
38
41
39− static SurfaceManager *singleton();
42+ static SurfaceManager *instance();
40
43
41 Q_INVOKABLE MirSurface* createSurface(const QString& name,
44 Q_INVOKABLE MirSurface* createSurface(const QString& name,
42 Mir::Type type,
45 Mir::Type type,
tests/mocks/Unity/Application/UbuntuKeyboardInfo.cpp−2
@@ -16,8 +16,6 @@
16
16
17#include "UbuntuKeyboardInfo.h"
17#include "UbuntuKeyboardInfo.h"
18
18
19−UbuntuKeyboardInfo *UbuntuKeyboardInfo::m_instance = nullptr;
20−
21UbuntuKeyboardInfo::UbuntuKeyboardInfo(QObject *parent)
19UbuntuKeyboardInfo::UbuntuKeyboardInfo(QObject *parent)
22 : QObject(parent),
20 : QObject(parent),
23 m_x(0),
21 m_x(0),
tests/mocks/Unity/Application/UbuntuKeyboardInfo.h−9
@@ -40,13 +40,6 @@ public:
40 void setWidth(qreal value);
40 void setWidth(qreal value);
41 void setHeight(qreal value);
41 void setHeight(qreal value);
42
42
43− static UbuntuKeyboardInfo *singleton() {
44− if (!m_instance) {
45− m_instance = new UbuntuKeyboardInfo;
46− }
47− return m_instance;
48− }
49−
50Q_SIGNALS:
43Q_SIGNALS:
51 void xChanged(qreal x);
44 void xChanged(qreal x);
52 void yChanged(qreal y);
45 void yChanged(qreal y);
@@ -59,8 +52,6 @@ private:
59 qint32 m_y;
52 qint32 m_y;
60 qint32 m_width;
53 qint32 m_width;
61 qint32 m_height;
54 qint32 m_height;
62−
63− static UbuntuKeyboardInfo *m_instance;
64};
55};
65
56
66#endif // UBUNTU_KEYBOARD_INFO_H
57#endif // UBUNTU_KEYBOARD_INFO_H
tests/mocks/Unity/Application/VirtualKeyboard.cpp+2−3
@@ -22,13 +22,12 @@
22
22
23#include <QDebug>
23#include <QDebug>
24
24
25−VirtualKeyboard::VirtualKeyboard(QObject *parent)
25+VirtualKeyboard::VirtualKeyboard()
26 : MirSurface("input-method",
26 : MirSurface("input-method",
27 Mir::InputMethodType,
27 Mir::InputMethodType,
28 Mir::MinimizedState,
28 Mir::MinimizedState,
29 QUrl("qrc:///Unity/Application/vkb_portrait.png"),
29 QUrl("qrc:///Unity/Application/vkb_portrait.png"),
30− QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"),
30+ QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"))
31− parent)
32{
31{
33}
32}
34
33
tests/mocks/Unity/Application/VirtualKeyboard.h+1−1
@@ -25,7 +25,7 @@ class VirtualKeyboard : public MirSurface
25{
25{
26 Q_OBJECT
26 Q_OBJECT
27public:
27public:
28− explicit VirtualKeyboard(QObject *parent = nullptr);
28+ explicit VirtualKeyboard();
29 ~VirtualKeyboard();
29 ~VirtualKeyboard();
30};
30};
31
31
tests/mocks/Unity/Application/plugin.cpp+33−38
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013-2015 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -17,12 +17,8 @@
17#include "plugin.h"
17#include "plugin.h"
18#include "ApplicationInfo.h"
18#include "ApplicationInfo.h"
19#include "ApplicationManager.h"
19#include "ApplicationManager.h"
20−#include "ApplicationScreenshotProvider.h"
21−#include "Session.h"
22#include "MirSurfaceItem.h"
20#include "MirSurfaceItem.h"
23#include "SurfaceManager.h"
21#include "SurfaceManager.h"
24−#include "SessionManager.h"
25−#include "ApplicationTestInterface.h"
26#include "UbuntuKeyboardInfo.h"
22#include "UbuntuKeyboardInfo.h"
27
23
28// unity-api
24// unity-api
@@ -31,62 +27,65 @@
31#include <qqml.h>
27#include <qqml.h>
32#include <QQmlEngine>
28#include <QQmlEngine>
33
29
34−static QObject* applicationManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
30+namespace {
35− Q_UNUSED(engine);
36− Q_UNUSED(scriptEngine);
37− return ApplicationManager::singleton();
38−}
39
31
40−static QObject* surfaceManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
32+// Creates the singletons that are called throughout C++ code
41− Q_UNUSED(engine);
33+void createUnityApplicationSharedSingletons()
42− Q_UNUSED(scriptEngine);
34+{
35+ // they have to be created in a specific order
36+ if (!MirFocusController::instance()) {
37+ new MirFocusController;
38+ }
43− return SurfaceManager::singleton();
39+ if (!SurfaceManager::instance()) {
40+ new SurfaceManager;
41+ }
44}
42}
45
43
46−static QObject* sessionManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
44+QObject* applicationManagerSingleton(QQmlEngine*, QJSEngine*)
47− Q_UNUSED(engine);
45+{
48− Q_UNUSED(scriptEngine);
46+ createUnityApplicationSharedSingletons();
49− return SessionManager::singleton();
47+ return new ApplicationManager;
50}
48}
51
49
52−static QObject* ubuntuKeyboardInfoSingleton(QQmlEngine*, QJSEngine*) {
50+QObject* surfaceManagerSingleton(QQmlEngine*, QJSEngine*)
53− return UbuntuKeyboardInfo::singleton();
51+{
52+ createUnityApplicationSharedSingletons();
53+ return SurfaceManager::instance();
54}
54}
55
55
56+QObject* ubuntuKeyboardInfoSingleton(QQmlEngine*, QJSEngine*)
57+{
58+ createUnityApplicationSharedSingletons();
59+ return new UbuntuKeyboardInfo;
60+}
56
61
57−ApplicationTestInterface* s_appTestInterface = nullptr;
58−
59−static QObject* applicationTestInterface(QQmlEngine* engine, QJSEngine* scriptEngine) {
62+QObject* mirFocusControllerSingleton(QQmlEngine*, QJSEngine*)
60− Q_UNUSED(engine);
63+{
61− Q_UNUSED(scriptEngine);
64+ createUnityApplicationSharedSingletons();
62− if (!s_appTestInterface) {
65+ return MirFocusController::instance();
63− s_appTestInterface = new ApplicationTestInterface(engine);
64− }
65− return s_appTestInterface;
66}
66}
67
67
68+} // anonymous namespace
69+
68void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
70void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
69{
71{
70− qRegisterMetaType<Session*>("Session*");
71 qRegisterMetaType<ApplicationInfo*>("ApplicationInfo*");
72 qRegisterMetaType<ApplicationInfo*>("ApplicationInfo*");
72− qRegisterMetaType<SessionModel*>("SessionModel*");
73 qRegisterMetaType<unity::shell::application::MirSurfaceInterface*>("unity::shell::application::MirSurfaceInterface*");
73 qRegisterMetaType<unity::shell::application::MirSurfaceInterface*>("unity::shell::application::MirSurfaceInterface*");
74+ qRegisterMetaType<unity::shell::application::MirSurfaceListInterface*>("unity::shell::application::MirSurfaceListInterface*");
74 qRegisterMetaType<Mir::Type>("Mir::Type");
75 qRegisterMetaType<Mir::Type>("Mir::Type");
75 qRegisterMetaType<Mir::State>("Mir::State");
76 qRegisterMetaType<Mir::State>("Mir::State");
76
77
77 qmlRegisterUncreatableType<unity::shell::application::ApplicationManagerInterface>(uri, 0, 1, "ApplicationManagerInterface", "Abstract interface. Cannot be created in QML");
78 qmlRegisterUncreatableType<unity::shell::application::ApplicationManagerInterface>(uri, 0, 1, "ApplicationManagerInterface", "Abstract interface. Cannot be created in QML");
78 qmlRegisterUncreatableType<unity::shell::application::ApplicationInfoInterface>(uri, 0, 1, "ApplicationInfoInterface", "Abstract interface. Cannot be created in QML");
79 qmlRegisterUncreatableType<unity::shell::application::ApplicationInfoInterface>(uri, 0, 1, "ApplicationInfoInterface", "Abstract interface. Cannot be created in QML");
79− qmlRegisterUncreatableType<Session>(uri, 0, 1, "Session", "Session can't be instantiated from QML");
80 qmlRegisterUncreatableType<MirSurface>(uri, 0, 1, "MirSurface", "MirSurface can't be instantiated from QML");
80 qmlRegisterUncreatableType<MirSurface>(uri, 0, 1, "MirSurface", "MirSurface can't be instantiated from QML");
81 qmlRegisterUncreatableType<unity::shell::application::MirSurfaceInterface>(
81 qmlRegisterUncreatableType<unity::shell::application::MirSurfaceInterface>(
82 uri, 0, 1, "MirSurface", "MirSurface can't be instantiated from QML");
82 uri, 0, 1, "MirSurface", "MirSurface can't be instantiated from QML");
83+ qmlRegisterSingletonType<MirFocusController>(uri, 0, 1, "MirFocusController", mirFocusControllerSingleton);
83 qmlRegisterType<MirSurfaceItem>(uri, 0, 1, "MirSurfaceItem");
84 qmlRegisterType<MirSurfaceItem>(uri, 0, 1, "MirSurfaceItem");
84 qmlRegisterType<ApplicationInfo>(uri, 0, 1, "ApplicationInfo");
85 qmlRegisterType<ApplicationInfo>(uri, 0, 1, "ApplicationInfo");
85
86
86 qmlRegisterSingletonType<ApplicationManager>(uri, 0, 1, "ApplicationManager", applicationManagerSingleton);
87 qmlRegisterSingletonType<ApplicationManager>(uri, 0, 1, "ApplicationManager", applicationManagerSingleton);
87 qmlRegisterSingletonType<SurfaceManager>(uri, 0, 1, "SurfaceManager", surfaceManagerSingleton);
88 qmlRegisterSingletonType<SurfaceManager>(uri, 0, 1, "SurfaceManager", surfaceManagerSingleton);
88− qmlRegisterSingletonType<SessionManager>(uri, 0, 1, "SessionManager", sessionManagerSingleton);
89− qmlRegisterSingletonType<ApplicationTestInterface>(uri, 0, 1, "ApplicationTest", applicationTestInterface);
90 qmlRegisterSingletonType<UbuntuKeyboardInfo>(uri, 0, 1, "UbuntuKeyboardInfo", ubuntuKeyboardInfoSingleton);
89 qmlRegisterSingletonType<UbuntuKeyboardInfo>(uri, 0, 1, "UbuntuKeyboardInfo", ubuntuKeyboardInfoSingleton);
91
90
92 qmlRegisterUncreatableType<Mir>(uri, 0, 1, "Mir", "Mir provides enum values, it can't be instantiated");
91 qmlRegisterUncreatableType<Mir>(uri, 0, 1, "Mir", "Mir provides enum values, it can't be instantiated");
@@ -95,8 +94,4 @@ void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
95void FakeUnityApplicationQmlPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
94void FakeUnityApplicationQmlPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
96{
95{
97 QQmlExtensionPlugin::initializeEngine(engine, uri);
96 QQmlExtensionPlugin::initializeEngine(engine, uri);
98−
99− engine->addImageProvider(QLatin1String("application"), new ApplicationScreenshotProvider(ApplicationManager::singleton()));
100− // make sure we initialise our test interface.
101− applicationTestInterface(engine, nullptr);
102}
97}
tests/mocks/Utils/CMakeLists.txt+4
@@ -22,6 +22,10 @@ set(QMLPLUGIN_SRC
22 ${CMAKE_SOURCE_DIR}/plugins/Utils/deviceconfigparser.cpp
22 ${CMAKE_SOURCE_DIR}/plugins/Utils/deviceconfigparser.cpp
23 ${CMAKE_SOURCE_DIR}/plugins/Utils/globalfunctions.cpp
23 ${CMAKE_SOURCE_DIR}/plugins/Utils/globalfunctions.cpp
24 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
24 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
25+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
26+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
27+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceListInterface.h
28+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
25 constants.cpp
29 constants.cpp
26 plugin.cpp
30 plugin.cpp
27 windowstatestorage.cpp
31 windowstatestorage.cpp
tests/mocks/Utils/plugin.cpp+1−1
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
tests/plugins/Unity/Launcher/launchermodeltest.cpp+2−3
@@ -64,6 +64,7 @@ public:
64 void setExemptFromLifecycle(bool) override {}
64 void setExemptFromLifecycle(bool) override {}
65 QSize initialSurfaceSize() const override { return QSize(); }
65 QSize initialSurfaceSize() const override { return QSize(); }
66 void setInitialSurfaceSize(const QSize &) override {}
66 void setInitialSurfaceSize(const QSize &) override {}
67+ MirSurfaceListInterface* surfaceList() override { return nullptr; }
67
68
68 // Methods used for mocking (not in the interface)
69 // Methods used for mocking (not in the interface)
69 void setFocused(bool focused) { m_focused = focused; Q_EMIT focusedChanged(focused); }
70 void setFocused(bool focused) { m_focused = focused; Q_EMIT focusedChanged(focused); }
@@ -106,7 +107,7 @@ public:
106 }
107 }
107 return false;
108 return false;
108 }
109 }
109− bool focusApplication(const QString &appId) override {
110+ bool focusApplication(const QString &appId) {
110 Q_FOREACH(MockApp* app, m_list) {
111 Q_FOREACH(MockApp* app, m_list) {
111 app->setFocused(app->appId() == appId);
112 app->setFocused(app->appId() == appId);
112 }
113 }
@@ -114,8 +115,6 @@ public:
114 return true;
115 return true;
115 }
116 }
116
117
117− void unfocusCurrentApplication() override { }
118−
119 void addApplication(MockApp *app) {
118 void addApplication(MockApp *app) {
120 beginInsertRows(QModelIndex(), count(), count());
119 beginInsertRows(QModelIndex(), count(), count());
121 m_list.append(app);
120 m_list.append(app);
tests/qmltests/CMakeLists.txt−1
@@ -89,7 +89,6 @@ add_unity8_qmltest(Stages DesktopStage)
89add_unity8_qmltest(Stages PhoneStage)
89add_unity8_qmltest(Stages PhoneStage)
90add_unity8_qmltest(Stages SpreadDelegate)
90add_unity8_qmltest(Stages SpreadDelegate)
91add_unity8_qmltest(Stages SurfaceContainer)
91add_unity8_qmltest(Stages SurfaceContainer)
92−add_unity8_qmltest(Stages SessionContainer)
93add_unity8_qmltest(Stages TabletStage)
92add_unity8_qmltest(Stages TabletStage)
94add_unity8_qmltest(Stages WindowResizeArea)
93add_unity8_qmltest(Stages WindowResizeArea)
95add_unity8_qmltest(Stages Splash)
94add_unity8_qmltest(Stages Splash)
tests/qmltests/Dash/tst_DashShell.qml+6−2
@@ -91,8 +91,12 @@ Item {
91 var stopY = startY;
91 var stopY = startY;
92 touchFlick(shell, startX, startY, stopX, stopY);
92 touchFlick(shell, startX, startY, stopX, stopY);
93
93
94− // Now do a long launcher movement
94+ // bring in the launcher
95+ var startX = units.gu(1);
96+ var startY = shell.height / 2;
97+ var stopX = shell.width / 3;
98+ var stopY = startY;
95− touchFlick(shell, stopX, startY, startX, stopY);
99+ touchFlick(shell, startX, startY, stopX, stopY);
96
100
97 var launcher = findChild(shell, "launcher");
101 var launcher = findChild(shell, "launcher");
98 var buttonShowDashHome = findChild(launcher, "buttonShowDashHome");
102 var buttonShowDashHome = findChild(launcher, "buttonShowDashHome");
tests/qmltests/Greeter/tst_Greeter.qml+2−2
@@ -361,7 +361,7 @@ Item {
361 }
361 }
362
362
363 function test_notifyAboutToFocusApp() {
363 function test_notifyAboutToFocusApp() {
364− greeter.notifyAboutToFocusApp("fake-app");
364+ greeter.notifyUserRequestedApp("fake-app");
365 compare(viewTryToUnlockSpy.count, 1);
365 compare(viewTryToUnlockSpy.count, 1);
366 compare(viewTryToUnlockSpy.signalArguments[0][0], false);
366 compare(viewTryToUnlockSpy.signalArguments[0][0], false);
367 }
367 }
@@ -500,7 +500,7 @@ Item {
500
500
501 // Test opening a locked app
501 // Test opening a locked app
502 greeter.lockedApp = "test-app";
502 greeter.lockedApp = "test-app";
503− greeter.notifyAppFocused("test-app");
503+ greeter.notifyAppFocusRequested("test-app");
504 verify(greeter.hasLockedApp);
504 verify(greeter.hasLockedApp);
505 verify(!greeter.shown);
505 verify(!greeter.shown);
506
506
tests/qmltests/Panel/tst_ActiveCallHint.qml+3−2
@@ -96,11 +96,12 @@ Item {
96 function test_activeHint(data) {
96 function test_activeHint(data) {
97 if (data.dialer) {
97 if (data.dialer) {
98 var application = ApplicationManager.startApplication("dialer-app");
98 var application = ApplicationManager.startApplication("dialer-app");
99− ApplicationManager.focusApplication("dialer-app");
99+ tryCompare(application.surfaceList, "count", 1);
100+ MirFocusController.focusedSurface = application.surfaceList.get(0);
100 tryCompare(ApplicationManager, "focusedApplicationId", "dialer-app");
101 tryCompare(ApplicationManager, "focusedApplicationId", "dialer-app");
101 tryCompare(application, "state", ApplicationInfoInterface.Running);
102 tryCompare(application, "state", ApplicationInfoInterface.Running);
102
103
103− if (!data.focused) { ApplicationManager.unfocusCurrentApplication(); }
104+ if (!data.focused) { MirFocusController.focusedSurface = null; }
104 }
105 }
105 callManager.foregroundCall = data.call;
106 callManager.foregroundCall = data.call;
106 callManager.callIndicatorVisible = data.visible;
107 callManager.callIndicatorVisible = data.visible;
tests/qmltests/Panel/tst_Panel.qml+2−2
@@ -29,7 +29,7 @@ IndicatorTest {
29 id: root
29 id: root
30 width: units.gu(100)
30 width: units.gu(100)
31 height: units.gu(71)
31 height: units.gu(71)
32− color: "white"
32+ color: "black"
33
33
34 Component.onCompleted: theme.name = "Ubuntu.Components.Themes.SuruDark"
34 Component.onCompleted: theme.name = "Ubuntu.Components.Themes.SuruDark"
35
35
@@ -464,7 +464,7 @@ IndicatorTest {
464
464
465 callManager.foregroundCall = phoneCall;
465 callManager.foregroundCall = phoneCall;
466
466
467− ApplicationManager.focusApplication("unity8-dash");
467+ MirFocusController.focusedSurface = ApplicationManager.findApplication("unity8-dash").surfaceList.get(0);
468 tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash");
468 tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash");
469
469
470 mouseClick(panel.indicators,
470 mouseClick(panel.indicators,
tests/qmltests/Stages/ApplicationCheckBox.qml+104−58
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -19,11 +19,17 @@ import QtQuick.Layouts 1.1
19import Ubuntu.Components 1.3
19import Ubuntu.Components 1.3
20import Unity.Application 0.1
20import Unity.Application 0.1
21
21
22−RowLayout {
22+Column {
23 id: root
23 id: root
24 property string appId
24 property string appId
25 property bool checked: false
25 property bool checked: false
26
26
27+ function createSurface() {
28+ if (d.application) {
29+ d.application.createSurface();
30+ }
31+ }
32+
27 enabled: appId !== "unity8-dash"
33 enabled: appId !== "unity8-dash"
28
34
29 onCheckedChanged: {
35 onCheckedChanged: {
@@ -38,77 +44,117 @@ RowLayout {
38 d.bindGuard = false;
44 d.bindGuard = false;
39 }
45 }
40
46
47+ RowLayout {
48+
41− QtObject {
49+ QtObject {
42− id: d
50+ id: d
43− property bool bindGuard: false
51+ property bool bindGuard: false
44− property var application: null
52+ property var application: null
45− Component.onCompleted: {
53+ Component.onCompleted: {
46− application = ApplicationManager.findApplication(root.appId);
54+ application = ApplicationManager.findApplication(root.appId);
55+ }
47 }
56 }
48− }
49
57
50− Connections {
58+ Connections {
51− target: ApplicationManager
59+ target: ApplicationManager
52− onCountChanged: {
60+ onCountChanged: {
53− d.application = ApplicationManager.findApplication(root.appId);
61+ d.application = ApplicationManager.findApplication(root.appId);
62+ }
54 }
63 }
55− }
56
64
57− Layout.fillWidth: true
65+ Layout.fillWidth: true
58− CheckBox {
66+ CheckBox {
59− id: checkbox
67+ id: checkbox
60− checked: false
68+ checked: false
61− activeFocusOnPress: false
69+ activeFocusOnPress: false
62
70
63− onTriggered: {
71+ onTriggered: {
64− if (d.bindGuard) { return; }
72+ if (d.bindGuard) { return; }
65− d.bindGuard = true;
73+ d.bindGuard = true;
66
74
67− if (checked) {
75+ if (checked) {
68− ApplicationManager.startApplication(root.appId);
76+ ApplicationManager.startApplication(root.appId);
69− } else {
77+ } else {
70− ApplicationManager.stopApplication(root.appId);
78+ ApplicationManager.stopApplication(root.appId);
79+ }
80+ d.bindGuard = false;
71 }
81 }
72− d.bindGuard = false;
73− }
74− onCheckedChanged: {
82+ onCheckedChanged: {
75− if (d.bindGuard) { return; }
83+ if (d.bindGuard) { return; }
76− d.bindGuard = true;
84+ d.bindGuard = true;
77
85
78− root.checked = checked;
86+ root.checked = checked;
79
87
80− d.bindGuard = false;
88+ d.bindGuard = false;
89+ }
90+ Binding {
91+ target: checkbox
92+ property: "checked"
93+ value: d.application != null
94+ }
81 }
95 }
82− Binding {
96+ Label {
83− target: checkbox
97+ id: appIdLabel
84− property: "checked"
98+ text: root.appId
85− value: d.application != null
99+ color: "white"
100+ anchors.verticalCenter: parent.verticalCenter
86 }
101 }
87− }
88− Label {
89− id: appIdLabel
90− text: root.appId
91− color: "white"
92− anchors.verticalCenter: parent.verticalCenter
93− }
94− Rectangle {
102+ Rectangle {
95− color: {
103+ color: {
96− if (d.application) {
104+ if (d.application) {
97− if (d.application.state === ApplicationInfoInterface.Starting) {
105+ if (d.application.state === ApplicationInfoInterface.Starting) {
98− return "yellow";
106+ return "yellow";
99− } else if (d.application.state === ApplicationInfoInterface.Running) {
107+ } else if (d.application.state === ApplicationInfoInterface.Running) {
100− return "green";
108+ return "green";
101− } else if (d.application.state === ApplicationInfoInterface.Suspended) {
109+ } else if (d.application.state === ApplicationInfoInterface.Suspended) {
102− return "blue";
110+ return "blue";
111+ } else {
112+ return "darkred";
113+ }
103 } else {
114 } else {
104 return "darkred";
115 return "darkred";
105 }
116 }
106− } else {
117+ }
107− return "darkred";
118+ width: height
119+ height: appIdLabel.height * 0.7
120+ anchors.verticalCenter: parent.verticalCenter
121+ }
122+
123+ MouseArea {
124+ width: height
125+ height: appIdLabel.height * 0.7
126+ anchors.verticalCenter: parent.verticalCenter
127+ onClicked: root.createSurface()
128+ enabled: d.application && d.application.state === ApplicationInfoInterface.Running
129+ visible: enabled
130+ Label {
131+ text: "➕"
132+ color: "white"
133+ anchors.centerIn: parent
134+ }
135+ }
136+ }
137+ Repeater {
138+ model: d.application ? d.application.surfaceList : null
139+ RowLayout {
140+ spacing: units.gu(1)
141+ Label {
142+ color: "white"
143+ text: "- " + model.surface.name
144+ }
145+ MouseArea {
146+ width: height
147+ height: appIdLabel.height * 0.7
148+ anchors.verticalCenter: parent.verticalCenter
149+ enabled: model.surface.live
150+ visible: enabled
151+ onClicked: model.surface.setLive(false);
152+ Label {
153+ text: "⛒"
154+ color: "white"
155+ anchors.centerIn: parent
156+ }
108 }
157 }
109 }
158 }
110− width: height
111− height: appIdLabel.height * 0.7
112− anchors.verticalCenter: parent.verticalCenter
113 }
159 }
114}
160}
tests/qmltests/Stages/RecursingChildSessionControl.qml+10−61
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2014 Canonical Ltd.
2+ * Copyright 2014,2016 Canonical Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -22,16 +22,7 @@ import Unity.Application 0.1
22ColumnLayout {
22ColumnLayout {
23 id: root
23 id: root
24
24
25− property var session
25+ property var surface
26− property var childSessions: session ? session.childSessions : 0
27− property bool removable: false
28− property alias surfaceCheckbox: _surfaceCheckbox
29−
30− property var screenshotIds: [ "gallery", "map", "facebook", "camera", "browser", "music", "twitter"]
31−
32− onSessionChanged: {
33− if (!session) surfaceCheckbox.checked = false;
34− }
35
26
36 Column {
27 Column {
37 id: column
28 id: column
@@ -41,7 +32,7 @@ ColumnLayout {
41
32
42 Repeater {
33 Repeater {
43 id: repeater
34 id: repeater
44− model: root.childSessions
35+ model: root.surface ? root.surface.promptSurfaceList : null
45 delegate: Rectangle {
36 delegate: Rectangle {
46 border {
37 border {
47 color: "black"
38 color: "black"
@@ -71,8 +62,7 @@ ColumnLayout {
71 }
62 }
72
63
73 onLoaded: {
64 onLoaded: {
74− item.session = modelData;
65+ item.surface = model.surface;
75− item.removable = true;
76 }
66 }
77 }
67 }
78 }
68 }
@@ -83,62 +73,21 @@ ColumnLayout {
83 Layout.fillWidth: true
73 Layout.fillWidth: true
84 spacing: units.gu(1)
74 spacing: units.gu(1)
85
75
86− RowLayout {
87− Layout.fillWidth: true
88−
89− CheckBox {
90− id: _surfaceCheckbox;
91− checked: root.session.lastSurface ? true : false
92− activeFocusOnPress: false
93− enabled: root.session
94− onCheckedChanged: {
95− if (checked) {
96− root.session.createSurface();
97− } else if (root.session && root.session.lastSurface) {
98− ApplicationTest.removeSurface(root.session.lastSurface);
99− }
100− }
101−
102− Connections {
103− target: root.session ? root.session : null
104− onLastSurfaceChanged: {
105− surfaceCheckbox.checked = root.session.lastSurface !== null
106− }
107− }
108− }
109−
110− Label {
111− text: "Surface"
112− anchors.verticalCenter: parent.verticalCenter
113− }
114− }
115−
116 RowLayout {
76 RowLayout {
117 id: buttonLayout
77 id: buttonLayout
118
78
119 Button {
79 Button {
120− enabled: root.session
80+ enabled: root.surface
121 activeFocusOnPress: false
81 activeFocusOnPress: false
122− text: removable ? "Remove" : "Release"
82+ text: "Remove"
123− onClicked: {
83+ onClicked: { root.surface.close(); }
124− if (removable) {
125− // release the surface first. simulates mir app closing
126− if (root.session.lastSurface) ApplicationTest.removeSurface(root.session.lastSurface);
127− ApplicationTest.removeSession(root.session);
128− } else {
129− root.session.release();
130− }
131− }
132 }
84 }
133
85
134 Button {
86 Button {
135− enabled: root.session !== null
87+ enabled: root.surface !== null
136 activeFocusOnPress: false
88 activeFocusOnPress: false
137− text: "Add Child"
89+ text: "Add Prompt Surface"
138− onClicked: {
90+ onClicked: { root.surface.createPromptSurface(); }
139− var screenshot = Math.round(Math.random()*100 % (screenshotIds.length-1));
140− var session = ApplicationTest.addChildSession(root.session, root.screenshotIds[screenshot], true);
141− }
142 }
91 }
143 }
92 }
144 }
93 }
tests/qmltests/Stages/tst_ApplicationWindow.qml+73−59
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2014-2015 Canonical Ltd.
2+ * Copyright 2014-2016 Canonical Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -34,16 +34,9 @@ Rectangle {
34 root.fakeApplication = ApplicationManager.add("gallery-app");
34 root.fakeApplication = ApplicationManager.add("gallery-app");
35 root.fakeApplication.manualSurfaceCreation = true;
35 root.fakeApplication.manualSurfaceCreation = true;
36 root.fakeApplication.setState(ApplicationInfoInterface.Starting);
36 root.fakeApplication.setState(ApplicationInfoInterface.Starting);
37+ applicationWindowLoader.item.application = root.fakeApplication;
37 }
38 }
38 property QtObject fakeApplication: null
39 property QtObject fakeApplication: null
39− readonly property var fakeSession: fakeApplication ? fakeApplication.session : null
40−
41− Connections {
42− target: fakeApplication
43− onSessionChanged: {
44− sessionCheckbox.checked = fakeApplication.session !== null
45− }
46− }
47
40
48 Loader {
41 Loader {
49 id: applicationWindowLoader
42 id: applicationWindowLoader
@@ -58,7 +51,6 @@ Rectangle {
58 sourceComponent: Component {
51 sourceComponent: Component {
59 ApplicationWindow {
52 ApplicationWindow {
60 anchors.fill: parent
53 anchors.fill: parent
61− application: fakeApplication
62 surfaceOrientationAngle: 0
54 surfaceOrientationAngle: 0
63 interactive: true
55 interactive: true
64 focus: true
56 focus: true
@@ -86,18 +78,27 @@ Rectangle {
86 Layout.fillWidth: true
78 Layout.fillWidth: true
87
79
88 CheckBox {
80 CheckBox {
81+ id: surfaceCheckbox;
89− id: sessionCheckbox; checked: false
82+ checked: false;
90 activeFocusOnPress: false
83 activeFocusOnPress: false
91 onCheckedChanged: {
84 onCheckedChanged: {
92− if (checked && !fakeApplication.session) {
85+ if (applicationWindowLoader.status !== Loader.Ready)
93− fakeApplication.createSession();
86+ return;
94− } else if (!checked && fakeApplication.session) {
87+
95− fakeApplication.destroySession();
88+ if (checked) {
89+ applicationWindowLoader.item.surface = SurfaceManager.createSurface("foo",
90+ Mir.NormalType, Mir.MaximizedState, root.fakeApplication);
91+
92+ root.fakeApplication.setState(ApplicationInfoInterface.Running);
93+ } else {
94+ if (applicationWindowLoader.item.surface) {
95+ applicationWindowLoader.item.surface.setLive(false);
96+ }
96 }
97 }
97 }
98 }
98 }
99 }
99 Label {
100 Label {
100− text: "Session"
101+ text: "Surface"
101 anchors.verticalCenter: parent.verticalCenter
102 anchors.verticalCenter: parent.verticalCenter
102 }
103 }
103 }
104 }
@@ -117,7 +118,7 @@ Rectangle {
117 id: sessionControl
118 id: sessionControl
118 anchors { left: parent.left; right: parent.right; }
119 anchors { left: parent.left; right: parent.right; }
119
120
120− session: fakeSession
121+ surface: applicationWindowLoader.item ? applicationWindowLoader.item.surface : null
121 }
122 }
122 }
123 }
123
124
@@ -143,7 +144,15 @@ Rectangle {
143 }
144 }
144 onSelectedApplicationStateChanged: {
145 onSelectedApplicationStateChanged: {
145 // state is a read-only property, thus we have to call the setter function
146 // state is a read-only property, thus we have to call the setter function
147+ if (fakeApplication && fakeApplication.state != selectedApplicationState) {
146− fakeApplication.setState(selectedApplicationState);
148+ fakeApplication.setState(selectedApplicationState);
149+ }
150+ }
151+ Connections {
152+ target: fakeApplication
153+ onStateChanged: {
154+ testCase.setApplicationState(state);
155+ }
147 }
156 }
148 }
157 }
149
158
@@ -197,6 +206,8 @@ Rectangle {
197 }
206 }
198 }
207 }
199
208
209+ property var applicationWindow: applicationWindowLoader.item
210+
200 // holds some of the internal ApplicationWindow objects we probe during the tests
211 // holds some of the internal ApplicationWindow objects we probe during the tests
201 property var stateGroup: null
212 property var stateGroup: null
202
213
@@ -213,11 +224,6 @@ Rectangle {
213 findInterestingApplicationWindowChildren();
224 findInterestingApplicationWindowChildren();
214 }
225 }
215
226
216− function initSession() {
217− sessionCheckbox.checked = true;
218− sessionControl.surfaceCheckbox.checked = true;
219− }
220−
221 function cleanup() {
227 function cleanup() {
222 forgetApplicationWindowChildren();
228 forgetApplicationWindowChildren();
223
229
@@ -238,10 +244,17 @@ Rectangle {
238 // deleted, so you end up with two instances in memory.
244 // deleted, so you end up with two instances in memory.
239 tryCompare(applicationWindowLoader, "itemDestroyed", true);
245 tryCompare(applicationWindowLoader, "itemDestroyed", true);
240
246
241− appStateSelector.selectedIndex = 0;
247+ setApplicationState(appStarting);
242− sessionCheckbox.checked = false;
248+ surfaceCheckbox.checked = false;
249+
250+ ApplicationManager.stopApplication("gallery-app");
251+ root.fakeApplication = ApplicationManager.add("gallery-app");
252+ root.fakeApplication.manualSurfaceCreation = true;
253+ root.fakeApplication.setState(ApplicationInfoInterface.Starting);
243
254
244 applicationWindowLoader.active = true;
255 applicationWindowLoader.active = true;
256+
257+ applicationWindowLoader.item.application = root.fakeApplication;
245 }
258 }
246
259
247 function test_showSplashUntilAppFullyInit_data() {
260 function test_showSplashUntilAppFullyInit_data() {
@@ -256,7 +269,7 @@ Rectangle {
256 verify(stateGroup.state === "splashScreen");
269 verify(stateGroup.state === "splashScreen");
257
270
258 if (data.swapInitOrder) {
271 if (data.swapInitOrder) {
259− initSession();
272+ surfaceCheckbox.checked = true;
260 } else {
273 } else {
261 setApplicationState(appRunning);
274 setApplicationState(appRunning);
262 }
275 }
@@ -266,14 +279,14 @@ Rectangle {
266 if (data.swapInitOrder) {
279 if (data.swapInitOrder) {
267 setApplicationState(appRunning);
280 setApplicationState(appRunning);
268 } else {
281 } else {
269− initSession();
282+ surfaceCheckbox.checked = true;
270 }
283 }
271
284
272 tryCompare(stateGroup, "state", "surface");
285 tryCompare(stateGroup, "state", "surface");
273 }
286 }
274
287
275 function test_suspendedAppShowsSurface() {
288 function test_suspendedAppShowsSurface() {
276− initSession();
289+ surfaceCheckbox.checked = true;
277 setApplicationState(appRunning);
290 setApplicationState(appRunning);
278
291
279 tryCompare(stateGroup, "state", "surface");
292 tryCompare(stateGroup, "state", "surface");
@@ -287,7 +300,7 @@ Rectangle {
287 }
300 }
288
301
289 function test_killedAppShowsScreenshot() {
302 function test_killedAppShowsScreenshot() {
290− initSession();
303+ surfaceCheckbox.checked = true;
291 setApplicationState(appRunning);
304 setApplicationState(appRunning);
292 tryCompare(stateGroup, "state", "surface");
305 tryCompare(stateGroup, "state", "surface");
293
306
@@ -297,16 +310,17 @@ Rectangle {
297 verify(fakeApplication.surface !== null);
310 verify(fakeApplication.surface !== null);
298
311
299 // kill it!
312 // kill it!
313+ surfaceCheckbox.checked = false;
300 setApplicationState(appStopped);
314 setApplicationState(appStopped);
301
315
302 tryCompare(stateGroup, "state", "screenshot");
316 tryCompare(stateGroup, "state", "screenshot");
303− tryCompare(fakeApplication, "session", null);
317+ tryCompare(fakeApplication.surfaceList, "count", 0);
304 }
318 }
305
319
306 function test_restartApp() {
320 function test_restartApp() {
307− var screenshotImage = findChild(applicationWindowLoader.item, "screenshotImage");
321+ var screenshotImage = findChild(applicationWindow, "screenshotImage");
308
322
309− initSession();
323+ surfaceCheckbox.checked = true;
310 setApplicationState(appRunning);
324 setApplicationState(appRunning);
311 tryCompare(stateGroup, "state", "surface");
325 tryCompare(stateGroup, "state", "surface");
312 waitUntilTransitionsEnd(stateGroup);
326 waitUntilTransitionsEnd(stateGroup);
@@ -314,109 +328,109 @@ Rectangle {
314 setApplicationState(appSuspended);
328 setApplicationState(appSuspended);
315
329
316 // kill it
330 // kill it
331+ surfaceCheckbox.checked = false;
317 setApplicationState(appStopped);
332 setApplicationState(appStopped);
318
333
319 tryCompare(stateGroup, "state", "screenshot");
334 tryCompare(stateGroup, "state", "screenshot");
320 waitUntilTransitionsEnd(stateGroup);
335 waitUntilTransitionsEnd(stateGroup);
321− tryCompare(fakeApplication, "session", null);
336+ tryCompare(applicationWindow, "surface", null);
322
337
323 // and restart it
338 // and restart it
324 setApplicationState(appStarting);
339 setApplicationState(appStarting);
325
340
326 waitUntilTransitionsEnd(stateGroup);
341 waitUntilTransitionsEnd(stateGroup);
327 verify(stateGroup.state === "screenshot");
342 verify(stateGroup.state === "screenshot");
328− verify(fakeSession === null);
343+ verify(applicationWindow.surface === null);
329
344
330 setApplicationState(appRunning);
345 setApplicationState(appRunning);
331
346
332 waitUntilTransitionsEnd(stateGroup);
347 waitUntilTransitionsEnd(stateGroup);
333 verify(stateGroup.state === "screenshot");
348 verify(stateGroup.state === "screenshot");
334
349
335− initSession();
350+ surfaceCheckbox.checked = true;
336
351
337 tryCompare(stateGroup, "state", "surface");
352 tryCompare(stateGroup, "state", "surface");
338 tryCompare(screenshotImage, "status", Image.Null);
353 tryCompare(screenshotImage, "status", Image.Null);
339 }
354 }
340
355
341 function test_appCrashed() {
356 function test_appCrashed() {
342− initSession();
357+ surfaceCheckbox.checked = true;
343 setApplicationState(appRunning);
358 setApplicationState(appRunning);
344 tryCompare(stateGroup, "state", "surface");
359 tryCompare(stateGroup, "state", "surface");
345 waitUntilTransitionsEnd(stateGroup);
360 waitUntilTransitionsEnd(stateGroup);
346
361
347 // oh, it crashed...
362 // oh, it crashed...
363+ surfaceCheckbox.checked = false;
348 setApplicationState(appStopped);
364 setApplicationState(appStopped);
349
365
350 tryCompare(stateGroup, "state", "screenshot");
366 tryCompare(stateGroup, "state", "screenshot");
351− tryCompare(fakeApplication, "session", null);
367+ tryCompare(applicationWindow, "surface", null);
352 }
368 }
353
369
354 function test_keepSurfaceWhileInvisible() {
370 function test_keepSurfaceWhileInvisible() {
355− initSession();
371+ surfaceCheckbox.checked = true;
356 setApplicationState(appRunning);
372 setApplicationState(appRunning);
357 tryCompare(stateGroup, "state", "surface");
373 tryCompare(stateGroup, "state", "surface");
358 waitUntilTransitionsEnd(stateGroup);
374 waitUntilTransitionsEnd(stateGroup);
359− verify(fakeSession.lastSurface !== null);
375+ verify(applicationWindow.surface !== null);
360
376
361− applicationWindowLoader.item.visible = false;
377+ applicationWindow.visible = false;
362
378
363 waitUntilTransitionsEnd(stateGroup);
379 waitUntilTransitionsEnd(stateGroup);
364 verify(stateGroup.state === "surface");
380 verify(stateGroup.state === "surface");
365− verify(fakeSession.lastSurface !== null);
381+ verify(applicationWindow.surface !== null);
366
382
367− applicationWindowLoader.item.visible = true;
383+ applicationWindow.visible = true;
368
384
369 waitUntilTransitionsEnd(stateGroup);
385 waitUntilTransitionsEnd(stateGroup);
370 verify(stateGroup.state === "surface");
386 verify(stateGroup.state === "surface");
371− verify(fakeSession.lastSurface !== null);
387+ verify(applicationWindow.surface !== null);
372 }
388 }
373
389
374 function test_touchesReachSurfaceWhenItsShown() {
390 function test_touchesReachSurfaceWhenItsShown() {
375 setApplicationState(appRunning);
391 setApplicationState(appRunning);
376− initSession();
392+ surfaceCheckbox.checked = true;
377
393
378 tryCompare(stateGroup, "state", "surface");
394 tryCompare(stateGroup, "state", "surface");
379
395
380 waitUntilTransitionsEnd(stateGroup);
396 waitUntilTransitionsEnd(stateGroup);
381
397
382− var surfaceItem = findChild(applicationWindowLoader.item, "surfaceItem");
398+ var surfaceItem = findChild(applicationWindow, "surfaceItem");
383 verify(surfaceItem);
399 verify(surfaceItem);
384− verify(surfaceItem.surface === fakeSession.lastSurface);
400+ verify(surfaceItem.surface === applicationWindow.surface);
385
401
386 surfaceItem.touchPressCount = 0;
402 surfaceItem.touchPressCount = 0;
387 surfaceItem.touchReleaseCount = 0;
403 surfaceItem.touchReleaseCount = 0;
388
404
389− tap(applicationWindowLoader.item,
405+ tap(applicationWindow);
390− applicationWindowLoader.item.width / 2, applicationWindowLoader.item.height / 2);
391
406
392 verify(surfaceItem.touchPressCount === 1);
407 verify(surfaceItem.touchPressCount === 1);
393 verify(surfaceItem.touchReleaseCount === 1);
408 verify(surfaceItem.touchReleaseCount === 1);
394 }
409 }
395
410
396 function test_showNothingOnSuddenSurfaceLoss() {
411 function test_showNothingOnSuddenSurfaceLoss() {
397− initSession();
412+ surfaceCheckbox.checked = true;
398 setApplicationState(appRunning);
413 setApplicationState(appRunning);
399 tryCompare(stateGroup, "state", "surface");
414 tryCompare(stateGroup, "state", "surface");
400 waitUntilTransitionsEnd(stateGroup);
415 waitUntilTransitionsEnd(stateGroup);
401
416
402− sessionControl.surfaceCheckbox.checked = false;
417+ applicationWindow.surface = null;
403
418
404 tryCompare(stateGroup, "state", "void");
419 tryCompare(stateGroup, "state", "void");
405 }
420 }
406
421
407 function test_surfaceActiveFocusFollowsAppWindowInterative() {
422 function test_surfaceActiveFocusFollowsAppWindowInterative() {
408− fakeApplication.createSession();
409− applicationWindowLoader.item.interactive = false;
423+ applicationWindow.interactive = false;
410− applicationWindowLoader.item.interactive = true;
424+ applicationWindow.interactive = true;
411− fakeSession.createSurface();
425+ surfaceCheckbox.checked = true;
412
426
413− compare(fakeSession.lastSurface.activeFocus, true);
427+ compare(applicationWindow.surface.activeFocus, true);
414
428
415− applicationWindowLoader.item.interactive = false;
429+ applicationWindow.interactive = false;
416− compare(fakeSession.lastSurface.activeFocus, false);
430+ compare(applicationWindow.surface.activeFocus, false);
417
431
418− applicationWindowLoader.item.interactive = true;
432+ applicationWindow.interactive = true;
419− compare(fakeSession.lastSurface.activeFocus, true);
433+ compare(applicationWindow.surface.activeFocus, true);
420 }
434 }
421 }
435 }
422}
436}
tests/qmltests/Stages/tst_DesktopStage.qml+243−161
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.3
20import Ubuntu.Components.ListItems 1.3
20import Ubuntu.Components.ListItems 1.3
21import Unity.Application 0.1
21import Unity.Application 0.1
22import Unity.Test 0.1
22import Unity.Test 0.1
23+import WindowManager 0.1
23import Utils 0.1
24import Utils 0.1
24
25
25import ".." // For EdgeBarrierControls
26import ".." // For EdgeBarrierControls
@@ -53,6 +54,11 @@ Item {
53 }
54 }
54 }
55 }
55
56
57+ TopLevelSurfaceList {
58+ id: topSurfaceList
59+ applicationsModel: ApplicationManager
60+ }
61+
56 Loader {
62 Loader {
57 id: desktopStageLoader
63 id: desktopStageLoader
58 x: ((root.width - controls.width) - width) / 2
64 x: ((root.width - controls.width) - width) / 2
@@ -68,6 +74,7 @@ Item {
68 color: "white"
74 color: "white"
69 anchors.fill: parent
75 anchors.fill: parent
70 background: "../../../qml/graphics/tablet_background.jpg"
76 background: "../../../qml/graphics/tablet_background.jpg"
77+ focus: true
71
78
72 Component.onCompleted: {
79 Component.onCompleted: {
73 edgeBarrierControls.target = testCase.findChild(this, "edgeBarrierController");
80 edgeBarrierControls.target = testCase.findChild(this, "edgeBarrierController");
@@ -76,6 +83,8 @@ Item {
76 desktopStageLoader.itemDestroyed = true;
83 desktopStageLoader.itemDestroyed = true;
77 }
84 }
78 orientations: Orientations {}
85 orientations: Orientations {}
86+ applicationManager: ApplicationManager
87+ topLevelSurfaceList: topSurfaceList
79 }
88 }
80 }
89 }
81 }
90 }
@@ -103,7 +112,7 @@ Item {
103 activeFocusOnPress: false
112 activeFocusOnPress: false
104 onClicked: {
113 onClicked: {
105 if (ApplicationManager.focusedApplicationId) {
114 if (ApplicationManager.focusedApplicationId) {
106− var surface = ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).session.lastSurface;
115+ var surface = ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).surfaceList.get(0);
107 surface.slowToResize = true;
116 surface.slowToResize = true;
108 }
117 }
109 }
118 }
@@ -137,6 +146,19 @@ Item {
137
146
138 property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
147 property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
139
148
149+ function init() {
150+ // wait until unity8-dash is up and running.
151+ // it's started automatically by ApplicationManager mock implementation
152+ tryCompare(ApplicationManager, "count", 1);
153+ var dashApp = ApplicationManager.findApplication("unity8-dash");
154+ verify(dashApp);
155+ tryCompare(dashApp, "state", ApplicationInfoInterface.Running);
156+
157+ tryCompare(topSurfaceList, "count", 1);
158+ tryCompareFunction(function(){return topSurfaceList.surfaceAt(0) != null;}, true);
159+ compare(MirFocusController.focusedSurface, topSurfaceList.surfaceAt(0));
160+ }
161+
140 function cleanup() {
162 function cleanup() {
141 desktopStageLoader.itemDestroyed = false;
163 desktopStageLoader.itemDestroyed = false;
142 desktopStageLoader.active = false;
164 desktopStageLoader.active = false;
@@ -149,43 +171,71 @@ Item {
149 // Shell instance gets destroyed.
171 // Shell instance gets destroyed.
150 tryCompare(desktopStageLoader, "itemDestroyed", true);
172 tryCompare(desktopStageLoader, "itemDestroyed", true);
151
173
152− killAllRunningApps();
174+ killApps();
175+
176+ root.resetGeometry();
153
177
154 desktopStageLoader.active = true;
178 desktopStageLoader.active = true;
155 tryCompare(desktopStageLoader, "status", Loader.Ready);
179 tryCompare(desktopStageLoader, "status", Loader.Ready);
156− root.resetGeometry();
157− }
158
180
159− function killAllRunningApps() {
160− while (ApplicationManager.count > 0) {
161− ApplicationManager.stopApplication(ApplicationManager.get(0).appId);
162− }
163− compare(ApplicationManager.count, 0)
164 }
181 }
165
182
166− function waitUntilAppSurfaceShowsUp(appId) {
183+ function waitUntilAppSurfaceShowsUp(surfaceId) {
167− var appWindow = findChild(desktopStage, "appWindow_" + appId);
184+ var appDelegate = findChild(desktopStage, "appDelegate_" + surfaceId);
185+ verify(appDelegate);
186+ var appWindow = findChild(appDelegate, "appWindow");
168 verify(appWindow);
187 verify(appWindow);
169 var appWindowStates = findInvisibleChild(appWindow, "applicationWindowStateGroup");
188 var appWindowStates = findInvisibleChild(appWindow, "applicationWindowStateGroup");
170 verify(appWindowStates);
189 verify(appWindowStates);
171 tryCompare(appWindowStates, "state", "surface");
190 tryCompare(appWindowStates, "state", "surface");
172 }
191 }
173
192
193+ /*
194+ Returns the appDelegate of the first surface created by the app with the specified appId
195+ */
174 function startApplication(appId) {
196 function startApplication(appId) {
197+ try {
175− var app = ApplicationManager.findApplication(appId);
198+ var app = ApplicationManager.findApplication(appId);
176− if (!app) {
199+ if (app) {
200+ for (var i = 0; i < topSurfaceList.count; i++) {
201+ if (topSurfaceList.applicationAt(i).appId === appId) {
202+ var appRepeater = findChild(desktopStage, "appRepeater");
203+ verify(appRepeater);
204+ return appRepeater.itemAt(i);
205+ }
206+ }
207+ }
208+
209+ var surfaceId = topSurfaceList.nextId;
177 app = ApplicationManager.startApplication(appId);
210 app = ApplicationManager.startApplication(appId);
211+ verify(app);
212+ waitUntilAppSurfaceShowsUp(surfaceId);
213+ compare(app.surfaceList.count, 1);
214+
215+ return findChild(desktopStage, "appDelegate_" + surfaceId);
216+ } catch(err) {
217+ throw new Error("startApplication("+appId+") called from line " + util.callerLine(1) + " failed!");
218+ }
219+ }
220+
221+ function maximizeAppDelegate(appDelegate) {
222+ var maximizeButton = findChild(appDelegate, "maximizeWindowButton");
223+ if (!maximizeButton) {
224+ fail("Could not find maximizeWindowButton of appDelegate=" + appDelegate);
225+ }
226+ mouseClick(maximizeButton);
227+
228+ try {
229+ tryCompare(appDelegate, "visuallyMaximized", true);
230+ } catch(err) {
231+ fail("appDelegate.visuallyMaximized !== true");
178 }
232 }
179− verify(app);
180− waitUntilAppSurfaceShowsUp(appId);
181− verify(app.session.lastSurface);
182− return app;
183 }
233 }
184
234
185 function test_appFocusSwitch_data() {
235 function test_appFocusSwitch_data() {
186 return [
236 return [
187− {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
237+ {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "gmail-webapp" ], focusfrom: 0, focusTo: 1 },
188− {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
238+ {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "gmail-webapp" ], focusfrom: 1, focusTo: 0 },
189 ]
239 ]
190 }
240 }
191
241
@@ -193,10 +243,10 @@ Item {
193 data.apps.forEach(startApplication);
243 data.apps.forEach(startApplication);
194
244
195 ApplicationManager.requestFocusApplication(data.apps[data.focusfrom]);
245 ApplicationManager.requestFocusApplication(data.apps[data.focusfrom]);
196− tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.lastSurface, "activeFocus", true);
246+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).surfaceList.get(0), "activeFocus", true);
197
247
198 ApplicationManager.requestFocusApplication(data.apps[data.focusTo]);
248 ApplicationManager.requestFocusApplication(data.apps[data.focusTo]);
199− tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.lastSurface, "activeFocus", true);
249+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).surfaceList.get(0), "activeFocus", true);
200 }
250 }
201
251
202 function test_tappingOnWindowChangesFocusedApp_data() {
252 function test_tappingOnWindowChangesFocusedApp_data() {
@@ -207,21 +257,24 @@ Item {
207 }
257 }
208
258
209 function test_tappingOnWindowChangesFocusedApp(data) {
259 function test_tappingOnWindowChangesFocusedApp(data) {
260+ var appDelegates = [];
261+ for (var i = 0; i < data.apps.length; i++) {
210− data.apps.forEach(startApplication);
262+ appDelegates[i] = startApplication(data.apps[i]);
263+ }
211− var fromAppId = data.apps[data.focusfrom];
264+ var fromDelegate = appDelegates[data.focusfrom];
212− var toAppId = data.apps[data.focusTo]
265+ var toDelegate = appDelegates[data.focusTo];
213
266
214− var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
267+ var fromAppWindow = findChild(fromDelegate, "appWindow");
215 verify(fromAppWindow);
268 verify(fromAppWindow);
216 tap(fromAppWindow);
269 tap(fromAppWindow);
217− compare(fromAppWindow.application.session.lastSurface.activeFocus, true);
270+ compare(fromDelegate.surface.activeFocus, true);
218− compare(ApplicationManager.focusedApplicationId, fromAppId);
271+ compare(MirFocusController.focusedSurface, fromDelegate.surface);
219
272
220− var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
273+ var toAppWindow = findChild(toDelegate, "appWindow");
221 verify(toAppWindow);
274 verify(toAppWindow);
222 tap(toAppWindow);
275 tap(toAppWindow);
223− compare(toAppWindow.application.session.lastSurface.activeFocus, true);
276+ compare(toDelegate.surface.activeFocus, true);
224− compare(ApplicationManager.focusedApplicationId, toAppId);
277+ compare(MirFocusController.focusedSurface, toDelegate.surface);
225 }
278 }
226
279
227 function test_clickingOnWindowChangesFocusedApp_data() {
280 function test_clickingOnWindowChangesFocusedApp_data() {
@@ -229,21 +282,24 @@ Item {
229 }
282 }
230
283
231 function test_clickingOnWindowChangesFocusedApp(data) {
284 function test_clickingOnWindowChangesFocusedApp(data) {
285+ var appDelegates = [];
286+ for (var i = 0; i < data.apps.length; i++) {
232− data.apps.forEach(startApplication);
287+ appDelegates[i] = startApplication(data.apps[i]);
288+ }
233− var fromAppId = data.apps[data.focusfrom];
289+ var fromDelegate = appDelegates[data.focusfrom];
234− var toAppId = data.apps[data.focusTo]
290+ var toDelegate = appDelegates[data.focusTo];
235
291
236− var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
292+ var fromAppWindow = findChild(fromDelegate, "appWindow");
237 verify(fromAppWindow);
293 verify(fromAppWindow);
238 mouseClick(fromAppWindow);
294 mouseClick(fromAppWindow);
239− compare(fromAppWindow.application.session.lastSurface.activeFocus, true);
295+ compare(fromDelegate.surface.activeFocus, true);
240− compare(ApplicationManager.focusedApplicationId, fromAppId);
296+ compare(MirFocusController.focusedSurface, fromDelegate.surface);
241
297
242− var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
298+ var toAppWindow = findChild(toDelegate, "appWindow");
243 verify(toAppWindow);
299 verify(toAppWindow);
244 mouseClick(toAppWindow);
300 mouseClick(toAppWindow);
245− compare(toAppWindow.application.session.lastSurface.activeFocus, true);
301+ compare(toDelegate.surface.activeFocus, true);
246− compare(ApplicationManager.focusedApplicationId, toAppId);
302+ compare(MirFocusController.focusedSurface, toDelegate.surface);
247 }
303 }
248
304
249 function test_tappingOnDecorationFocusesApplication_data() {
305 function test_tappingOnDecorationFocusesApplication_data() {
@@ -253,24 +309,49 @@ Item {
253 ]
309 ]
254 }
310 }
255
311
312+ function findDecoratedWindow(surfaceId) {
313+ var appDelegate = findChild(desktopStage, "appDelegate_" + surfaceId);
314+ if (!appDelegate) {
315+ console.warn("Could not find appDelegate for surfaceId="+surfaceId);
316+ return null;
317+ }
318+ return findChild(appDelegate, "decoratedWindow");
319+ }
320+
321+ function findWindowDecoration(surfaceId) {
322+ var appDelegate = findChild(desktopStage, "appDelegate_" + surfaceId);
323+ if (!appDelegate) {
324+ console.warn("Could not find appDelegate for surfaceId="+surfaceId);
325+ return null;
326+ }
327+ return findChild(appDelegate, "appWindowDecoration");
328+ }
329+
256 function test_tappingOnDecorationFocusesApplication(data) {
330 function test_tappingOnDecorationFocusesApplication(data) {
331+ var appDelegates = [];
332+ for (var i = 0; i < data.apps.length; i++) {
257− data.apps.forEach(startApplication);
333+ appDelegates[i] = startApplication(data.apps[i]);
334+ }
335+
336+ var fromDelegate = appDelegates[data.focusfrom];
337+ var toDelegate = appDelegates[data.focusTo];
258
338
259− var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
339+ var fromAppDecoration = findChild(fromDelegate, "appWindowDecoration");
260 verify(fromAppDecoration);
340 verify(fromAppDecoration);
261 tap(fromAppDecoration);
341 tap(fromAppDecoration);
262
342
263− var fromApp = ApplicationManager.findApplication(data.apps[data.focusfrom]);
264− verify(fromApp);
265− tryCompare(fromApp.session.lastSurface, "activeFocus", true);
343+ tryCompare(fromDelegate.surface, "activeFocus", true);
266
344
267− var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
345+ var toAppDecoration = findChild(toDelegate, "appWindowDecoration");
268 verify(toAppDecoration);
346 verify(toAppDecoration);
347+
348+ // FIXME: Wait a bit before the second tap or the window decoration will say it got double clicked.
349+ // No idea why.
350+ wait(700);
351+
269 tap(toAppDecoration);
352 tap(toAppDecoration);
270
353
271− var toApp = ApplicationManager.findApplication(data.apps[data.focusTo]);
272− verify(toApp);
273− tryCompare(toApp.session.lastSurface, "activeFocus", true);
354+ tryCompare(toDelegate.surface, "activeFocus", true);
274 }
355 }
275
356
276 function test_clickingOnDecorationFocusesApplication_data() {
357 function test_clickingOnDecorationFocusesApplication_data() {
@@ -278,159 +359,170 @@ Item {
278 }
359 }
279
360
280 function test_clickingOnDecorationFocusesApplication(data) {
361 function test_clickingOnDecorationFocusesApplication(data) {
362+ var appDelegates = [];
363+ for (var i = 0; i < data.apps.length; i++) {
281− data.apps.forEach(startApplication);
364+ appDelegates[i] = startApplication(data.apps[i]);
365+ }
366+ var fromDelegate = appDelegates[data.focusfrom];
367+ var toDelegate = appDelegates[data.focusTo];
282
368
283− var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
369+ var fromAppDecoration = findChild(fromDelegate, "appWindowDecoration");
284 verify(fromAppDecoration);
370 verify(fromAppDecoration);
285 mouseClick(fromAppDecoration);
371 mouseClick(fromAppDecoration);
286− tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.lastSurface, "activeFocus", true);
372+ tryCompare(fromDelegate.surface, "activeFocus", true);
287
373
288− var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
374+ var toAppDecoration = findChild(toDelegate, "appWindowDecoration");
289 verify(toAppDecoration);
375 verify(toAppDecoration);
290 mouseClick(toAppDecoration);
376 mouseClick(toAppDecoration);
291− tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.lastSurface, "activeFocus", true);
377+ tryCompare(toDelegate.surface, "activeFocus", true);
292 }
378 }
293
379
294 function test_windowMaximize() {
380 function test_windowMaximize() {
295− var apps = ["unity8-dash", "dialer-app", "camera-app"];
381+ var dialerDelegate = startApplication("dialer-app");
296− apps.forEach(startApplication);
382+ startApplication("camera-app");
297− var appName = "dialer-app";
383+
298− var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
384+ tryCompareFunction(function(){ return dialerDelegate.surface !== null; }, true);
299− verify(appDelegate);
385+ dialerDelegate.surface.requestFocus();
300− ApplicationManager.focusApplication(appName);
386+ tryCompare(dialerDelegate, "focus", true);
387+
301 keyClick(Qt.Key_Up, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Up shortcut to maximize
388 keyClick(Qt.Key_Up, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Up shortcut to maximize
302− tryCompare(appDelegate, "maximized", true);
389+ tryCompare(dialerDelegate, "maximized", true);
303− tryCompare(appDelegate, "minimized", false);
390+ tryCompare(dialerDelegate, "minimized", false);
304 }
391 }
305
392
306 function test_windowMaximizeLeft() {
393 function test_windowMaximizeLeft() {
307− var apps = ["unity8-dash", "dialer-app", "camera-app"];
394+ var dialerDelegate = startApplication("dialer-app");
308− apps.forEach(startApplication);
395+ startApplication("camera-app");
309− var appName = "dialer-app";
396+
310− var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
397+ tryCompareFunction(function(){ return dialerDelegate.surface !== null; }, true);
311− verify(appDelegate);
398+ dialerDelegate.surface.requestFocus();
312− ApplicationManager.focusApplication(appName);
399+ tryCompare(dialerDelegate, "focus", true);
400+
313 keyClick(Qt.Key_Left, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Left shortcut to maximizeLeft
401 keyClick(Qt.Key_Left, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Left shortcut to maximizeLeft
314− tryCompare(appDelegate, "maximized", false);
402+ tryCompare(dialerDelegate, "maximized", false);
315− tryCompare(appDelegate, "minimized", false);
403+ tryCompare(dialerDelegate, "minimized", false);
316− tryCompare(appDelegate, "maximizedLeft", true);
404+ tryCompare(dialerDelegate, "maximizedLeft", true);
317− tryCompare(appDelegate, "maximizedRight", false);
405+ tryCompare(dialerDelegate, "maximizedRight", false);
318 }
406 }
319
407
320 function test_windowMaximizeRight() {
408 function test_windowMaximizeRight() {
321− var apps = ["unity8-dash", "dialer-app", "camera-app"];
409+ var dialerDelegate = startApplication("dialer-app");
322− apps.forEach(startApplication);
410+ startApplication("camera-app");
323− var appName = "dialer-app";
411+
324− var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
412+ tryCompareFunction(function(){ return dialerDelegate.surface !== null; }, true);
325− verify(appDelegate);
413+ dialerDelegate.surface.requestFocus();
326− ApplicationManager.focusApplication(appName);
414+ tryCompare(dialerDelegate, "focus", true);
415+
327 keyClick(Qt.Key_Right, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Right shortcut to maximizeRight
416 keyClick(Qt.Key_Right, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Right shortcut to maximizeRight
328− tryCompare(appDelegate, "maximized", false);
417+ tryCompare(dialerDelegate, "maximized", false);
329− tryCompare(appDelegate, "minimized", false);
418+ tryCompare(dialerDelegate, "minimized", false);
330− tryCompare(appDelegate, "maximizedLeft", false);
419+ tryCompare(dialerDelegate, "maximizedLeft", false);
331− tryCompare(appDelegate, "maximizedRight", true);
420+ tryCompare(dialerDelegate, "maximizedRight", true);
332 }
421 }
333
422
334 function test_windowMinimize() {
423 function test_windowMinimize() {
335− var apps = ["unity8-dash", "dialer-app", "camera-app"];
424+ var dialerDelegate = startApplication("dialer-app");
336− apps.forEach(startApplication);
425+ startApplication("camera-app");
337− var appName = "dialer-app";
426+
338− var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
427+ tryCompareFunction(function(){ return dialerDelegate.surface !== null; }, true);
339− verify(appDelegate);
428+ dialerDelegate.surface.requestFocus();
340− ApplicationManager.focusApplication(appName);
429+ tryCompare(dialerDelegate, "focus", true);
430+
341 keyClick(Qt.Key_Down, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Down shortcut to minimize
431 keyClick(Qt.Key_Down, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Down shortcut to minimize
342− tryCompare(appDelegate, "maximized", false);
432+ tryCompare(dialerDelegate, "maximized", false);
343− tryCompare(appDelegate, "minimized", true);
433+ tryCompare(dialerDelegate, "minimized", true);
344 verify(ApplicationManager.focusedApplicationId != ""); // verify we don't lose focus when minimizing an app
434 verify(ApplicationManager.focusedApplicationId != ""); // verify we don't lose focus when minimizing an app
345 }
435 }
346
436
347 function test_windowMinimizeAll() {
437 function test_windowMinimizeAll() {
348 var apps = ["unity8-dash", "dialer-app", "camera-app"];
438 var apps = ["unity8-dash", "dialer-app", "camera-app"];
349 apps.forEach(startApplication);
439 apps.forEach(startApplication);
350− verify(ApplicationManager.count == 3);
440+ verify(topSurfaceList.count == 3);
351 keyClick(Qt.Key_D, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+D shortcut to minimize all
441 keyClick(Qt.Key_D, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+D shortcut to minimize all
352 tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify no app is focused
442 tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify no app is focused
353 }
443 }
354
444
355 function test_windowClose() {
445 function test_windowClose() {
356− var apps = ["unity8-dash", "dialer-app", "camera-app"];
446+ var dialerSurfaceId = topSurfaceList.nextId;
357− apps.forEach(startApplication);
447+ var dialerDelegate = startApplication("dialer-app");
448+ verify(topSurfaceList.indexForId(dialerSurfaceId) !== -1);
449+ startApplication("gmail-webapp");
358− verify(ApplicationManager.count == 3);
450+ verify(topSurfaceList.count == 3);
359− var appName = "dialer-app";
451+
360− var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
452+ mouseClick(dialerDelegate);
361− verify(appDelegate);
453+
362− ApplicationManager.focusApplication(appName);
454+ var desktopStagePriv = findInvisibleChild(desktopStage, "DesktopStagePrivate");
455+ tryCompare(desktopStagePriv, "focusedAppDelegate", dialerDelegate);
456+
363 keyClick(Qt.Key_F4, Qt.AltModifier); // Alt+F4 shortcut to close
457 keyClick(Qt.Key_F4, Qt.AltModifier); // Alt+F4 shortcut to close
458+
364− verify(ApplicationManager.count == 2); // verify the app is gone
459+ // verify the surface is gone
365− verify(ApplicationManager.findApplication(appName) === null); // and it's not in running apps
460+ tryCompare(topSurfaceList, "count", 2);
461+ verify(topSurfaceList.indexForId(dialerSurfaceId) === -1);
366 }
462 }
367
463
368 function test_smashCursorKeys() {
464 function test_smashCursorKeys() {
369− var apps = ["unity8-dash", "dialer-app", "camera-app"];
465+ var apps = ["dialer-app", "gmail-webapp"];
370 apps.forEach(startApplication);
466 apps.forEach(startApplication);
371− verify(ApplicationManager.count == 3);
467+ verify(topSurfaceList.count == 3);
372 keyClick(Qt.Key_D, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+D shortcut to minimize all
468 keyClick(Qt.Key_D, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+D shortcut to minimize all
373− tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify no app is focused
469+ tryCompare(MirFocusController, "focusedSurface", null); // verify no surface is focused
374
470
375 // now try pressing all 4 arrow keys + ctrl + meta
471 // now try pressing all 4 arrow keys + ctrl + meta
376 keyClick(Qt.Key_Up | Qt.Key_Down | Qt.Key_Left | Qt.Key_Right, Qt.MetaModifier|Qt.ControlModifier); // smash it!!!
472 keyClick(Qt.Key_Up | Qt.Key_Down | Qt.Key_Left | Qt.Key_Right, Qt.MetaModifier|Qt.ControlModifier); // smash it!!!
377− tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify still no app is focused
473+ tryCompare(MirFocusController, "focusedSurface", null); // verify still no surface is focused
378 }
474 }
379
475
380 function test_minimizeApplicationHidesSurface() {
476 function test_minimizeApplicationHidesSurface() {
381− var dashApp = startApplication("unity8-dash");
477+ compare(topSurfaceList.applicationAt(0).appId, "unity8-dash");
478+ var dashSurface = topSurfaceList.surfaceAt(0);
479+ var dashSurfaceId = topSurfaceList.idAt(0);
382
480
383− var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
481+ var decoratedWindow = findDecoratedWindow(dashSurfaceId);
384− verify(dashDelegate);
482+ verify(decoratedWindow);
385
483
484+ tryCompare(dashSurface, "visible", true);
386− findChild(dashDelegate, "decoratedWindow").minimize();
485+ decoratedWindow.minimize();
387− tryCompare(dashApp.session.lastSurface, "visible", false);
486+ tryCompare(dashSurface, "visible", false);
388 }
487 }
389
488
390 function test_maximizeApplicationHidesSurfacesBehindIt() {
489 function test_maximizeApplicationHidesSurfacesBehindIt() {
391− var dashApp = startApplication("unity8-dash");
490+ var dashDelegate = startApplication("unity8-dash");
392− var dialerApp = startApplication("dialer-app");
491+ var dialerDelegate = startApplication("dialer-app");
393− var gmailApp = startApplication("gmail-webapp");
492+ var gmailDelegate = startApplication("gmail-webapp");
394
493
395− var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
396− verify(dashDelegate);
397− var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app");
398− verify(dialerDelegate);
399− var gmailDelegate = findChild(desktopStage, "appDelegate_gmail-webapp");
400− verify(gmailDelegate);
401−
402− // maximize
494+ // maximize without raising
403 dialerDelegate.maximize();
495 dialerDelegate.maximize();
404 tryCompare(dialerDelegate, "visuallyMaximized", true);
496 tryCompare(dialerDelegate, "visuallyMaximized", true);
405
497
406− tryCompare(dashApp.session.lastSurface, "visible", false);
498+ tryCompare(dashDelegate.surface, "visible", false);
407− compare(gmailApp.session.lastSurface.visible, true);
499+ compare(gmailDelegate.surface.visible, true);
408
500
409− // restore
501+ // restore without raising
410 dialerDelegate.restoreFromMaximized();
502 dialerDelegate.restoreFromMaximized();
411− compare(dashApp.session.lastSurface.visible, true);
503+ compare(dashDelegate.surface.visible, true);
412− compare(gmailApp.session.lastSurface.visible, true);
504+ compare(gmailDelegate.surface.visible, true);
413 }
505 }
414
506
415 function test_applicationsBecomeVisibleWhenOccludingAppRemoved() {
507 function test_applicationsBecomeVisibleWhenOccludingAppRemoved() {
416− var dashApp = startApplication("unity8-dash");
508+ var dashApp = topSurfaceList.applicationAt(0);
417− var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
418− verify(dashDelegate);
419
509
420− var dialerApp = startApplication("dialer-app");
510+ var dialerSurfaceId = topSurfaceList.nextId;
421− var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app");
511+ var dialerDelegate = startApplication("dialer-app");
422 verify(dialerDelegate);
512 verify(dialerDelegate);
513+ var dialerApp = dialerDelegate.application;
423
514
424 var dialerMaximizeButton = findChild(dialerDelegate, "maximizeWindowButton");
515 var dialerMaximizeButton = findChild(dialerDelegate, "maximizeWindowButton");
425 verify(dialerMaximizeButton);
516 verify(dialerMaximizeButton);
426 mouseClick(dialerMaximizeButton);
517 mouseClick(dialerMaximizeButton);
427
518
428− var mapApp = startApplication("map");
519+ var mapSurfaceId = topSurfaceList.nextId;
429− var mapDelegate = findChild(desktopStage, "appDelegate_map");
520+ var mapDelegate = startApplication("map");
430 verify(mapDelegate);
521 verify(mapDelegate);
522+ var mapApp = mapDelegate.application;
431
523
432− var gmailApp = startApplication("gmail-webapp");
524+ var gmailSurfaceId = topSurfaceList.nextId;
433− var gmailDelegate = findChild(desktopStage, "appDelegate_gmail-webapp");
525+ var gmailDelegate = startApplication("gmail-webapp");
434 verify(gmailDelegate);
526 verify(gmailDelegate);
435
527
436 var gmailMaximizeButton = findChild(gmailDelegate, "maximizeWindowButton");
528 var gmailMaximizeButton = findChild(gmailDelegate, "maximizeWindowButton");
@@ -440,29 +532,27 @@ Item {
440 tryCompare(dialerDelegate, "visuallyMaximized", true);
532 tryCompare(dialerDelegate, "visuallyMaximized", true);
441 tryCompare(gmailDelegate, "visuallyMaximized", true);
533 tryCompare(gmailDelegate, "visuallyMaximized", true);
442
534
443− tryCompare(dashApp.session.lastSurface, "visible", false);
535+ tryCompare(dashApp.surfaceList.get(0), "visible", false);
444− tryCompare(dialerApp.session.lastSurface, "visible", false);
536+ tryCompare(dialerApp.surfaceList.get(0), "visible", false);
445− tryCompare(mapApp.session.lastSurface, "visible", false);
537+ tryCompare(mapApp.surfaceList.get(0), "visible", false);
446
538
447 ApplicationManager.stopApplication("gmail-webapp");
539 ApplicationManager.stopApplication("gmail-webapp");
448
540
449− compare(mapApp.session.lastSurface.visible, true);
541+ tryCompare(mapApp.surfaceList.get(0), "visible", true);
450− tryCompare(dialerApp.session.lastSurface, "visible", true);
542+ tryCompare(dialerApp.surfaceList.get(0), "visible", true);
451− tryCompare(dashApp.session.lastSurface, "visible", false); // still occluded by maximised dialer
543+ tryCompare(dashApp.surfaceList.get(0), "visible", false); // still occluded by maximised dialer
452 }
544 }
453
545
454 function test_maximisedAppStaysVisibleWhenAppStarts() {
546 function test_maximisedAppStaysVisibleWhenAppStarts() {
455− var dashApp = startApplication("unity8-dash");
547+ var dashDelegate = startApplication("unity8-dash");
456− var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
548+
457− verify(dashDelegate);
458 // maximize
549 // maximize
459 var dashMaximizeButton = findChild(dashDelegate, "maximizeWindowButton");
550 var dashMaximizeButton = findChild(dashDelegate, "maximizeWindowButton");
460 verify(dashMaximizeButton);
551 verify(dashMaximizeButton);
461 mouseClick(dashMaximizeButton);
552 mouseClick(dashMaximizeButton);
462 tryCompare(dashDelegate, "visuallyMaximized", true);
553 tryCompare(dashDelegate, "visuallyMaximized", true);
463
554
464− var dialerApp = startApplication("dialer-app");
555+ var dialerDelegate = startApplication("dialer-app");
465− var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app");
466 verify(dialerDelegate);
556 verify(dialerDelegate);
467
557
468 compare(dialerDelegate.visible, true, "Dialer should be visible");
558 compare(dialerDelegate.visible, true, "Dialer should be visible");
@@ -470,14 +560,11 @@ Item {
470 }
560 }
471
561
472 function test_occlusionWithMultipleMaximized() {
562 function test_occlusionWithMultipleMaximized() {
473− var dashApp = startApplication("unity8-dash");
563+ var dashAppDelegate = startApplication("unity8-dash");
474− var dashAppDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
475
564
476− var dialerApp = startApplication("dialer-app");
565+ var dialerAppDelegate = startApplication("dialer-app");
477− var dialerAppDelegate = findChild(desktopStage, "appDelegate_dialer-app");
478
566
479− var facebookApp = startApplication("facebook-webapp");
567+ var facebookAppDelegate = startApplication("facebook-webapp");
480− var facebookAppDelegate = findChild(desktopStage, "appDelegate_facebook-webapp");
481
568
482 // all of them are in restored state now. all should be visible
569 // all of them are in restored state now. all should be visible
483 tryCompare(dashAppDelegate, "visible", true);
570 tryCompare(dashAppDelegate, "visible", true);
@@ -491,13 +578,13 @@ Item {
491 tryCompare(facebookAppDelegate, "visible", true);
578 tryCompare(facebookAppDelegate, "visible", true);
492
579
493 // Bring dash to front. make sure dash and the maximized facebook are visible, the restored one behind is hidden
580 // Bring dash to front. make sure dash and the maximized facebook are visible, the restored one behind is hidden
494− ApplicationManager.focusApplication("unity8-dash");
581+ dashAppDelegate.focus = true;
495 tryCompare(dashAppDelegate, "visible", true);
582 tryCompare(dashAppDelegate, "visible", true);
496 tryCompare(dialerAppDelegate, "visible", false);
583 tryCompare(dialerAppDelegate, "visible", false);
497 tryCompare(facebookAppDelegate, "visible", true);
584 tryCompare(facebookAppDelegate, "visible", true);
498
585
499 // Now focus the dialer app. all 3 should be visible again
586 // Now focus the dialer app. all 3 should be visible again
500− ApplicationManager.focusApplication("dialer-app");
587+ dialerAppDelegate.focus = true;
501 tryCompare(dashAppDelegate, "visible", true);
588 tryCompare(dashAppDelegate, "visible", true);
502 tryCompare(dialerAppDelegate, "visible", true);
589 tryCompare(dialerAppDelegate, "visible", true);
503 tryCompare(facebookAppDelegate, "visible", true);
590 tryCompare(facebookAppDelegate, "visible", true);
@@ -510,20 +597,15 @@ Item {
510 }
597 }
511
598
512 function test_dropShadow() {
599 function test_dropShadow() {
513− // verify the drop shadow is not visible initially
514− verify(PanelState.dropShadow == false);
515−
516 // start an app, maximize it
600 // start an app, maximize it
517− var facebookApp = startApplication("facebook-webapp");
601+ var facebookAppDelegate = startApplication("facebook-webapp");
518− var facebookAppDelegate = findChild(desktopStage, "appDelegate_facebook-webapp");
519 facebookAppDelegate.maximize();
602 facebookAppDelegate.maximize();
520
603
521 // verify the drop shadow is still not visible
604 // verify the drop shadow is still not visible
522 verify(PanelState.dropShadow == false);
605 verify(PanelState.dropShadow == false);
523
606
524 // start a foreground app, not maximized
607 // start a foreground app, not maximized
525− var dialerApp = startApplication("dialer-app");
608+ var dialerAppDelegate = startApplication("dialer-app");
526− var dialerAppDelegate = findChild(desktopStage, "appDelegate_dialer-app");
527
609
528 // verify the drop shadow becomes visible
610 // verify the drop shadow becomes visible
529 verify(PanelState.dropShadow == true);
611 verify(PanelState.dropShadow == true);
@@ -532,7 +614,7 @@ Item {
532 ApplicationManager.stopApplication("facebook-webapp");
614 ApplicationManager.stopApplication("facebook-webapp");
533
615
534 // verify the drop shadow is gone
616 // verify the drop shadow is gone
535− verify(PanelState.dropShadow == false);
617+ tryCompare(PanelState, "dropShadow", false);
536 }
618 }
537 }
619 }
538}
620}
tests/qmltests/Stages/tst_PhoneStage.qml+272−82
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2014-2015 Canonical Ltd.
2+ * Copyright 2014-2016 Canonical Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -22,8 +22,10 @@ import "../../../qml/Components"
22import "../../../qml/Stages"
22import "../../../qml/Stages"
23import Ubuntu.Components 1.3
23import Ubuntu.Components 1.3
24import Unity.Application 0.1
24import Unity.Application 0.1
25+import WindowManager 0.1
25
26
26Item {
27Item {
28+ id: root
27 width: units.gu(70)
29 width: units.gu(70)
28 height: units.gu(70)
30 height: units.gu(70)
29
31
@@ -38,63 +40,40 @@ Item {
38 interactive: true
40 interactive: true
39 shellOrientation: Qt.PortraitOrientation
41 shellOrientation: Qt.PortraitOrientation
40 orientations: Orientations {}
42 orientations: Orientations {}
43+ applicationManager: ApplicationManager
44+ topLevelSurfaceList: TopLevelSurfaceList {
45+ id: topLevelSurfaceList
46+ applicationsModel: ApplicationManager
47+ }
41 }
48 }
42
49
50+ Flickable {
51+ contentHeight: controlRect.height
52+
53+ anchors.top: root.top
54+ anchors.bottom: root.bottom
55+ anchors.right: root.right
56+ width: units.gu(30)
43− Rectangle {
57+ Rectangle {
44− anchors { fill: parent; leftMargin: phoneStage.width }
58+ id: controlRect
45−
59+ anchors { left: parent.left; right: parent.right }
60+ height: childrenRect.height + units.gu(2)
61+ color: "darkGrey"
46− Column {
62+ Column {
47− id: buttons
48− anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
63+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
49− spacing: units.gu(1)
64+ spacing: units.gu(1)
50− Button {
65+ EdgeBarrierControls {
51− anchors { left: parent.left; right: parent.right }
66+ id: edgeBarrierControls
52− text: "Add App"
67+ text: "Drag here to pull out spread"
53− activeFocusOnPress: false
68+ backgroundColor: "blue"
54− onClicked: {
69+ onDragged: { phoneStage.pushRightEdge(amount); }
55− testCase.addApps();
70+ Component.onCompleted: {
56− }
71+ edgeBarrierControls.target = testCase.findChild(phoneStage, "edgeBarrierController");
57− }
72+ }
58− Button {
59− anchors { left: parent.left; right: parent.right }
60− text: "Remove Selected"
61− activeFocusOnPress: false
62− onClicked: {
63− ApplicationManager.stopApplication(ApplicationManager.get(appList.selectedAppIndex).appId);
64− }
65− }
66− Button {
67− anchors { left: parent.left; right: parent.right }
68− text: "Stop Selected"
69− activeFocusOnPress: false
70− onClicked: {
71− ApplicationManager.get(appList.selectedAppIndex).setState(ApplicationInfoInterface.Stopped);
72 }
73 }
73− }
74+ Repeater {
74− EdgeBarrierControls {
75− id: edgeBarrierControls
76− text: "Drag here to pull out spread"
77− backgroundColor: "blue"
78− onDragged: { phoneStage.pushRightEdge(amount); }
79− Component.onCompleted: {
80− edgeBarrierControls.target = testCase.findChild(phoneStage, "edgeBarrierController");
81− }
82− }
83− }
84− ListView {
85− id: appList
86− property int selectedAppIndex
87− anchors { left: parent.left; right: parent.right; top: buttons.bottom; bottom: parent.bottom }
88− boundsBehavior: Flickable.StopAtBounds
89− model: ApplicationManager
75+ model: ApplicationManager.availableApplications
90− delegate: Rectangle {
76+ ApplicationCheckBox { appId: modelData }
91− anchors { left: parent.left; right: parent.right }
92− height: units.gu(2)
93− color: appList.selectedAppIndex === model.index ? "red" : "white"
94− Text { anchors.fill: parent; text: model.appId }
95− MouseArea {
96− anchors.fill: parent
97− onPressed: { appList.selectedAppIndex = model.index; }
98 }
77 }
99 }
78 }
100 }
79 }
@@ -105,18 +84,41 @@ Item {
105 name: "PhoneStage"
84 name: "PhoneStage"
106 when: windowShown
85 when: windowShown
107
86
87+ function findAppWindowForSurfaceId(surfaceId) {
88+ var delegateObjectName = "spreadDelegate_" + surfaceId;
89+ var spreadDelegate = findChild(phoneStage, delegateObjectName);
90+ if (!spreadDelegate) {
91+ console.warn("Failed to find " + delegateObjectName + " in phoneStage ("+phoneStage+")");
92+ return null;
93+ }
94+ var appWindow = findChild(spreadDelegate, "appWindow");
95+ return appWindow;
96+ }
97+
98+ // Waits until ApplicationWindow has moved from showing a splash screen to displaying
99+ // the application surface.
100+ function waitUntilAppSurfaceShowsUp(surfaceId) {
101+ var appWindow = findAppWindowForSurfaceId(surfaceId);
102+ verify(appWindow);
103+ var appWindowStates = findInvisibleChild(appWindow, "applicationWindowStateGroup");
104+ verify(appWindowStates);
105+ tryCompare(appWindowStates, "state", "surface");
106+ }
107+
108 function addApps(count) {
108 function addApps(count) {
109 if (count == undefined) count = 1;
109 if (count == undefined) count = 1;
110 for (var i = 0; i < count; i++) {
110 for (var i = 0; i < count; i++) {
111+ var appSurfaceId = topLevelSurfaceList.nextId;
111 var app = ApplicationManager.startApplication(ApplicationManager.availableApplications[ApplicationManager.count])
112 var app = ApplicationManager.startApplication(ApplicationManager.availableApplications[ApplicationManager.count])
112 tryCompare(app, "state", ApplicationInfoInterface.Running)
113 tryCompare(app, "state", ApplicationInfoInterface.Running)
113 var spreadView = findChild(phoneStage, "spreadView");
114 var spreadView = findChild(phoneStage, "spreadView");
114 tryCompare(spreadView, "contentX", -spreadView.shift);
115 tryCompare(spreadView, "contentX", -spreadView.shift);
116+ waitUntilAppSurfaceShowsUp(appSurfaceId);
115 waitForRendering(phoneStage)
117 waitForRendering(phoneStage)
116 }
118 }
117 }
119 }
118
120
119− function goToSpread() {
121+ function performEdgeSwipeToShowAppSpread() {
120 var spreadView = findChild(phoneStage, "spreadView");
122 var spreadView = findChild(phoneStage, "spreadView");
121
123
122 // Keep it inside the PhoneStage otherwise the controls on the right side will
124 // Keep it inside the PhoneStage otherwise the controls on the right side will
@@ -130,9 +132,46 @@ Item {
130 true /* beginTouch */, true /* endTouch */, units.gu(10), 50);
132 true /* beginTouch */, true /* endTouch */, units.gu(10), 50);
131
133
132 tryCompare(spreadView, "phase", 2);
134 tryCompare(spreadView, "phase", 2);
135+ tryCompare(spreadView, "flicking", false);
136+ tryCompare(spreadView, "moving", false);
133 waitForRendering(phoneStage);
137 waitForRendering(phoneStage);
134 }
138 }
135
139
140+ function swipeSurfaceUpwards(surfaceId) {
141+ var appWindow = findAppWindowForSurfaceId(surfaceId);
142+ verify(appWindow);
143+
144+ // Swipe from the left side of the surface as it's the one most likely
145+ // to not be covered by other surfaces when they're all being shown in the spread
146+ touchFlick(appWindow,
147+ appWindow.width * 0.1, appWindow.height / 2,
148+ appWindow.width * 0.1, -appWindow.height / 2);
149+ }
150+
151+ function switchToSurface(targetSurfaceId) {
152+ performEdgeSwipeToShowAppSpread();
153+
154+ waitUntilAppDelegateStopsMoving(targetSurfaceId);
155+
156+ // TODO: won't work if there are many items in the spread. in this case
157+ // you might have to drag the list to the right or left a bit to better
158+ // expose the target surface. Improve this code if needed.
159+ var targetAppWindow = findAppWindowForSurfaceId(targetSurfaceId);
160+ verify(targetAppWindow);
161+ tap(targetAppWindow, 10, 10);
162+ }
163+
164+ function waitUntilAppDelegateStopsMoving(targetSurfaceId)
165+ {
166+ var targetAppDelegate = findChild(phoneStage, "spreadDelegate_" + targetSurfaceId);
167+ verify(targetAppDelegate);
168+ var lastValue = undefined;
169+ do {
170+ lastValue = targetAppDelegate.animatedProgress;
171+ wait(300);
172+ } while (lastValue != targetAppDelegate.animatedProgress);
173+ }
174+
136 function test_shortFlick() {
175 function test_shortFlick() {
137 addApps(2)
176 addApps(2)
138 var startX = phoneStage.width - units.gu(1);
177 var startX = phoneStage.width - units.gu(1);
@@ -200,7 +239,7 @@ Item {
200 tryCompare(spreadView, "phase", data.targetPhase)
239 tryCompare(spreadView, "phase", data.targetPhase)
201
240
202 if (data.targetPhase == 2) {
241 if (data.targetPhase == 2) {
203− var app2 = findChild(spreadView, "appDelegate2");
242+ var app2 = findChild(spreadView, "spreadDelegate_" + topLevelSurfaceList.idAt(2));
204 tryCompare(app2, "swipeToCloseEnabled", true);
243 tryCompare(app2, "swipeToCloseEnabled", true);
205 mouseClick(app2, units.gu(1), units.gu(1));
244 mouseClick(app2, units.gu(1), units.gu(1));
206 }
245 }
@@ -226,11 +265,11 @@ Item {
226
265
227 var spreadView = findChild(phoneStage, "spreadView");
266 var spreadView = findChild(phoneStage, "spreadView");
228
267
229− goToSpread();
268+ performEdgeSwipeToShowAppSpread();
230
269
231 tryCompare(spreadView, "phase", 2);
270 tryCompare(spreadView, "phase", 2);
232
271
233− var tile = findChild(spreadView, "appDelegate" + data.index);
272+ var tile = findChild(spreadView, "spreadDelegate_" + topLevelSurfaceList.idAt(data.index));
234 var appId = ApplicationManager.get(data.index).appId;
273 var appId = ApplicationManager.get(data.index).appId;
235
274
236 if (tile.mapToItem(spreadView).x > spreadView.width) {
275 if (tile.mapToItem(spreadView).x > spreadView.width) {
@@ -266,7 +305,7 @@ Item {
266 var spreadView = findChild(phoneStage, "spreadView");
305 var spreadView = findChild(phoneStage, "spreadView");
267 var selectedApp = ApplicationManager.get(data.index);
306 var selectedApp = ApplicationManager.get(data.index);
268
307
269− goToSpread();
308+ performEdgeSwipeToShowAppSpread();
270
309
271 phoneStage.select(selectedApp.appId);
310 phoneStage.select(selectedApp.appId);
272
311
@@ -280,7 +319,7 @@ Item {
280
319
281 var focusedAppId = ApplicationManager.focusedApplicationId;
320 var focusedAppId = ApplicationManager.focusedApplicationId;
282
321
283− goToSpread();
322+ performEdgeSwipeToShowAppSpread();
284
323
285 mouseClick(phoneStage, units.gu(1), units.gu(1));
324 mouseClick(phoneStage, units.gu(1), units.gu(1));
286
325
@@ -292,15 +331,26 @@ Item {
292 compare(focusedAppId, ApplicationManager.focusedApplicationId);
331 compare(focusedAppId, ApplicationManager.focusedApplicationId);
293 }
332 }
294
333
334+ function init() {
335+ // wait until unity8-dash is up and running.
336+ // it's started automatically by ApplicationManager mock implementation
337+ tryCompare(ApplicationManager, "count", 1);
338+ var dashApp = ApplicationManager.findApplication("unity8-dash");
339+ verify(dashApp);
340+ tryCompare(dashApp, "state", ApplicationInfoInterface.Running);
341+ }
342+
295 function cleanup() {
343 function cleanup() {
296− while (ApplicationManager.count > 1) {
344+ killApps();
297− var oldCount = ApplicationManager.count;
345+
298− var closingIndex = ApplicationManager.focusedApplicationId == "unity8-dash" ? 1 : 0
299− ApplicationManager.stopApplication(ApplicationManager.get(closingIndex).appId)
300− tryCompare(ApplicationManager, "count", oldCount - 1)
301− }
302 phoneStage.shellOrientationAngle = 0;
346 phoneStage.shellOrientationAngle = 0;
303 phoneStage.select(ApplicationManager.get(0).appId);
347 phoneStage.select(ApplicationManager.get(0).appId);
348+
349+ // wait for PhoneStage to stabilize back into its initial state
350+ var spreadView = findChild(phoneStage, "spreadView");
351+ while (spreadView.phase !== 0 || spreadView.contentX !== -spreadView.shift) {
352+ wait(50);
353+ }
304 }
354 }
305
355
306 function test_focusNewTopMostAppAfterFocusedOneClosesItself() {
356 function test_focusNewTopMostAppAfterFocusedOneClosesItself() {
@@ -323,16 +373,16 @@ Item {
323 function test_cantCloseWhileSnapping() {
373 function test_cantCloseWhileSnapping() {
324 addApps(2);
374 addApps(2);
325
375
326− goToSpread();
376+ performEdgeSwipeToShowAppSpread();
327
377
328 var spreadView = findChild(phoneStage, "spreadView");
378 var spreadView = findChild(phoneStage, "spreadView");
329 var selectedApp = ApplicationManager.get(2);
379 var selectedApp = ApplicationManager.get(2);
330
380
331− goToSpread();
381+ performEdgeSwipeToShowAppSpread();
332
382
333− var app0 = findChild(spreadView, "appDelegate0");
383+ var app0 = findChild(spreadView, "spreadDelegate_" + topLevelSurfaceList.idAt(0));
334− var app1 = findChild(spreadView, "appDelegate1");
384+ var app1 = findChild(spreadView, "spreadDelegate_" + topLevelSurfaceList.idAt(1));
335− var app2 = findChild(spreadView, "appDelegate2");
385+ var app2 = findChild(spreadView, "spreadDelegate_" + topLevelSurfaceList.idAt(2));
336
386
337 var dragArea0 = findChild(app0, "dragArea");
387 var dragArea0 = findChild(app0, "dragArea");
338 var dragArea1 = findChild(app1, "dragArea");
388 var dragArea1 = findChild(app1, "dragArea");
@@ -382,10 +432,10 @@ Item {
382 addApps(2);
432 addApps(2);
383
433
384 if (data.inSpread) {
434 if (data.inSpread) {
385− goToSpread();
435+ performEdgeSwipeToShowAppSpread();
386 }
436 }
387
437
388− var focusedDelegate = findChild(phoneStage, "appDelegate0");
438+ var focusedDelegate = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(0));
389 phoneStage.inverseProgress = data.leftEdgeDragWidth;
439 phoneStage.inverseProgress = data.leftEdgeDragWidth;
390
440
391 tryCompare(focusedDelegate, "x", data.shouldMoveApp ? data.leftEdgeDragWidth : 0);
441 tryCompare(focusedDelegate, "x", data.shouldMoveApp ? data.leftEdgeDragWidth : 0);
@@ -398,9 +448,9 @@ Item {
398 function test_focusedAppIsTheOnlyRunningApp() {
448 function test_focusedAppIsTheOnlyRunningApp() {
399 addApps(2);
449 addApps(2);
400
450
401− var delegateA = findChild(phoneStage, "appDelegate0");
451+ var delegateA = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(0));
402 verify(delegateA);
452 verify(delegateA);
403− var delegateB = findChild(phoneStage, "appDelegate1");
453+ var delegateB = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(1));
404 verify(delegateB);
454 verify(delegateB);
405
455
406 // A is focused and running, B is unfocused and suspended
456 // A is focused and running, B is unfocused and suspended
@@ -410,7 +460,7 @@ Item {
410 compare(delegateB.application.requestedState, ApplicationInfoInterface.RequestedSuspended);
460 compare(delegateB.application.requestedState, ApplicationInfoInterface.RequestedSuspended);
411
461
412 // Switch foreground/focused appp from A to B
462 // Switch foreground/focused appp from A to B
413− goToSpread();
463+ performEdgeSwipeToShowAppSpread();
414 phoneStage.select(delegateB.application.appId);
464 phoneStage.select(delegateB.application.appId);
415
465
416 // Now it's the other way round
466 // Now it's the other way round
@@ -424,14 +474,14 @@ Item {
424 function test_dashRemainsRunningIfStageIsToldSo() {
474 function test_dashRemainsRunningIfStageIsToldSo() {
425 addApps(1);
475 addApps(1);
426
476
427− var delegateDash = findChild(phoneStage, "appDelegate1");
477+ var delegateDash = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(1));
428 verify(delegateDash);
478 verify(delegateDash);
429 compare(delegateDash.application.appId, "unity8-dash");
479 compare(delegateDash.application.appId, "unity8-dash");
430
480
431− var delegateOther = findChild(phoneStage, "appDelegate0");
481+ var delegateOther = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(0));
432 verify(delegateOther);
482 verify(delegateOther);
433
483
434− goToSpread();
484+ performEdgeSwipeToShowAppSpread();
435 phoneStage.select("unity8-dash");
485 phoneStage.select("unity8-dash");
436
486
437 tryCompare(delegateDash, "focus", true);
487 tryCompare(delegateDash, "focus", true);
@@ -439,7 +489,7 @@ Item {
439 compare(delegateOther.focus, false);
489 compare(delegateOther.focus, false);
440 compare(delegateOther.application.requestedState, ApplicationInfoInterface.RequestedSuspended);
490 compare(delegateOther.application.requestedState, ApplicationInfoInterface.RequestedSuspended);
441
491
442− goToSpread();
492+ performEdgeSwipeToShowAppSpread();
443 phoneStage.select(delegateOther.application.appId);
493 phoneStage.select(delegateOther.application.appId);
444
494
445 // The other app gets focused and running but dash is kept running despite being unfocused
495 // The other app gets focused and running but dash is kept running despite being unfocused
@@ -452,7 +502,7 @@ Item {
452 function test_foregroundAppIsSuspendedWhenStageIsSuspended() {
502 function test_foregroundAppIsSuspendedWhenStageIsSuspended() {
453 addApps(1);
503 addApps(1);
454
504
455− var delegate = findChild(phoneStage, "appDelegate0");
505+ var delegate = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(0));
456 verify(delegate);
506 verify(delegate);
457
507
458 compare(delegate.focus, true);
508 compare(delegate.focus, true);
@@ -476,5 +526,145 @@ Item {
476 }
526 }
477 tryCompare(spreadView, "phase", 2);
527 tryCompare(spreadView, "phase", 2);
478 }
528 }
529+
530+ function test_closeSurfaceOfMultiSurfaceApp() {
531+ var surface1Id = topLevelSurfaceList.nextId;
532+ var webbrowserApp = ApplicationManager.startApplication("webbrowser-app");
533+ waitUntilAppSurfaceShowsUp(surface1Id);
534+
535+ var surface2Id = topLevelSurfaceList.nextId;
536+ verify(surface1Id !== surface2Id); // sanity checking
537+ webbrowserApp.createSurface();
538+ waitUntilAppSurfaceShowsUp(surface2Id);
539+
540+ performEdgeSwipeToShowAppSpread();
541+
542+ var appDelegate = findChild(phoneStage, "spreadDelegate_" + surface1Id);
543+ verify(appDelegate);
544+ tryCompare(appDelegate, "swipeToCloseEnabled", true);
545+
546+ compare(webbrowserApp.surfaceList.count, 2);
547+ compare(webbrowserApp.state, ApplicationInfoInterface.Running);
548+
549+ swipeSurfaceUpwards(surface1Id);
550+
551+ // Surface must eventually be gone
552+ tryCompareFunction(function() { return topLevelSurfaceList.indexForId(surface1Id); }, -1);
553+ tryCompare(webbrowserApp.surfaceList, "count", 1);
554+ compare(webbrowserApp.state, ApplicationInfoInterface.Running);
555+ }
556+
557+ /*
558+ 1- Suspended app gets killed behind the scenes, causing its surface to go zombie.
559+ 2- Surface gets screenshotted and removed. Its slot in the topLevelSurfaceList remains,
560+ though (so ApplicationWindow can display the screenshot in its place).
561+ 3- User taps on the screenshot of the long-gone surface.
562+
563+ Expected outcome:
564+ Application gets relaunched. Its new surface will seamlessly replace the screenshot.
565+ */
566+ function test_selectSuspendedAppWithoutSurface() {
567+ compare(topLevelSurfaceList.applicationAt(0).appId, "unity8-dash");
568+ var dashSurfaceId = topLevelSurfaceList.idAt(0);
569+ var dashSurface = topLevelSurfaceList.surfaceAt(0);
570+
571+ var webbrowserSurfaceId = topLevelSurfaceList.nextId;
572+ var webbrowserApp = ApplicationManager.startApplication("webbrowser-app");
573+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
574+
575+ switchToSurface(dashSurfaceId);
576+
577+ tryCompare(MirFocusController, "focusedSurface", dashSurface);
578+ tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Suspended);
579+
580+ compare(webbrowserApp.surfaceList.count, 1);
581+
582+ // simulate the suspended app being killed by the out-of-memory daemon
583+ webbrowserApp.surfaceList.get(0).setLive(false);
584+
585+ // wait until the surface is gone
586+ tryCompare(webbrowserApp.surfaceList, "count", 0);
587+
588+ compare(topLevelSurfaceList.surfaceAt(topLevelSurfaceList.indexForId(webbrowserSurfaceId)), null);
589+
590+ switchToSurface(webbrowserSurfaceId);
591+
592+ // webbrowser should have been brought to front
593+ tryCompareFunction(function(){return topLevelSurfaceList.idAt(0);}, webbrowserSurfaceId);
594+
595+ // and it should eventually get a new surface and get resumed
596+ tryCompareFunction(function(){return topLevelSurfaceList.surfaceAt(0) !== null;}, true);
597+ compare(topLevelSurfaceList.count, 2); // still two top-level items
598+ tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Running);
599+ compare(webbrowserApp.surfaceList.count, 1);
600+ }
601+
602+ /*
603+ 1 - user suspends an application (ie, focus a surface from a different application)
604+ 2 - That suspended application gets killed, causing its surface to go zombie
605+ 3 - user goes to spread and closes that zombie surface. Actually, by that time
606+ Tablet shell will be displaying a screenshot of it instead, so there's no
607+ MirSurface whatsoever backing it up.
608+ */
609+ function test_closeZombieSurface()
610+ {
611+ compare(topLevelSurfaceList.applicationAt(0).appId, "unity8-dash");
612+ var dashSurfaceId = topLevelSurfaceList.idAt(0);
613+ var dashSurface = topLevelSurfaceList.surfaceAt(0);
614+
615+ var webbrowserSurfaceId = topLevelSurfaceList.nextId;
616+ var webbrowserApp = ApplicationManager.startApplication("webbrowser-app");
617+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
618+
619+ switchToSurface(dashSurfaceId);
620+
621+ tryCompare(MirFocusController, "focusedSurface", dashSurface);
622+ tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Suspended);
623+
624+ compare(webbrowserApp.surfaceList.count, 1);
625+
626+ // simulate the suspended app being killed by the out-of-memory daemon
627+ webbrowserApp.surfaceList.get(0).setLive(false);
628+
629+ // wait until the surface is gone
630+ tryCompare(webbrowserApp.surfaceList, "count", 0);
631+ compare(topLevelSurfaceList.surfaceAt(topLevelSurfaceList.indexForId(webbrowserSurfaceId)), null);
632+
633+ performEdgeSwipeToShowAppSpread();
634+
635+ {
636+ var appDelegate = findChild(phoneStage, "spreadDelegate_" + webbrowserSurfaceId);
637+ verify(appDelegate);
638+ tryCompare(appDelegate, "swipeToCloseEnabled", true);
639+ }
640+
641+ swipeSurfaceUpwards(webbrowserSurfaceId);
642+
643+ // webbrowser entry is nowhere to be seen
644+ tryCompareFunction(function(){return topLevelSurfaceList.indexForId(webbrowserSurfaceId);}, -1);
645+
646+ // nor is its app
647+ compare(ApplicationManager.findApplication("webbrowser-app"), null);
648+
649+ // only unity8-dash surface is left
650+ compare(topLevelSurfaceList.count, 1);
651+ }
652+
653+
654+ /*
655+ Check that when an application starts while the spread is open, the
656+ spread closes and that new app is brought to front (gets focused).
657+ */
658+ function test_launchAppWithSpreadOpen()
659+ {
660+ performEdgeSwipeToShowAppSpread();
661+
662+ var webbrowserSurfaceId = topLevelSurfaceList.nextId;
663+ var webbrowserApp = ApplicationManager.startApplication("webbrowser-app");
664+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
665+
666+ compare(topLevelSurfaceList.idAt(0), webbrowserSurfaceId);
667+ compare(webbrowserApp.focused, true);
668+ }
479 }
669 }
480}
670}
tests/qmltests/Stages/tst_SessionContainer.qmldeleted−331
@@ -1,331 +0,0 @@
1−/*
2− * Copyright 2014-2015 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.4
18−import QtQuick.Layouts 1.1
19−import QtTest 1.0
20−import Unity.Test 0.1 as UT
21−import Ubuntu.Components 1.3
22−import Unity.Application 0.1
23−import "../../../qml/Stages"
24−
25−Rectangle {
26− color: "red"
27− id: root
28− width: units.gu(80)
29− height: units.gu(70)
30−
31− Connections {
32− target: sessionContainerLoader.status === Loader.Ready ? sessionContainerLoader.item : null
33− onSessionChanged: {
34− sessionCheckbox.checked = sessionContainerLoader.item.session !== null
35− }
36− }
37−
38− Component {
39− id: sessionContainerComponent
40−
41− SessionContainer {
42− id: sessionContainer
43− anchors.fill: parent
44− focus: true
45− interactive: true
46− }
47− }
48−
49− Loader {
50− id: sessionContainerLoader
51− focus: true
52− anchors {
53− top: parent.top
54− bottom: parent.bottom
55− left: parent.left
56− }
57− width: units.gu(40)
58− sourceComponent: sessionContainerComponent
59− }
60−
61− Rectangle {
62− color: "white"
63− anchors {
64− top: parent.top
65− bottom: parent.bottom
66− left: sessionContainerLoader.right
67− right: parent.right
68− }
69−
70− ColumnLayout {
71− anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
72− spacing: units.gu(1)
73−
74− RowLayout {
75− Layout.fillWidth: true
76−
77− CheckBox {
78− id: sessionCheckbox;
79− checked: false;
80− activeFocusOnPress: false
81− onCheckedChanged: {
82− if (sessionContainerLoader.status !== Loader.Ready)
83− return;
84−
85− if (checked) {
86− var fakeSession = SessionManager.createSession("music-player", Qt.resolvedUrl("../Dash/artwork/music-player-design.png"));
87− sessionContainerLoader.item.session = fakeSession;
88− fakeSession.createSurface();
89− } else {
90− sessionContainerLoader.item.session.release();
91− }
92− }
93− }
94−
95− Label {
96− text: "session"
97− anchors.verticalCenter: parent.verticalCenter
98− }
99− }
100−
101− Rectangle {
102− border {
103− color: "black"
104− width: 1
105− }
106− anchors {
107− left: parent.left
108− right: parent.right
109− }
110− Layout.preferredHeight: sessionChildrenControl.height
111−
112− RecursingChildSessionControl {
113− id: sessionChildrenControl
114− anchors { left: parent.left; right: parent.right; }
115−
116− session: sessionContainerLoader.item ? sessionContainerLoader.item.session : null
117− }
118− }
119− }
120− }
121−
122− SignalSpy {
123− id: sessionSpy
124− target: SessionManager
125− signalName: "sessionStopping"
126− }
127−
128− UT.UnityTestCase {
129− id: testCase
130− name: "SessionContainer"
131−
132− function init() {
133− // reload our test subject to get it in a fresh state once again
134− sessionContainerLoader.active = false;
135− sessionCheckbox.checked = false;
136− sessionContainerLoader.active = true;
137−
138− tryCompare(sessionContainerLoader.item, "session", null);
139− sessionSpy.clear();
140− }
141−
142− when: windowShown
143−
144− function test_addChildSession_data() {
145− return [ { tag: "count=1", count: 1 },
146− { tag: "count=4", count: 4 } ];
147− }
148−
149− function test_addChildSession(data) {
150− sessionCheckbox.checked = true;
151− var sessionContainer = sessionContainerLoader.item;
152− compare(sessionContainer.childSessions.count(), 0);
153−
154− var i;
155− var sessions = [];
156− for (i = 0; i < data.count; i++) {
157− var session = ApplicationTest.addChildSession(sessionContainer.session,
158− "gallery",
159− true);
160− session.createSurface();
161− sessionContainer.session.addChildSession(session);
162− compare(sessionContainer.childSessions.count(), i+1);
163−
164− sessions.push(session);
165− }
166−
167− for (i = data.count-1; i >= 0; i--) {
168− ApplicationTest.removeSession(sessions[i]);
169− tryCompareFunction(function() { return sessionContainer.childSessions.count(); }, i);
170− }
171− tryCompare(sessionSpy, "count", data.count);
172− }
173−
174− function test_childSessionDestructionReturnsFocusToSiblingOrParent() {
175− sessionCheckbox.checked = true;
176− var sessionContainer = sessionContainerLoader.item;
177− compare(sessionContainer.childSessions.count(), 0);
178−
179− var i;
180− var sessions = [];
181− // 3 sessions should cover all edge cases
182− for(i = 0; i < 3; i++) {
183− var a_session = ApplicationTest.addChildSession(
184− sessionContainer.session, "gallery", true
185− )
186−
187− a_session.createSurface();
188− sessionContainer.session.addChildSession(a_session);
189− compare(sessionContainer.childSessions.count(), i + 1);
190−
191− sessions.push(a_session);
192− }
193−
194− var a_session;
195− while(a_session = sessions.pop()) {
196− compare(a_session.lastSurface.activeFocus, true);
197−
198− ApplicationTest.removeSurface(a_session.lastSurface);
199− ApplicationTest.removeSession(a_session);
200−
201− if (sessions.length > 0) {
202− // active focus should have gone to the yongest remaining sibling
203− var previousSiblingSurface = sessions[sessions.length - 1].lastSurface
204− tryCompare(previousSiblingSurface, "activeFocus", true);
205− } else {
206− // active focus should have gone to the parent surface
207− tryCompare(sessionContainer.session.lastSurface, "activeFocus", true);
208− }
209− }
210− }
211−
212− function test_nestedChildSessions_data() {
213− return [ { tag: "depth=2", depth: 2 },
214− { tag: "depth=8", depth: 8 }
215− ];
216− }
217−
218− function test_nestedChildSessions(data) {
219− sessionCheckbox.checked = true;
220− var sessionContainer = sessionContainerLoader.item;
221− compare(sessionContainer.childSessions.count(), 0);
222−
223− var i;
224− var sessions = [];
225− var lastSession = sessionContainer.session;
226− var delegate;
227− var container = sessionContainer;
228− for (i = 0; i < data.depth; i++) {
229− var session = ApplicationTest.addChildSession(lastSession,
230− "gallery",
231− true);
232− session.createSurface();
233− lastSession.addChildSession(session);
234− compare(container.childSessions.count(), 1);
235− sessions.push(session);
236−
237− delegate = findChild(container, "childDelegate0");
238− container = findChild(delegate, "sessionContainer");
239− lastSession = session;
240− }
241−
242− for (i = data.depth-1; i >= 0; i--) {
243− ApplicationTest.removeSession(sessions[i]);
244− }
245−
246− tryCompareFunction(function() { return sessionContainer.childSessions.count(); }, 0);
247− tryCompare(sessionSpy, "count", data.depth);
248− }
249−
250− function test_childrenAdjustForParentSize() {
251− sessionCheckbox.checked = true;
252− var sessionContainer = sessionContainerLoader.item;
253−
254− var session = ApplicationTest.addChildSession(sessionContainer.session,
255− "gallery",
256− true);
257− session.createSurface();
258− sessionContainer.session.addChildSession(session);
259−
260− var delegate = findChild(sessionContainer, "childDelegate0");
261− var childContainer = findChild(delegate, "sessionContainer");
262−
263− tryCompareFunction(function() { return childContainer.height === sessionContainer.height; }, true);
264− tryCompareFunction(function() { return childContainer.width === sessionContainer.width; }, true);
265− tryCompareFunction(function() { return childContainer.x === 0; }, true);
266− tryCompareFunction(function() { return childContainer.y === 0; }, true);
267−
268− sessionContainer.anchors.margins = units.gu(2);
269−
270− tryCompareFunction(function() { return childContainer.height === sessionContainer.height; }, true);
271− tryCompareFunction(function() { return childContainer.width === sessionContainer.width; }, true);
272− tryCompareFunction(function() { return childContainer.x === 0; }, true);
273− tryCompareFunction(function() { return childContainer.y === 0; }, true);
274− }
275−
276− function isContainerAnimating(container) {
277− var animation = findInvisibleChild(container, "sessionAnimation");
278− if (!animation) return false;
279−
280− var animating = false;
281− for (var i = 0; i < animation.transitions.length; ++i) {
282− if (animation.transitions[i].running) {
283− return true;
284− }
285− }
286− return false;
287− }
288−
289− function test_childrenAnimate() {
290− sessionCheckbox.checked = true;
291− var sessionContainer = sessionContainerLoader.item;
292−
293− var session = ApplicationTest.addChildSession(sessionContainer.session,
294− "gallery",
295− true);
296−
297− var delegate = findChild(sessionContainer, "childDelegate0");
298− var childContainer = findChild(delegate, "sessionContainer");
299−
300− // wait for animation to begin
301− tryCompareFunction(function() { return isContainerAnimating(childContainer); }, true);
302− // wait for animation to end
303− tryCompareFunction(function() { return isContainerAnimating(childContainer); }, false);
304−
305− ApplicationTest.removeSession(session);
306−
307− // wait for animation to begin
308− tryCompareFunction(function() { return isContainerAnimating(childContainer); }, true);
309− // wait for animation to end
310− tryCompareFunction(function() { return isContainerAnimating(childContainer); }, false);
311−
312− tryCompareFunction(function() { return sessionContainer.childSessions.count() }, 0);
313− }
314−
315− function test_childSessionsRemovedOnStopWhenNotLive() {
316− sessionCheckbox.checked = true;
317− var sessionContainer = sessionContainerLoader.item;
318−
319− var session = ApplicationTest.addChildSession(sessionContainer.session,
320− "gallery",
321− false);
322−
323− var delegate = findChild(sessionContainer, "childDelegate0");
324− var childContainer = findChild(delegate, "sessionContainer");
325−
326− ApplicationTest.removeSession(session);
327−
328− tryCompareFunction(function() { return sessionContainer.childSessions.count() }, 0);
329− }
330− }
331−}
tests/qmltests/Stages/tst_SpreadDelegate.qml+3−2
@@ -61,6 +61,7 @@ Rectangle {
61 swipeToCloseEnabled: swipeToCloseCheckbox.checked
61 swipeToCloseEnabled: swipeToCloseCheckbox.checked
62 closeable: closeableCheckbox.checked
62 closeable: closeableCheckbox.checked
63 application: fakeApplication
63 application: fakeApplication
64+ surface: fakeApplication && fakeApplication.surfaceList.count > 0 ? fakeApplication.surfaceList.get(0) : null
64 shellOrientationAngle: shellOrientationAngleSelector.value
65 shellOrientationAngle: shellOrientationAngleSelector.value
65 shellOrientation: {
66 shellOrientation: {
66 switch (shellOrientationAngleSelector.value) {
67 switch (shellOrientationAngleSelector.value) {
@@ -162,8 +163,8 @@ Rectangle {
162 unloadSpreadDelegate();
163 unloadSpreadDelegate();
163 spyClosedSignal.clear();
164 spyClosedSignal.clear();
164 shellOrientationAngleSelector.selectedIndex = 0;
165 shellOrientationAngleSelector.selectedIndex = 0;
165− ApplicationManager.stopApplication(root.fakeApplication.appId);
166 root.fakeApplication = null;
166 root.fakeApplication = null;
167+ killApps();
167 }
168 }
168
169
169 function restartWithApp(appId) {
170 function restartWithApp(appId) {
@@ -258,7 +259,7 @@ Rectangle {
258 function test_loadingLandscapeOnlyAppWhenShellInPortrait() {
259 function test_loadingLandscapeOnlyAppWhenShellInPortrait() {
259 loadWithWeatherApp.clicked();
260 loadWithWeatherApp.clicked();
260
261
261− var appWindow = findChild(spreadDelegate, "appWindow_ubuntu-weather-app");
262+ var appWindow = findChild(spreadDelegate, "appWindow");
262 verify(appWindow);
263 verify(appWindow);
263
264
264 // It must have landscape dimensions as it does not support portrait
265 // It must have landscape dimensions as it does not support portrait
tests/qmltests/Stages/tst_SurfaceContainer.qml+242−46
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright 2014-2015 Canonical Ltd.
2+ * Copyright 2014-2016 Canonical Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -15,28 +15,42 @@
15 */
15 */
16
16
17import QtQuick 2.4
17import QtQuick 2.4
18+import QtQuick.Layouts 1.1
18import QtTest 1.0
19import QtTest 1.0
19−import Unity.Test 0.1
20+import Unity.Test 0.1 as UT
20−import ".."
21−import "../../../qml/Stages"
22import Ubuntu.Components 1.3
21import Ubuntu.Components 1.3
23import Unity.Application 0.1
22import Unity.Application 0.1
23+import "../../../qml/Stages"
24
24
25Rectangle {
25Rectangle {
26− color: "black"
26+ color: "red"
27 id: root
27 id: root
28− width: units.gu(70)
28+ width: units.gu(80)
29 height: units.gu(70)
29 height: units.gu(70)
30
30
31+ Connections {
32+ target: surfaceContainerLoader.status === Loader.Ready ? surfaceContainerLoader.item : null
33+ onSurfaceChanged: {
34+ surfaceCheckbox.checked = surfaceContainerLoader.item.surface !== null
35+ }
36+ }
37+
31 Component {
38 Component {
32 id: surfaceContainerComponent
39 id: surfaceContainerComponent
40+
33 SurfaceContainer {
41 SurfaceContainer {
34 anchors.fill: parent
42 anchors.fill: parent
43+ focus: true
35 interactive: interactiveCheckbox.checked
44 interactive: interactiveCheckbox.checked
45+ Component.onDestruction: {
46+ surfaceContainerLoader.itemDestroyed = true;
47+ }
36 }
48 }
37 }
49 }
50+
38 Loader {
51 Loader {
39 id: surfaceContainerLoader
52 id: surfaceContainerLoader
53+ focus: true
40 anchors {
54 anchors {
41 top: parent.top
55 top: parent.top
42 topMargin: fullscreenCheckbox.checked ? 0 : units.gu(3)
56 topMargin: fullscreenCheckbox.checked ? 0 : units.gu(3)
@@ -44,6 +58,7 @@ Rectangle {
44 left: parent.left
58 left: parent.left
45 }
59 }
46 width: units.gu(40)
60 width: units.gu(40)
61+ property bool itemDestroyed: false
47 sourceComponent: surfaceContainerComponent
62 sourceComponent: surfaceContainerComponent
48 }
63 }
49
64
@@ -56,80 +71,257 @@ Rectangle {
56 right: parent.right
71 right: parent.right
57 }
72 }
58
73
59− Column {
74+ ColumnLayout {
60 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
75 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
61 spacing: units.gu(1)
76 spacing: units.gu(1)
77+
78+ RowLayout {
79+ Layout.fillWidth: true
80+
62− Row {
81+ Row {
63− anchors { left: parent.left; right: parent.right }
82+ CheckBox {id: fullscreenCheckbox; checked: true; activeFocusOnPress: false }
83+ Label { text: "fullscreen" }
84+ }
85+ Row {
86+ CheckBox {id: interactiveCheckbox; checked: true; activeFocusOnPress: false }
87+ Label { text: "interactive" }
88+ }
89+ }
90+
91+ RowLayout {
92+ Layout.fillWidth: true
93+
64 CheckBox {
94 CheckBox {
65 id: surfaceCheckbox;
95 id: surfaceCheckbox;
66 checked: false;
96 checked: false;
97+ activeFocusOnPress: false
67 onCheckedChanged: {
98 onCheckedChanged: {
68 if (surfaceContainerLoader.status !== Loader.Ready)
99 if (surfaceContainerLoader.status !== Loader.Ready)
69 return;
100 return;
70
101
71 if (checked) {
102 if (checked) {
103+ var application = ApplicationManager.add("music-app");
104+ application.manualSurfaceCreation = true;
105+ application.setState(ApplicationInfoInterface.Starting);
106+
72− var fakeSurface = SurfaceManager.createSurface("fake-surface",
107+ surfaceContainerLoader.item.surface = SurfaceManager.createSurface("foo",
73− Mir.NormalType,
108+ Mir.NormalType, Mir.MaximizedState, application.screenshot);
74− Mir.RestoredState,
109+
75− Qt.resolvedUrl("../Dash/artwork/music-player-design.png"));
110+ application.setState(ApplicationInfoInterface.Running);
76− surfaceContainerLoader.item.surface = fakeSurface;
77 } else {
111 } else {
112+ if (surfaceContainerLoader.item.surface) {
78− surfaceContainerLoader.item.surface.setLive(false);
113+ surfaceContainerLoader.item.surface.setLive(false);
114+ }
115+ ApplicationManager.stopApplication("music-app");
79 }
116 }
80 }
117 }
81 }
118 }
119+
120+ Label {
82− Label { text: "surface" }
121+ text: "surface"
83− }
122+ anchors.verticalCenter: parent.verticalCenter
84− Row {
123+ }
85− anchors { left: parent.left; right: parent.right }
86− CheckBox {id: fullscreenCheckbox; checked: true; }
87− Label { text: "fullscreen" }
88 }
124 }
89− Row {
125+
126+ Rectangle {
127+ border {
128+ color: "black"
129+ width: 1
130+ }
131+ anchors {
132+ left: parent.left
90− anchors { left: parent.left; right: parent.right }
133+ right: parent.right
91− CheckBox {id: interactiveCheckbox; checked: true; }
134+ }
92− Label { text: "interactive" }
135+ Layout.preferredHeight: surfaceChildrenControl.height
136+
137+ RecursingChildSessionControl {
138+ id: surfaceChildrenControl
139+ anchors { left: parent.left; right: parent.right; }
140+
141+ surface: surfaceContainerLoader.item ? surfaceContainerLoader.item.surface : null
142+ }
93 }
143 }
94− MouseTouchEmulationCheckbox {}
95 }
144 }
96 }
145 }
97
146
98− SignalSpy {
99− id: surfaceSpy
100− target: SurfaceManager
101− signalName: "surfaceDestroyed"
102− }
103−
104− UnityTestCase {
147+ UT.UnityTestCase {
105 id: testCase
148 id: testCase
106 name: "SurfaceContainer"
149 name: "SurfaceContainer"
107− when: windowShown
108
150
109− property var surfaceContainer:
110− surfaceContainerLoader.status === Loader.Ready ? surfaceContainerLoader.item : null
151+ property Item surfaceContainer: surfaceContainerLoader.status === Loader.Ready ? surfaceContainerLoader.item : null
111
152
112 function cleanup() {
153 function cleanup() {
113 // reload our test subject to get it in a fresh state once again
154 // reload our test subject to get it in a fresh state once again
155+
156+ surfaceContainerLoader.itemDestroyed = false;
114 surfaceContainerLoader.active = false;
157 surfaceContainerLoader.active = false;
158+
159+ tryCompare(surfaceContainerLoader, "status", Loader.Null);
160+ tryCompare(surfaceContainerLoader, "item", null);
161+ tryCompare(surfaceContainerLoader, "itemDestroyed", true);
162+
163+ killApps();
164+
115 surfaceCheckbox.checked = false;
165 surfaceCheckbox.checked = false;
166+ interactiveCheckbox.checked = true;
167+
116 surfaceContainerLoader.active = true;
168 surfaceContainerLoader.active = true;
169+ tryCompare(surfaceContainerLoader, "status", Loader.Ready);
170+ }
117
171
118− tryCompare(surfaceContainerLoader.item, "surface", null);
172+ when: windowShown
119− surfaceSpy.clear();
120
173
121− interactiveCheckbox.checked = true;
174+ function test_addChildSession_data() {
175+ return [ { tag: "count=1", count: 1 },
176+ { tag: "count=4", count: 4 } ];
122 }
177 }
123
178
124− function test_animateRemoval() {
179+ function test_addChildSession(data) {
125 surfaceCheckbox.checked = true;
180 surfaceCheckbox.checked = true;
181+ var childSurfaces = testCase.findChild(surfaceContainer, "childSurfacesRepeater");
182+ compare(childSurfaces.count, 0);
126
183
184+ var i;
185+ for (i = 0; i < data.count; i++) {
127− verify(surfaceContainer.surface !== null);
186+ surfaceContainer.surface.createPromptSurface();
187+ compare(childSurfaces.count, i+1);
188+ }
189+
190+ for (i = data.count-1; i >= 0; i--) {
191+ {
192+ var childPromptSurface = surfaceContainer.surface.promptSurfaceList.get(i);
193+ childPromptSurface.close();
194+ }
195+ tryCompareFunction(function() { return childSurfaces.count; }, i);
196+ }
197+ }
198+
199+ function test_childSessionDestructionReturnsFocusToSiblingOrParent() {
200+ surfaceCheckbox.checked = true;
201+ var childSurfaces = testCase.findChild(surfaceContainer, "childSurfacesRepeater");
202+ compare(childSurfaces.count, 0);
203+
204+ var i;
205+ // 3 surfaces should cover all edge cases
206+ for (i = 0; i < 3; i++) {
207+ surfaceContainer.surface.createPromptSurface();
208+ compare(childSurfaces.count, i+1);
209+ }
128
210
211+ for (i = 2; i >= 0; --i) {
129− surfaceContainer.surface.setLive(false);
212+ var childPromptSurface = surfaceContainer.surface.promptSurfaceList.get(i);
213+ compare(childPromptSurface.activeFocus, true);
214+
215+ childPromptSurface.close();
216+ tryCompareFunction(function() { return childSurfaces.count; }, i);
217+
218+ if (i > 0) {
219+ // active focus should have gone to the yongest remaining sibling
220+ var previousSiblingSurface = surfaceContainer.surface.promptSurfaceList.get(i-1);
221+ tryCompare(previousSiblingSurface, "activeFocus", true);
222+ } else {
223+ // active focus should have gone to the parent surface
224+ tryCompare(surfaceContainer.surface, "activeFocus", true);
225+ }
226+ }
227+ }
130
228
131− compare(surfaceContainer.state, "zombie");
229+ function test_nestedChildSessions_data() {
132− tryCompare(surfaceContainer, "surface", null);
230+ return [ { tag: "depth=2", depth: 2 },
231+ { tag: "depth=8", depth: 8 }
232+ ];
233+ }
234+ function test_nestedChildSessions(data) {
235+ surfaceCheckbox.checked = true;
236+
237+ var i;
238+ var container = surfaceContainer;
239+ var surface = container.surface;
240+ var surfaces = [surface];
241+ var parent_childSurfaces = [null];
242+ for (i = 0; i < data.depth; i++) {
243+ surface.createPromptSurface();
244+ var childSurfaces = testCase.findChild(container, "childSurfacesRepeater");
245+ compare(childSurfaces.count, 1);
246+
247+ var childDelegate = childSurfaces.itemAt(0);
248+ container = findChild(childDelegate, "surfaceContainer");
249+ {
250+ var animationsLoader = findChild(container, "animationsLoader");
251+ tryCompare(animationsLoader, "status", Loader.Ready);
252+ waitUntilTransitionsEnd(animationsLoader.item);
253+ }
254+ surface = container.surface;
255+
256+ surfaces.push(surface);
257+ parent_childSurfaces.push(childSurfaces);
258+ }
259+
260+ for (i = surfaces.length-1; i >= 0; i--) {
261+ surfaces[i].close();
262+ if (parent_childSurfaces[i]) {
263+ tryCompareFunction(function() { return parent_childSurfaces[i].count; }, 0);
264+ }
265+ }
266+ }
267+
268+ function test_childrenAdjustForParentSize() {
269+ surfaceCheckbox.checked = true;
270+
271+ surfaceContainer.surface.createPromptSurface();
272+
273+ var delegate = findChild(surfaceContainer, "childDelegate0");
274+ var childContainer = findChild(delegate, "surfaceContainer");
275+
276+ tryCompareFunction(function() { return childContainer.height === surfaceContainer.height; }, true);
277+ tryCompareFunction(function() { return childContainer.width === surfaceContainer.width; }, true);
278+ tryCompareFunction(function() { return childContainer.x === 0; }, true);
279+ tryCompareFunction(function() { return childContainer.y === 0; }, true);
280+
281+ surfaceContainer.anchors.margins = units.gu(2);
282+
283+ tryCompareFunction(function() { return childContainer.height === surfaceContainer.height; }, true);
284+ tryCompareFunction(function() { return childContainer.width === surfaceContainer.width; }, true);
285+ tryCompareFunction(function() { return childContainer.x === 0; }, true);
286+ tryCompareFunction(function() { return childContainer.y === 0; }, true);
287+ }
288+
289+ function isContainerAnimating(container) {
290+ var animationsLoader = findChild(container, "animationsLoader");
291+ if (!animationsLoader || animationsLoader.status != Loader.Ready) {
292+ return false;
293+ }
294+
295+ var animation = animationsLoader.item;
296+
297+ var animating = false;
298+ for (var i = 0; i < animation.transitions.length; ++i) {
299+ if (animation.transitions[i].running) {
300+ return true;
301+ }
302+ }
303+ return false;
304+ }
305+
306+ function test_childrenAnimate() {
307+ surfaceCheckbox.checked = true;
308+
309+ surfaceContainer.surface.createPromptSurface();
310+
311+ var delegate = findChild(surfaceContainer, "childDelegate0");
312+ var childContainer = findChild(delegate, "surfaceContainer");
313+
314+ // wait for animation to begin
315+ tryCompareFunction(function() { return isContainerAnimating(childContainer); }, true);
316+ // wait for animation to end
317+ tryCompareFunction(function() { return isContainerAnimating(childContainer); }, false);
318+
319+ surfaceContainer.surface.promptSurfaceList.get(0).close();
320+
321+ // wait for animation to begin
322+ tryCompareFunction(function() { return isContainerAnimating(childContainer); }, true);
323+ // wait for animation to end
324+ tryCompareFunction(function() { return isContainerAnimating(childContainer); }, false);
133 }
325 }
134
326
135 function test_surfaceItemGetsNoTouchesWhenContainerNotInteractive() {
327 function test_surfaceItemGetsNoTouchesWhenContainerNotInteractive() {
@@ -142,14 +334,14 @@ Rectangle {
142 surfaceItem.touchPressCount = 0;
334 surfaceItem.touchPressCount = 0;
143 surfaceItem.touchReleaseCount = 0;
335 surfaceItem.touchReleaseCount = 0;
144
336
145− tap(surfaceContainer, surfaceContainer.width / 2, surfaceContainer.height / 2);
337+ tap(surfaceContainer);
146
338
147 // surface got touches as the surfaceContainer is interactive
339 // surface got touches as the surfaceContainer is interactive
148 compare(surfaceItem.touchPressCount, 1)
340 compare(surfaceItem.touchPressCount, 1)
149 compare(surfaceItem.touchReleaseCount, 1);
341 compare(surfaceItem.touchReleaseCount, 1);
150
342
151 interactiveCheckbox.checked = false;
343 interactiveCheckbox.checked = false;
152− tap(surfaceContainer, surfaceContainer.width / 2, surfaceContainer.height / 2);
344+ tap(surfaceContainer);
153
345
154 // surface shouldn't get the touches from the second tap as the surfaceContainer
346 // surface shouldn't get the touches from the second tap as the surfaceContainer
155 // was *not* interactive when it happened.
347 // was *not* interactive when it happened.
@@ -164,6 +356,8 @@ Rectangle {
164 var surfaceItem = findChild(surfaceContainer, "surfaceItem");
356 var surfaceItem = findChild(surfaceContainer, "surfaceItem");
165 verify(surfaceItem !== null);
357 verify(surfaceItem !== null);
166
358
359+ surfaceContainer.focus = false;
360+
167 compare(surfaceItem.activeFocus, false);
361 compare(surfaceItem.activeFocus, false);
168 mouseClick(surfaceContainer);
362 mouseClick(surfaceContainer);
169 compare(surfaceItem.activeFocus, true);
363 compare(surfaceItem.activeFocus, true);
@@ -176,6 +370,8 @@ Rectangle {
176 var surfaceItem = findChild(surfaceContainer, "surfaceItem");
370 var surfaceItem = findChild(surfaceContainer, "surfaceItem");
177 verify(surfaceItem !== null);
371 verify(surfaceItem !== null);
178
372
373+ surfaceContainer.focus = false;
374+
179 compare(surfaceItem.activeFocus, false);
375 compare(surfaceItem.activeFocus, false);
180 tap(surfaceContainer);
376 tap(surfaceContainer);
181 compare(surfaceItem.activeFocus, true);
377 compare(surfaceItem.activeFocus, true);
tests/qmltests/Stages/tst_TabletStage.qml+252−89
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -21,6 +21,7 @@ import Ubuntu.Components.ListItems 1.3 as ListItem
21import Unity.Application 0.1
21import Unity.Application 0.1
22import Unity.Test 0.1
22import Unity.Test 0.1
23import Utils 0.1
23import Utils 0.1
24+import WindowManager 0.1
24
25
25import ".."
26import ".."
26import "../../../qml/Stages"
27import "../../../qml/Stages"
@@ -34,6 +35,11 @@ Rectangle {
34
35
35 property var greeter: { fullyShown: true }
36 property var greeter: { fullyShown: true }
36
37
38+ TopLevelSurfaceList {
39+ id: topSurfaceList
40+ applicationsModel: ApplicationManager
41+ }
42+
37 Loader {
43 Loader {
38 id: tabletStageLoader
44 id: tabletStageLoader
39
45
@@ -62,6 +68,8 @@ Rectangle {
62 primary: Qt.LandscapeOrientation
68 primary: Qt.LandscapeOrientation
63 }
69 }
64 focus: true
70 focus: true
71+ applicationManager: ApplicationManager
72+ topLevelSurfaceList: topSurfaceList
65 }
73 }
66 }
74 }
67 }
75 }
@@ -76,6 +84,9 @@ Rectangle {
76 right: parent.right
84 right: parent.right
77 }
85 }
78
86
87+ // don't let mouse clicks in the controls area disturb the TabletStage behind it
88+ MouseArea { anchors.fill: parent }
89+
79 Column {
90 Column {
80 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
91 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
81 spacing: units.gu(1)
92 spacing: units.gu(1)
@@ -130,18 +141,21 @@ Rectangle {
130 tabletStageLoader.active = true;
141 tabletStageLoader.active = true;
131 tryCompare(tabletStageLoader, "status", Loader.Ready);
142 tryCompare(tabletStageLoader, "status", Loader.Ready);
132
143
144+ tryCompare(topSurfaceList, "count", 1);
145+ compare(topSurfaceList.applicationAt(0).appId, "unity8-dash");
146+
133 // this is very strange, but sometimes the test starts without
147 // this is very strange, but sometimes the test starts without
134 // TabletStage components having finished loading themselves
148 // TabletStage components having finished loading themselves
135− var appWindow = null;
149+ var appWindow = null
136 while (!appWindow) {
150 while (!appWindow) {
137− appWindow = findChild(tabletStage, "appWindow_unity8-dash");
151+ appWindow = findAppWindowForSurfaceId(topSurfaceList.idAt(0));
138 if (!appWindow) {
152 if (!appWindow) {
139− console.log("didn't find appWindow_unity8-dash in " + tabletStage + ". Trying again...");
153+ console.log("didn't find unity8-dash appWindow in " + tabletStage + ". Trying again...");
140 wait(50);
154 wait(50);
141 }
155 }
142 }
156 }
143
157
144− waitUntilAppSurfaceShowsUp("unity8-dash");
158+ waitUntilAppSurfaceShowsUp(topSurfaceList.idAt(0));
145 sideStage.hideNow()
159 sideStage.hideNow()
146 }
160 }
147
161
@@ -157,42 +171,39 @@ Rectangle {
157 // Shell instance gets destroyed.
171 // Shell instance gets destroyed.
158 tryCompare(tabletStageLoader, "itemDestroyed", true);
172 tryCompare(tabletStageLoader, "itemDestroyed", true);
159
173
160− // kill all (fake) running apps
174+ killApps();
161− webbrowserCheckBox.checked = false;
162− galleryCheckBox.checked = false;
163− dialerCheckBox.checked = false;
164− facebookCheckBox.checked = false;
165 WindowStateStorage.clear();
175 WindowStateStorage.clear();
166 }
176 }
167
177
168− function waitUntilAppSurfaceShowsUp(appId) {
178+ function waitUntilAppSurfaceShowsUp(surfaceId) {
169− var appWindow = findChild(tabletStage, "appWindow_" + appId);
179+ var appWindow = findAppWindowForSurfaceId(surfaceId);
170 verify(appWindow);
180 verify(appWindow);
171 var appWindowStates = findInvisibleChild(appWindow, "applicationWindowStateGroup");
181 var appWindowStates = findInvisibleChild(appWindow, "applicationWindowStateGroup");
172 verify(appWindowStates);
182 verify(appWindowStates);
173 tryCompare(appWindowStates, "state", "surface");
183 tryCompare(appWindowStates, "state", "surface");
174 }
184 }
175
185
176− function switchToApp(targetAppId) {
186+ function findAppWindowForSurfaceId(surfaceId) {
177− touchFlick(tabletStage,
187+ var spreadDelegate = findChild(tabletStage, "spreadDelegate_" + surfaceId);
178− tabletStage.width - (tabletStage.dragAreaWidth / 2), tabletStage.height / 2,
188+ if (!spreadDelegate) {
179− tabletStage.x + 1, tabletStage.height / 2);
189+ return null;
180−
190+ }
181− var spreadView = findChild(tabletStage, "spreadView");
191+ var appWindow = findChild(spreadDelegate, "appWindow");
182− verify(spreadView);
192+ return appWindow;
183− tryCompare(spreadView, "phase", 2);
193+ }
184− tryCompare(spreadView, "flicking", false);
185− tryCompare(spreadView, "moving", false);
186
194
187− waitUntilAppDelegateStopsMoving(targetAppId);
195+ function switchToSurface(targetSurfaceId) {
196+ performEdgeSwipeToShowAppSpread();
188
197
189− var targetAppWindow = findChild(tabletStage, "appWindow_" + targetAppId);
198+ waitUntilAppDelegateStopsMoving(targetSurfaceId);
199+ var targetAppWindow = findAppWindowForSurfaceId(targetSurfaceId);
200+ verify(targetAppWindow);
190 tap(targetAppWindow, 10, 10);
201 tap(targetAppWindow, 10, 10);
191 }
202 }
192
203
193− function waitUntilAppDelegateStopsMoving(targetAppId)
204+ function waitUntilAppDelegateStopsMoving(targetSurfaceId)
194 {
205 {
195− var targetAppDelegate = findChild(tabletStage, "tabletSpreadDelegate_" + targetAppId);
206+ var targetAppDelegate = findChild(tabletStage, "spreadDelegate_" + targetSurfaceId);
196 verify(targetAppDelegate);
207 verify(targetAppDelegate);
197 var lastValue = undefined;
208 var lastValue = undefined;
198 do {
209 do {
@@ -201,56 +212,86 @@ Rectangle {
201 } while (lastValue != targetAppDelegate.animatedProgress);
212 } while (lastValue != targetAppDelegate.animatedProgress);
202 }
213 }
203
214
215+ function performEdgeSwipeToShowAppSpread() {
216+ touchFlick(tabletStage,
217+ tabletStage.width - (tabletStage.dragAreaWidth / 2), tabletStage.height / 2,
218+ tabletStage.x + 1, tabletStage.height / 2);
219+
220+ var spreadView = findChild(tabletStage, "spreadView");
221+ verify(spreadView);
222+ tryCompare(spreadView, "phase", 2);
223+ tryCompare(spreadView, "flicking", false);
224+ tryCompare(spreadView, "moving", false);
225+ }
226+
227+ function swipeSurfaceUpwards(surfaceId) {
228+ var appWindow = findAppWindowForSurfaceId(surfaceId);
229+ verify(appWindow);
230+
231+ // Swipe from the left side of the surface as it's the one most likely
232+ // to not be covered by other surfaces when they're all being shown in the spread
233+ touchFlick(appWindow,
234+ appWindow.width * 0.1, appWindow.height / 2,
235+ appWindow.width * 0.1, -appWindow.height / 2);
236+ }
237+
204 function test_tappingSwitchesFocusBetweenStages() {
238 function test_tappingSwitchesFocusBetweenStages() {
205 WindowStateStorage.saveStage(dialerCheckBox.appId, ApplicationInfoInterface.SideStage)
239 WindowStateStorage.saveStage(dialerCheckBox.appId, ApplicationInfoInterface.SideStage)
206
240
241+ var webbrowserSurfaceId = topSurfaceList.nextId;
207 webbrowserCheckBox.checked = true;
242 webbrowserCheckBox.checked = true;
208− waitUntilAppSurfaceShowsUp(webbrowserCheckBox.appId);
243+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
209 var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
244 var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
210 compare(webbrowserApp.stage, ApplicationInfoInterface.MainStage);
245 compare(webbrowserApp.stage, ApplicationInfoInterface.MainStage);
246+ var webbrowserWindow = findAppWindowForSurfaceId(webbrowserSurfaceId);
247+ verify(webbrowserWindow);
248+
211− tryCompare(webbrowserApp.session.lastSurface, "activeFocus", true);
249+ tryCompare(webbrowserWindow.surface, "activeFocus", true);
212
250
251+ var dialerSurfaceId = topSurfaceList.nextId;
213 dialerCheckBox.checked = true;
252 dialerCheckBox.checked = true;
214− waitUntilAppSurfaceShowsUp(dialerCheckBox.appId);
253+ waitUntilAppSurfaceShowsUp(dialerSurfaceId);
254+
215 var dialerApp = ApplicationManager.findApplication(dialerCheckBox.appId);
255 var dialerApp = ApplicationManager.findApplication(dialerCheckBox.appId);
256+ var dialerDelegate = findChild(tabletStage, "spreadDelegate_" + dialerSurfaceId);
257+ verify(dialerDelegate);
216− compare(dialerApp.stage, ApplicationInfoInterface.SideStage);
258+ compare(dialerDelegate.stage, ApplicationInfoInterface.SideStage);
259+
217− tryCompare(dialerApp.session.lastSurface, "activeFocus", true);
260+ tryCompare(dialerDelegate.surface, "activeFocus", true);
218− tryCompare(webbrowserApp.session.lastSurface, "activeFocus", false);
261+ tryCompare(webbrowserWindow.surface, "activeFocus", false);
219
262
220 // Tap on the main stage application and check if the focus
263 // Tap on the main stage application and check if the focus
221 // has been passed to it.
264 // has been passed to it.
222
265
223− var webbrowserWindow = findChild(tabletStage, "appWindow_" + webbrowserApp.appId);
224− verify(webbrowserWindow);
225 tap(webbrowserWindow);
266 tap(webbrowserWindow);
226
267
227− tryCompare(dialerApp.session.lastSurface, "activeFocus", false);
268+ tryCompare(dialerDelegate.surface, "activeFocus", false);
228− tryCompare(webbrowserApp.session.lastSurface, "activeFocus", true);
269+ tryCompare(webbrowserWindow.surface, "activeFocus", true);
229
270
230 // Now tap on the side stage application and check if the focus
271 // Now tap on the side stage application and check if the focus
231 // has been passed back to it.
272 // has been passed back to it.
232
273
233− var dialerWindow = findChild(tabletStage, "appWindow_" + dialerApp.appId);
274+ tap(dialerDelegate);
234− verify(dialerWindow);
235− tap(dialerWindow);
236
275
237− tryCompare(dialerApp.session.lastSurface, "activeFocus", true);
276+ tryCompare(dialerDelegate.surface, "activeFocus", true);
238− tryCompare(webbrowserApp.session.lastSurface, "activeFocus", false);
277+ tryCompare(webbrowserWindow.surface, "activeFocus", false);
239 }
278 }
240
279
241 function test_closeAppInSideStage() {
280 function test_closeAppInSideStage() {
242 WindowStateStorage.saveStage(dialerCheckBox.appId, ApplicationInfoInterface.SideStage)
281 WindowStateStorage.saveStage(dialerCheckBox.appId, ApplicationInfoInterface.SideStage)
243
282
283+ var dialerSurfaceId = topSurfaceList.nextId;
244 dialerCheckBox.checked = true;
284 dialerCheckBox.checked = true;
245− waitUntilAppSurfaceShowsUp(dialerCheckBox.appId);
285+ waitUntilAppSurfaceShowsUp(dialerSurfaceId);
246
286
247 performEdgeSwipeToShowAppSpread();
287 performEdgeSwipeToShowAppSpread();
248
288
249− var appDelegate = findChild(tabletStage, "tabletSpreadDelegate_" + dialerCheckBox.appId);
289+ var appDelegate = findChild(tabletStage, "spreadDelegate_" + dialerSurfaceId);
250 verify(appDelegate);
290 verify(appDelegate);
291+ compare(appDelegate.stage, ApplicationInfoInterface.SideStage);
251 tryCompare(appDelegate, "swipeToCloseEnabled", true);
292 tryCompare(appDelegate, "swipeToCloseEnabled", true);
252
293
253− swipeAppUpwards(dialerCheckBox.appId);
294+ swipeSurfaceUpwards(dialerSurfaceId);
254
295
255 // Check that dialer-app has been closed
296 // Check that dialer-app has been closed
256
297
@@ -263,54 +304,37 @@ Rectangle {
263 }, null);
304 }, null);
264 }
305 }
265
306
266− function performEdgeSwipeToShowAppSpread() {
267− var touchStartY = tabletStage.height / 2;
268− touchFlick(tabletStage,
269− tabletStage.width - 1, touchStartY,
270− 0, touchStartY);
271−
272− var spreadView = findChild(tabletStage, "spreadView");
273− verify(spreadView);
274− tryCompare(spreadView, "phase", 2);
275− tryCompare(spreadView, "flicking", false);
276− tryCompare(spreadView, "moving", false);
277− }
278−
279− function swipeAppUpwards(appId) {
280− var appWindow = findChild(tabletStage, "appWindow_" + appId);
281− verify(appWindow);
282−
283− touchFlick(appWindow,
284− appWindow.width / 2, appWindow.height / 2,
285− appWindow.width / 2, -appWindow.height / 2);
286− }
287−
288 function test_suspendsAndResumesAppsInMainStage() {
307 function test_suspendsAndResumesAppsInMainStage() {
308+ var webbrowserSurfaceId = topSurfaceList.nextId;
289 webbrowserCheckBox.checked = true;
309 webbrowserCheckBox.checked = true;
310+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
290 var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
311 var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
312+ var webbrowserDelegate = findChild(tabletStage, "spreadDelegate_" + webbrowserSurfaceId);
291− compare(webbrowserApp.stage, ApplicationInfoInterface.MainStage);
313+ compare(webbrowserDelegate.stage, ApplicationInfoInterface.MainStage);
292
314
293 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Running);
315 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Running);
294
316
317+ var gallerySurfaceId = topSurfaceList.nextId;
295 galleryCheckBox.checked = true;
318 galleryCheckBox.checked = true;
319+ waitUntilAppSurfaceShowsUp(gallerySurfaceId);
296 var galleryApp = ApplicationManager.findApplication(galleryCheckBox.appId);
320 var galleryApp = ApplicationManager.findApplication(galleryCheckBox.appId);
321+ var galleryDelegate = findChild(tabletStage, "spreadDelegate_" + gallerySurfaceId);
297− compare(galleryApp.stage, ApplicationInfoInterface.MainStage);
322+ compare(galleryDelegate.stage, ApplicationInfoInterface.MainStage);
298
323
299 tryCompare(galleryApp, "state", ApplicationInfoInterface.Running);
324 tryCompare(galleryApp, "state", ApplicationInfoInterface.Running);
300 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Suspended);
325 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Suspended);
301
326
302− switchToApp(webbrowserApp.appId);
327+ switchToSurface(webbrowserSurfaceId);
303
328
304 tryCompare(galleryApp, "state", ApplicationInfoInterface.Suspended);
329 tryCompare(galleryApp, "state", ApplicationInfoInterface.Suspended);
305 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Running);
330 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Running);
306
331
307− switchToApp(galleryApp.appId);
332+ switchToSurface(gallerySurfaceId);
308
333
309 tryCompare(galleryApp, "state", ApplicationInfoInterface.Running);
334 tryCompare(galleryApp, "state", ApplicationInfoInterface.Running);
310 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Suspended);
335 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Suspended);
311 }
336 }
312
337
313−
314 function test_foregroundMainAndSideStageAppsAreKeptRunning() {
338 function test_foregroundMainAndSideStageAppsAreKeptRunning() {
315 WindowStateStorage.saveStage(facebookCheckBox.appId, ApplicationInfoInterface.SideStage)
339 WindowStateStorage.saveStage(facebookCheckBox.appId, ApplicationInfoInterface.SideStage)
316 WindowStateStorage.saveStage(dialerCheckBox.appId, ApplicationInfoInterface.SideStage)
340 WindowStateStorage.saveStage(dialerCheckBox.appId, ApplicationInfoInterface.SideStage)
@@ -321,30 +345,37 @@ Rectangle {
321 // launch two main stage apps
345 // launch two main stage apps
322 // gallery will be on foreground and webbrowser on background
346 // gallery will be on foreground and webbrowser on background
323
347
348+ var webbrowserSurfaceId = topSurfaceList.nextId;
324 webbrowserCheckBox.checked = true;
349 webbrowserCheckBox.checked = true;
325− waitUntilAppSurfaceShowsUp(webbrowserCheckBox.appId)
350+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
326 var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
351 var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
327 compare(webbrowserApp.stage, ApplicationInfoInterface.MainStage);
352 compare(webbrowserApp.stage, ApplicationInfoInterface.MainStage);
328
353
354+ var gallerySurfaceId = topSurfaceList.nextId;
329 galleryCheckBox.checked = true;
355 galleryCheckBox.checked = true;
330− waitUntilAppSurfaceShowsUp(galleryCheckBox.appId)
356+ waitUntilAppSurfaceShowsUp(gallerySurfaceId);
331 var galleryApp = ApplicationManager.findApplication(galleryCheckBox.appId);
357 var galleryApp = ApplicationManager.findApplication(galleryCheckBox.appId);
358+ var galleryDelegate = findChild(tabletStage, "spreadDelegate_" + gallerySurfaceId);
332− compare(galleryApp.stage, ApplicationInfoInterface.MainStage);
359+ compare(galleryDelegate.stage, ApplicationInfoInterface.MainStage);
333
360
334 compare(stagesPriv.mainStageAppId, galleryCheckBox.appId);
361 compare(stagesPriv.mainStageAppId, galleryCheckBox.appId);
335
362
336 // then launch two side stage apps
363 // then launch two side stage apps
337 // facebook will be on foreground and dialer on background
364 // facebook will be on foreground and dialer on background
338
365
366+ var dialerSurfaceId = topSurfaceList.nextId;
339 dialerCheckBox.checked = true;
367 dialerCheckBox.checked = true;
340− waitUntilAppSurfaceShowsUp(dialerCheckBox.appId)
368+ waitUntilAppSurfaceShowsUp(dialerSurfaceId);
341 var dialerApp = ApplicationManager.findApplication(dialerCheckBox.appId);
369 var dialerApp = ApplicationManager.findApplication(dialerCheckBox.appId);
370+ var dialerDelegate = findChild(tabletStage, "spreadDelegate_" + dialerSurfaceId);
342− compare(dialerApp.stage, ApplicationInfoInterface.SideStage);
371+ compare(dialerDelegate.stage, ApplicationInfoInterface.SideStage);
343
372
373+ var facebookSurfaceId = topSurfaceList.nextId;
344 facebookCheckBox.checked = true;
374 facebookCheckBox.checked = true;
345− waitUntilAppSurfaceShowsUp(facebookCheckBox.appId)
375+ waitUntilAppSurfaceShowsUp(facebookSurfaceId);
346 var facebookApp = ApplicationManager.findApplication(facebookCheckBox.appId);
376 var facebookApp = ApplicationManager.findApplication(facebookCheckBox.appId);
377+ var facebookDelegate = findChild(tabletStage, "spreadDelegate_" + facebookSurfaceId);
347− compare(facebookApp.stage, ApplicationInfoInterface.SideStage);
378+ compare(facebookDelegate.stage, ApplicationInfoInterface.SideStage);
348
379
349 compare(stagesPriv.sideStageAppId, facebookCheckBox.appId);
380 compare(stagesPriv.sideStageAppId, facebookCheckBox.appId);
350
381
@@ -356,14 +387,14 @@ Rectangle {
356 tryCompare(facebookApp, "state", ApplicationInfoInterface.Running);
387 tryCompare(facebookApp, "state", ApplicationInfoInterface.Running);
357 tryCompare(dialerApp, "state", ApplicationInfoInterface.Suspended);
388 tryCompare(dialerApp, "state", ApplicationInfoInterface.Suspended);
358
389
359− switchToApp(dialerCheckBox.appId);
390+ switchToSurface(dialerSurfaceId);
360
391
361 tryCompare(galleryApp, "state", ApplicationInfoInterface.Running);
392 tryCompare(galleryApp, "state", ApplicationInfoInterface.Running);
362 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Suspended);
393 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Suspended);
363 tryCompare(facebookApp, "state", ApplicationInfoInterface.Suspended);
394 tryCompare(facebookApp, "state", ApplicationInfoInterface.Suspended);
364 tryCompare(dialerApp, "state", ApplicationInfoInterface.Running);
395 tryCompare(dialerApp, "state", ApplicationInfoInterface.Running);
365
396
366− switchToApp(webbrowserCheckBox.appId);
397+ switchToSurface(webbrowserSurfaceId);
367
398
368 tryCompare(galleryApp, "state", ApplicationInfoInterface.Suspended);
399 tryCompare(galleryApp, "state", ApplicationInfoInterface.Suspended);
369 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Running);
400 tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Running);
@@ -374,15 +405,19 @@ Rectangle {
374 function test_foregroundAppsAreSuspendedWhenStageIsSuspended() {
405 function test_foregroundAppsAreSuspendedWhenStageIsSuspended() {
375 WindowStateStorage.saveStage(dialerCheckBox.appId, ApplicationInfoInterface.SideStage)
406 WindowStateStorage.saveStage(dialerCheckBox.appId, ApplicationInfoInterface.SideStage)
376
407
408+ var webbrowserSurfaceId = topSurfaceList.nextId;
377 webbrowserCheckBox.checked = true;
409 webbrowserCheckBox.checked = true;
378− waitUntilAppSurfaceShowsUp(webbrowserCheckBox.appId)
410+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
379 var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
411 var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
412+ var webbrowserDelegate = findChild(tabletStage, "spreadDelegate_" + webbrowserSurfaceId);
380− compare(webbrowserApp.stage, ApplicationInfoInterface.MainStage);
413+ compare(webbrowserDelegate.stage, ApplicationInfoInterface.MainStage);
381
414
415+ var dialerSurfaceId = topSurfaceList.nextId;
382 dialerCheckBox.checked = true;
416 dialerCheckBox.checked = true;
383− waitUntilAppSurfaceShowsUp(dialerCheckBox.appId)
417+ waitUntilAppSurfaceShowsUp(dialerSurfaceId);
384 var dialerApp = ApplicationManager.findApplication(dialerCheckBox.appId);
418 var dialerApp = ApplicationManager.findApplication(dialerCheckBox.appId);
419+ var dialerDelegate = findChild(tabletStage, "spreadDelegate_" + dialerSurfaceId);
385− compare(dialerApp.stage, ApplicationInfoInterface.SideStage);
420+ compare(dialerDelegate.stage, ApplicationInfoInterface.SideStage);
386
421
387
422
388 compare(webbrowserApp.requestedState, ApplicationInfoInterface.RequestedRunning);
423 compare(webbrowserApp.requestedState, ApplicationInfoInterface.RequestedRunning);
@@ -467,8 +502,9 @@ Rectangle {
467 tryCompare(stagesPriv, "mainStageAppId", "unity8-dash");
502 tryCompare(stagesPriv, "mainStageAppId", "unity8-dash");
468 tryCompare(stagesPriv, "sideStageAppId", "");
503 tryCompare(stagesPriv, "sideStageAppId", "");
469
504
505+ var webbrowserSurfaceId = topSurfaceList.nextId;
470 webbrowserCheckBox.checked = true;
506 webbrowserCheckBox.checked = true;
471− waitUntilAppSurfaceShowsUp(webbrowserCheckBox.appId)
507+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
472
508
473 tryCompare(stagesPriv, "mainStageAppId", data.mainStageAppId);
509 tryCompare(stagesPriv, "mainStageAppId", data.mainStageAppId);
474 tryCompare(stagesPriv, "sideStageAppId", data.sideStageAppId);
510 tryCompare(stagesPriv, "sideStageAppId", data.sideStageAppId);
@@ -476,10 +512,11 @@ Rectangle {
476
512
477 function test_loadSideStageByDragginFromMainStage() {
513 function test_loadSideStageByDragginFromMainStage() {
478 sideStage.showNow();
514 sideStage.showNow();
515+ var webbrowserSurfaceId = topSurfaceList.nextId;
479 webbrowserCheckBox.checked = true;
516 webbrowserCheckBox.checked = true;
480− waitUntilAppSurfaceShowsUp(webbrowserCheckBox.appId);
517+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
481
518
482− var appDelegate = findChild(tabletStage, "tabletSpreadDelegate_" + webbrowserCheckBox.appId);
519+ var appDelegate = findChild(tabletStage, "spreadDelegate_" + webbrowserSurfaceId);
483 verify(appDelegate);
520 verify(appDelegate);
484 compare(appDelegate.stage, ApplicationInfoInterface.MainStage);
521 compare(appDelegate.stage, ApplicationInfoInterface.MainStage);
485
522
@@ -504,10 +541,11 @@ Rectangle {
504 function test_unloadSideStageByDragginFromStageStage() {
541 function test_unloadSideStageByDragginFromStageStage() {
505 sideStage.showNow();
542 sideStage.showNow();
506 WindowStateStorage.saveStage(webbrowserCheckBox.appId, ApplicationInfoInterface.SideStage)
543 WindowStateStorage.saveStage(webbrowserCheckBox.appId, ApplicationInfoInterface.SideStage)
544+ var webbrowserSurfaceId = topSurfaceList.nextId;
507 webbrowserCheckBox.checked = true;
545 webbrowserCheckBox.checked = true;
508− waitUntilAppSurfaceShowsUp(webbrowserCheckBox.appId);
546+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
509
547
510− var appDelegate = findChild(tabletStage, "tabletSpreadDelegate_" + webbrowserCheckBox.appId);
548+ var appDelegate = findChild(tabletStage, "spreadDelegate_" + webbrowserSurfaceId);
511 verify(appDelegate);
549 verify(appDelegate);
512 compare(appDelegate.stage, ApplicationInfoInterface.SideStage);
550 compare(appDelegate.stage, ApplicationInfoInterface.SideStage);
513
551
@@ -527,5 +565,130 @@ Rectangle {
527
565
528 tryCompare(appDelegate, "stage", ApplicationInfoInterface.MainStage);
566 tryCompare(appDelegate, "stage", ApplicationInfoInterface.MainStage);
529 }
567 }
568+
569+ function test_closeSurfaceOfMultiSurfaceApp() {
570+ var surface1Id = topSurfaceList.nextId;
571+ webbrowserCheckBox.checked = true;
572+ waitUntilAppSurfaceShowsUp(surface1Id);
573+ var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
574+
575+ var surface2Id = topSurfaceList.nextId;
576+ verify(surface1Id !== surface2Id); // sanity checking
577+ webbrowserCheckBox.createSurface();
578+ waitUntilAppSurfaceShowsUp(surface2Id);
579+
580+ performEdgeSwipeToShowAppSpread();
581+
582+ var appDelegate = findChild(tabletStage, "spreadDelegate_" + surface1Id);
583+ verify(appDelegate);
584+ tryCompare(appDelegate, "swipeToCloseEnabled", true);
585+
586+ compare(webbrowserApp.surfaceList.count, 2);
587+ compare(webbrowserApp.state, ApplicationInfoInterface.Running);
588+
589+ swipeSurfaceUpwards(surface1Id);
590+
591+ // Surface must eventually be gone
592+ tryCompareFunction(function() { return topSurfaceList.indexForId(surface1Id); }, -1);
593+ tryCompare(webbrowserApp.surfaceList, "count", 1);
594+ compare(webbrowserApp.state, ApplicationInfoInterface.Running);
595+ }
596+
597+ /*
598+ 1- Suspended app gets killed behind the scenes, causing its surface to go zombie.
599+ 2- Surface gets screenshotted and removed. Its slot in the topSurfaceList remains,
600+ though (so ApplicationWindow can display the screenshot in its place).
601+ 3- User taps on the screenshot of the long-gone surface.
602+
603+ Expected outcome:
604+ Application gets relaunched. Its new surface will seamlessly replace the screenshot.
605+ */
606+ function test_selectSuspendedAppWithoutSurface() {
607+ compare(topSurfaceList.applicationAt(0).appId, "unity8-dash");
608+ var dashSurfaceId = topSurfaceList.idAt(0);
609+ var dashSurface = topSurfaceList.surfaceAt(0);
610+
611+ var webbrowserSurfaceId = topSurfaceList.nextId;
612+ webbrowserCheckBox.checked = true;
613+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
614+ var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
615+
616+ switchToSurface(dashSurfaceId);
617+
618+ tryCompare(MirFocusController, "focusedSurface", dashSurface);
619+ tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Suspended);
620+
621+ compare(webbrowserApp.surfaceList.count, 1);
622+
623+ // simulate the suspended app being killed by the out-of-memory daemon
624+ webbrowserApp.surfaceList.get(0).setLive(false);
625+
626+ // wait until the surface is gone
627+ tryCompare(webbrowserApp.surfaceList, "count", 0);
628+ compare(topSurfaceList.surfaceAt(topSurfaceList.indexForId(webbrowserSurfaceId)), null);
629+
630+ switchToSurface(webbrowserSurfaceId);
631+
632+ // webbrowser should have been brought to front
633+ tryCompareFunction(function(){return topSurfaceList.idAt(0);}, webbrowserSurfaceId);
634+
635+ // and it should eventually get a new surface and get resumed
636+ tryCompareFunction(function(){return topSurfaceList.surfaceAt(0) !== null;}, true);
637+ compare(topSurfaceList.count, 2); // still two top-level items
638+ tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Running);
639+ compare(webbrowserApp.surfaceList.count, 1);
640+ }
641+
642+ /*
643+ 1 - user suspends an application (ie, focus a surface from a different application)
644+ 2 - That suspended application gets killed, causing its surface to go zombie
645+ 3 - user goes to spread and closes that zombie surface. Actually, by that time
646+ Tablet shell will be displaying a screenshot of it instead, so there's no
647+ MirSurface whatsoever backing it up.
648+ */
649+ function test_closeZombieSurface()
650+ {
651+ compare(topSurfaceList.applicationAt(0).appId, "unity8-dash");
652+ var dashSurfaceId = topSurfaceList.idAt(0);
653+ var dashSurface = topSurfaceList.surfaceAt(0);
654+
655+ var webbrowserSurfaceId = topSurfaceList.nextId;
656+ webbrowserCheckBox.checked = true;
657+ waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
658+ var webbrowserApp = ApplicationManager.findApplication(webbrowserCheckBox.appId);
659+
660+ switchToSurface(dashSurfaceId);
661+
662+ tryCompare(MirFocusController, "focusedSurface", dashSurface);
663+ tryCompare(webbrowserApp, "state", ApplicationInfoInterface.Suspended);
664+
665+ compare(webbrowserApp.surfaceList.count, 1);
666+
667+ // simulate the suspended app being killed by the out-of-memory daemon
668+ webbrowserApp.surfaceList.get(0).setLive(false);
669+
670+ // wait until the surface is gone
671+ tryCompare(webbrowserApp.surfaceList, "count", 0);
672+ compare(topSurfaceList.surfaceAt(topSurfaceList.indexForId(webbrowserSurfaceId)), null);
673+
674+ performEdgeSwipeToShowAppSpread();
675+
676+ {
677+ var appDelegate = findChild(tabletStage, "spreadDelegate_" + webbrowserSurfaceId);
678+ verify(appDelegate);
679+ tryCompare(appDelegate, "swipeToCloseEnabled", true);
680+ }
681+
682+ swipeSurfaceUpwards(webbrowserSurfaceId);
683+
684+ // webbrowser entry is nowhere to be seen
685+ tryCompareFunction(function(){return topSurfaceList.indexForId(webbrowserSurfaceId);}, -1);
686+
687+ // nor is its app
688+ compare(ApplicationManager.findApplication(webbrowserCheckBox.appId), null);
689+
690+ // only unity8-dash surface is left
691+ compare(topSurfaceList.count, 1);
692+ }
530 }
693 }
531}
694}
tests/qmltests/Tutorial/tst_Tutorial.qml+4−8
@@ -113,6 +113,8 @@ Rectangle {
113 sourceComponent: Component {
113 sourceComponent: Component {
114 Shell {
114 Shell {
115 usageScenario: shellLoader.state
115 usageScenario: shellLoader.state
116+ nativeWidth: width
117+ nativeHeight: height
116 property string indicatorProfile: "phone"
118 property string indicatorProfile: "phone"
117 orientation: shellLoader.shellOrientation
119 orientation: shellLoader.shellOrientation
118 orientations: Orientations {
120 orientations: Orientations {
@@ -280,14 +282,6 @@ Rectangle {
280 prepareShell();
282 prepareShell();
281 }
283 }
282
284
283− function killApps() {
284− while (ApplicationManager.count > 1) {
285− var appIndex = ApplicationManager.get(0).appId == "unity8-dash" ? 1 : 0
286− ApplicationManager.stopApplication(ApplicationManager.get(appIndex).appId);
287− }
288− compare(ApplicationManager.count, 1)
289− }
290−
291 function swipeAwayGreeter() {
285 function swipeAwayGreeter() {
292 var coverPage = findChild(shell, "coverPage");
286 var coverPage = findChild(shell, "coverPage");
293 tryCompare(coverPage, "showProgress", 1);
287 tryCompare(coverPage, "showProgress", 1);
@@ -409,6 +403,8 @@ Rectangle {
409
403
410 var launcher = findChild(shell, "launcher");
404 var launcher = findChild(shell, "launcher");
411 var tutorialLeft = findChild(shell, "tutorialLeftLoader");
405 var tutorialLeft = findChild(shell, "tutorialLeftLoader");
406+ verify(tutorialLeft);
407+
412 touchFlick(shell, 0, halfHeight, shell.width, halfHeight);
408 touchFlick(shell, 0, halfHeight, shell.width, halfHeight);
413
409
414 tryCompare(tutorialLeft, "shown", false);
410 tryCompare(tutorialLeft, "shown", false);
tests/qmltests/tst_OrientedShell.qml+92−65
@@ -25,6 +25,7 @@ import Unity.Test 0.1
25import IntegratedLightDM 0.1 as LightDM
25import IntegratedLightDM 0.1 as LightDM
26import Powerd 0.1
26import Powerd 0.1
27import Unity.InputInfo 0.1
27import Unity.InputInfo 0.1
28+import Utils 0.1
28
29
29import "../../qml"
30import "../../qml"
30
31
@@ -432,6 +433,7 @@ Rectangle {
432
433
433 property Item orientedShell: orientedShellLoader.status === Loader.Ready ? orientedShellLoader.item : null
434 property Item orientedShell: orientedShellLoader.status === Loader.Ready ? orientedShellLoader.item : null
434 property Item shell
435 property Item shell
436+ property QtObject topLevelSurfaceList
435
437
436 SignalSpy { id: signalSpy }
438 SignalSpy { id: signalSpy }
437 SignalSpy { id: signalSpy2 }
439 SignalSpy { id: signalSpy2 }
@@ -490,6 +492,7 @@ Rectangle {
490 function cleanup() {
492 function cleanup() {
491 tryCompare(shell, "enabled", true); // make sure greeter didn't leave us in disabled state
493 tryCompare(shell, "enabled", true); // make sure greeter didn't leave us in disabled state
492 shell = null;
494 shell = null;
495+ topLevelSurfaceList = null;
493
496
494 tearDown();
497 tearDown();
495 }
498 }
@@ -497,17 +500,23 @@ Rectangle {
497 function test_appSupportingOnlyPrimaryOrientationMakesPhoneShellStayPut() {
500 function test_appSupportingOnlyPrimaryOrientationMakesPhoneShellStayPut() {
498 loadShell("mako");
501 loadShell("mako");
499
502
503+ var spreadRepeater = findChild(shell, "spreadRepeater");
504+ verify(spreadRepeater);
505+
500 // unity8-dash supports only primary orientation and should be already running
506 // unity8-dash supports only primary orientation and should be already running
501− var dashAppWindow = findChild(shell, "appWindow_unity8-dash");
507+ compare(spreadRepeater.count, 1);
502− verify(dashAppWindow);
508+ var dashDelegate = spreadRepeater.itemAt(0);
503− compare(ApplicationManager.focusedApplicationId, "unity8-dash");
504− var dashApp = dashAppWindow.application
509+ var dashApp = dashDelegate.application;
505 verify(dashApp);
510 verify(dashApp);
511+ compare(dashApp.appId, "unity8-dash");
512+ var dashAppWindow = findChild(dashDelegate, "appWindow");
513+ verify(dashAppWindow);
514+ compare(dashDelegate.focus, true);
506 compare(dashApp.rotatesWindowContents, false);
515 compare(dashApp.rotatesWindowContents, false);
507 compare(dashApp.supportedOrientations, Qt.PrimaryOrientation);
516 compare(dashApp.supportedOrientations, Qt.PrimaryOrientation);
508 compare(dashApp.stage, ApplicationInfoInterface.MainStage);
517 compare(dashApp.stage, ApplicationInfoInterface.MainStage);
509
518
510− tryCompareFunction(function(){return dashApp.session.lastSurface != null;}, true);
519+ tryCompareFunction(function(){return dashDelegate.surface != null;}, true);
511 verify(checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle));
520 verify(checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle));
512
521
513 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
522 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
@@ -538,17 +547,20 @@ Rectangle {
538 function test_appSupportingOnlyPrimaryOrientationWillOnlyRotateInLandscape(data) {
547 function test_appSupportingOnlyPrimaryOrientationWillOnlyRotateInLandscape(data) {
539 loadShell(data.deviceName);
548 loadShell(data.deviceName);
540
549
550+ compare(topLevelSurfaceList.applicationAt(0).appId, "unity8-dash");
551+ var dashSurfaceId = topLevelSurfaceList.idAt(0);
552+ var dashAppWindow = findAppWindowForSurfaceId(dashSurfaceId);
553+
541 // unity8-dash supports only primary orientation and should be already running
554 // unity8-dash supports only primary orientation and should be already running
542− var dashAppWindow = findChild(shell, "appWindow_unity8-dash");
555+
543− verify(dashAppWindow);
544 compare(ApplicationManager.focusedApplicationId, "unity8-dash");
556 compare(ApplicationManager.focusedApplicationId, "unity8-dash");
545− var dashApp = dashAppWindow.application
557+ var dashApp = dashAppWindow.application;
546 verify(dashApp);
558 verify(dashApp);
547 compare(dashApp.rotatesWindowContents, false);
559 compare(dashApp.rotatesWindowContents, false);
548 compare(dashApp.supportedOrientations, Qt.PrimaryOrientation);
560 compare(dashApp.supportedOrientations, Qt.PrimaryOrientation);
549 compare(dashApp.stage, ApplicationInfoInterface.MainStage);
561 compare(dashApp.stage, ApplicationInfoInterface.MainStage);
550
562
551− tryCompareFunction(function(){return dashApp.session.lastSurface != null;}, true);
563+ tryCompareFunction(function(){return dashApp.surfaceList.count > 0;}, true);
552 verify(checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle));
564 verify(checkAppSurfaceOrientation(dashAppWindow, dashApp, root.primaryOrientationAngle));
553
565
554 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
566 compare(shell.transformRotationAngle, root.primaryOrientationAngle);
@@ -615,6 +627,7 @@ Rectangle {
615 }
627 }
616 function test_appRotatesWindowContents(data) {
628 function test_appRotatesWindowContents(data) {
617 loadShell(data.deviceName);
629 loadShell(data.deviceName);
630+ var cameraSurfaceId = topLevelSurfaceList.nextId;
618 var cameraApp = ApplicationManager.startApplication("camera-app");
631 var cameraApp = ApplicationManager.startApplication("camera-app");
619 verify(cameraApp);
632 verify(cameraApp);
620
633
@@ -624,9 +637,9 @@ Rectangle {
624 compare(cameraApp.supportedOrientations, Qt.PortraitOrientation | Qt.LandscapeOrientation
637 compare(cameraApp.supportedOrientations, Qt.PortraitOrientation | Qt.LandscapeOrientation
625 | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation);
638 | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation);
626
639
627− waitUntilAppSurfaceShowsUp("camera-app")
640+ waitUntilAppWindowIsFullyLoaded(cameraSurfaceId);
628
641
629− var cameraSurface = cameraApp.session.lastSurface;
642+ var cameraSurface = cameraApp.surfaceList.get(0);
630 verify(cameraSurface);
643 verify(cameraSurface);
631
644
632 var focusChangedSpy = signalSpy;
645 var focusChangedSpy = signalSpy;
@@ -692,6 +705,7 @@ Rectangle {
692 }
705 }
693 function test_switchingToAppWithDifferentRotation(data) {
706 function test_switchingToAppWithDifferentRotation(data) {
694 loadShell(data.deviceName);
707 loadShell(data.deviceName);
708+ var gmailSurfaceId = topLevelSurfaceList.nextId;
695 var gmailApp = ApplicationManager.startApplication("gmail-webapp");
709 var gmailApp = ApplicationManager.startApplication("gmail-webapp");
696 verify(gmailApp);
710 verify(gmailApp);
697
711
@@ -701,8 +715,9 @@ Rectangle {
701 | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation);
715 | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation);
702 compare(gmailApp.stage, ApplicationInfoInterface.MainStage);
716 compare(gmailApp.stage, ApplicationInfoInterface.MainStage);
703
717
704− waitUntilAppSurfaceShowsUp("gmail-webapp")
718+ waitUntilAppWindowIsFullyLoaded(gmailSurfaceId);
705
719
720+ var musicSurfaceId = topLevelSurfaceList.nextId;
706 var musicApp = ApplicationManager.startApplication("music-app");
721 var musicApp = ApplicationManager.startApplication("music-app");
707 verify(musicApp);
722 verify(musicApp);
708
723
@@ -712,7 +727,7 @@ Rectangle {
712 | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation);
727 | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation);
713 compare(musicApp.stage, ApplicationInfoInterface.MainStage);
728 compare(musicApp.stage, ApplicationInfoInterface.MainStage);
714
729
715− waitUntilAppSurfaceShowsUp("music-app")
730+ waitUntilAppWindowIsFullyLoaded(musicSurfaceId);
716 tryCompare(shell, "orientationChangesEnabled", true);
731 tryCompare(shell, "orientationChangesEnabled", true);
717
732
718 rotateTo(90);
733 rotateTo(90);
@@ -747,6 +762,7 @@ Rectangle {
747 */
762 */
748 function test_rotateToUnsupportedDeviceOrientation(data) {
763 function test_rotateToUnsupportedDeviceOrientation(data) {
749 loadShell("mako");
764 loadShell("mako");
765+ var twitterSurfaceId = topLevelSurfaceList.nextId;
750 var twitterApp = ApplicationManager.startApplication("twitter-webapp");
766 var twitterApp = ApplicationManager.startApplication("twitter-webapp");
751 verify(twitterApp);
767 verify(twitterApp);
752
768
@@ -755,7 +771,7 @@ Rectangle {
755 compare(twitterApp.supportedOrientations, Qt.PortraitOrientation | Qt.LandscapeOrientation
771 compare(twitterApp.supportedOrientations, Qt.PortraitOrientation | Qt.LandscapeOrientation
756 | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation);
772 | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation);
757
773
758− waitUntilAppSurfaceShowsUp("twitter-webapp")
774+ waitUntilAppWindowIsFullyLoaded(twitterSurfaceId);
759
775
760 rotateTo(data.rotationAngle);
776 rotateTo(data.rotationAngle);
761 tryCompare(shell, "transformRotationAngle", data.rotationAngle);
777 tryCompare(shell, "transformRotationAngle", data.rotationAngle);
@@ -772,13 +788,14 @@ Rectangle {
772
788
773 function test_launchLandscapeOnlyAppFromPortrait() {
789 function test_launchLandscapeOnlyAppFromPortrait() {
774 loadShell("mako");
790 loadShell("mako");
791+ var weatherSurfaceId = topLevelSurfaceList.nextId;
775 var weatherApp = ApplicationManager.startApplication("ubuntu-weather-app");
792 var weatherApp = ApplicationManager.startApplication("ubuntu-weather-app");
776 verify(weatherApp);
793 verify(weatherApp);
777
794
778 // ensure the mock app is as we expect
795 // ensure the mock app is as we expect
779 compare(weatherApp.supportedOrientations, Qt.LandscapeOrientation | Qt.InvertedLandscapeOrientation);
796 compare(weatherApp.supportedOrientations, Qt.LandscapeOrientation | Qt.InvertedLandscapeOrientation);
780
797
781− waitUntilAppSurfaceShowsUp("ubuntu-weather-app");
798+ waitUntilAppWindowIsFullyLoaded(weatherSurfaceId);
782
799
783 var rotationStates = findInvisibleChild(orientedShell, "rotationStates");
800 var rotationStates = findInvisibleChild(orientedShell, "rotationStates");
784 waitUntilTransitionsEnd(rotationStates);
801 waitUntilTransitionsEnd(rotationStates);
@@ -810,6 +827,7 @@ Rectangle {
810 */
827 */
811 function test_greeterStaysAwayAfterRotation() {
828 function test_greeterStaysAwayAfterRotation() {
812 loadShell("mako");
829 loadShell("mako");
830+ var twitterSurfaceId = topLevelSurfaceList.nextId;
813 var twitterApp = ApplicationManager.startApplication("twitter-webapp");
831 var twitterApp = ApplicationManager.startApplication("twitter-webapp");
814 verify(twitterApp);
832 verify(twitterApp);
815
833
@@ -818,8 +836,8 @@ Rectangle {
818 compare(twitterApp.supportedOrientations, Qt.PortraitOrientation | Qt.LandscapeOrientation
836 compare(twitterApp.supportedOrientations, Qt.PortraitOrientation | Qt.LandscapeOrientation
819 | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation);
837 | Qt.InvertedPortraitOrientation | Qt.InvertedLandscapeOrientation);
820
838
821− waitUntilAppSurfaceShowsUp("twitter-webapp");
839+ waitUntilAppWindowIsFullyLoaded(twitterSurfaceId);
822− waitUntilAppWindowCanRotate("twitter-webapp");
840+ waitUntilAppWindowCanRotate(twitterSurfaceId);
823
841
824 // go back to unity8-dash
842 // go back to unity8-dash
825 performEdgeSwipeToSwitchToPreviousApp();
843 performEdgeSwipeToSwitchToPreviousApp();
@@ -835,7 +853,7 @@ Rectangle {
835 var greeter = findChild(shell, "greeter");
853 var greeter = findChild(shell, "greeter");
836 tryCompare(greeter, "animating", false);
854 tryCompare(greeter, "animating", false);
837
855
838− var twitterDelegate = findChild(shell, "appDelegate1");
856+ var twitterDelegate = findChild(shell, "spreadDelegate_" + topLevelSurfaceList.idAt(1));
839 compare(twitterDelegate.application.appId, "twitter-webapp");
857 compare(twitterDelegate.application.appId, "twitter-webapp");
840 twitterDelegate.clicked();
858 twitterDelegate.clicked();
841
859
@@ -908,9 +926,9 @@ Rectangle {
908 verify(item.application.appId, "dialer-app");
926 verify(item.application.appId, "dialer-app");
909 }
927 }
910
928
929+ WindowStateStorage.saveStage("dialer-app", ApplicationInfoInterface.SideStage)
911 var dialerApp = ApplicationManager.startApplication("dialer-app");
930 var dialerApp = ApplicationManager.startApplication("dialer-app");
912 verify(dialerApp);
931 verify(dialerApp);
913− dialerApp.stage = ApplicationInfoInterface.SideStage;
914
932
915 // ensure the mock dialer-app is as we expect
933 // ensure the mock dialer-app is as we expect
916 compare(dialerApp.rotatesWindowContents, false);
934 compare(dialerApp.rotatesWindowContents, false);
@@ -955,9 +973,9 @@ Rectangle {
955 verify(item.application.appId, "dialer-app");
973 verify(item.application.appId, "dialer-app");
956 }
974 }
957
975
976+ WindowStateStorage.saveStage("dialer-app", ApplicationInfoInterface.SideStage)
958 var dialerApp = ApplicationManager.startApplication("dialer-app");
977 var dialerApp = ApplicationManager.startApplication("dialer-app");
959 verify(dialerApp);
978 verify(dialerApp);
960− dialerApp.stage = ApplicationInfoInterface.SideStage;
961
979
962 // ensure the mock dialer-app is as we expect
980 // ensure the mock dialer-app is as we expect
963 compare(dialerApp.rotatesWindowContents, false);
981 compare(dialerApp.rotatesWindowContents, false);
@@ -1023,13 +1041,15 @@ Rectangle {
1023 function test_launchedAppHasActiveFocus(data) {
1041 function test_launchedAppHasActiveFocus(data) {
1024 loadShell(data.deviceName);
1042 loadShell(data.deviceName);
1025
1043
1044+ var gmailSurfaceId = topLevelSurfaceList.nextId;
1026 var gmailApp = ApplicationManager.startApplication("gmail-webapp");
1045 var gmailApp = ApplicationManager.startApplication("gmail-webapp");
1027 verify(gmailApp);
1046 verify(gmailApp);
1028− waitUntilAppSurfaceShowsUp("gmail-webapp")
1047+ waitUntilAppWindowIsFullyLoaded(gmailSurfaceId);
1029
1048
1030− verify(gmailApp.session.lastSurface);
1049+ var gmailSurface = gmailApp.surfaceList.get(0);
1050+ verify(gmailSurface);
1031
1051
1032− tryCompare(gmailApp.session.lastSurface, "activeFocus", true);
1052+ tryCompare(gmailSurface, "activeFocus", true);
1033 }
1053 }
1034
1054
1035 function test_launchLandscapeOnlyAppOverPortraitOnlyDashThenSwitchToDash() {
1055 function test_launchLandscapeOnlyAppOverPortraitOnlyDashThenSwitchToDash() {
@@ -1038,13 +1058,14 @@ Rectangle {
1038 // starts as portrait, as unity8-dash is portrait only
1058 // starts as portrait, as unity8-dash is portrait only
1039 tryCompare(shell, "transformRotationAngle", 0);
1059 tryCompare(shell, "transformRotationAngle", 0);
1040
1060
1061+ var weatherSurfaceId = topLevelSurfaceList.nextId;
1041 var weatherApp = ApplicationManager.startApplication("ubuntu-weather-app");
1062 var weatherApp = ApplicationManager.startApplication("ubuntu-weather-app");
1042 verify(weatherApp);
1063 verify(weatherApp);
1043
1064
1044 // ensure the mock app is as we expect
1065 // ensure the mock app is as we expect
1045 compare(weatherApp.supportedOrientations, Qt.LandscapeOrientation | Qt.InvertedLandscapeOrientation);
1066 compare(weatherApp.supportedOrientations, Qt.LandscapeOrientation | Qt.InvertedLandscapeOrientation);
1046
1067
1047− waitUntilAppSurfaceShowsUp("ubuntu-weather-app");
1068+ waitUntilAppWindowIsFullyLoaded(weatherSurfaceId);
1048
1069
1049 // should have rotated to landscape
1070 // should have rotated to landscape
1050 tryCompareFunction(function () { return shell.transformRotationAngle == 270
1071 tryCompareFunction(function () { return shell.transformRotationAngle == 270
@@ -1243,10 +1264,14 @@ Rectangle {
1243 function test_lockPhoneAfterClosingAppInSpreadThenUnlockAndRotate() {
1264 function test_lockPhoneAfterClosingAppInSpreadThenUnlockAndRotate() {
1244 loadShell("mako");
1265 loadShell("mako");
1245
1266
1267+ compare(topLevelSurfaceList.applicationAt(0).appId, "unity8-dash");
1268+ var dashSurfaceId = topLevelSurfaceList.idAt(0);
1269+
1270+ var gmailSurfaceId = topLevelSurfaceList.nextId;
1246 var gmailApp = ApplicationManager.startApplication("gmail-webapp");
1271 var gmailApp = ApplicationManager.startApplication("gmail-webapp");
1247 verify(gmailApp);
1272 verify(gmailApp);
1248
1273
1249− waitUntilAppSurfaceShowsUp("gmail-webapp");
1274+ waitUntilAppWindowIsFullyLoaded(gmailSurfaceId);
1250
1275
1251 performEdgeSwipeToShowAppSpread();
1276 performEdgeSwipeToShowAppSpread();
1252
1277
@@ -1262,7 +1287,7 @@ Rectangle {
1262
1287
1263 swipeAwayGreeter();
1288 swipeAwayGreeter();
1264
1289
1265− verify(isAppSurfaceFocused("unity8-dash"))
1290+ verify(isAppSurfaceFocused(dashSurfaceId))
1266
1291
1267 signalSpy.clear();
1292 signalSpy.clear();
1268 signalSpy.target = shell;
1293 signalSpy.target = shell;
@@ -1324,6 +1349,7 @@ Rectangle {
1324 ////
1349 ////
1325 // Launch a portrait-only application
1350 // Launch a portrait-only application
1326
1351
1352+ var dialerSurfaceId = topLevelSurfaceList.nextId;
1327 var dialerApp = ApplicationManager.startApplication("dialer-app");
1353 var dialerApp = ApplicationManager.startApplication("dialer-app");
1328 verify(dialerApp);
1354 verify(dialerApp);
1329
1355
@@ -1331,9 +1357,9 @@ Rectangle {
1331 compare(dialerApp.rotatesWindowContents, false);
1357 compare(dialerApp.rotatesWindowContents, false);
1332 compare(dialerApp.supportedOrientations, Qt.PortraitOrientation | Qt.InvertedPortraitOrientation);
1358 compare(dialerApp.supportedOrientations, Qt.PortraitOrientation | Qt.InvertedPortraitOrientation);
1333
1359
1334− waitUntilAppSurfaceShowsUp("dialer-app");
1360+ waitUntilAppWindowIsFullyLoaded(dialerSurfaceId);
1335− waitUntilAppWindowCanRotate("dialer-app");
1361+ waitUntilAppWindowCanRotate(dialerSurfaceId);
1336− verify(isAppSurfaceFocused("dialer-app"));
1362+ verify(isAppSurfaceFocused(dialerSurfaceId));
1337
1363
1338 ////
1364 ////
1339 // check outcome (shell should stay in landscape)
1365 // check outcome (shell should stay in landscape)
@@ -1386,17 +1412,29 @@ Rectangle {
1386 tryCompare(appWindowStates, "state", "surface");
1412 tryCompare(appWindowStates, "state", "surface");
1387 }
1413 }
1388
1414
1389− function waitUntilAppSurfaceShowsUp(appId) {
1415+ function findAppWindowForSurfaceId(surfaceId) {
1390− var appWindow = findChild(shell, "appWindow_" + appId);
1416+ // for PhoneStage and TabletStage
1391− verify(appWindow);
1417+ var delegate = findChild(shell, "spreadDelegate_" + surfaceId);
1392− var appWindowStates = findInvisibleChild(appWindow, "applicationWindowStateGroup");
1418+ if (!delegate) {
1393− verify(appWindowStates);
1419+ // for DesktopStage
1394− tryCompare(appWindowStates, "state", "surface");
1420+ delegate = findChild(shell, "appDelegate_" + surfaceId);
1421+ }
1422+ verify(delegate);
1423+ var appWindow = findChild(delegate, "appWindow");
1424+ return appWindow;
1395 }
1425 }
1396
1426
1427+ // Wait until the ApplicationWindow for the given Application object is fully loaded
1428+ // (ie, the real surface has replaced the splash screen)
1429+ function waitUntilAppWindowIsFullyLoaded(surfaceId) {
1430+ var appWindow = findAppWindowForSurfaceId(surfaceId);
1431+ var appWindowStateGroup = findInvisibleChild(appWindow, "applicationWindowStateGroup");
1432+ tryCompareFunction(function() { return appWindowStateGroup.state === "surface" }, true);
1433+ waitUntilTransitionsEnd(appWindowStateGroup);
1434+ }
1435+
1397− function waitUntilAppWindowCanRotate(appId) {
1436+ function waitUntilAppWindowCanRotate(surfaceId) {
1398− var appWindow = findChild(shell, "appWindow_" + appId);
1437+ var appWindow = findAppWindowForSurfaceId(surfaceId);
1399− verify(appWindow);
1400 tryCompare(appWindow, "orientationChangesEnabled", true);
1438 tryCompare(appWindow, "orientationChangesEnabled", true);
1401 }
1439 }
1402
1440
@@ -1426,8 +1464,8 @@ Rectangle {
1426 var spreadView = findChild(shell, "spreadView");
1464 var spreadView = findChild(shell, "spreadView");
1427 verify(spreadView);
1465 verify(spreadView);
1428
1466
1429− verify(ApplicationManager.count >= 2);
1467+ verify(topLevelSurfaceList.count >= 2);
1430− var previousApp = ApplicationManager.get(1);
1468+ var previousSurfaceId = topLevelSurfaceList.idAt(1);
1431
1469
1432 var touchStartX = shell.width - 1;
1470 var touchStartX = shell.width - 1;
1433 var touchStartY = shell.height / 2;
1471 var touchStartY = shell.height / 2;
@@ -1453,7 +1491,7 @@ Rectangle {
1453 // ensure the app switch animation has ended
1491 // ensure the app switch animation has ended
1454 tryCompare(spreadView, "shiftedContentX", 0);
1492 tryCompare(spreadView, "shiftedContentX", 0);
1455
1493
1456− compare(ApplicationManager.get(0).appId, previousApp.appId);
1494+ tryCompareFunction(function(){ return topLevelSurfaceList.idAt(0); }, previousSurfaceId);
1457 }
1495 }
1458
1496
1459 function performEdgeSwipeToShowAppSpread() {
1497 function performEdgeSwipeToShowAppSpread() {
@@ -1508,14 +1546,6 @@ Rectangle {
1508 tryCompare(greeter, "fullyShown", true);
1546 tryCompare(greeter, "fullyShown", true);
1509 }
1547 }
1510
1548
1511− function killApps() {
1512− while (ApplicationManager.count > 1) {
1513− var appIndex = ApplicationManager.get(0).appId == "unity8-dash" ? 1 : 0
1514− ApplicationManager.stopApplication(ApplicationManager.get(appIndex).appId);
1515− }
1516− compare(ApplicationManager.count, 1)
1517− }
1518−
1519 function loadShell(deviceName) {
1549 function loadShell(deviceName) {
1520 applicationArguments.deviceName = deviceName;
1550 applicationArguments.deviceName = deviceName;
1521
1551
@@ -1527,6 +1557,12 @@ Rectangle {
1527
1557
1528 shell = findChild(orientedShell, "shell");
1558 shell = findChild(orientedShell, "shell");
1529
1559
1560+ topLevelSurfaceList = findInvisibleChild(shell, "topLevelSurfaceList");
1561+ verify(topLevelSurfaceList);
1562+
1563+ var stageLoader = findChild(shell, "applicationsDisplayLoader");
1564+ verify(stageLoader);
1565+
1530 tryCompare(shell, "enabled", true); // enabled by greeter when ready
1566 tryCompare(shell, "enabled", true); // enabled by greeter when ready
1531
1567
1532 waitUntilShellIsInOrientation(root.physicalOrientation0);
1568 waitUntilShellIsInOrientation(root.physicalOrientation0);
@@ -1535,7 +1571,7 @@ Rectangle {
1535
1571
1536 swipeAwayGreeter();
1572 swipeAwayGreeter();
1537
1573
1538− var spreadRepeater = findChild(shell, "spreadRepeater");
1574+ var spreadRepeater = findChild(stageLoader, "spreadRepeater");
1539 if (spreadRepeater) {
1575 if (spreadRepeater) {
1540 spreadRepeaterConnections.target = spreadRepeater;
1576 spreadRepeaterConnections.target = spreadRepeater;
1541 }
1577 }
@@ -1556,7 +1592,7 @@ Rectangle {
1556
1592
1557 // expectedAngle is in orientedShell's coordinate system
1593 // expectedAngle is in orientedShell's coordinate system
1558 function checkAppSurfaceOrientation(item, app, expectedAngle) {
1594 function checkAppSurfaceOrientation(item, app, expectedAngle) {
1559− var surface = app.session.lastSurface;
1595+ var surface = app.surfaceList.get(0);
1560 if (!surface) {
1596 if (!surface) {
1561 console.warn("no surface");
1597 console.warn("no surface");
1562 return false;
1598 return false;
@@ -1611,7 +1647,7 @@ Rectangle {
1611 var spreadView = findChild(shell, "spreadView");
1647 var spreadView = findChild(shell, "spreadView");
1612 verify(spreadView);
1648 verify(spreadView);
1613
1649
1614− var delegateToClose = findChild(spreadView, "appDelegate0");
1650+ var delegateToClose = findChild(spreadView, "spreadDelegate_" + topLevelSurfaceList.idAt(0));
1615 verify(delegateToClose);
1651 verify(delegateToClose);
1616
1652
1617 var appIdToClose = ApplicationManager.get(0).appId;;
1653 var appIdToClose = ApplicationManager.get(0).appId;;
@@ -1637,20 +1673,11 @@ Rectangle {
1637 compare(ApplicationManager.findApplication(appIdToClose), null);
1673 compare(ApplicationManager.findApplication(appIdToClose), null);
1638 }
1674 }
1639
1675
1640− function isAppSurfaceFocused(appId) {
1676+ function isAppSurfaceFocused(surfaceId) {
1641− var appWindow = findChild(shell, "appWindow_" + appId);
1677+ var index = topLevelSurfaceList.indexForId(surfaceId);
1642− verify(appWindow);
1678+ var surface = topLevelSurfaceList.surfaceAt(index);
1643−
1644− var app = ApplicationManager.findApplication(appId);
1645− verify(app);
1646−
1647− var surface = app.session.lastSurface;
1648 verify(surface);
1679 verify(surface);
1649−
1650− var surfaceItem = findSurfaceItem(appWindow, surface);
1651− verify(surfaceItem);
1652−
1653− return surfaceItem.activeFocus;
1680+ return surface.activeFocus;
1654 }
1681 }
1655 }
1682 }
1656}
1683}
tests/qmltests/tst_Shell.qml+236−170

This diff is too big to show here.

tests/qmltests/tst_ShellWithPin.qml+9−13

This diff is too big to show here.

tests/utils/modules/Unity/Test/UnityTestCase.qml+20−2

This diff is too big to show here.