on xenial help sign in
Merge
commit0ab7cfa3dcd8676f734e453ef889c3f61a6ae758 authorAlbert Astals Cid <albert.astals@canonical.com> dateTue 26 Apr 2016, 09:32 (10 years ago) parent4ebbd8e7c4428e
179 files changed+6902−5312
CMakeLists.txt+1−1 data/com.canonical.Unity8.gschema.xml+5 debian/bileto_pre_release_hook+5 debian/changelog+28 debian/control+3−3 debian/rules−8 debian/unity8-private.install+1 plugins/CMakeLists.txt+1 plugins/WindowManager/CMakeLists.txt+13 plugins/WindowManager/TopLevelSurfaceList.cpp+486 plugins/WindowManager/TopLevelSurfaceList.h+223 plugins/WindowManager/WindowManagerPlugin.cpp+28 tests/mocks/Unity/Application/SessionManager.h → plugins/WindowManager/WindowManagerPlugin.h+10−22 plugins/WindowManager/qmldir+2 po/aa.po+9−9 po/am.po+12−18 po/ar.po+9−9 po/ast.po+30−39 po/az.po+9−9 po/be.po+9−9 po/bg.po+9−9 po/bn.po+9−9 po/br.po+57−64 po/bs.po+9−9 po/ca.po+11−11 po/ca@valencia.po+9−9 po/ce.po+9−9 po/ckb.po+9−9 po/cs.po+9−9 po/cy.po+9−9 po/da.po+9−9 po/de.po+90−78 po/el.po+79−66 po/en_AU.po+13−10 po/en_GB.po+13−10 po/eo.po+9−9 po/es.po+16−13 po/eu.po+9−9 po/fa.po+13−10 po/fi.po+90−84 po/fo.po+9−9 po/fr.po+18−15 po/ga.po+9−9 po/gd.po+95−75 po/gl.po+87−82 po/gv.po+9−9 po/he.po+9−9 po/hi.po+9−9 po/hr.po+91−82 po/hu.po+13−19 po/hy.po+9−9 po/ia.po+89−82 po/id.po+9−9 po/is.po+9−9 po/it.po+14−11 po/ja.po+9−9 po/km.po+31−34 po/kn.po+9−9 po/ko.po+9−18 po/ku.po+9−9 po/ky.po+9−9 po/lo.po+9−9 po/lt.po+9−9 po/lv.po+9−9 po/ml.po+9−9 po/mr.po+9−9 po/ms.po+9−9 po/my.po+9−9 po/nb.po+13−10 po/ne.po+9−9 po/nl.po+26−31 po/nn.po+9−9 po/oc.po+353−110 po/or.po+9−9 po/pa.po+9−9 po/pl.po+76−56 po/pt.po+88−85 po/pt_BR.po+23−23 po/ro.po+9−9 po/ru.po+36−30 po/shn.po+9−9 po/si.po+9−9 po/sk.po+13−10 po/sl.po+92−75 po/sq.po+36−35 po/sr.po+13−19 po/sv.po+13−10 po/sw.po+9−9 po/ta.po+9−9 po/te.po+9−9 po/th.po+9−9 po/tr.po+9−9 po/ug.po+9−9 po/uk.po+13−10 po/unity8.pot+8−8 po/ur.po+9−9 po/uz.po+9−9 po/vi.po+9−9 po/wo.po+9−9 po/xh.po+9−9 po/zh_CN.po+87−93 po/zh_HK.po+9−9 po/zh_TW.po+11−20 qml/Components/Dialogs.qml+2−2 qml/Components/KeymapSwitcher.qml+65 qml/Greeter/Greeter.qml+5−4 qml/Launcher/LauncherPanel.qml+1 qml/OrientedShell.qml+27−12 qml/Shell.qml+69−102 qml/Stages/AbstractStage.qml+9−3 qml/Stages/Animations/BaseSessionAnimation.qml−96 qml/Stages/Animations/SwipeFromBottomAnimation.qml−53 qml/Stages/ApplicationWindow.qml+113−77 qml/Stages/DecoratedWindow.qml+5−5 qml/Stages/DesktopSpread.qml+22−18 qml/Stages/DesktopSpreadDelegate.qml+4−3 qml/Stages/DesktopStage.qml+158−101 qml/Stages/PhoneStage.qml+152−91 qml/Stages/PromptSurfaceAnimations.qml+81 qml/Stages/SessionContainer.qml−180 qml/Stages/SpreadDelegate.qml+4−4 qml/Stages/StagedFullscreenPolicy.qml+12−14 qml/Stages/SurfaceContainer.qml+97−53 qml/Stages/TabletStage.qml+300−239 qml/Stages/TopLevelSurfaceRepeater.qml+52 qml/Stages/TransformedSpreadDelegate.qml+4−4 qml/Stages/TransformedTabletSpreadDelegate.qml+29−23 qml/Stages/WindowedFullscreenPolicy.qml+5−7 qml/Tutorial/TutorialBottom.qml+1−1 tests/mocks/GSettings.1.0/fake_gsettings.cpp+126−38 tests/mocks/GSettings.1.0/fake_gsettings.h+51−26 tests/mocks/Unity/Application/ApplicationInfo.cpp+181−108 tests/mocks/Unity/Application/ApplicationInfo.h+39−24 tests/mocks/Unity/Application/ApplicationManager.cpp+109−74 tests/mocks/Unity/Application/ApplicationManager.h+12−14 tests/mocks/Unity/Application/ApplicationScreenshotProvider.cpp−79 tests/mocks/Unity/Application/ApplicationScreenshotProvider.h−34 tests/mocks/Unity/Application/ApplicationTestInterface.cpp−117 tests/mocks/Unity/Application/ApplicationTestInterface.h−45 tests/mocks/Unity/Application/CMakeLists.txt+3−5 tests/mocks/Unity/Application/MirSurface.cpp+191−30 tests/mocks/Unity/Application/MirSurface.h+56−12 tests/mocks/Unity/Application/MirSurfaceItem.cpp+13−7 tests/mocks/Unity/Application/MirSurfaceListModel.cpp+121 tests/mocks/Unity/Application/MirSurfaceListModel.h+56 tests/mocks/Unity/Application/ObjectListModel.h+2 tests/mocks/Unity/Application/Session.cpp−209 tests/mocks/Unity/Application/Session.h−104 tests/mocks/Unity/Application/SessionManager.cpp−55 tests/mocks/Unity/Application/SessionModel.h−35 tests/mocks/Unity/Application/SurfaceManager.cpp+16−9 tests/mocks/Unity/Application/SurfaceManager.h+5−2 tests/mocks/Unity/Application/UbuntuKeyboardInfo.cpp−2 tests/mocks/Unity/Application/UbuntuKeyboardInfo.h−9 tests/mocks/Unity/Application/VirtualKeyboard.cpp+2−3 tests/mocks/Unity/Application/VirtualKeyboard.h+1−1 tests/mocks/Unity/Application/plugin.cpp+33−38 tests/mocks/Utils/CMakeLists.txt+4 tests/mocks/Utils/plugin.cpp+1−1 tests/plugins/Unity/Launcher/launchermodeltest.cpp+2−3 tests/qmltests/CMakeLists.txt−1 tests/qmltests/Dash/tst_DashShell.qml+6−2 tests/qmltests/Greeter/tst_Greeter.qml+2−2 tests/qmltests/Panel/tst_ActiveCallHint.qml+3−2 tests/qmltests/Panel/tst_Panel.qml+2−2 tests/qmltests/Stages/ApplicationCheckBox.qml+104−58 tests/qmltests/Stages/RecursingChildSessionControl.qml+10−61 tests/qmltests/Stages/tst_ApplicationWindow.qml+73−59 tests/qmltests/Stages/tst_DesktopStage.qml+243−161 tests/qmltests/Stages/tst_PhoneStage.qml+272−82 tests/qmltests/Stages/tst_SessionContainer.qml−331 tests/qmltests/Stages/tst_SpreadDelegate.qml+3−2 tests/qmltests/Stages/tst_SurfaceContainer.qml+242−46 tests/qmltests/Stages/tst_TabletStage.qml+252−89 tests/qmltests/Tutorial/tst_Tutorial.qml+4−8 tests/qmltests/tst_OrientedShell.qml+124−87 tests/qmltests/tst_Shell.qml+236−170 tests/qmltests/tst_ShellWithPin.qml+9−13 tests/utils/modules/Unity/Test/UnityTestCase.qml+21−3
CMakeLists.txt+1−1
@@ -57,7 +57,7 @@ find_package(Qt5DBus 5.4 REQUIRED)
5757find_package(Qt5Concurrent 5.4 REQUIRED)
5858find_package(Qt5Sql 5.4 REQUIRED)
5959
60−pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=14)
60+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=15)
6161pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
6262pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
6363pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
data/com.canonical.Unity8.gschema.xml+5
@@ -27,6 +27,11 @@
2727 <summary>Maximum push needed to overcome edge barrier</summary>
2828 <description>How much you have to push (in grid units) the mouse against an edge barrier when sensibility is 1.</description>
2929 </key>
30+ <key type="u" name="edge-drag-width">
31+ <default>2</default>
32+ <summary>The width of the edge drag areas</summary>
33+ <description>How big (in grid units) the edge-drag sensitive area should be.</description>
34+ </key>
3035 <key type="b" name="autohide-launcher">
3136 <default>true</default>
3237 <summary>Autohide the launcher</summary>
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+28
@@ -1,3 +1,31 @@
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+
17+unity8 (8.12+16.04.20160414.1-0ubuntu1) xenial; urgency=medium
18+
19+ [ Michael Terry ]
20+ * Make sure that usageMode is set on startup, fixing a problem with
21+ the tutorial not noticing that it is running on a desktop. (LP:
22+ #1564351)
23+
24+ [ Michael Zanetti ]
25+ * make the edge drag area width configurable (LP: #1559512)
26+
27+ -- Michael Zanetti <michael.zanetti@canonical.com> Thu, 14 Apr 2016 21:20:28 +0000
28+
129unity8 (8.12+16.04.20160401-0ubuntu1) xenial; urgency=medium
230
331 * Add missing Testsuite header
debian/control+3−3
@@ -32,7 +32,7 @@ Build-Depends: cmake,
3232 libubuntugestures5-dev,
3333 libubuntugestures5-private-dev,
3434 libudev-dev,
35− libunity-api-dev (>= 7.108),
35+ libunity-api-dev (>= 7.110),
3636 libusermetricsoutput1-dev,
3737# Need those X11 libs touch emulation from mouse events in manual QML tests on a X11 desktop
3838 libx11-dev[!armhf],
@@ -135,7 +135,7 @@ Depends: qml-module-qtquick-layouts,
135135 qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1845) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1845),
136136 qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
137137 ubuntu-thumbnailer-impl-0,
138− unity-application-impl-14,
138+ unity-application-impl-15,
139139 unity-notifications-impl-3,
140140 unity-plugin-scopes | unity-scopes-impl,
141141 unity-scopes-impl-11,
@@ -181,7 +181,7 @@ Pre-Depends: ${misc:Pre-Depends},
181181Depends: ${misc:Depends},
182182 ${shlibs:Depends},
183183Provides: unity-application-impl,
184− unity-application-impl-14,
184+ unity-application-impl-15,
185185Replaces: unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1)
186186Description: Fake environment for running Unity 8 shell
187187 Provides fake implementations of some QML modules used by Unity 8 shell
debian/rules−8
@@ -36,11 +36,3 @@ override_dh_makeshlibs:
3636# libMockLightDM-qml.so links against liblightdm-qt5-2.so which doesn't exist
3737override_dh_shlibdeps:
3838 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
@@ -13,6 +13,7 @@ usr/lib/*/unity8/qml/Ubuntu
1313usr/lib/*/unity8/qml/Unity
1414usr/lib/*/unity8/qml/UInput
1515usr/lib/*/unity8/qml/Utils
16+usr/lib/*/unity8/qml/WindowManager
1617usr/lib/*/unity8/qml/Wizard
1718usr/share/accountsservice/interfaces
1819usr/share/dbus-1/interfaces
plugins/CMakeLists.txt+1
@@ -25,4 +25,5 @@ add_subdirectory(Ubuntu)
2525add_subdirectory(UInput)
2626add_subdirectory(Unity)
2727add_subdirectory(Utils)
28+add_subdirectory(WindowManager)
2829add_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 @@
11/*
2− * Copyright (C) 2014 Canonical, Ltd.
2+ * Copyright (C) 2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -14,31 +14,19 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−#ifndef SESSIONMANAGER_H
18−#define SESSIONMANAGER_H
17+#ifndef WINDOWMANAGER_PLUGIN_H
18+#define WINDOWMANAGER_PLUGIN_H
1919
20−#include <QObject>
20+#include <QtQml/QQmlEngine>
21+#include <QtQml/QQmlExtensionPlugin>
2122
22−class Session;
23−
24−class SessionManager : public QObject
23+class WindowManagerPlugin : public QQmlExtensionPlugin
2524{
2625 Q_OBJECT
27−public:
28− explicit SessionManager(QObject *parent = 0);
29−
30− static SessionManager *singleton();
31−
32− Q_INVOKABLE Session* createSession(const QString& name, const QUrl& screenshot);
26+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
3327
34− void registerSession(Session *session);
35−
36−Q_SIGNALS:
37− void sessionStarting(Session *session);
38− void sessionStopping(Session *session);
39−
40−private:
41− static SessionManager *the_session_manager;
28+public:
29+ void registerTypes(const char *uri) override;
4230};
4331
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 ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2016-02-12 10:18+0000\n"
1212"Last-Translator: Charif AYFARAH <ayfarah@ymail.com>\n"
1313"Language-Team: Afar <aa@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/am.po+12−18
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2016-03-24 19:07+0000\n"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-25 05:54+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -446,19 +446,19 @@ msgstr "ወደ ላይ ይጥረጉ መልእክት ለ መፍጠር"
446446msgid "Swipe up to manage the app"
447447msgstr "ወደ ላይ ይጥረጉ መተግበሪያ ለማስተዳደር"
448448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
452−
453449#: qml/Tutorial/TutorialLeftLong.qml:47
454450msgid "Long swipe from the left edge to open the Today scope"
455451msgstr "በ ረጅሙ ከ ግራ ጠርዝ በኩል ይጥረጉ የ ዛሬን ክልል ለ መክፈት"
456452
457−#: qml/Tutorial/TutorialRight.qml:54
458−msgid "Hover your mouse on the right edge to view your open apps"
459−msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
453+#: qml/Tutorial/TutorialLeft.qml:47
454+msgid "Swipe from the left edge to open the launcher"
455+msgstr "ከ ግራ ጠርዝ በኩል ይጥረጉ ማስጀመሪያውን ለ መክፈት"
460456
461457#: 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
462462msgid "Short or long swipe from the right edge to view your open apps"
463463msgstr "በ አጭሩ ወይንም በ ረጅሙ ይጥረጉ ከ ቀኝ ጠረዝ በኩል የ ተከፈቱ መተግበሪያዎችን ለማየት"
464464
@@ -1051,11 +1051,5 @@ msgstr "በጣም ደካማ የ መግቢያ ቃል"
10511051#~ msgid "Call back"
10521052#~ msgstr "መልሶ መደወያ"
10531053
1054−#~ msgid "Welcome to your Ubuntu device."
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 "የ እርስዎ አካል አሁን ዝግጁ ነው"
1054+#~ msgid "Hover your mouse on the right edge to view your open apps"
1055+#~ msgstr "የ እርስዎን አይጥ ወደ ቀኝ ጠርዝ በኩል ሲያደርጉ የ ተከፈቱ መተግበሪያዎች መመልከቻ"
po/ar.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-29 09:41+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
1818"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"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -465,19 +465,19 @@ msgstr ""
465465msgid "Swipe up to manage the app"
466466msgstr ""
467467
468−#: qml/Tutorial/TutorialLeft.qml:47
469−msgid "Swipe from the left edge to open the launcher"
470−msgstr ""
471−
472468#: qml/Tutorial/TutorialLeftLong.qml:47
473469msgid "Long swipe from the left edge to open the Today scope"
474470msgstr ""
475471
476−#: qml/Tutorial/TutorialRight.qml:54
477−msgid "Hover your mouse on the right edge to view your open apps"
472+#: qml/Tutorial/TutorialLeft.qml:47
473+msgid "Swipe from the left edge to open the launcher"
478474msgstr ""
479475
480476#: 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
481481msgid "Short or long swipe from the right edge to view your open apps"
482482msgstr ""
483483
po/ast.po+30−39
@@ -7,16 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11−"PO-Revision-Date: 2016-03-12 00:17+0000\n"
12−"Last-Translator: enolp <enolp@softastur.org>\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11+"PO-Revision-Date: 2016-04-17 16:57+0000\n"
12+"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -187,7 +187,7 @@ msgstr ""
187187
188188#: qml/Dash/FiltersPopover.qml:69
189189msgid "Reset"
190−msgstr ""
190+msgstr "Reafitar"
191191
192192#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
193193msgid "See less"
@@ -208,7 +208,7 @@ msgstr ""
208208
209209#: qml/Dash/PageHeaderExtraPanel.qml:66
210210msgid "Clear All"
211−msgstr ""
211+msgstr "Llimpiar too"
212212
213213#: qml/Dash/Previews/PreviewActionCombo.qml:35
214214msgid "More..."
@@ -447,19 +447,19 @@ msgstr ""
447447msgid "Swipe up to manage the app"
448448msgstr ""
449449
450−#: qml/Tutorial/TutorialLeft.qml:47
451−msgid "Swipe from the left edge to open the launcher"
452−msgstr ""
453−
454450#: qml/Tutorial/TutorialLeftLong.qml:47
455451msgid "Long swipe from the left edge to open the Today scope"
456452msgstr ""
457453
458−#: qml/Tutorial/TutorialRight.qml:54
459−msgid "Hover your mouse on the right edge to view your open apps"
454+#: qml/Tutorial/TutorialLeft.qml:47
455+msgid "Swipe from the left edge to open the launcher"
460456msgstr ""
461457
462458#: 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
463463msgid "Short or long swipe from the right edge to view your open apps"
464464msgstr ""
465465
@@ -478,7 +478,7 @@ msgstr "Atrás"
478478
479479#: qml/Wizard/Pages/10-welcome.qml:27
480480msgid "Language"
481−msgstr ""
481+msgstr "Llingua"
482482
483483#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
484484#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -487,7 +487,7 @@ msgstr ""
487487#: qml/Wizard/Pages/passcode-desktop.qml:124
488488#: qml/Wizard/Pages/password-set.qml:141
489489msgid "Next"
490−msgstr ""
490+msgstr "Siguiente"
491491
492492#: qml/Wizard/Pages/30-wifi.qml:29
493493msgid "Connect to Wi‑Fi"
@@ -495,15 +495,15 @@ msgstr "Coneutase al WiFi"
495495
496496#: qml/Wizard/Pages/30-wifi.qml:130
497497msgid "Connected"
498−msgstr ""
498+msgstr "Coneutáu"
499499
500500#: qml/Wizard/Pages/30-wifi.qml:163
501501msgid "Available Wi-Fi networks"
502−msgstr ""
502+msgstr "Redes Wi-Fi disponibles"
503503
504504#: qml/Wizard/Pages/30-wifi.qml:164
505505msgid "No available Wi-Fi networks"
506−msgstr ""
506+msgstr "Nun hai redes Wi-Fi disponibles"
507507
508508#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
509509#: qml/Wizard/Pages/sim.qml:101
@@ -544,23 +544,23 @@ msgstr ""
544544
545545#: qml/Wizard/Pages/50-timezone.qml:29
546546msgid "Time Zone"
547−msgstr ""
547+msgstr "Estaya horaria"
548548
549549#: qml/Wizard/Pages/50-timezone.qml:178
550550msgid "Enter your city"
551−msgstr ""
551+msgstr "Escribe la ciudá"
552552
553553#: qml/Wizard/Pages/60-account.qml:24
554554msgid "Personalize Your Device"
555−msgstr ""
555+msgstr "Personaliza'l preséu"
556556
557557#: qml/Wizard/Pages/60-account.qml:48
558558msgid "Preferred Name"
559−msgstr ""
559+msgstr "Nome preferíu"
560560
561561#: qml/Wizard/Pages/70-passwd-type.qml:39
562562msgid "Lock Screen"
563−msgstr ""
563+msgstr "Bloquiar pantalla"
564564
565565#: qml/Wizard/Pages/70-passwd-type.qml:101
566566msgctxt "Label: Type of security method"
@@ -595,7 +595,7 @@ msgstr ""
595595
596596#: qml/Wizard/Pages/80-finished.qml:89
597597msgid "Welcome to Ubuntu"
598−msgstr ""
598+msgstr "Bienveníu/a a Ubuntu"
599599
600600#: qml/Wizard/Pages/80-finished.qml:104
601601msgid "You are ready to use your device now"
@@ -603,7 +603,7 @@ msgstr ""
603603
604604#: qml/Wizard/Pages/80-finished.qml:124
605605msgid "Get Started"
606−msgstr ""
606+msgstr "Primeros pasos"
607607
608608#: qml/Wizard/Pages/here-terms.qml:25
609609msgid "Terms & Conditions"
@@ -692,7 +692,7 @@ msgstr ""
692692
693693#: qml/Wizard/Pages/password-set.qml:103
694694msgid "Confirm password"
695−msgstr ""
695+msgstr "Confirmar contraseña"
696696
697697#: qml/Wizard/Pages/sim.qml:27
698698msgid "No SIM card installed"
@@ -728,19 +728,19 @@ msgstr ""
728728
729729#: qml/Wizard/PasswordMeter.qml:93
730730msgid "Strong password"
731−msgstr ""
731+msgstr "Contraseña fuerte"
732732
733733#: qml/Wizard/PasswordMeter.qml:95
734734msgid "Fair password"
735−msgstr ""
735+msgstr "Contraseña aceutable"
736736
737737#: qml/Wizard/PasswordMeter.qml:97
738738msgid "Weak password"
739−msgstr ""
739+msgstr "Contraseña feble"
740740
741741#: qml/Wizard/PasswordMeter.qml:99
742742msgid "Very weak password"
743−msgstr ""
743+msgstr "Contraseña feble enforma"
744744
745745#~ msgid "Skip intro"
746746#~ msgstr "Omitir la intro"
@@ -1056,12 +1056,3 @@ msgstr ""
10561056
10571057#~ msgid "Call back"
10581058#~ msgstr "Devolver llamada"
1059−
1060−#~ msgid "Your device is now ready to use."
1061−#~ msgstr "Agora'l to preséu ta preparáu pa usase."
1062−
1063−#~ msgid "Welcome to your Ubuntu device."
1064−#~ msgstr "Bienllegáu/ada al to preséu d'Ubuntu."
1065−
1066−#~ msgid "Please select how you’d like to unlock your device."
1067−#~ msgstr "Esbilla cómo te prestaría desbloquiar el to preséu, por favor."
po/az.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2014-09-03 16:39+0000\n"
1212"Last-Translator: Nicat Məmmədov <n1c4t97@gmail.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -444,19 +444,19 @@ msgstr ""
444444msgid "Swipe up to manage the app"
445445msgstr ""
446446
447−#: qml/Tutorial/TutorialLeft.qml:47
448−msgid "Swipe from the left edge to open the launcher"
449−msgstr ""
450−
451447#: qml/Tutorial/TutorialLeftLong.qml:47
452448msgid "Long swipe from the left edge to open the Today scope"
453449msgstr ""
454450
455−#: qml/Tutorial/TutorialRight.qml:54
456−msgid "Hover your mouse on the right edge to view your open apps"
451+#: qml/Tutorial/TutorialLeft.qml:47
452+msgid "Swipe from the left edge to open the launcher"
457453msgstr ""
458454
459455#: 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
460460msgid "Short or long swipe from the right edge to view your open apps"
461461msgstr ""
462462
po/be.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-12-13 13:12+0000\n"
1212"Last-Translator: Mikhail_SaTuRn <mikhail_saturn@tut.by>\n"
1313"Language-Team: Belarusian <be@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -454,19 +454,19 @@ msgstr ""
454454msgid "Swipe up to manage the app"
455455msgstr ""
456456
457−#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Swipe from the left edge to open the launcher"
459−msgstr ""
460−
461457#: qml/Tutorial/TutorialLeftLong.qml:47
462458msgid "Long swipe from the left edge to open the Today scope"
463459msgstr ""
464460
465−#: qml/Tutorial/TutorialRight.qml:54
466−msgid "Hover your mouse on the right edge to view your open apps"
461+#: qml/Tutorial/TutorialLeft.qml:47
462+msgid "Swipe from the left edge to open the launcher"
467463msgstr ""
468464
469465#: 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
470470msgid "Short or long swipe from the right edge to view your open apps"
471471msgstr ""
472472
po/bg.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-04-12 14:43+0000\n"
1212"Last-Translator: George Karavasilev <kokoto-java@ubuntu.com>\n"
1313"Language-Team: Bulgarian <bg@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -442,19 +442,19 @@ msgstr ""
442442msgid "Swipe up to manage the app"
443443msgstr ""
444444
445−#: qml/Tutorial/TutorialLeft.qml:47
446−msgid "Swipe from the left edge to open the launcher"
447−msgstr ""
448−
449445#: qml/Tutorial/TutorialLeftLong.qml:47
450446msgid "Long swipe from the left edge to open the Today scope"
451447msgstr ""
452448
453−#: qml/Tutorial/TutorialRight.qml:54
454−msgid "Hover your mouse on the right edge to view your open apps"
449+#: qml/Tutorial/TutorialLeft.qml:47
450+msgid "Swipe from the left edge to open the launcher"
455451msgstr ""
456452
457453#: 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
458458msgid "Short or long swipe from the right edge to view your open apps"
459459msgstr ""
460460
po/bn.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-11-27 19:38+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Bengali <bn@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -443,19 +443,19 @@ msgstr ""
443443msgid "Swipe up to manage the app"
444444msgstr ""
445445
446−#: qml/Tutorial/TutorialLeft.qml:47
447−msgid "Swipe from the left edge to open the launcher"
448−msgstr ""
449−
450446#: qml/Tutorial/TutorialLeftLong.qml:47
451447msgid "Long swipe from the left edge to open the Today scope"
452448msgstr ""
453449
454−#: qml/Tutorial/TutorialRight.qml:54
455−msgid "Hover your mouse on the right edge to view your open apps"
450+#: qml/Tutorial/TutorialLeft.qml:47
451+msgid "Swipe from the left edge to open the launcher"
456452msgstr ""
457453
458454#: 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
459459msgid "Short or long swipe from the right edge to view your open apps"
460460msgstr ""
461461
po/br.po+57−64
@@ -7,16 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11−"PO-Revision-Date: 2016-02-22 12:29+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11+"PO-Revision-Date: 2016-04-18 07:33+0000\n"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -144,6 +144,8 @@ msgctxt ""
144144"Re-dock means connect the device again to an external screen/mouse/keyboard"
145145msgid "Re-dock, save your work and close these apps to continue."
146146msgstr ""
147+"Adkevreit ouzh ar savlec'h degemer, enrollot ho labour ha serrit an arloadoù-"
148+"mañ evit kenderc'hel."
147149
148150#: qml/Components/ModeSwitchWarningDialog.qml:63
149151msgid "Or force close now (unsaved data will be lost)."
@@ -191,7 +193,7 @@ msgstr ""
191193
192194#: qml/Dash/FiltersPopover.qml:69
193195msgid "Reset"
194−msgstr ""
196+msgstr "Adderaouekaat"
195197
196198#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
197199msgid "See less"
@@ -208,11 +210,11 @@ msgstr "Klask"
208210
209211#: qml/Dash/PageHeaderExtraPanel.qml:55
210212msgid "Recent Searches"
211−msgstr ""
213+msgstr "Enklaskoù graet nevez zo"
212214
213215#: qml/Dash/PageHeaderExtraPanel.qml:66
214216msgid "Clear All"
215−msgstr ""
217+msgstr "Diverkañ pep tra"
216218
217219#: qml/Dash/Previews/PreviewActionCombo.qml:35
218220msgid "More..."
@@ -433,7 +435,7 @@ msgstr ""
433435
434436#: qml/Tutorial/TutorialBottom.qml:78
435437msgid "Swipe up to add a contact"
436−msgstr ""
438+msgstr "Riklit d'an nec'h evit ouzhpennañ un darempred"
437439
438440#: qml/Tutorial/TutorialBottom.qml:80
439441msgid "Swipe up for favorite calculations"
@@ -445,25 +447,25 @@ msgstr ""
445447
446448#: qml/Tutorial/TutorialBottom.qml:84
447449msgid "Swipe up to create a message"
448−msgstr ""
450+msgstr "Riklit d'an nec'h evit krouiñ ur gemennadenn"
449451
450452#: qml/Tutorial/TutorialBottom.qml:85
451453msgid "Swipe up to manage the app"
452454msgstr ""
453455
454−#: qml/Tutorial/TutorialLeft.qml:47
455−msgid "Swipe from the left edge to open the launcher"
456−msgstr ""
457−
458456#: qml/Tutorial/TutorialLeftLong.qml:47
459457msgid "Long swipe from the left edge to open the Today scope"
460458msgstr ""
461459
462−#: qml/Tutorial/TutorialRight.qml:54
463−msgid "Hover your mouse on the right edge to view your open apps"
460+#: qml/Tutorial/TutorialLeft.qml:47
461+msgid "Swipe from the left edge to open the launcher"
464462msgstr ""
465463
466464#: 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
467469msgid "Short or long swipe from the right edge to view your open apps"
468470msgstr ""
469471
@@ -482,7 +484,7 @@ msgstr "Distreiñ"
482484
483485#: qml/Wizard/Pages/10-welcome.qml:27
484486msgid "Language"
485−msgstr ""
487+msgstr "Yezh"
486488
487489#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
488490#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -491,7 +493,7 @@ msgstr ""
491493#: qml/Wizard/Pages/passcode-desktop.qml:124
492494#: qml/Wizard/Pages/password-set.qml:141
493495msgid "Next"
494−msgstr ""
496+msgstr "War-lerc'h"
495497
496498#: qml/Wizard/Pages/30-wifi.qml:29
497499msgid "Connect to Wi‑Fi"
@@ -499,15 +501,15 @@ msgstr "Kevreañ ouzh ar Wi-Fi"
499501
500502#: qml/Wizard/Pages/30-wifi.qml:130
501503msgid "Connected"
502−msgstr ""
504+msgstr "Kevreet"
503505
504506#: qml/Wizard/Pages/30-wifi.qml:163
505507msgid "Available Wi-Fi networks"
506−msgstr ""
508+msgstr "Rouedadoù Wi-Fi da gaout"
507509
508510#: qml/Wizard/Pages/30-wifi.qml:164
509511msgid "No available Wi-Fi networks"
510−msgstr ""
512+msgstr "N'eus ket rouedadoù Wi-Fi da gaout"
511513
512514#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
513515#: qml/Wizard/Pages/sim.qml:101
@@ -516,7 +518,7 @@ msgstr "Tremen hebiou"
516518
517519#: qml/Wizard/Pages/40-location.qml:27
518520msgid "Location Services"
519−msgstr ""
521+msgstr "Servijoù lec'hiañ"
520522
521523#: qml/Wizard/Pages/40-location.qml:83
522524msgid ""
@@ -532,15 +534,15 @@ msgstr ""
532534#: qml/Wizard/Pages/40-location.qml:106
533535msgctxt "part of: Nokia HERE terms and conditions"
534536msgid "terms and conditions"
535−msgstr ""
537+msgstr "penndivizoù implij"
536538
537539#: qml/Wizard/Pages/40-location.qml:160
538540msgid "GPS only"
539−msgstr ""
541+msgstr "GPS hepken"
540542
541543#: qml/Wizard/Pages/40-location.qml:214
542544msgid "Don't use my location"
543−msgstr ""
545+msgstr "Arabat implijout ma lec'h"
544546
545547#: qml/Wizard/Pages/40-location.qml:260
546548msgid "You can change it later in System Settings."
@@ -548,15 +550,15 @@ msgstr ""
548550
549551#: qml/Wizard/Pages/50-timezone.qml:29
550552msgid "Time Zone"
551−msgstr ""
553+msgstr "Gwerzhid-eur"
552554
553555#: qml/Wizard/Pages/50-timezone.qml:178
554556msgid "Enter your city"
555−msgstr ""
557+msgstr "Skrivit ho kêr"
556558
557559#: qml/Wizard/Pages/60-account.qml:24
558560msgid "Personalize Your Device"
559−msgstr ""
561+msgstr "Personelaat ho penveg"
560562
561563#: qml/Wizard/Pages/60-account.qml:48
562564msgid "Preferred Name"
@@ -564,30 +566,30 @@ msgstr ""
564566
565567#: qml/Wizard/Pages/70-passwd-type.qml:39
566568msgid "Lock Screen"
567−msgstr ""
569+msgstr "Prennañ ar skramm"
568570
569571#: qml/Wizard/Pages/70-passwd-type.qml:101
570572msgctxt "Label: Type of security method"
571573msgid "Create new password"
572−msgstr ""
574+msgstr "Krouiñ ur ger-tremen nevez"
573575
574576#: qml/Wizard/Pages/70-passwd-type.qml:103
575577msgctxt "Label: Type of security method"
576578msgid "Create passcode (numbers only)"
577−msgstr ""
579+msgstr "Krouiñ ur c'hod (difroù hepken)"
578580
579581#: qml/Wizard/Pages/70-passwd-type.qml:105
580582msgctxt "Label: Type of security method"
581583msgid "No lock code"
582−msgstr ""
584+msgstr "N'eus kod prennañ ebet"
583585
584586#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
585587msgid "Privacy Policy"
586−msgstr ""
588+msgstr "Reolennoù prevezded"
587589
588590#: qml/Wizard/Pages/75-report-check.qml:26
589591msgid "Help Us Improve"
590−msgstr ""
592+msgstr "Sikourit ac'hanomp da wellaat"
591593
592594#: qml/Wizard/Pages/75-report-check.qml:59
593595msgid "Improve system performance by sending us crashes and error reports."
@@ -595,19 +597,19 @@ msgstr ""
595597
596598#: qml/Wizard/Pages/75-report-check.qml:60
597599msgid "Privacy policy"
598−msgstr ""
600+msgstr "Reolennoù buhez prevez"
599601
600602#: qml/Wizard/Pages/80-finished.qml:89
601603msgid "Welcome to Ubuntu"
602−msgstr ""
604+msgstr "Donemat en Ubuntu"
603605
604606#: qml/Wizard/Pages/80-finished.qml:104
605607msgid "You are ready to use your device now"
606−msgstr ""
608+msgstr "Bremañ oc'h prest da implijout ho penveg"
607609
608610#: qml/Wizard/Pages/80-finished.qml:124
609611msgid "Get Started"
610−msgstr ""
612+msgstr "Kregiñ ganti"
611613
612614#: qml/Wizard/Pages/here-terms.qml:25
613615msgid "Terms & Conditions"
@@ -637,7 +639,7 @@ msgstr ""
637639
638640#: qml/Wizard/Pages/here-terms.qml:107
639641msgid "Service Terms"
640−msgstr ""
642+msgstr "Divizoù servij"
641643
642644#: qml/Wizard/Pages/passcode-confirm.qml:43
643645#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -646,16 +648,16 @@ msgstr "Kadarnaat ar c'hod-tremen"
646648
647649#: qml/Wizard/Pages/passcode-confirm.qml:45
648650msgid "Incorrect passcode."
649−msgstr ""
651+msgstr "Kod direizh"
650652
651653#: qml/Wizard/Pages/passcode-confirm.qml:45
652654msgctxt "Enter the passcode again"
653655msgid "Please re-enter."
654−msgstr ""
656+msgstr "Skrivit adarre, mar plij."
655657
656658#: qml/Wizard/Pages/passcode-desktop.qml:30
657659msgid "Lock Screen Passcode"
658−msgstr ""
660+msgstr "Kod da brennañ ar skramm"
659661
660662#: qml/Wizard/Pages/passcode-desktop.qml:56
661663msgid "Enter 4 numbers to setup your passcode"
@@ -664,11 +666,11 @@ msgstr ""
664666#: qml/Wizard/Pages/passcode-desktop.qml:65
665667#: qml/Wizard/Pages/passcode-set.qml:54
666668msgid "Choose passcode"
667−msgstr ""
669+msgstr "Choaz ur c'hod"
668670
669671#: qml/Wizard/Pages/passcode-desktop.qml:105
670672msgid "Passcode too short"
671−msgstr ""
673+msgstr "Kod re verr"
672674
673675#: qml/Wizard/Pages/passcode-desktop.qml:107
674676msgid "Passcodes match"
@@ -684,27 +686,27 @@ msgstr ""
684686
685687#: qml/Wizard/Pages/password-set.qml:30
686688msgid "Lock Screen Password"
687−msgstr ""
689+msgstr "Ger-tremen da brennañ ar skramm"
688690
689691#: qml/Wizard/Pages/password-set.qml:61
690692msgid "Enter at least 8 characters"
691−msgstr ""
693+msgstr "Skrivit 8 arouezenn da vihanañ"
692694
693695#: qml/Wizard/Pages/password-set.qml:73
694696msgid "Choose password"
695−msgstr ""
697+msgstr "Choaz ur ger-tremen"
696698
697699#: qml/Wizard/Pages/password-set.qml:103
698700msgid "Confirm password"
699−msgstr ""
701+msgstr "Kadarnaat ar ger-tremen"
700702
701703#: qml/Wizard/Pages/sim.qml:27
702704msgid "No SIM card installed"
703−msgstr ""
705+msgstr "N'eus kartenn SIM ebet"
704706
705707#: qml/Wizard/Pages/sim.qml:54
706708msgid "SIM card added"
707−msgstr ""
709+msgstr "Lakaet ez eus bet ur gartenn SIM"
708710
709711#: qml/Wizard/Pages/sim.qml:55
710712msgid "You must restart the device to access the mobile network."
@@ -724,27 +726,27 @@ msgstr ""
724726
725727#: qml/Wizard/PasswordMeter.qml:87
726728msgid "Passwords match"
727−msgstr ""
729+msgstr "Klotañ a ra ar gerioù-tremen an eil gant egile"
728730
729731#: qml/Wizard/PasswordMeter.qml:89
730732msgid "Passwords do not match"
731−msgstr ""
733+msgstr "Ne glot ket ar gerioù-tremen"
732734
733735#: qml/Wizard/PasswordMeter.qml:93
734736msgid "Strong password"
735−msgstr ""
737+msgstr "Ger-tremen sur"
736738
737739#: qml/Wizard/PasswordMeter.qml:95
738740msgid "Fair password"
739−msgstr ""
741+msgstr "Ger-tremen reizh"
740742
741743#: qml/Wizard/PasswordMeter.qml:97
742744msgid "Weak password"
743−msgstr ""
745+msgstr "Ger-tremen diasur"
744746
745747#: qml/Wizard/PasswordMeter.qml:99
746748msgid "Very weak password"
747−msgstr ""
749+msgstr "Ger-tremen diasur-kenañ"
748750
749751#~ msgid "Close"
750752#~ msgstr "Serriñ"
@@ -1064,12 +1066,3 @@ msgstr ""
10641066
10651067#~ msgid "Call back"
10661068#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-12-01 20:06+0000\n"
1212"Last-Translator: Kenan Gutić <Unknown>\n"
1313"Language-Team: Bosnian <bs@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -453,19 +453,19 @@ msgstr ""
453453msgid "Swipe up to manage the app"
454454msgstr ""
455455
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
459−
460456#: qml/Tutorial/TutorialLeftLong.qml:47
461457msgid "Long swipe from the left edge to open the Today scope"
462458msgstr ""
463459
464−#: qml/Tutorial/TutorialRight.qml:54
465−msgid "Hover your mouse on the right edge to view your open apps"
460+#: qml/Tutorial/TutorialLeft.qml:47
461+msgid "Swipe from the left edge to open the launcher"
466462msgstr ""
467463
468464#: 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
469469msgid "Short or long swipe from the right edge to view your open apps"
470470msgstr ""
471471
po/ca.po+11−11
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-04 09:48+0000\n"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -207,11 +207,11 @@ msgstr "Cerca"
207207
208208#: qml/Dash/PageHeaderExtraPanel.qml:55
209209msgid "Recent Searches"
210−msgstr ""
210+msgstr "Cerques recents"
211211
212212#: qml/Dash/PageHeaderExtraPanel.qml:66
213213msgid "Clear All"
214−msgstr ""
214+msgstr "Neteja-ho tot"
215215
216216#: qml/Dash/Previews/PreviewActionCombo.qml:35
217217msgid "More..."
@@ -452,19 +452,19 @@ msgstr ""
452452msgid "Swipe up to manage the app"
453453msgstr ""
454454
455−#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Swipe from the left edge to open the launcher"
457−msgstr ""
458−
459455#: qml/Tutorial/TutorialLeftLong.qml:47
460456msgid "Long swipe from the left edge to open the Today scope"
461457msgstr ""
462458
463−#: qml/Tutorial/TutorialRight.qml:54
464−msgid "Hover your mouse on the right edge to view your open apps"
459+#: qml/Tutorial/TutorialLeft.qml:47
460+msgid "Swipe from the left edge to open the launcher"
465461msgstr ""
466462
467463#: 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
468468msgid "Short or long swipe from the right edge to view your open apps"
469469msgstr ""
470470
po/ca@valencia.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-02-22 15:22+0000\n"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -452,19 +452,19 @@ msgstr ""
452452msgid "Swipe up to manage the app"
453453msgstr ""
454454
455−#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Swipe from the left edge to open the launcher"
457−msgstr ""
458−
459455#: qml/Tutorial/TutorialLeftLong.qml:47
460456msgid "Long swipe from the left edge to open the Today scope"
461457msgstr ""
462458
463−#: qml/Tutorial/TutorialRight.qml:54
464−msgid "Hover your mouse on the right edge to view your open apps"
459+#: qml/Tutorial/TutorialLeft.qml:47
460+msgid "Swipe from the left edge to open the launcher"
465461msgstr ""
466462
467463#: 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
468468msgid "Short or long swipe from the right edge to view your open apps"
469469msgstr ""
470470
po/ce.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-02-15 04:01+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Chechen <ce@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/ckb.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-01-21 11:05+0000\n"
1212"Last-Translator: Aras <aras.noori@gmail.com>\n"
1313"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/cs.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-07 10:44+0000\n"
1212"Last-Translator: Vojtěch Daněk <vdanek@outlook.com>\n"
1313"Language-Team: Czech <cs@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"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"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020"Language: cs\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -453,19 +453,19 @@ msgstr ""
453453msgid "Swipe up to manage the app"
454454msgstr ""
455455
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
459−
460456#: qml/Tutorial/TutorialLeftLong.qml:47
461457msgid "Long swipe from the left edge to open the Today scope"
462458msgstr ""
463459
464−#: qml/Tutorial/TutorialRight.qml:54
465−msgid "Hover your mouse on the right edge to view your open apps"
460+#: qml/Tutorial/TutorialLeft.qml:47
461+msgid "Swipe from the left edge to open the launcher"
466462msgstr ""
467463
468464#: 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
469469msgid "Short or long swipe from the right edge to view your open apps"
470470msgstr ""
471471
po/cy.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-31 13:21+0000\n"
1212"Last-Translator: Owen Llywelyn <owen.llywelyn@gmail.com>\n"
1313"Language-Team: Welsh <cy@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
1818"2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -457,19 +457,19 @@ msgstr ""
457457msgid "Swipe up to manage the app"
458458msgstr ""
459459
460−#: qml/Tutorial/TutorialLeft.qml:47
461−msgid "Swipe from the left edge to open the launcher"
462−msgstr ""
463−
464460#: qml/Tutorial/TutorialLeftLong.qml:47
465461msgid "Long swipe from the left edge to open the Today scope"
466462msgstr ""
467463
468−#: qml/Tutorial/TutorialRight.qml:54
469−msgid "Hover your mouse on the right edge to view your open apps"
464+#: qml/Tutorial/TutorialLeft.qml:47
465+msgid "Swipe from the left edge to open the launcher"
470466msgstr ""
471467
472468#: 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
473473msgid "Short or long swipe from the right edge to view your open apps"
474474msgstr ""
475475
po/da.po+9−9
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"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"
1212"PO-Revision-Date: 2015-07-06 12:05+0000\n"
1313"Last-Translator: Folmer Fredslund <Unknown>\n"
1414"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
1818"Plural-Forms: nplurals=2; plural=n != 1;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -451,19 +451,19 @@ msgstr ""
451451msgid "Swipe up to manage the app"
452452msgstr ""
453453
454−#: qml/Tutorial/TutorialLeft.qml:47
455−msgid "Swipe from the left edge to open the launcher"
456−msgstr ""
457−
458454#: qml/Tutorial/TutorialLeftLong.qml:47
459455msgid "Long swipe from the left edge to open the Today scope"
460456msgstr ""
461457
462−#: qml/Tutorial/TutorialRight.qml:54
463−msgid "Hover your mouse on the right edge to view your open apps"
458+#: qml/Tutorial/TutorialLeft.qml:47
459+msgid "Swipe from the left edge to open the launcher"
464460msgstr ""
465461
466462#: 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
467467msgid "Short or long swipe from the right edge to view your open apps"
468468msgstr ""
469469
po/de.po+90−78
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-03-13 15:41+0000\n"
1212"Last-Translator: schuko24 <gerdsaenger@t-online.de>\n"
1313"Language-Team: German <de@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -188,11 +188,11 @@ msgstr "Zu Favoriten hinzufügen"
188188
189189#: qml/Dash/FiltersPopover.qml:60
190190msgid "Refine your results"
191−msgstr ""
191+msgstr "Ergebnisse verfeinern"
192192
193193#: qml/Dash/FiltersPopover.qml:69
194194msgid "Reset"
195−msgstr ""
195+msgstr "Zurücksetzen"
196196
197197#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
198198msgid "See less"
@@ -209,11 +209,11 @@ msgstr "Suchen"
209209
210210#: qml/Dash/PageHeaderExtraPanel.qml:55
211211msgid "Recent Searches"
212−msgstr ""
212+msgstr "Letzte Suchanfragen"
213213
214214#: qml/Dash/PageHeaderExtraPanel.qml:66
215215msgid "Clear All"
216−msgstr ""
216+msgstr "Alle zurücksetzen"
217217
218218#: qml/Dash/Previews/PreviewActionCombo.qml:35
219219msgid "More..."
@@ -432,51 +432,56 @@ msgstr "Zurückrufen"
432432
433433#: qml/Stages/SideStage.qml:76
434434msgid "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"
436436
437437#: qml/Tutorial/TutorialBottom.qml:78
438438msgid "Swipe up to add a contact"
439−msgstr ""
439+msgstr "Aufwärts wischen, um einen Kontakt hinzuzufügen"
440440
441441#: qml/Tutorial/TutorialBottom.qml:80
442442msgid "Swipe up for favorite calculations"
443−msgstr ""
443+msgstr "Aufwärts wischen, um die Favoriten-Rechnungen anzuzeigen"
444444
445445#: qml/Tutorial/TutorialBottom.qml:82
446446msgid "Swipe up for recent calls"
447−msgstr ""
447+msgstr "Aufwärts wischen, um die letzten Anrufe anzuzeigen"
448448
449449#: qml/Tutorial/TutorialBottom.qml:84
450450msgid "Swipe up to create a message"
451−msgstr ""
451+msgstr "Aufwärts wischen, um eine Nachricht zu erstellen"
452452
453453#: qml/Tutorial/TutorialBottom.qml:85
454454msgid "Swipe up to manage the app"
455−msgstr ""
456−
457−#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Swipe from the left edge to open the launcher"
459−msgstr ""
455+msgstr "Aufwärts wischen, um die Anwendung zu verwalten"
460456
461457#: qml/Tutorial/TutorialLeftLong.qml:47
462458msgid "Long swipe from the left edge to open the Today scope"
463459msgstr ""
460+"Langgezogene Wischgeste von der linken Kante, um den Heute-Scope zu öffnen"
464461
465−#: qml/Tutorial/TutorialRight.qml:54
466−msgid "Hover your mouse on the right edge to view your open apps"
467−msgstr ""
462+#: qml/Tutorial/TutorialLeft.qml:47
463+msgid "Swipe from the left edge to open the launcher"
464+msgstr "Von der linken Kante wischen, um den Starter zu öffnen"
468465
469466#: 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
470471msgid "Short or long swipe from the right edge to view your open apps"
471472msgstr ""
473+"Kurze oder langgezogene Wischgeste von der rechten Kante, um die offenen "
474+"Anwendungen zu sehen"
472475
473476#: qml/Tutorial/TutorialTop.qml:53
474477msgid "Swipe from the top right edge to open the notification bar"
475478msgstr ""
479+"Vom rechten oberen Rand her wischen, um die Benachrichtigungsleiste zu öffnen"
476480
477481#: qml/Tutorial/TutorialTop.qml:54
478482msgid "Swipe from the top edge to open the notification bar"
479483msgstr ""
484+"Vom oberen Rand her wischen, um die Benachrichtigungsleiste zu öffnen"
480485
481486#: qml/Wizard/Page.qml:54
482487msgctxt "Button: Go back one page in the Wizard"
@@ -485,7 +490,7 @@ msgstr "Zurück"
485490
486491#: qml/Wizard/Pages/10-welcome.qml:27
487492msgid "Language"
488−msgstr ""
493+msgstr "Sprache"
489494
490495#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
491496#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -494,7 +499,7 @@ msgstr ""
494499#: qml/Wizard/Pages/passcode-desktop.qml:124
495500#: qml/Wizard/Pages/password-set.qml:141
496501msgid "Next"
497−msgstr ""
502+msgstr "Weiter"
498503
499504#: qml/Wizard/Pages/30-wifi.qml:29
500505msgid "Connect to Wi‑Fi"
@@ -502,15 +507,15 @@ msgstr "Mit WLAN verbinden"
502507
503508#: qml/Wizard/Pages/30-wifi.qml:130
504509msgid "Connected"
505−msgstr ""
510+msgstr "Verbunden"
506511
507512#: qml/Wizard/Pages/30-wifi.qml:163
508513msgid "Available Wi-Fi networks"
509−msgstr ""
514+msgstr "Verfügbare Funknetzwerke"
510515
511516#: qml/Wizard/Pages/30-wifi.qml:164
512517msgid "No available Wi-Fi networks"
513−msgstr ""
518+msgstr "Keine Funknetzwerke verfügbar"
514519
515520#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
516521#: qml/Wizard/Pages/sim.qml:101
@@ -519,98 +524,102 @@ msgstr "Überspringen"
519524
520525#: qml/Wizard/Pages/40-location.qml:27
521526msgid "Location Services"
522−msgstr ""
527+msgstr "Standortdienste"
523528
524529#: qml/Wizard/Pages/40-location.qml:83
525530msgid ""
526531"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
527532"(recommended)"
528533msgstr ""
534+"GPS, WLAN-Netzwerke und Mobilfunknetzwerk anonymisiert für die "
535+"Standortbestimmung nutzen (empfohlen)"
529536
530537#: qml/Wizard/Pages/40-location.qml:105
531538#, qt-format
532539msgid "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."
534541
535542#: qml/Wizard/Pages/40-location.qml:106
536543msgctxt "part of: Nokia HERE terms and conditions"
537544msgid "terms and conditions"
538−msgstr ""
545+msgstr "Nutzungsbedingungen"
539546
540547#: qml/Wizard/Pages/40-location.qml:160
541548msgid "GPS only"
542−msgstr ""
549+msgstr "Nur GPS"
543550
544551#: qml/Wizard/Pages/40-location.qml:214
545552msgid "Don't use my location"
546−msgstr ""
553+msgstr "Meinen Standort nicht verwenden"
547554
548555#: qml/Wizard/Pages/40-location.qml:260
549556msgid "You can change it later in System Settings."
550−msgstr ""
557+msgstr "Dies kann später in den Systemeinstellungen geändert werden."
551558
552559#: qml/Wizard/Pages/50-timezone.qml:29
553560msgid "Time Zone"
554−msgstr ""
561+msgstr "Zeitzone"
555562
556563#: qml/Wizard/Pages/50-timezone.qml:178
557564msgid "Enter your city"
558−msgstr ""
565+msgstr "Bitte Ihre Stadt eingeben"
559566
560567#: qml/Wizard/Pages/60-account.qml:24
561568msgid "Personalize Your Device"
562−msgstr ""
569+msgstr "Ihr Gerät personalisieren"
563570
564571#: qml/Wizard/Pages/60-account.qml:48
565572msgid "Preferred Name"
566−msgstr ""
573+msgstr "Bevorzugter Name"
567574
568575#: qml/Wizard/Pages/70-passwd-type.qml:39
569576msgid "Lock Screen"
570−msgstr ""
577+msgstr "Sperrbildschirm"
571578
572579#: qml/Wizard/Pages/70-passwd-type.qml:101
573580msgctxt "Label: Type of security method"
574581msgid "Create new password"
575−msgstr ""
582+msgstr "Neues Passwort erstellen"
576583
577584#: qml/Wizard/Pages/70-passwd-type.qml:103
578585msgctxt "Label: Type of security method"
579586msgid "Create passcode (numbers only)"
580−msgstr ""
587+msgstr "PIN erstellen (nur Ziffern)"
581588
582589#: qml/Wizard/Pages/70-passwd-type.qml:105
583590msgctxt "Label: Type of security method"
584591msgid "No lock code"
585−msgstr ""
592+msgstr "Kein Sperrcode"
586593
587594#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
588595msgid "Privacy Policy"
589−msgstr ""
596+msgstr "Datenschutzerklärung"
590597
591598#: qml/Wizard/Pages/75-report-check.qml:26
592599msgid "Help Us Improve"
593−msgstr ""
600+msgstr "Bei der Verbesserung unterstützen"
594601
595602#: qml/Wizard/Pages/75-report-check.qml:59
596603msgid "Improve system performance by sending us crashes and error reports."
597604msgstr ""
605+"Bei der Systemverbesserung unterstützen, in dem Absturz- und Fehlerberichte "
606+"gesendet werden."
598607
599608#: qml/Wizard/Pages/75-report-check.qml:60
600609msgid "Privacy policy"
601−msgstr ""
610+msgstr "Datenschutzerklärung"
602611
603612#: qml/Wizard/Pages/80-finished.qml:89
604613msgid "Welcome to Ubuntu"
605−msgstr ""
614+msgstr "Willkommen bei Ubuntu"
606615
607616#: qml/Wizard/Pages/80-finished.qml:104
608617msgid "You are ready to use your device now"
609−msgstr ""
618+msgstr "Sie können Ihr Gerät nun verwenden"
610619
611620#: qml/Wizard/Pages/80-finished.qml:124
612621msgid "Get Started"
613−msgstr ""
622+msgstr "Erste Schritte"
614623
615624#: qml/Wizard/Pages/here-terms.qml:25
616625msgid "Terms & Conditions"
@@ -619,6 +628,8 @@ msgstr "Nutzungsbedingungen"
619628#: qml/Wizard/Pages/here-terms.qml:69
620629msgid "Your device uses positioning technologies provided by HERE."
621630msgstr ""
631+"Das Gerät verwendet Standortermittlungsdienste, die durch HERE "
632+"bereitgestellt werden."
622633
623634#: qml/Wizard/Pages/here-terms.qml:81
624635msgid ""
@@ -626,21 +637,26 @@ msgid ""
626637"collects information about nearby cell towers and Wi-Fi hotspots around your "
627638"current location whenever your position is being found."
628639msgstr ""
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."
629643
630644#: qml/Wizard/Pages/here-terms.qml:93
631645msgid ""
632646"The information collected is used to analyze the service and to improve the "
633647"use of service, but not to identify you personally."
634648msgstr ""
649+"Die gesammelte Information wird zur Analyse und zur Nutzungsverbesserung des "
650+"Dienstes genutzt. Nicht aber zur persönlichen Identifikation."
635651
636652#: qml/Wizard/Pages/here-terms.qml:106
637653#, qt-format
638654msgid "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."
640656
641657#: qml/Wizard/Pages/here-terms.qml:107
642658msgid "Service Terms"
643−msgstr ""
659+msgstr "Bedingungen des Dienstes"
644660
645661#: qml/Wizard/Pages/passcode-confirm.qml:43
646662#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -649,69 +665,70 @@ msgstr "PIN bestätigen"
649665
650666#: qml/Wizard/Pages/passcode-confirm.qml:45
651667msgid "Incorrect passcode."
652−msgstr ""
668+msgstr "Falsche PIN."
653669
654670#: qml/Wizard/Pages/passcode-confirm.qml:45
655671msgctxt "Enter the passcode again"
656672msgid "Please re-enter."
657−msgstr ""
673+msgstr "Bitte erneut eingeben."
658674
659675#: qml/Wizard/Pages/passcode-desktop.qml:30
660676msgid "Lock Screen Passcode"
661−msgstr ""
677+msgstr "Sperrbildschirm-PIN"
662678
663679#: qml/Wizard/Pages/passcode-desktop.qml:56
664680msgid "Enter 4 numbers to setup your passcode"
665−msgstr ""
681+msgstr "Geben Sie 4 Ziffern ein, um Ihre PIN einzurichten"
666682
667683#: qml/Wizard/Pages/passcode-desktop.qml:65
668684#: qml/Wizard/Pages/passcode-set.qml:54
669685msgid "Choose passcode"
670−msgstr ""
686+msgstr "PIN wählen"
671687
672688#: qml/Wizard/Pages/passcode-desktop.qml:105
673689msgid "Passcode too short"
674−msgstr ""
690+msgstr "PIN zu kurz"
675691
676692#: qml/Wizard/Pages/passcode-desktop.qml:107
677693msgid "Passcodes match"
678−msgstr ""
694+msgstr "PINs stimmen überein"
679695
680696#: qml/Wizard/Pages/passcode-desktop.qml:109
681697msgid "Passcodes do not match"
682−msgstr ""
698+msgstr "PINs stimmen nicht überein"
683699
684700#: qml/Wizard/Pages/passcode-set.qml:62
685701msgid "Passcode must be 4 characters long"
686−msgstr ""
702+msgstr "PIN muss 4 Ziffern lang sein"
687703
688704#: qml/Wizard/Pages/password-set.qml:30
689705msgid "Lock Screen Password"
690−msgstr ""
706+msgstr "Sperrbildschirm-Passwort"
691707
692708#: qml/Wizard/Pages/password-set.qml:61
693709msgid "Enter at least 8 characters"
694−msgstr ""
710+msgstr "Geben Sie mindestens 8 Zeichen ein"
695711
696712#: qml/Wizard/Pages/password-set.qml:73
697713msgid "Choose password"
698−msgstr ""
714+msgstr "Wählen Sie ein Passwort"
699715
700716#: qml/Wizard/Pages/password-set.qml:103
701717msgid "Confirm password"
702−msgstr ""
718+msgstr "Passwort bestätigen"
703719
704720#: qml/Wizard/Pages/sim.qml:27
705721msgid "No SIM card installed"
706−msgstr ""
722+msgstr "Keine SIM-Karte im Gerät"
707723
708724#: qml/Wizard/Pages/sim.qml:54
709725msgid "SIM card added"
710−msgstr ""
726+msgstr "SIM-Karte hinzugefügt"
711727
712728#: qml/Wizard/Pages/sim.qml:55
713729msgid "You must restart the device to access the mobile network."
714730msgstr ""
731+"Das Gerät muss neu gestartet werden, um auf das Mobilfunknetz zuzugreifen."
715732
716733#: qml/Wizard/Pages/sim.qml:59
717734msgid "Restart"
@@ -719,35 +736,35 @@ msgstr "Neustarten"
719736
720737#: qml/Wizard/Pages/sim.qml:78
721738msgid "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."
723740
724741#: qml/Wizard/Pages/sim.qml:90
725742msgid "To proceed with no SIM tap Skip."
726−msgstr ""
743+msgstr "Um ohne SIM-Karte fortzufahren, Überspringen drücken."
727744
728745#: qml/Wizard/PasswordMeter.qml:87
729746msgid "Passwords match"
730−msgstr ""
747+msgstr "Passwörter stimmen überein"
731748
732749#: qml/Wizard/PasswordMeter.qml:89
733750msgid "Passwords do not match"
734−msgstr ""
751+msgstr "Passwörter stimmen nicht überein"
735752
736753#: qml/Wizard/PasswordMeter.qml:93
737754msgid "Strong password"
738−msgstr ""
755+msgstr "Starkes Passwort"
739756
740757#: qml/Wizard/PasswordMeter.qml:95
741758msgid "Fair password"
742−msgstr ""
759+msgstr "Ausreichendes Passwort"
743760
744761#: qml/Wizard/PasswordMeter.qml:97
745762msgid "Weak password"
746−msgstr ""
763+msgstr "Schwaches Passwort"
747764
748765#: qml/Wizard/PasswordMeter.qml:99
749766msgid "Very weak password"
750−msgstr ""
767+msgstr "Sehr schwaches Passwort"
751768
752769#~ msgid "Confirm"
753770#~ msgstr "Bestätigen"
@@ -1067,11 +1084,6 @@ msgstr ""
10671084#~ msgid "Call back"
10681085#~ msgstr "Zurückrufen"
10691086
1070−#~ msgid "Your device is now ready to use."
1071−#~ msgstr "Ihr Gerät ist nun einsatzbereit."
1072−
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."
1087+#~ msgid "Hover your mouse on the right edge to view your open apps"
1088+#~ msgstr ""
1089+#~ "Die Maus auf den rechten Rand bewegen, um die offenen Anwendungen zu sehen"
po/el.po+79−66
@@ -7,16 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11−"PO-Revision-Date: 2015-12-04 09:38+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11+"PO-Revision-Date: 2016-04-25 16:24+0000\n"
1212"Last-Translator: Aggelos Arnaoutis <angelosarn@hotmail.com>\n"
1313"Language-Team: Greek <el@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -43,13 +43,13 @@ msgstr "Κλειδωμένη συσκευή"
4343msgid "You have been locked out due to too many failed passphrase attempts."
4444msgstr ""
4545"Δεν σας επιτρέπεται η πρόσβαση καθώς προσπαθήσατε επανηλλημένως να "
46−"συνδεθείτε με λάθος κωδικό."
46+"συνδεθείτε με λάθος συνθηματικό."
4747
4848#: qml/Components/DelayedLockscreen.qml:65
4949msgid "You have been locked out due to too many failed passcode attempts."
5050msgstr ""
5151"Δεν σας επιτρέπεται η πρόσβαση καθώς προσπαθήσατε επανηλλημένως να "
52−"συνδεθείτε με λάθος κωδικό."
52+"συνδεθείτε με λάθος κωδικό πρόσβασης."
5353
5454#: qml/Components/DelayedLockscreen.qml:74
5555#, qt-format
@@ -188,11 +188,11 @@ msgstr "Προσθήκη στα αγαπημένα"
188188
189189#: qml/Dash/FiltersPopover.qml:60
190190msgid "Refine your results"
191−msgstr ""
191+msgstr "Βελτιώστε τα αποτελέσματά σας"
192192
193193#: qml/Dash/FiltersPopover.qml:69
194194msgid "Reset"
195−msgstr ""
195+msgstr "Επαναφορά"
196196
197197#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
198198msgid "See less"
@@ -209,11 +209,11 @@ msgstr "Αναζήτηση"
209209
210210#: qml/Dash/PageHeaderExtraPanel.qml:55
211211msgid "Recent Searches"
212−msgstr ""
212+msgstr "Πρόσφατες αναζητήσεις"
213213
214214#: qml/Dash/PageHeaderExtraPanel.qml:66
215215msgid "Clear All"
216−msgstr ""
216+msgstr "Καθαρισμός όλων"
217217
218218#: qml/Dash/Previews/PreviewActionCombo.qml:35
219219msgid "More..."
@@ -269,6 +269,8 @@ msgid ""
269269"Your device is now connected to an external display. Use this screen as a "
270270"touch pad to interact with the pointer."
271271msgstr ""
272+"Η συσκεύη σας τώρα είναι συνδεδεμένη με μια εξωτερική οθόνη. Χρησιμοποιείστε "
273+"αυτήν την οθόνη ως επιφάνεια αφής για να αλληλεπηδράσετε με τον δείκτη."
272274
273275#: qml/Greeter/CoverPage.qml:118
274276msgid "Unlock"
@@ -284,7 +286,7 @@ msgstr "Ακουμπήστε για να ξεκλειδώσετε"
284286
285287#: qml/Greeter/NarrowView.qml:54
286288msgid "Sorry, incorrect passphrase."
287−msgstr "Συγνώμη, μη έγκυρη συνθηματική φράση."
289+msgstr "Συγνώμη, μη έγκυρο συνθηματικό."
288290
289291#: qml/Greeter/NarrowView.qml:55
290292msgid "Sorry, incorrect passcode."
@@ -299,9 +301,8 @@ msgid ""
299301"If passphrase is entered incorrectly, your phone will conduct a factory "
300302"reset and all personal data will be deleted."
301303msgstr ""
302−"Εάν η συνθηματική φράση που θα εισάγετε είναι μη έγκυρη, το τηλέφωνο σας θα "
303−"κάνει επαναφορά των εργοστασιακών ρυθμίσεων και όλα τα δεδομένα σας θα "
304−"διαγραφούν."
304+"Εάν το συνθηματικό που θα εισάγετε είναι μη έγκυρο, το τηλέφωνο σας θα κάνει "
305+"επαναφορά των εργοστασιακών ρυθμίσεων και όλα τα δεδομένα σας θα διαγραφούν."
305306
306307#: qml/Greeter/NarrowView.qml:59
307308msgid ""
@@ -323,7 +324,7 @@ msgstr "Εισαγωγή συνθηματικού"
323324
324325#: qml/Greeter/NarrowView.qml:118
325326msgid "Enter passcode"
326−msgstr "Εισαγωγή κωδικού"
327+msgstr "Εισαγωγή κωδικού πρόσβασης"
327328
328329#: qml/Greeter/NarrowView.qml:119
329330#, qt-format
@@ -433,6 +434,8 @@ msgstr "Επανάκληση"
433434#: qml/Stages/SideStage.qml:76
434435msgid "Drag using 3 fingers any application from one window to the other"
435436msgstr ""
437+"Σύρετε με την χρήση των 3 δακτύλων οποιαδήποτε εφαρμογή από ένα παράθυρο σε "
438+"άλλο"
436439
437440#: qml/Tutorial/TutorialBottom.qml:78
438441msgid "Swipe up to add a contact"
@@ -454,19 +457,19 @@ msgstr ""
454457msgid "Swipe up to manage the app"
455458msgstr ""
456459
457−#: qml/Tutorial/TutorialLeft.qml:47
458−msgid "Swipe from the left edge to open the launcher"
459−msgstr ""
460−
461460#: qml/Tutorial/TutorialLeftLong.qml:47
462461msgid "Long swipe from the left edge to open the Today scope"
463462msgstr ""
464463
465−#: qml/Tutorial/TutorialRight.qml:54
466−msgid "Hover your mouse on the right edge to view your open apps"
464+#: qml/Tutorial/TutorialLeft.qml:47
465+msgid "Swipe from the left edge to open the launcher"
467466msgstr ""
468467
469468#: 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
470473msgid "Short or long swipe from the right edge to view your open apps"
471474msgstr ""
472475
@@ -485,7 +488,7 @@ msgstr "Πίσω"
485488
486489#: qml/Wizard/Pages/10-welcome.qml:27
487490msgid "Language"
488−msgstr ""
491+msgstr "Γλώσσα"
489492
490493#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
491494#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -494,7 +497,7 @@ msgstr ""
494497#: qml/Wizard/Pages/passcode-desktop.qml:124
495498#: qml/Wizard/Pages/password-set.qml:141
496499msgid "Next"
497−msgstr ""
500+msgstr "Επόμενο"
498501
499502#: qml/Wizard/Pages/30-wifi.qml:29
500503msgid "Connect to Wi‑Fi"
@@ -502,15 +505,15 @@ msgstr "Σύνδεση σε δίκτυο Wi-Fi"
502505
503506#: qml/Wizard/Pages/30-wifi.qml:130
504507msgid "Connected"
505−msgstr ""
508+msgstr "Συνδεδεμένο"
506509
507510#: qml/Wizard/Pages/30-wifi.qml:163
508511msgid "Available Wi-Fi networks"
509−msgstr ""
512+msgstr "Διαθέσιμα δίκτυα Wi-Fi"
510513
511514#: qml/Wizard/Pages/30-wifi.qml:164
512515msgid "No available Wi-Fi networks"
513−msgstr ""
516+msgstr "Κανένα διαθέσιμο δίκτυο Wi-Fi"
514517
515518#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
516519#: qml/Wizard/Pages/sim.qml:101
@@ -519,7 +522,7 @@ msgstr "Παράβλεψη"
519522
520523#: qml/Wizard/Pages/40-location.qml:27
521524msgid "Location Services"
522−msgstr ""
525+msgstr "Υπηρεσίες τοποθεσίας"
523526
524527#: qml/Wizard/Pages/40-location.qml:83
525528msgid ""
@@ -531,82 +534,85 @@ msgstr ""
531534#, qt-format
532535msgid "By selecting this option you agree to the Nokia HERE %1."
533536msgstr ""
537+"Με το να επιλέξετε αυτήν την επιλογή συμφωνείτε με τους %1 Nokia HERE."
534538
535539#: qml/Wizard/Pages/40-location.qml:106
536540msgctxt "part of: Nokia HERE terms and conditions"
537541msgid "terms and conditions"
538−msgstr ""
542+msgstr "όρους χρήσης"
539543
540544#: qml/Wizard/Pages/40-location.qml:160
541545msgid "GPS only"
542−msgstr ""
546+msgstr "Μόνο GPS"
543547
544548#: qml/Wizard/Pages/40-location.qml:214
545549msgid "Don't use my location"
546−msgstr ""
550+msgstr "Μην χρησιμοποιήσεις την τοποθεσία μου"
547551
548552#: qml/Wizard/Pages/40-location.qml:260
549553msgid "You can change it later in System Settings."
550−msgstr ""
554+msgstr "Μπορείτε να το αλλάξετε αργότερα στις Ρυθμίσεις συστήματος."
551555
552556#: qml/Wizard/Pages/50-timezone.qml:29
553557msgid "Time Zone"
554−msgstr ""
558+msgstr "Ζώνη ώρας"
555559
556560#: qml/Wizard/Pages/50-timezone.qml:178
557561msgid "Enter your city"
558−msgstr ""
562+msgstr "Εισάγετε την πόλη σας"
559563
560564#: qml/Wizard/Pages/60-account.qml:24
561565msgid "Personalize Your Device"
562−msgstr ""
566+msgstr "Εξατομικεύστε την συσκευή σας."
563567
564568#: qml/Wizard/Pages/60-account.qml:48
565569msgid "Preferred Name"
566−msgstr ""
570+msgstr "Προτιμώμενο όνομα"
567571
568572#: qml/Wizard/Pages/70-passwd-type.qml:39
569573msgid "Lock Screen"
570−msgstr ""
574+msgstr "Κλείδωμα οθόνης"
571575
572576#: qml/Wizard/Pages/70-passwd-type.qml:101
573577msgctxt "Label: Type of security method"
574578msgid "Create new password"
575−msgstr ""
579+msgstr "Δημιουργία νέου κωδικού πρόσβασης"
576580
577581#: qml/Wizard/Pages/70-passwd-type.qml:103
578582msgctxt "Label: Type of security method"
579583msgid "Create passcode (numbers only)"
580−msgstr ""
584+msgstr "Δημιουργία κωδικού πρόσβασης (αριθμοί μόνο)"
581585
582586#: qml/Wizard/Pages/70-passwd-type.qml:105
583587msgctxt "Label: Type of security method"
584588msgid "No lock code"
585−msgstr ""
589+msgstr "Κανένας κωδικός κλειδώματος"
586590
587591#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
588592msgid "Privacy Policy"
589−msgstr ""
593+msgstr "Πολιτική απορρήτου"
590594
591595#: qml/Wizard/Pages/75-report-check.qml:26
592596msgid "Help Us Improve"
593−msgstr ""
597+msgstr "Βοηθήστε μας να βελτιωθούμε"
594598
595599#: qml/Wizard/Pages/75-report-check.qml:59
596600msgid "Improve system performance by sending us crashes and error reports."
597601msgstr ""
602+"Βελτιώστε την απόδοση συστήματος με το να στέλνετε σε εμάς αναφορές "
603+"κατάρρευσης και σφαλμάτων."
598604
599605#: qml/Wizard/Pages/75-report-check.qml:60
600606msgid "Privacy policy"
601−msgstr ""
607+msgstr "Πολιτική απορρήτου"
602608
603609#: qml/Wizard/Pages/80-finished.qml:89
604610msgid "Welcome to Ubuntu"
605−msgstr ""
611+msgstr "Καλώς ήρθατε στο Ubuntu"
606612
607613#: qml/Wizard/Pages/80-finished.qml:104
608614msgid "You are ready to use your device now"
609−msgstr ""
615+msgstr "Είστε έτοιμος να χρησιμοποιείσετε της συσκεύη σας τώρα"
610616
611617#: qml/Wizard/Pages/80-finished.qml:124
612618msgid "Get Started"
@@ -619,6 +625,8 @@ msgstr "Όροι και προϋποθέσεις"
619625#: qml/Wizard/Pages/here-terms.qml:69
620626msgid "Your device uses positioning technologies provided by HERE."
621627msgstr ""
628+"Η συσκεύη σας χρησιμοποιούν τεχνολογίες εντοπισμού θέσης που παρέχονται από "
629+"το HERE."
622630
623631#: qml/Wizard/Pages/here-terms.qml:81
624632msgid ""
@@ -632,15 +640,17 @@ msgid ""
632640"The information collected is used to analyze the service and to improve the "
633641"use of service, but not to identify you personally."
634642msgstr ""
643+"Οι πληροφορίες που μαζεύονται χρησιμοποιούνται για αναλύσουν την υπηρεσία "
644+"και να βελτιώσουν την χρήση της υπηρεσίας, και όχι για να βρουν ποιος είστε."
635645
636646#: qml/Wizard/Pages/here-terms.qml:106
637647#, qt-format
638648msgid "By continuing, you agree to the HERE platform %1 and %2."
639−msgstr ""
649+msgstr "Με το να συνεχίσετε, συμφωνείτε στα %1 και %2 της πλατφόρμας HERE."
640650
641651#: qml/Wizard/Pages/here-terms.qml:107
642652msgid "Service Terms"
643−msgstr ""
653+msgstr "Όρους υπηρεσίας"
644654
645655#: qml/Wizard/Pages/passcode-confirm.qml:43
646656#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -649,69 +659,71 @@ msgstr "Επιβεβαιώστε τον κωδικό πρόσβασης"
649659
650660#: qml/Wizard/Pages/passcode-confirm.qml:45
651661msgid "Incorrect passcode."
652−msgstr ""
662+msgstr "Μη έγκυρος κωδικός πρόσβασης"
653663
654664#: qml/Wizard/Pages/passcode-confirm.qml:45
655665msgctxt "Enter the passcode again"
656666msgid "Please re-enter."
657−msgstr ""
667+msgstr "Παρακαλώ πληκτρολογήστε ξανά."
658668
659669#: qml/Wizard/Pages/passcode-desktop.qml:30
660670msgid "Lock Screen Passcode"
661−msgstr ""
671+msgstr "Κωδικός πρόσβασης κλειδώματος οθόνης"
662672
663673#: qml/Wizard/Pages/passcode-desktop.qml:56
664674msgid "Enter 4 numbers to setup your passcode"
665−msgstr ""
675+msgstr "Εισάγετε 4 αριθμούς για ρύθμιση κωδικού πρόσβασης"
666676
667677#: qml/Wizard/Pages/passcode-desktop.qml:65
668678#: qml/Wizard/Pages/passcode-set.qml:54
669679msgid "Choose passcode"
670−msgstr ""
680+msgstr "Επιλογή κωδικού πρόσβασης"
671681
672682#: qml/Wizard/Pages/passcode-desktop.qml:105
673683msgid "Passcode too short"
674−msgstr ""
684+msgstr "Κωδικός πρόσβασης πολύ μικρός"
675685
676686#: qml/Wizard/Pages/passcode-desktop.qml:107
677687msgid "Passcodes match"
678−msgstr ""
688+msgstr "Ταίριασμα κωδικών πρόσβασης"
679689
680690#: qml/Wizard/Pages/passcode-desktop.qml:109
681691msgid "Passcodes do not match"
682−msgstr ""
692+msgstr "Οι κωδικοί πρόσβασης δεν ταιριάζουν"
683693
684694#: qml/Wizard/Pages/passcode-set.qml:62
685695msgid "Passcode must be 4 characters long"
686−msgstr ""
696+msgstr "Ο κωδικός πρόσβασης πρέπει να είναι 4 χαρακτήρες"
687697
688698#: qml/Wizard/Pages/password-set.qml:30
689699msgid "Lock Screen Password"
690−msgstr ""
700+msgstr "Κωδικός πρόσβασης κλειδώματος οθόνης"
691701
692702#: qml/Wizard/Pages/password-set.qml:61
693703msgid "Enter at least 8 characters"
694−msgstr ""
704+msgstr "Εισάγετε τουλάχιστον 8 χαρακτήρες"
695705
696706#: qml/Wizard/Pages/password-set.qml:73
697707msgid "Choose password"
698−msgstr ""
708+msgstr "Επιλογή κωδικού πρόσβασης"
699709
700710#: qml/Wizard/Pages/password-set.qml:103
701711msgid "Confirm password"
702−msgstr ""
712+msgstr "Επιβεβαίωση κωδικού πρόσβασης"
703713
704714#: qml/Wizard/Pages/sim.qml:27
705715msgid "No SIM card installed"
706−msgstr ""
716+msgstr "Καμία κάρτα SIM δεν έχει εγκατασταθεί"
707717
708718#: qml/Wizard/Pages/sim.qml:54
709719msgid "SIM card added"
710−msgstr ""
720+msgstr "Κάρτα SIM προστέθηκε"
711721
712722#: qml/Wizard/Pages/sim.qml:55
713723msgid "You must restart the device to access the mobile network."
714724msgstr ""
725+"Πρέπει να επανεκκίνησετε την συσκεύη σας για πρόσβαση στο δίκτυο κινητής "
726+"τηλεφωνίας."
715727
716728#: qml/Wizard/Pages/sim.qml:59
717729msgid "Restart"
@@ -720,6 +732,7 @@ msgstr "Επανεκκίνηση"
720732#: qml/Wizard/Pages/sim.qml:78
721733msgid "You won’t be able to make calls or use text messaging without a SIM."
722734msgstr ""
735+"Δεν θα μπορείτε να καλείτε ή να στέλνετε γραπτά μηνύματα χωρίς μια SIM."
723736
724737#: qml/Wizard/Pages/sim.qml:90
725738msgid "To proceed with no SIM tap Skip."
@@ -727,23 +740,23 @@ msgstr ""
727740
728741#: qml/Wizard/PasswordMeter.qml:87
729742msgid "Passwords match"
730−msgstr ""
743+msgstr "Οι κωδικοί πρόσβασης ταιριάζουν"
731744
732745#: qml/Wizard/PasswordMeter.qml:89
733746msgid "Passwords do not match"
734−msgstr ""
747+msgstr "Οι κωδικοί πρόσβασης δεν ταιριάζουν"
735748
736749#: qml/Wizard/PasswordMeter.qml:93
737750msgid "Strong password"
738−msgstr ""
751+msgstr "Δυνατός κωδικός πρόσβασης"
739752
740753#: qml/Wizard/PasswordMeter.qml:95
741754msgid "Fair password"
742−msgstr ""
755+msgstr "Μέτριος κωδικός πρόσβασης"
743756
744757#: qml/Wizard/PasswordMeter.qml:97
745758msgid "Weak password"
746−msgstr ""
759+msgstr "Αδύναμος κωδικός πρόσβασης"
747760
748761#: qml/Wizard/PasswordMeter.qml:99
749762msgid "Very weak password"
po/en_AU.po+13−10
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-03-27 10:09+0000\n"
1212"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
1313"Language-Team: English (Australia) <en_AU@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-28 05:45+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -448,19 +448,19 @@ msgstr "Swipe up to create a message"
448448msgid "Swipe up to manage the app"
449449msgstr "Swipe up to manage the app"
450450
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−
455451#: qml/Tutorial/TutorialLeftLong.qml:47
456452msgid "Long swipe from the left edge to open the Today scope"
457453msgstr "Long swipe from the left edge to open the Today scope"
458454
459−#: qml/Tutorial/TutorialRight.qml:54
460−msgid "Hover your mouse on the right edge to view your open apps"
461−msgstr "Hover your mouse on the right edge to view your open apps"
455+#: qml/Tutorial/TutorialLeft.qml:47
456+msgid "Swipe from the left edge to open the launcher"
457+msgstr "Swipe from the left edge to open the launcher"
462458
463459#: 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
464464msgid "Short or long swipe from the right edge to view your open apps"
465465msgstr "Short or long swipe from the right edge to view your open apps"
466466
@@ -1058,3 +1058,6 @@ msgstr "Very weak password"
10581058
10591059#~ msgid "%a %d %b %l:%M %p"
10601060#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-03-30 11:54+0000\n"
1212"Last-Translator: James Tait <Unknown>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-31 05:49+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -448,19 +448,19 @@ msgstr "Swipe up to create a message"
448448msgid "Swipe up to manage the app"
449449msgstr "Swipe up to manage the app"
450450
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−
455451#: qml/Tutorial/TutorialLeftLong.qml:47
456452msgid "Long swipe from the left edge to open the Today scope"
457453msgstr "Long swipe from the left edge to open the Today scope"
458454
459−#: qml/Tutorial/TutorialRight.qml:54
460−msgid "Hover your mouse on the right edge to view your open apps"
461−msgstr "Hover your mouse on the right edge to view your open apps"
455+#: qml/Tutorial/TutorialLeft.qml:47
456+msgid "Swipe from the left edge to open the launcher"
457+msgstr "Swipe from the left edge to open the launcher"
462458
463459#: 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
464464msgid "Short or long swipe from the right edge to view your open apps"
465465msgstr "Short or long swipe from the right edge to view your open apps"
466466
@@ -1061,3 +1061,6 @@ msgstr "Very weak password"
10611061
10621062#~ msgid "Call back"
10631063#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-06-06 23:37+0000\n"
1212"Last-Translator: Eliovir <Unknown>\n"
1313"Language-Team: Esperanto <eo@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/es.po+16−13
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-03-25 12:02+0000\n"
1212"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-26 05:44+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -454,20 +454,19 @@ msgstr "Deslice arriba para crear un mensaje"
454454msgid "Swipe up to manage the app"
455455msgstr "Deslice arriba para configurar la apli"
456456
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−
461457#: qml/Tutorial/TutorialLeftLong.qml:47
462458msgid "Long swipe from the left edge to open the Today scope"
463459msgstr "Deslice largo desde el borde izquierdo para ver el scope Hoy"
464460
465−#: qml/Tutorial/TutorialRight.qml:54
466−msgid "Hover your mouse on the right edge to view your open apps"
467−msgstr ""
468−"Sitúe el ratón en el borde derecho para ver las aplicaciones abiertas"
461+#: qml/Tutorial/TutorialLeft.qml:47
462+msgid "Swipe from the left edge to open the launcher"
463+msgstr "Deslice desde el borde izquierdo para abrir el lanzador"
469464
470465#: 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
471470msgid "Short or long swipe from the right edge to view your open apps"
472471msgstr "Deslice desde el borde derecho para ver las aplis abiertas"
473472
@@ -608,11 +607,11 @@ msgstr "Política de privacidad"
608607
609608#: qml/Wizard/Pages/80-finished.qml:89
610609msgid "Welcome to Ubuntu"
611−msgstr "Le damos la bienvenida a Ubuntu"
610+msgstr "Bienvenido a su dispositivo Ubuntu"
612611
613612#: qml/Wizard/Pages/80-finished.qml:104
614613msgid "You are ready to use your device now"
615−msgstr "Ahora ya puede usar su dispositivo"
614+msgstr "El dispositivo ya está listo"
616615
617616#: qml/Wizard/Pages/80-finished.qml:124
618617msgid "Get Started"
@@ -1075,3 +1074,7 @@ msgstr "Contraseña muy débil"
10751074
10761075#~ msgid "Call back"
10771076#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-13 23:29+0000\n"
1212"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
1313"Language-Team: Basque <eu@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -447,19 +447,19 @@ msgstr ""
447447msgid "Swipe up to manage the app"
448448msgstr ""
449449
450−#: qml/Tutorial/TutorialLeft.qml:47
451−msgid "Swipe from the left edge to open the launcher"
452−msgstr ""
453−
454450#: qml/Tutorial/TutorialLeftLong.qml:47
455451msgid "Long swipe from the left edge to open the Today scope"
456452msgstr ""
457453
458−#: qml/Tutorial/TutorialRight.qml:54
459−msgid "Hover your mouse on the right edge to view your open apps"
454+#: qml/Tutorial/TutorialLeft.qml:47
455+msgid "Swipe from the left edge to open the launcher"
460456msgstr ""
461457
462458#: 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
463463msgid "Short or long swipe from the right edge to view your open apps"
464464msgstr ""
465465
po/fa.po+13−10
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2016-03-30 14:29+0000\n"
1212"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
1313"Language-Team: Persian <fa@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-31 05:49+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -446,19 +446,19 @@ msgstr "برای ایجاد پیام، به بالا بکشید"
446446msgid "Swipe up to manage the app"
447447msgstr "برای مدیریت کاره، به بالا بکشید"
448448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr "برای گشودن اجراگر، از لبهٔ چپ بکشید"
452−
453449#: qml/Tutorial/TutorialLeftLong.qml:47
454450msgid "Long swipe from the left edge to open the Today scope"
455451msgstr "برای گشودن حوزهٔ امروز، از لبهٔ چپ طولانی بکشید"
456452
457−#: qml/Tutorial/TutorialRight.qml:54
458−msgid "Hover your mouse on the right edge to view your open apps"
459−msgstr "برای دیدن کاره‌های گشوده، موشی‌تان را روی لبهٔ راست نگه دارید"
453+#: qml/Tutorial/TutorialLeft.qml:47
454+msgid "Swipe from the left edge to open the launcher"
455+msgstr "برای گشودن اجراگر، از لبهٔ چپ بکشید"
460456
461457#: 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
462462msgid "Short or long swipe from the right edge to view your open apps"
463463msgstr "برای دیدن کاره‌های گشوده، از گوشهٔ راست بکشید"
464464
@@ -1064,3 +1064,6 @@ msgstr "گذرواژهٔ خیلی ضعیف"
10641064
10651065#~ msgid "Call back"
10661066#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-04 18:32+0000\n"
1212"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -186,11 +186,11 @@ msgstr "Lisää suosikkeihin"
186186
187187#: qml/Dash/FiltersPopover.qml:60
188188msgid "Refine your results"
189−msgstr ""
189+msgstr "Tarkenna tuloksia"
190190
191191#: qml/Dash/FiltersPopover.qml:69
192192msgid "Reset"
193−msgstr ""
193+msgstr "Palauta"
194194
195195#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
196196msgid "See less"
@@ -207,11 +207,11 @@ msgstr "Etsi"
207207
208208#: qml/Dash/PageHeaderExtraPanel.qml:55
209209msgid "Recent Searches"
210−msgstr ""
210+msgstr "Viimeisimmät haut"
211211
212212#: qml/Dash/PageHeaderExtraPanel.qml:66
213213msgid "Clear All"
214−msgstr ""
214+msgstr "Tyhjennä kaikki"
215215
216216#: qml/Dash/Previews/PreviewActionCombo.qml:35
217217msgid "More..."
@@ -280,7 +280,7 @@ msgstr "Yritä uudelleen"
280280
281281#: qml/Greeter/LoginList.qml:240
282282msgid "Tap to unlock"
283−msgstr "Napauta avataksesi lukituksen"
283+msgstr "Avaa lukitus"
284284
285285#: qml/Greeter/NarrowView.qml:54
286286msgid "Sorry, incorrect passphrase."
@@ -430,51 +430,53 @@ msgstr "Soita takaisin"
430430
431431#: qml/Stages/SideStage.qml:76
432432msgid "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"
434434
435435#: qml/Tutorial/TutorialBottom.qml:78
436436msgid "Swipe up to add a contact"
437−msgstr ""
437+msgstr "Vedä ylös lisätäksesi yhteystiedon"
438438
439439#: qml/Tutorial/TutorialBottom.qml:80
440440msgid "Swipe up for favorite calculations"
441−msgstr ""
441+msgstr "Vedä ylös nähdäksesi suosikkilaskutoimitukset"
442442
443443#: qml/Tutorial/TutorialBottom.qml:82
444444msgid "Swipe up for recent calls"
445−msgstr ""
445+msgstr "Vedä ylös nähdäksesi viimeisimmät puhelut"
446446
447447#: qml/Tutorial/TutorialBottom.qml:84
448448msgid "Swipe up to create a message"
449−msgstr ""
449+msgstr "Vedä ylös luodaksesi uuden viestin"
450450
451451#: qml/Tutorial/TutorialBottom.qml:85
452452msgid "Swipe up to manage the app"
453−msgstr ""
454−
455−#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Swipe from the left edge to open the launcher"
457−msgstr ""
453+msgstr "Vedä ylös hallitaksesi sovellusta"
458454
459455#: qml/Tutorial/TutorialLeftLong.qml:47
460456msgid "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"
462458
463−#: qml/Tutorial/TutorialRight.qml:54
464−msgid "Hover your mouse on the right edge to view your open apps"
465−msgstr ""
459+#: qml/Tutorial/TutorialLeft.qml:47
460+msgid "Swipe from the left edge to open the launcher"
461+msgstr "Vedä vasemmasta reunasta avataksesi käynnistimen"
466462
467463#: 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
468468msgid "Short or long swipe from the right edge to view your open apps"
469469msgstr ""
470+"Tee lyhyt tai pitkä veto oikeasta laidasta nähdäksesi avoinna olevat "
471+"sovellukset"
470472
471473#: qml/Tutorial/TutorialTop.qml:53
472474msgid "Swipe from the top right edge to open the notification bar"
473−msgstr ""
475+msgstr "Vedä oikeasta yläreunasta avataksesi ilmoituspalkin"
474476
475477#: qml/Tutorial/TutorialTop.qml:54
476478msgid "Swipe from the top edge to open the notification bar"
477−msgstr ""
479+msgstr "Vedä yläreunasta avataksesi ilmoituspalkin"
478480
479481#: qml/Wizard/Page.qml:54
480482msgctxt "Button: Go back one page in the Wizard"
@@ -483,7 +485,7 @@ msgstr "Takaisin"
483485
484486#: qml/Wizard/Pages/10-welcome.qml:27
485487msgid "Language"
486−msgstr ""
488+msgstr "Kieli"
487489
488490#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
489491#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -492,7 +494,7 @@ msgstr ""
492494#: qml/Wizard/Pages/passcode-desktop.qml:124
493495#: qml/Wizard/Pages/password-set.qml:141
494496msgid "Next"
495−msgstr ""
497+msgstr "Seuraava"
496498
497499#: qml/Wizard/Pages/30-wifi.qml:29
498500msgid "Connect to Wi‑Fi"
@@ -500,15 +502,15 @@ msgstr "Yhdistä wifi-verkkoon"
500502
501503#: qml/Wizard/Pages/30-wifi.qml:130
502504msgid "Connected"
503−msgstr ""
505+msgstr "Yhdistetty"
504506
505507#: qml/Wizard/Pages/30-wifi.qml:163
506508msgid "Available Wi-Fi networks"
507−msgstr ""
509+msgstr "Käytettävissä olevat wifi-verkot"
508510
509511#: qml/Wizard/Pages/30-wifi.qml:164
510512msgid "No available Wi-Fi networks"
511−msgstr ""
513+msgstr "Ei käytettävissä olevia wifi-verkkoja"
512514
513515#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
514516#: qml/Wizard/Pages/sim.qml:101
@@ -517,98 +519,102 @@ msgstr "Ohita"
517519
518520#: qml/Wizard/Pages/40-location.qml:27
519521msgid "Location Services"
520−msgstr ""
522+msgstr "Sijaintipalvelut"
521523
522524#: qml/Wizard/Pages/40-location.qml:83
523525msgid ""
524526"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
525527"(recommended)"
526528msgstr ""
529+"Käytä GPS:ää, wifi-tukiasemia ja mobiiliverkkoa anonyymisti sijainnin "
530+"havaitsemiseen (suositeltu)"
527531
528532#: qml/Wizard/Pages/40-location.qml:105
529533#, qt-format
530534msgid "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."
532536
533537#: qml/Wizard/Pages/40-location.qml:106
534538msgctxt "part of: Nokia HERE terms and conditions"
535539msgid "terms and conditions"
536−msgstr ""
540+msgstr "käyttöehdot"
537541
538542#: qml/Wizard/Pages/40-location.qml:160
539543msgid "GPS only"
540−msgstr ""
544+msgstr "Vain GPS"
541545
542546#: qml/Wizard/Pages/40-location.qml:214
543547msgid "Don't use my location"
544−msgstr ""
548+msgstr "Älä käytä sijaintiani"
545549
546550#: qml/Wizard/Pages/40-location.qml:260
547551msgid "You can change it later in System Settings."
548−msgstr ""
552+msgstr "Voit muuttaa asetusta myöhemmin järjestelmän asetuksista."
549553
550554#: qml/Wizard/Pages/50-timezone.qml:29
551555msgid "Time Zone"
552−msgstr ""
556+msgstr "Aikavyöhyke"
553557
554558#: qml/Wizard/Pages/50-timezone.qml:178
555559msgid "Enter your city"
556−msgstr ""
560+msgstr "Määritä kaupunkisi"
557561
558562#: qml/Wizard/Pages/60-account.qml:24
559563msgid "Personalize Your Device"
560−msgstr ""
564+msgstr "Mukauta laitteesi"
561565
562566#: qml/Wizard/Pages/60-account.qml:48
563567msgid "Preferred Name"
564−msgstr ""
568+msgstr "Ensisijainen nimi"
565569
566570#: qml/Wizard/Pages/70-passwd-type.qml:39
567571msgid "Lock Screen"
568−msgstr ""
572+msgstr "Lukitusnäyttö"
569573
570574#: qml/Wizard/Pages/70-passwd-type.qml:101
571575msgctxt "Label: Type of security method"
572576msgid "Create new password"
573−msgstr ""
577+msgstr "Luo uusi salasana"
574578
575579#: qml/Wizard/Pages/70-passwd-type.qml:103
576580msgctxt "Label: Type of security method"
577581msgid "Create passcode (numbers only)"
578−msgstr ""
582+msgstr "Luo suojakoodi (vain numeroita)"
579583
580584#: qml/Wizard/Pages/70-passwd-type.qml:105
581585msgctxt "Label: Type of security method"
582586msgid "No lock code"
583−msgstr ""
587+msgstr "Ei lukituskoodia"
584588
585589#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
586590msgid "Privacy Policy"
587−msgstr ""
591+msgstr "Tietosuoja"
588592
589593#: qml/Wizard/Pages/75-report-check.qml:26
590594msgid "Help Us Improve"
591−msgstr ""
595+msgstr "Auta parantamaan"
592596
593597#: qml/Wizard/Pages/75-report-check.qml:59
594598msgid "Improve system performance by sending us crashes and error reports."
595599msgstr ""
600+"Paranna järjestelmän suorituskykyä lähettämällä virheraportteja "
601+"Canonicalille."
596602
597603#: qml/Wizard/Pages/75-report-check.qml:60
598604msgid "Privacy policy"
599−msgstr ""
605+msgstr "Tietosuojakäytäntö"
600606
601607#: qml/Wizard/Pages/80-finished.qml:89
602608msgid "Welcome to Ubuntu"
603−msgstr ""
609+msgstr "Tervetuloa Ubuntuun"
604610
605611#: qml/Wizard/Pages/80-finished.qml:104
606612msgid "You are ready to use your device now"
607−msgstr ""
613+msgstr "Voit aloittaa nyt laitteesi käytön"
608614
609615#: qml/Wizard/Pages/80-finished.qml:124
610616msgid "Get Started"
611−msgstr ""
617+msgstr "Alkuun pääsy"
612618
613619#: qml/Wizard/Pages/here-terms.qml:25
614620msgid "Terms & Conditions"
@@ -616,7 +622,7 @@ msgstr "Käyttöehdot"
616622
617623#: qml/Wizard/Pages/here-terms.qml:69
618624msgid "Your device uses positioning technologies provided by HERE."
619−msgstr ""
625+msgstr "Laitteesi käyttää HERE:n tarjoamia sijaintiteknologioita."
620626
621627#: qml/Wizard/Pages/here-terms.qml:81
622628msgid ""
@@ -624,21 +630,26 @@ msgid ""
624630"collects information about nearby cell towers and Wi-Fi hotspots around your "
625631"current location whenever your position is being found."
626632msgstr ""
633+"Sijaintipalvelujen ja niiden parantamisen vuoksi HERE kerää tietoja "
634+"lähelläsi olevista matkapuhelinmastoista ja wifi-tukiasemista, kun "
635+"sijaintisi paikannetaan."
627636
628637#: qml/Wizard/Pages/here-terms.qml:93
629638msgid ""
630639"The information collected is used to analyze the service and to improve the "
631640"use of service, but not to identify you personally."
632641msgstr ""
642+"Kerättyä tietoa käytetään palvelun analysointiin ja palvelun parantamiseen, "
643+"mutta ei sinun henkilökohtaiseen tunnistamiseen."
633644
634645#: qml/Wizard/Pages/here-terms.qml:106
635646#, qt-format
636647msgid "By continuing, you agree to the HERE platform %1 and %2."
637−msgstr ""
648+msgstr "Jatkamalla hyväksyt HERE-alustan %1 ja %2."
638649
639650#: qml/Wizard/Pages/here-terms.qml:107
640651msgid "Service Terms"
641−msgstr ""
652+msgstr "palveluehdot"
642653
643654#: qml/Wizard/Pages/passcode-confirm.qml:43
644655#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -647,69 +658,69 @@ msgstr "Vahvista suojakoodi"
647658
648659#: qml/Wizard/Pages/passcode-confirm.qml:45
649660msgid "Incorrect passcode."
650−msgstr ""
661+msgstr "Virheellinen suojakoodi."
651662
652663#: qml/Wizard/Pages/passcode-confirm.qml:45
653664msgctxt "Enter the passcode again"
654665msgid "Please re-enter."
655−msgstr ""
666+msgstr "Anna uudelleen"
656667
657668#: qml/Wizard/Pages/passcode-desktop.qml:30
658669msgid "Lock Screen Passcode"
659−msgstr ""
670+msgstr "Lukitusnäytön suojakoodi"
660671
661672#: qml/Wizard/Pages/passcode-desktop.qml:56
662673msgid "Enter 4 numbers to setup your passcode"
663−msgstr ""
674+msgstr "Anna 4 numeroa määrittääksesi suojakoodisi"
664675
665676#: qml/Wizard/Pages/passcode-desktop.qml:65
666677#: qml/Wizard/Pages/passcode-set.qml:54
667678msgid "Choose passcode"
668−msgstr ""
679+msgstr "Valitse suojakoodi"
669680
670681#: qml/Wizard/Pages/passcode-desktop.qml:105
671682msgid "Passcode too short"
672−msgstr ""
683+msgstr "Suojakoodi on liian lyhyt"
673684
674685#: qml/Wizard/Pages/passcode-desktop.qml:107
675686msgid "Passcodes match"
676−msgstr ""
687+msgstr "Suojakoodit vastaavat toisiaan"
677688
678689#: qml/Wizard/Pages/passcode-desktop.qml:109
679690msgid "Passcodes do not match"
680−msgstr ""
691+msgstr "Suojakoodit eivät vastaa toisiaan"
681692
682693#: qml/Wizard/Pages/passcode-set.qml:62
683694msgid "Passcode must be 4 characters long"
684−msgstr ""
695+msgstr "Suojakoodin tulee olla 4 merkkiä pitkä"
685696
686697#: qml/Wizard/Pages/password-set.qml:30
687698msgid "Lock Screen Password"
688−msgstr ""
699+msgstr "Lukitusnäytön salasana"
689700
690701#: qml/Wizard/Pages/password-set.qml:61
691702msgid "Enter at least 8 characters"
692−msgstr ""
703+msgstr "Anna ainakin 8 merkkiä"
693704
694705#: qml/Wizard/Pages/password-set.qml:73
695706msgid "Choose password"
696−msgstr ""
707+msgstr "Valitse salasana"
697708
698709#: qml/Wizard/Pages/password-set.qml:103
699710msgid "Confirm password"
700−msgstr ""
711+msgstr "Vahvista salasana"
701712
702713#: qml/Wizard/Pages/sim.qml:27
703714msgid "No SIM card installed"
704−msgstr ""
715+msgstr "SIM-korttia ei ole asennettu"
705716
706717#: qml/Wizard/Pages/sim.qml:54
707718msgid "SIM card added"
708−msgstr ""
719+msgstr "SIM-kortti lisätty"
709720
710721#: qml/Wizard/Pages/sim.qml:55
711722msgid "You must restart the device to access the mobile network."
712−msgstr ""
723+msgstr "Käynnistä laite uudelleen, jotta voit käyttää mobiiliverkkoa."
713724
714725#: qml/Wizard/Pages/sim.qml:59
715726msgid "Restart"
@@ -717,35 +728,35 @@ msgstr "Käynnistä uudelleen"
717728
718729#: qml/Wizard/Pages/sim.qml:78
719730msgid "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."
721732
722733#: qml/Wizard/Pages/sim.qml:90
723734msgid "To proceed with no SIM tap Skip."
724−msgstr ""
735+msgstr "Valitse \"Ohita\" jatkaaksesi ilman SIM-korttia."
725736
726737#: qml/Wizard/PasswordMeter.qml:87
727738msgid "Passwords match"
728−msgstr ""
739+msgstr "Salasanat vastaavat toisiaan"
729740
730741#: qml/Wizard/PasswordMeter.qml:89
731742msgid "Passwords do not match"
732−msgstr ""
743+msgstr "Salasanat eivät vastaa toisiaan"
733744
734745#: qml/Wizard/PasswordMeter.qml:93
735746msgid "Strong password"
736−msgstr ""
747+msgstr "Vahva salasana"
737748
738749#: qml/Wizard/PasswordMeter.qml:95
739750msgid "Fair password"
740−msgstr ""
751+msgstr "Keskinkertainen salasana"
741752
742753#: qml/Wizard/PasswordMeter.qml:97
743754msgid "Weak password"
744−msgstr ""
755+msgstr "Heikko salasana"
745756
746757#: qml/Wizard/PasswordMeter.qml:99
747758msgid "Very weak password"
748−msgstr ""
759+msgstr "Erittäin heikko salasana"
749760
750761#~ msgid "Confirm"
751762#~ msgstr "Hyväksy"
@@ -1060,11 +1071,6 @@ msgstr ""
10601071#~ msgid "Call back"
10611072#~ msgstr "Soita takaisin"
10621073
1063−#~ msgid "Welcome to your Ubuntu device."
1064−#~ msgstr "Tervetuloa Ubuntu-laitteesi pariin."
1065−
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."
1074+#~ msgid "Hover your mouse on the right edge to view your open apps"
1075+#~ msgstr ""
1076+#~ "Vie hiiren osoitin oikeaan reunaan nähdäksesi avoinna olevat sovellukset"
po/fo.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2014-01-14 20:08+0000\n"
1212"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
1313"Language-Team: Faroese <fo@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/fr.po+18−15
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-03-26 13:06+0000\n"
1212"Last-Translator: Jean-Marc <Unknown>\n"
1313"Language-Team: French <fr@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-27 05:47+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -460,22 +460,21 @@ msgstr "Faites glisser vers le haut pour créer un message"
460460msgid "Swipe up to manage the app"
461461msgstr "Faites glisser vers le haut pour gérer l'application"
462462
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−
467463#: qml/Tutorial/TutorialLeftLong.qml:47
468464msgid "Long swipe from the left edge to open the Today scope"
469465msgstr ""
470466"Faites glisser à partir du bord gauche jusqu'au bord droit pour ouvrir le "
471467"moteur de recherche Aujourd'hui"
472468
473−#: qml/Tutorial/TutorialRight.qml:54
474−msgid "Hover your mouse on the right edge to view your open apps"
475−msgstr ""
476−"Passez votre souris sur le bord droit pour voir vos applications ouvertes"
469+#: qml/Tutorial/TutorialLeft.qml:47
470+msgid "Swipe from the left edge to open the launcher"
471+msgstr "Faites glisser à partir du bord gauche pour ouvrir le lanceur"
477472
478473#: 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
479478msgid "Short or long swipe from the right edge to view your open apps"
480479msgstr ""
481480"Faites glisser brièvement ou longuement à partir du bord droit pour voir vos "
@@ -564,7 +563,7 @@ msgstr "Ne pas utiliser ma position"
564563
565564#: qml/Wizard/Pages/40-location.qml:260
566565msgid "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."
568567
569568#: qml/Wizard/Pages/50-timezone.qml:29
570569msgid "Time Zone"
@@ -607,7 +606,7 @@ msgstr "Politique de confidentialité"
607606
608607#: qml/Wizard/Pages/75-report-check.qml:26
609608msgid "Help Us Improve"
610−msgstr "Aidez-nous à améliorer"
609+msgstr "Aidez-nous à nous améliorer"
611610
612611#: qml/Wizard/Pages/75-report-check.qml:59
613612msgid "Improve system performance by sending us crashes and error reports."
@@ -617,7 +616,7 @@ msgstr ""
617616
618617#: qml/Wizard/Pages/75-report-check.qml:60
619618msgid "Privacy policy"
620−msgstr "Politique relative à la vie privée"
619+msgstr "Politique de confidentialité"
621620
622621#: qml/Wizard/Pages/80-finished.qml:89
623622msgid "Welcome to Ubuntu"
@@ -752,7 +751,7 @@ msgstr ""
752751
753752#: qml/Wizard/Pages/sim.qml:90
754753msgid "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 »"
756755
757756#: qml/Wizard/PasswordMeter.qml:87
758757msgid "Passwords match"
@@ -1102,3 +1101,7 @@ msgstr "Mot de passe très faible"
11021101
11031102#~ msgid "Call back"
11041103#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2016-01-25 11:33+0000\n"
1212"Last-Translator: Joshua Kiley <Unknown>\n"
1313"Language-Team: Irish <ga@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"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"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -448,19 +448,19 @@ msgstr ""
448448msgid "Swipe up to manage the app"
449449msgstr ""
450450
451−#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Swipe from the left edge to open the launcher"
453−msgstr ""
454−
455451#: qml/Tutorial/TutorialLeftLong.qml:47
456452msgid "Long swipe from the left edge to open the Today scope"
457453msgstr ""
458454
459−#: qml/Tutorial/TutorialRight.qml:54
460−msgid "Hover your mouse on the right edge to view your open apps"
455+#: qml/Tutorial/TutorialLeft.qml:47
456+msgid "Swipe from the left edge to open the launcher"
461457msgstr ""
462458
463459#: 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
464464msgid "Short or long swipe from the right edge to view your open apps"
465465msgstr ""
466466
po/gd.po+95−75
@@ -7,17 +7,17 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11−"PO-Revision-Date: 2015-07-16 10:56+0000\n"
12−"Last-Translator: GunChleoc <Unknown>\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11+"PO-Revision-Date: 2016-04-08 18:34+0000\n"
12+"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
1313"Language-Team: Fòram na Gàidhlig\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
1818"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121"Language: gd\n"
2222
2323#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -192,11 +192,11 @@ msgstr "Cuir ris na h-annsachdan"
192192
193193#: qml/Dash/FiltersPopover.qml:60
194194msgid "Refine your results"
195−msgstr ""
195+msgstr "Cuir na toraidhean air gleus"
196196
197197#: qml/Dash/FiltersPopover.qml:69
198198msgid "Reset"
199−msgstr ""
199+msgstr "Ath-shuidhich"
200200
201201#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
202202msgid "See less"
@@ -213,11 +213,11 @@ msgstr "Lorg"
213213
214214#: qml/Dash/PageHeaderExtraPanel.qml:55
215215msgid "Recent Searches"
216−msgstr ""
216+msgstr "Na lorg thu roimhe"
217217
218218#: qml/Dash/PageHeaderExtraPanel.qml:66
219219msgid "Clear All"
220−msgstr ""
220+msgstr "Falamhaich na h-uile"
221221
222222#: qml/Dash/Previews/PreviewActionCombo.qml:35
223223msgid "More..."
@@ -446,50 +446,60 @@ msgstr "Fònaig air ais"
446446#: qml/Stages/SideStage.qml:76
447447msgid "Drag using 3 fingers any application from one window to the other"
448448msgstr ""
449+"Dèan slaodadh le trì corragan gus aplacaid a shlaodadh o uinneag gu uinneag "
450+"eile"
449451
450452#: qml/Tutorial/TutorialBottom.qml:78
451453msgid "Swipe up to add a contact"
452−msgstr ""
454+msgstr "Dèan grad-shlaighdeadh suas airson neach-aithne a chur ris"
453455
454456#: qml/Tutorial/TutorialBottom.qml:80
455457msgid "Swipe up for favorite calculations"
456458msgstr ""
459+"Dèan grad-shlaighdeadh suas airson na h-àireamhachaidhean coitcheann agad"
457460
458461#: qml/Tutorial/TutorialBottom.qml:82
459462msgid "Swipe up for recent calls"
460463msgstr ""
464+"Dèan grad-shlaighdeadh suas airson gairmean a rinn thu o chionn goirid"
461465
462466#: qml/Tutorial/TutorialBottom.qml:84
463467msgid "Swipe up to create a message"
464−msgstr ""
468+msgstr "Dèan grad-shlaighdeadh suas airson teachdaireachd a chruthachadh"
465469
466470#: qml/Tutorial/TutorialBottom.qml:85
467471msgid "Swipe up to manage the app"
468−msgstr ""
469−
470−#: qml/Tutorial/TutorialLeft.qml:47
471−msgid "Swipe from the left edge to open the launcher"
472−msgstr ""
472+msgstr "Dèan grad-shlaighdeadh suas gus an aplacaid a stiùireadh"
473473
474474#: qml/Tutorial/TutorialLeftLong.qml:47
475475msgid "Long swipe from the left edge to open the Today scope"
476476msgstr ""
477+"Dèan grad-shlaighdeadh a-steach on oir chlì gus breath an latha an-diugh "
478+"fhosgladh"
477479
478−#: qml/Tutorial/TutorialRight.qml:54
479−msgid "Hover your mouse on the right edge to view your open apps"
480+#: qml/Tutorial/TutorialLeft.qml:47
481+msgid "Swipe from the left edge to open the launcher"
480482msgstr ""
483+"Dèan grad-shlaighdeadh a-steach on oir chlì gus an lòinsear a chur gu dol"
481484
482485#: 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
483490msgid "Short or long swipe from the right edge to view your open apps"
484491msgstr ""
492+"Dèan grad-shlaighdeadh fada no goirid on oir dheas a dh’fhaicinn nan "
493+"aplacaidean fosgailte agad"
485494
486495#: qml/Tutorial/TutorialTop.qml:53
487496msgid "Swipe from the top right edge to open the notification bar"
488497msgstr ""
498+"Dèan grad-shlaighdeadh a-nuas on oir dheas a dh’fhosgladh bàr nam brathan"
489499
490500#: qml/Tutorial/TutorialTop.qml:54
491501msgid "Swipe from the top edge to open the notification bar"
492−msgstr ""
502+msgstr "Dèan grad-shlaighdeadh a-nuas on oir a dh’fhosgladh bàr nam brathan"
493503
494504#: qml/Wizard/Page.qml:54
495505msgctxt "Button: Go back one page in the Wizard"
@@ -498,7 +508,7 @@ msgstr "Air ais"
498508
499509#: qml/Wizard/Pages/10-welcome.qml:27
500510msgid "Language"
501−msgstr ""
511+msgstr "Cànan"
502512
503513#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
504514#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -507,7 +517,7 @@ msgstr ""
507517#: qml/Wizard/Pages/passcode-desktop.qml:124
508518#: qml/Wizard/Pages/password-set.qml:141
509519msgid "Next"
510−msgstr ""
520+msgstr "Air adhart"
511521
512522#: qml/Wizard/Pages/30-wifi.qml:29
513523msgid "Connect to Wi‑Fi"
@@ -515,15 +525,15 @@ msgstr "Ceangail ri Wi-Fi"
515525
516526#: qml/Wizard/Pages/30-wifi.qml:130
517527msgid "Connected"
518−msgstr ""
528+msgstr "Ceangailte"
519529
520530#: qml/Wizard/Pages/30-wifi.qml:163
521531msgid "Available Wi-Fi networks"
522−msgstr ""
532+msgstr "Lìonraidhean WiFi a tha ri làimh"
523533
524534#: qml/Wizard/Pages/30-wifi.qml:164
525535msgid "No available Wi-Fi networks"
526−msgstr ""
536+msgstr "Chan eil lìonra WiFi sam bith ann"
527537
528538#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
529539#: qml/Wizard/Pages/sim.qml:101
@@ -532,98 +542,103 @@ msgstr "Leum thairis air"
532542
533543#: qml/Wizard/Pages/40-location.qml:27
534544msgid "Location Services"
535−msgstr ""
545+msgstr "Seirbheisean ionaid"
536546
537547#: qml/Wizard/Pages/40-location.qml:83
538548msgid ""
539549"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
540550"(recommended)"
541551msgstr ""
552+"Cleachd GPS, hotspots WiFi is lìonraidhean mobile gun urra a dh’fhiosrachadh "
553+"d’ ionaid (mholamaid seo)"
542554
543555#: qml/Wizard/Pages/40-location.qml:105
544556#, qt-format
545557msgid "By selecting this option you agree to the Nokia HERE %1."
546558msgstr ""
559+"Ma thaghas tu an roghainn seo, bidh thu ag aontachadh ri %1 Nokia HERE."
547560
548561#: qml/Wizard/Pages/40-location.qml:106
549562msgctxt "part of: Nokia HERE terms and conditions"
550563msgid "terms and conditions"
551−msgstr ""
564+msgstr "teirmichean is cumhaichean"
552565
553566#: qml/Wizard/Pages/40-location.qml:160
554567msgid "GPS only"
555−msgstr ""
568+msgstr "GPS a-mhàin"
556569
557570#: qml/Wizard/Pages/40-location.qml:214
558571msgid "Don't use my location"
559−msgstr ""
572+msgstr "Na cleachd m’ ionad"
560573
561574#: qml/Wizard/Pages/40-location.qml:260
562575msgid "You can change it later in System Settings."
563−msgstr ""
576+msgstr "’S urrainn dhut seo atharrachadh sna roghainnean uair sam bith"
564577
565578#: qml/Wizard/Pages/50-timezone.qml:29
566579msgid "Time Zone"
567−msgstr ""
580+msgstr "Roinn-tìde"
568581
569582#: qml/Wizard/Pages/50-timezone.qml:178
570583msgid "Enter your city"
571−msgstr ""
584+msgstr "Cuir a-steach do bhaile"
572585
573586#: qml/Wizard/Pages/60-account.qml:24
574587msgid "Personalize Your Device"
575−msgstr ""
588+msgstr "Cuir dreach pearsanta air an uidheam agad"
576589
577590#: qml/Wizard/Pages/60-account.qml:48
578591msgid "Preferred Name"
579−msgstr ""
592+msgstr "An t-ainm as fhearr leat"
580593
581594#: qml/Wizard/Pages/70-passwd-type.qml:39
582595msgid "Lock Screen"
583−msgstr ""
596+msgstr "Glais an sgrìn"
584597
585598#: qml/Wizard/Pages/70-passwd-type.qml:101
586599msgctxt "Label: Type of security method"
587600msgid "Create new password"
588−msgstr ""
601+msgstr "Cruthaich facal-faire ùr"
589602
590603#: qml/Wizard/Pages/70-passwd-type.qml:103
591604msgctxt "Label: Type of security method"
592605msgid "Create passcode (numbers only)"
593−msgstr ""
606+msgstr "Cruthaich còd-faire (àireamhan a-mhàin)"
594607
595608#: qml/Wizard/Pages/70-passwd-type.qml:105
596609msgctxt "Label: Type of security method"
597610msgid "No lock code"
598−msgstr ""
611+msgstr "Gun chòd-faire"
599612
600613#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
601614msgid "Privacy Policy"
602−msgstr ""
615+msgstr "Am poileasaidh prìobhaideachd"
603616
604617#: qml/Wizard/Pages/75-report-check.qml:26
605618msgid "Help Us Improve"
606−msgstr ""
619+msgstr "Cuidich leinn ’ga leasachadh"
607620
608621#: qml/Wizard/Pages/75-report-check.qml:59
609622msgid "Improve system performance by sending us crashes and error reports."
610623msgstr ""
624+"Leasaich an siostam còmhla rinn is tu a’ cur thugainn aithisgean mu "
625+"thuislidhean is mearachdan."
611626
612627#: qml/Wizard/Pages/75-report-check.qml:60
613628msgid "Privacy policy"
614−msgstr ""
629+msgstr "Am poileasaidh prìobhaideachd"
615630
616631#: qml/Wizard/Pages/80-finished.qml:89
617632msgid "Welcome to Ubuntu"
618−msgstr ""
633+msgstr "Fàilte gu Ubuntu"
619634
620635#: qml/Wizard/Pages/80-finished.qml:104
621636msgid "You are ready to use your device now"
622−msgstr ""
637+msgstr "Tha an t-uidheam deas ri do làimh a-nis"
623638
624639#: qml/Wizard/Pages/80-finished.qml:124
625640msgid "Get Started"
626−msgstr ""
641+msgstr "Toiseach-tòiseachaidh"
627642
628643#: qml/Wizard/Pages/here-terms.qml:25
629644msgid "Terms & Conditions"
@@ -631,7 +646,7 @@ msgstr "Teirmichean ⁊ cumhaichean"
631646
632647#: qml/Wizard/Pages/here-terms.qml:69
633648msgid "Your device uses positioning technologies provided by HERE."
634−msgstr ""
649+msgstr "’S e HERE a tha a’ solar teicneolas ionad an uidheim agad."
635650
636651#: qml/Wizard/Pages/here-terms.qml:81
637652msgid ""
@@ -639,21 +654,28 @@ msgid ""
639654"collects information about nearby cell towers and Wi-Fi hotspots around your "
640655"current location whenever your position is being found."
641656msgstr ""
657+"Airson ’s gun urrainn dha HERE d’ ionad a dh’fhiosrachadh dhut is càileachd "
658+"nan seirbheisean aca a leasachadh, cruinnichidh iad fiosrachadh mu thùir nam "
659+"fònaichean-làimhe is hotspots WiFI faisg ort nuair a dh’fhiosraicheas iad d’ "
660+"ionad."
642661
643662#: qml/Wizard/Pages/here-terms.qml:93
644663msgid ""
645664"The information collected is used to analyze the service and to improve the "
646665"use of service, but not to identify you personally."
647666msgstr ""
667+"Cleachdar am fiosrachadh seo airson mion-sgrùdadh a dhèanamh air an t-"
668+"seirbheis agus a leasachadh ach chan ann gus d’ aithneachadh gu pearsanta."
648669
649670#: qml/Wizard/Pages/here-terms.qml:106
650671#, qt-format
651672msgid "By continuing, you agree to the HERE platform %1 and %2."
652673msgstr ""
674+"Ma leanas tu air adhart, bidh thu ag aontachadh ri %1 agus %2 ùrlar HERE."
653675
654676#: qml/Wizard/Pages/here-terms.qml:107
655677msgid "Service Terms"
656−msgstr ""
678+msgstr "teirmichean na seirbheise"
657679
658680#: qml/Wizard/Pages/passcode-confirm.qml:43
659681#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -662,69 +684,71 @@ msgstr "Dearbhaich an còd-faire"
662684
663685#: qml/Wizard/Pages/passcode-confirm.qml:45
664686msgid "Incorrect passcode."
665−msgstr ""
687+msgstr "Tha an còd-faire cearr."
666688
667689#: qml/Wizard/Pages/passcode-confirm.qml:45
668690msgctxt "Enter the passcode again"
669691msgid "Please re-enter."
670−msgstr ""
692+msgstr "Cuir a-steach e às ùr."
671693
672694#: qml/Wizard/Pages/passcode-desktop.qml:30
673695msgid "Lock Screen Passcode"
674−msgstr ""
696+msgstr "Còd-faire na sgrin-ghlasaidh"
675697
676698#: qml/Wizard/Pages/passcode-desktop.qml:56
677699msgid "Enter 4 numbers to setup your passcode"
678−msgstr ""
700+msgstr "Cuir a-steach 4 àireamhan a bhios ’nan còd-faire agad"
679701
680702#: qml/Wizard/Pages/passcode-desktop.qml:65
681703#: qml/Wizard/Pages/passcode-set.qml:54
682704msgid "Choose passcode"
683−msgstr ""
705+msgstr "Tagh còd-faire"
684706
685707#: qml/Wizard/Pages/passcode-desktop.qml:105
686708msgid "Passcode too short"
687−msgstr ""
709+msgstr "Tha an còd-faire ro ghoirid"
688710
689711#: qml/Wizard/Pages/passcode-desktop.qml:107
690712msgid "Passcodes match"
691−msgstr ""
713+msgstr "Tha an dà chòd-faire co-ionnann"
692714
693715#: qml/Wizard/Pages/passcode-desktop.qml:109
694716msgid "Passcodes do not match"
695−msgstr ""
717+msgstr "Chan eil an dà chòd-faire co-ionnann"
696718
697719#: qml/Wizard/Pages/passcode-set.qml:62
698720msgid "Passcode must be 4 characters long"
699−msgstr ""
721+msgstr "Feumaidh an còd-faire a bhith 4 caractaran a dh’fhaid"
700722
701723#: qml/Wizard/Pages/password-set.qml:30
702724msgid "Lock Screen Password"
703−msgstr ""
725+msgstr "Facal-faire na sgrìn-ghlasaidh"
704726
705727#: qml/Wizard/Pages/password-set.qml:61
706728msgid "Enter at least 8 characters"
707−msgstr ""
729+msgstr "Cuir a-steach co-dhiù 8 caractaran"
708730
709731#: qml/Wizard/Pages/password-set.qml:73
710732msgid "Choose password"
711−msgstr ""
733+msgstr "Tagh facal-faire"
712734
713735#: qml/Wizard/Pages/password-set.qml:103
714736msgid "Confirm password"
715−msgstr ""
737+msgstr "Dearbh am facal-faire"
716738
717739#: qml/Wizard/Pages/sim.qml:27
718740msgid "No SIM card installed"
719−msgstr ""
741+msgstr "Cha deach cairt SIM a stàladh"
720742
721743#: qml/Wizard/Pages/sim.qml:54
722744msgid "SIM card added"
723−msgstr ""
745+msgstr "Chaidh cairt SIM a chur ris"
724746
725747#: qml/Wizard/Pages/sim.qml:55
726748msgid "You must restart the device to access the mobile network."
727749msgstr ""
750+"Feumaidh tu an t-uidheam ath-thòiseachadh mus fhaigh thu cothrom air an "
751+"lìonra mobile."
728752
729753#: qml/Wizard/Pages/sim.qml:59
730754msgid "Restart"
@@ -732,35 +756,36 @@ msgstr "Ath-thòisich"
732756
733757#: qml/Wizard/Pages/sim.qml:78
734758msgid "You won’t be able to make calls or use text messaging without a SIM."
735−msgstr ""
759+msgstr "Chan urrainn dhut fòn no SMS a chur as aonais SIM."
736760
737761#: qml/Wizard/Pages/sim.qml:90
738762msgid "To proceed with no SIM tap Skip."
739763msgstr ""
764+"Leum thairis air seo ma tha thu airson leantainn air adhart as aonais SIM."
740765
741766#: qml/Wizard/PasswordMeter.qml:87
742767msgid "Passwords match"
743−msgstr ""
768+msgstr "Tha an dà fhacal-faire co-ionnann"
744769
745770#: qml/Wizard/PasswordMeter.qml:89
746771msgid "Passwords do not match"
747−msgstr ""
772+msgstr "Chan eil an dà fhacal-faire co-ionnann"
748773
749774#: qml/Wizard/PasswordMeter.qml:93
750775msgid "Strong password"
751−msgstr ""
776+msgstr "Facal-faire làidir"
752777
753778#: qml/Wizard/PasswordMeter.qml:95
754779msgid "Fair password"
755−msgstr ""
780+msgstr "Facal-faire meadhanach"
756781
757782#: qml/Wizard/PasswordMeter.qml:97
758783msgid "Weak password"
759−msgstr ""
784+msgstr "Facal-faire lag"
760785
761786#: qml/Wizard/PasswordMeter.qml:99
762787msgid "Very weak password"
763−msgstr ""
788+msgstr "Facal-faire glè lag"
764789
765790#~ msgid "Skip intro"
766791#~ msgstr "Gearr leum thairis air an ro-ràdh"
@@ -1085,12 +1110,7 @@ msgstr ""
10851110#~ msgid "Call back"
10861111#~ msgstr "Fònaig air ais"
10871112
1088−#~ msgid "Welcome to your Ubuntu device."
1089−#~ msgstr "Fàilte dhan uidheam Ubuntu agad."
1090−
1091−#~ msgid "Please select how you’d like to unlock your device."
1113+#~ msgid "Hover your mouse on the right edge to view your open apps"
10921114#~ msgstr ""
1093−#~ "Tagh an dòigh sa tha thu airson a' ghlas a thoirt far an uidheam agad."
1094−
1095−#~ msgid "Your device is now ready to use."
1096−#~ msgstr "Tha an t-uidheam agad ullamh a-nis."
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 ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-01-15 14:56+0000\n"
1212"Last-Translator: Marcos Lans <Unknown>\n"
1313"Language-Team: Galician <gl@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -182,11 +182,11 @@ msgstr "Engadir aos favoritos"
182182
183183#: qml/Dash/FiltersPopover.qml:60
184184msgid "Refine your results"
185−msgstr ""
185+msgstr "Afinar os resultados"
186186
187187#: qml/Dash/FiltersPopover.qml:69
188188msgid "Reset"
189−msgstr ""
189+msgstr "Restabelecer"
190190
191191#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192192msgid "See less"
@@ -203,11 +203,11 @@ msgstr "Buscar"
203203
204204#: qml/Dash/PageHeaderExtraPanel.qml:55
205205msgid "Recent Searches"
206−msgstr ""
206+msgstr "Buscas recentes"
207207
208208#: qml/Dash/PageHeaderExtraPanel.qml:66
209209msgid "Clear All"
210−msgstr ""
210+msgstr "Limpar todo"
211211
212212#: qml/Dash/Previews/PreviewActionCombo.qml:35
213213msgid "More..."
@@ -426,51 +426,52 @@ msgstr "Chamar de volta"
426426
427427#: qml/Stages/SideStage.qml:76
428428msgid "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"
430430
431431#: qml/Tutorial/TutorialBottom.qml:78
432432msgid "Swipe up to add a contact"
433−msgstr ""
433+msgstr "Esvare cara a arriba para engadir un contacto"
434434
435435#: qml/Tutorial/TutorialBottom.qml:80
436436msgid "Swipe up for favorite calculations"
437−msgstr ""
437+msgstr "Esvare cara a arriba para marcar favorito un cálculo"
438438
439439#: qml/Tutorial/TutorialBottom.qml:82
440440msgid "Swipe up for recent calls"
441−msgstr ""
441+msgstr "Esvare cara a arriba para ver as chamadas recentes"
442442
443443#: qml/Tutorial/TutorialBottom.qml:84
444444msgid "Swipe up to create a message"
445−msgstr ""
445+msgstr "Esvare cara a arriba para crear unha mensaxe"
446446
447447#: qml/Tutorial/TutorialBottom.qml:85
448448msgid "Swipe up to manage the app"
449−msgstr ""
450−
451−#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Swipe from the left edge to open the launcher"
453−msgstr ""
449+msgstr "Esvare cara a arriba para xestionar un aplicativo"
454450
455451#: qml/Tutorial/TutorialLeftLong.qml:47
456452msgid "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"
458454
459−#: qml/Tutorial/TutorialRight.qml:54
460−msgid "Hover your mouse on the right edge to view your open apps"
461−msgstr ""
455+#: qml/Tutorial/TutorialLeft.qml:47
456+msgid "Swipe from the left edge to open the launcher"
457+msgstr "Esvare desde o bordo esquerdo para abrir o Iniciador"
462458
463459#: 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"
465461msgstr ""
466462
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+
467467#: qml/Tutorial/TutorialTop.qml:53
468468msgid "Swipe from the top right edge to open the notification bar"
469469msgstr ""
470+"Esvare desde o bordo superior dereito para abrir a barra de notificacións"
470471
471472#: qml/Tutorial/TutorialTop.qml:54
472473msgid "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"
474475
475476#: qml/Wizard/Page.qml:54
476477msgctxt "Button: Go back one page in the Wizard"
@@ -479,7 +480,7 @@ msgstr "Atrás"
479480
480481#: qml/Wizard/Pages/10-welcome.qml:27
481482msgid "Language"
482−msgstr ""
483+msgstr "Idioma"
483484
484485#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
485486#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -488,7 +489,7 @@ msgstr ""
488489#: qml/Wizard/Pages/passcode-desktop.qml:124
489490#: qml/Wizard/Pages/password-set.qml:141
490491msgid "Next"
491−msgstr ""
492+msgstr "Seguinte"
492493
493494#: qml/Wizard/Pages/30-wifi.qml:29
494495msgid "Connect to Wi‑Fi"
@@ -496,15 +497,15 @@ msgstr "Conectar a unha wifi"
496497
497498#: qml/Wizard/Pages/30-wifi.qml:130
498499msgid "Connected"
499−msgstr ""
500+msgstr "Conectado"
500501
501502#: qml/Wizard/Pages/30-wifi.qml:163
502503msgid "Available Wi-Fi networks"
503−msgstr ""
504+msgstr "Hai redes wifi dispoñíbeis"
504505
505506#: qml/Wizard/Pages/30-wifi.qml:164
506507msgid "No available Wi-Fi networks"
507−msgstr ""
508+msgstr "Non hai redes wifi dispoñíbeis"
508509
509510#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
510511#: qml/Wizard/Pages/sim.qml:101
@@ -513,98 +514,101 @@ msgstr "Saltar"
513514
514515#: qml/Wizard/Pages/40-location.qml:27
515516msgid "Location Services"
516−msgstr ""
517+msgstr "Servizos de localización"
517518
518519#: qml/Wizard/Pages/40-location.qml:83
519520msgid ""
520521"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
521522"(recommended)"
522523msgstr ""
524+"Usar GPS, punto de conexión wifi e rede móbil anonimamente para detectar a "
525+"localización (recomendado)"
523526
524527#: qml/Wizard/Pages/40-location.qml:105
525528#, qt-format
526529msgid "By selecting this option you agree to the Nokia HERE %1."
527−msgstr ""
530+msgstr "Seleccionando esta opción acepta os %1 de HERE."
528531
529532#: qml/Wizard/Pages/40-location.qml:106
530533msgctxt "part of: Nokia HERE terms and conditions"
531534msgid "terms and conditions"
532−msgstr ""
535+msgstr "termos e condicións"
533536
534537#: qml/Wizard/Pages/40-location.qml:160
535538msgid "GPS only"
536−msgstr ""
539+msgstr "Só GPS"
537540
538541#: qml/Wizard/Pages/40-location.qml:214
539542msgid "Don't use my location"
540−msgstr ""
543+msgstr "Non usar a localización"
541544
542545#: qml/Wizard/Pages/40-location.qml:260
543546msgid "You can change it later in System Settings."
544−msgstr ""
547+msgstr "Pode cambiala depois nos axustes do sistema"
545548
546549#: qml/Wizard/Pages/50-timezone.qml:29
547550msgid "Time Zone"
548−msgstr ""
551+msgstr "Zona horaria"
549552
550553#: qml/Wizard/Pages/50-timezone.qml:178
551554msgid "Enter your city"
552−msgstr ""
555+msgstr "Introduza a súa cidade"
553556
554557#: qml/Wizard/Pages/60-account.qml:24
555558msgid "Personalize Your Device"
556−msgstr ""
559+msgstr "Personalice o dispositivo"
557560
558561#: qml/Wizard/Pages/60-account.qml:48
559562msgid "Preferred Name"
560−msgstr ""
563+msgstr "Nome preferido"
561564
562565#: qml/Wizard/Pages/70-passwd-type.qml:39
563566msgid "Lock Screen"
564−msgstr ""
567+msgstr "Bloquear pantalla"
565568
566569#: qml/Wizard/Pages/70-passwd-type.qml:101
567570msgctxt "Label: Type of security method"
568571msgid "Create new password"
569−msgstr ""
572+msgstr "Crear novo contrasinal"
570573
571574#: qml/Wizard/Pages/70-passwd-type.qml:103
572575msgctxt "Label: Type of security method"
573576msgid "Create passcode (numbers only)"
574−msgstr ""
577+msgstr "Crear clave (só números)"
575578
576579#: qml/Wizard/Pages/70-passwd-type.qml:105
577580msgctxt "Label: Type of security method"
578581msgid "No lock code"
579−msgstr ""
582+msgstr "Sen código de bloqueo"
580583
581584#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
582585msgid "Privacy Policy"
583−msgstr ""
586+msgstr "Política de confidencialidade"
584587
585588#: qml/Wizard/Pages/75-report-check.qml:26
586589msgid "Help Us Improve"
587−msgstr ""
590+msgstr "Axúdenos a mellorar"
588591
589592#: qml/Wizard/Pages/75-report-check.qml:59
590593msgid "Improve system performance by sending us crashes and error reports."
591594msgstr ""
595+"Mellorar o rendemento do sistema enviándonos informes de erro e quebra."
592596
593597#: qml/Wizard/Pages/75-report-check.qml:60
594598msgid "Privacy policy"
595−msgstr ""
599+msgstr "Política de confidencialidade"
596600
597601#: qml/Wizard/Pages/80-finished.qml:89
598602msgid "Welcome to Ubuntu"
599−msgstr ""
603+msgstr "Benvida/o a Ubuntu"
600604
601605#: qml/Wizard/Pages/80-finished.qml:104
602606msgid "You are ready to use your device now"
603−msgstr ""
607+msgstr "Xa está listo para usar o dispositivo"
604608
605609#: qml/Wizard/Pages/80-finished.qml:124
606610msgid "Get Started"
607−msgstr ""
611+msgstr "Comezar"
608612
609613#: qml/Wizard/Pages/here-terms.qml:25
610614msgid "Terms & Conditions"
@@ -612,7 +616,7 @@ msgstr "Termos e condicións"
612616
613617#: qml/Wizard/Pages/here-terms.qml:69
614618msgid "Your device uses positioning technologies provided by HERE."
615−msgstr ""
619+msgstr "O dispositivo usa tecnoloxías de posicionamento fornecidas por HERE."
616620
617621#: qml/Wizard/Pages/here-terms.qml:81
618622msgid ""
@@ -620,21 +624,26 @@ msgid ""
620624"collects information about nearby cell towers and Wi-Fi hotspots around your "
621625"current location whenever your position is being found."
622626msgstr ""
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."
623630
624631#: qml/Wizard/Pages/here-terms.qml:93
625632msgid ""
626633"The information collected is used to analyze the service and to improve the "
627634"use of service, but not to identify you personally."
628635msgstr ""
636+"A información recompilada úsase para analizar o servizo e mellorar o uso, "
637+"pero non o identifica persoalmente."
629638
630639#: qml/Wizard/Pages/here-terms.qml:106
631640#, qt-format
632641msgid "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."
634643
635644#: qml/Wizard/Pages/here-terms.qml:107
636645msgid "Service Terms"
637−msgstr ""
646+msgstr "Termos de servizo"
638647
639648#: qml/Wizard/Pages/passcode-confirm.qml:43
640649#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -643,69 +652,69 @@ msgstr "Confirmar a clave"
643652
644653#: qml/Wizard/Pages/passcode-confirm.qml:45
645654msgid "Incorrect passcode."
646−msgstr ""
655+msgstr "A clave é incorrecta"
647656
648657#: qml/Wizard/Pages/passcode-confirm.qml:45
649658msgctxt "Enter the passcode again"
650659msgid "Please re-enter."
651−msgstr ""
660+msgstr "Reintroducir"
652661
653662#: qml/Wizard/Pages/passcode-desktop.qml:30
654663msgid "Lock Screen Passcode"
655−msgstr ""
664+msgstr "Clave da pantalla de bloqueo"
656665
657666#: qml/Wizard/Pages/passcode-desktop.qml:56
658667msgid "Enter 4 numbers to setup your passcode"
659−msgstr ""
668+msgstr "Introduza 4 números para estabelecer a clave"
660669
661670#: qml/Wizard/Pages/passcode-desktop.qml:65
662671#: qml/Wizard/Pages/passcode-set.qml:54
663672msgid "Choose passcode"
664−msgstr ""
673+msgstr "Escolla unha clave"
665674
666675#: qml/Wizard/Pages/passcode-desktop.qml:105
667676msgid "Passcode too short"
668−msgstr ""
677+msgstr "A clave é curta de máis"
669678
670679#: qml/Wizard/Pages/passcode-desktop.qml:107
671680msgid "Passcodes match"
672−msgstr ""
681+msgstr "As claves coinciden"
673682
674683#: qml/Wizard/Pages/passcode-desktop.qml:109
675684msgid "Passcodes do not match"
676−msgstr ""
685+msgstr "As claves non coinciden"
677686
678687#: qml/Wizard/Pages/passcode-set.qml:62
679688msgid "Passcode must be 4 characters long"
680−msgstr ""
689+msgstr "A clave debe ter 4 caracteres"
681690
682691#: qml/Wizard/Pages/password-set.qml:30
683692msgid "Lock Screen Password"
684−msgstr ""
693+msgstr "Contrasinal da pantalla de bloqueo"
685694
686695#: qml/Wizard/Pages/password-set.qml:61
687696msgid "Enter at least 8 characters"
688−msgstr ""
697+msgstr "Introduza cando menos 8 caracteres"
689698
690699#: qml/Wizard/Pages/password-set.qml:73
691700msgid "Choose password"
692−msgstr ""
701+msgstr "Seleccionar contrasinal"
693702
694703#: qml/Wizard/Pages/password-set.qml:103
695704msgid "Confirm password"
696−msgstr ""
705+msgstr "Confirmar o contrasinal"
697706
698707#: qml/Wizard/Pages/sim.qml:27
699708msgid "No SIM card installed"
700−msgstr ""
709+msgstr "Non está instalada ningunha tarxeta SIM"
701710
702711#: qml/Wizard/Pages/sim.qml:54
703712msgid "SIM card added"
704−msgstr ""
713+msgstr "Engadiuse a tarxeta SIM"
705714
706715#: qml/Wizard/Pages/sim.qml:55
707716msgid "You must restart the device to access the mobile network."
708−msgstr ""
717+msgstr "Debe reiniciar o dispositivo para acceder á rede móbil."
709718
710719#: qml/Wizard/Pages/sim.qml:59
711720msgid "Restart"
@@ -714,34 +723,36 @@ msgstr "Reiniciar"
714723#: qml/Wizard/Pages/sim.qml:78
715724msgid "You won’t be able to make calls or use text messaging without a SIM."
716725msgstr ""
726+"Non será posíbel facer chamadas nin usar a mensaxería de texto sen unha "
727+"tarxeta SIM."
717728
718729#: qml/Wizard/Pages/sim.qml:90
719730msgid "To proceed with no SIM tap Skip."
720−msgstr ""
731+msgstr "Para continuar sen tarxeta SIM toque Saltar."
721732
722733#: qml/Wizard/PasswordMeter.qml:87
723734msgid "Passwords match"
724−msgstr ""
735+msgstr "Os contrasinais coinciden"
725736
726737#: qml/Wizard/PasswordMeter.qml:89
727738msgid "Passwords do not match"
728−msgstr ""
739+msgstr "Os contrasinais non coinciden"
729740
730741#: qml/Wizard/PasswordMeter.qml:93
731742msgid "Strong password"
732−msgstr ""
743+msgstr "O contrasinal é forte"
733744
734745#: qml/Wizard/PasswordMeter.qml:95
735746msgid "Fair password"
736−msgstr ""
747+msgstr "O contrasinal é aceptábel"
737748
738749#: qml/Wizard/PasswordMeter.qml:97
739750msgid "Weak password"
740−msgstr ""
751+msgstr "O contrasinal é feble"
741752
742753#: qml/Wizard/PasswordMeter.qml:99
743754msgid "Very weak password"
744−msgstr ""
755+msgstr "O contrasinal é moi feble"
745756
746757#~ msgid "Confirm"
747758#~ msgstr "Confirmar"
@@ -1058,11 +1069,5 @@ msgstr ""
10581069#~ msgid "%a %d %b %l:%M %p"
10591070#~ msgstr "%a, %d de %b  %l:%M %p"
10601071
1061−#~ msgid "Welcome to your Ubuntu device."
1062−#~ msgstr "Benvido/a ao seu dispositivo Ubuntu."
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."
1072+#~ msgid "Hover your mouse on the right edge to view your open apps"
1073+#~ msgstr "Pouse o cursor no bordo dereito para ver os aplicativos abertos"
po/gv.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-04-02 14:24+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Manx <gv@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"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"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -447,19 +447,19 @@ msgstr ""
447447msgid "Swipe up to manage the app"
448448msgstr ""
449449
450−#: qml/Tutorial/TutorialLeft.qml:47
451−msgid "Swipe from the left edge to open the launcher"
452−msgstr ""
453−
454450#: qml/Tutorial/TutorialLeftLong.qml:47
455451msgid "Long swipe from the left edge to open the Today scope"
456452msgstr ""
457453
458−#: qml/Tutorial/TutorialRight.qml:54
459−msgid "Hover your mouse on the right edge to view your open apps"
454+#: qml/Tutorial/TutorialLeft.qml:47
455+msgid "Swipe from the left edge to open the launcher"
460456msgstr ""
461457
462458#: 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
463463msgid "Short or long swipe from the right edge to view your open apps"
464464msgstr ""
465465
po/he.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-12 08:47+0000\n"
1212"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
1313"Language-Team: Hebrew <he@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/hi.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-01-15 01:49+0000\n"
1212"Last-Translator: Siddhanathan Shanmugam <Unknown>\n"
1313"Language-Team: Hindi <hi@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/hr.po+91−82
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-06-27 04:14+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Croatian <hr@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -119,7 +119,7 @@ msgstr "Isključi"
119119#: qml/Components/Dialogs.qml:210
120120msgctxt "Button: Restart the system"
121121msgid "Restart"
122−msgstr "Ponovo pokreni"
122+msgstr "Ponovno pokreni"
123123
124124#: qml/Components/Lockscreen.qml:231
125125msgid "Return to Call"
@@ -186,11 +186,11 @@ msgstr "Dodaj u omiljene"
186186
187187#: qml/Dash/FiltersPopover.qml:60
188188msgid "Refine your results"
189−msgstr ""
189+msgstr "Precizirajte svoje rezultate"
190190
191191#: qml/Dash/FiltersPopover.qml:69
192192msgid "Reset"
193−msgstr ""
193+msgstr "Ponovno postavi"
194194
195195#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
196196msgid "See less"
@@ -207,11 +207,11 @@ msgstr "Pretraži"
207207
208208#: qml/Dash/PageHeaderExtraPanel.qml:55
209209msgid "Recent Searches"
210−msgstr ""
210+msgstr "Nedavna pretraživanja"
211211
212212#: qml/Dash/PageHeaderExtraPanel.qml:66
213213msgid "Clear All"
214−msgstr ""
214+msgstr "Obriši sve"
215215
216216#: qml/Dash/Previews/PreviewActionCombo.qml:35
217217msgid "More..."
@@ -434,50 +434,53 @@ msgstr "Uzvrati poziv"
434434#: qml/Stages/SideStage.qml:76
435435msgid "Drag using 3 fingers any application from one window to the other"
436436msgstr ""
437+"Povucite pomoću 3 prsta bilo koju aplikaciju iz jednog prozora u drugi"
437438
438439#: qml/Tutorial/TutorialBottom.qml:78
439440msgid "Swipe up to add a contact"
440−msgstr ""
441+msgstr "Povucite prema gore za dodavanje kontakta"
441442
442443#: qml/Tutorial/TutorialBottom.qml:80
443444msgid "Swipe up for favorite calculations"
444−msgstr ""
445+msgstr "Povucite prema gore za izračunavanje omiljenih"
445446
446447#: qml/Tutorial/TutorialBottom.qml:82
447448msgid "Swipe up for recent calls"
448−msgstr ""
449+msgstr "Povucite prema gore za nedavne pozive"
449450
450451#: qml/Tutorial/TutorialBottom.qml:84
451452msgid "Swipe up to create a message"
452−msgstr ""
453+msgstr "Povucite prema gore za stvaranje poruke"
453454
454455#: qml/Tutorial/TutorialBottom.qml:85
455456msgid "Swipe up to manage the app"
456−msgstr ""
457−
458−#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Swipe from the left edge to open the launcher"
460−msgstr ""
457+msgstr "Povucite prema gore za upravljanje aplikacijom"
461458
462459#: qml/Tutorial/TutorialLeftLong.qml:47
463460msgid "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"
465462
466−#: qml/Tutorial/TutorialRight.qml:54
467−msgid "Hover your mouse on the right edge to view your open apps"
468−msgstr ""
463+#: qml/Tutorial/TutorialLeft.qml:47
464+msgid "Swipe from the left edge to open the launcher"
465+msgstr "Povucite od lijevog ruba za otvaranje pokretača"
469466
470467#: 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
471472msgid "Short or long swipe from the right edge to view your open apps"
472473msgstr ""
474+"Kraće ili dulje povucite od desnog ruba kako bi vidjeli svoje otvorene "
475+"aplikacije"
473476
474477#: qml/Tutorial/TutorialTop.qml:53
475478msgid "Swipe from the top right edge to open the notification bar"
476−msgstr ""
479+msgstr "Povucite od gornjeg desnog ruba za otvaranje obavijesne trake"
477480
478481#: qml/Tutorial/TutorialTop.qml:54
479482msgid "Swipe from the top edge to open the notification bar"
480−msgstr ""
483+msgstr "Povucite od gornjeg ruba za otvaranje obavijesne trake"
481484
482485#: qml/Wizard/Page.qml:54
483486msgctxt "Button: Go back one page in the Wizard"
@@ -486,7 +489,7 @@ msgstr "Natrag"
486489
487490#: qml/Wizard/Pages/10-welcome.qml:27
488491msgid "Language"
489−msgstr ""
492+msgstr "Jezik"
490493
491494#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
492495#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -495,7 +498,7 @@ msgstr ""
495498#: qml/Wizard/Pages/passcode-desktop.qml:124
496499#: qml/Wizard/Pages/password-set.qml:141
497500msgid "Next"
498−msgstr ""
501+msgstr "Sljedeće"
499502
500503#: qml/Wizard/Pages/30-wifi.qml:29
501504msgid "Connect to Wi‑Fi"
@@ -503,15 +506,15 @@ msgstr "Povezivanje s Wi‑Fi"
503506
504507#: qml/Wizard/Pages/30-wifi.qml:130
505508msgid "Connected"
506−msgstr ""
509+msgstr "Povezano"
507510
508511#: qml/Wizard/Pages/30-wifi.qml:163
509512msgid "Available Wi-Fi networks"
510−msgstr ""
513+msgstr "Dostupne bežične mreže"
511514
512515#: qml/Wizard/Pages/30-wifi.qml:164
513516msgid "No available Wi-Fi networks"
514−msgstr ""
517+msgstr "Nema dostupnih bežičnih mreža"
515518
516519#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
517520#: qml/Wizard/Pages/sim.qml:101
@@ -520,98 +523,101 @@ msgstr "Preskoči"
520523
521524#: qml/Wizard/Pages/40-location.qml:27
522525msgid "Location Services"
523−msgstr ""
526+msgstr "Usluge lokacije"
524527
525528#: qml/Wizard/Pages/40-location.qml:83
526529msgid ""
527530"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
528531"(recommended)"
529532msgstr ""
533+"Koristi GPS, bežične pristupne točke i mobilnu mrežu anonimno za otkrivanje "
534+"lokacije (preporučeno)"
530535
531536#: qml/Wizard/Pages/40-location.qml:105
532537#, qt-format
533538msgid "By selecting this option you agree to the Nokia HERE %1."
534−msgstr ""
539+msgstr "Odabirom ove mogućnosti pristajete na Nokia HERE %1."
535540
536541#: qml/Wizard/Pages/40-location.qml:106
537542msgctxt "part of: Nokia HERE terms and conditions"
538543msgid "terms and conditions"
539−msgstr ""
544+msgstr "uvjete i odredbe"
540545
541546#: qml/Wizard/Pages/40-location.qml:160
542547msgid "GPS only"
543−msgstr ""
548+msgstr "Samo GPS"
544549
545550#: qml/Wizard/Pages/40-location.qml:214
546551msgid "Don't use my location"
547−msgstr ""
552+msgstr "Ne koristi uslugu lokacije"
548553
549554#: qml/Wizard/Pages/40-location.qml:260
550555msgid "You can change it later in System Settings."
551−msgstr ""
556+msgstr "Ovo možete kasnije promijeniti u postavkama sustava."
552557
553558#: qml/Wizard/Pages/50-timezone.qml:29
554559msgid "Time Zone"
555−msgstr ""
560+msgstr "Vremenska zona"
556561
557562#: qml/Wizard/Pages/50-timezone.qml:178
558563msgid "Enter your city"
559−msgstr ""
564+msgstr "Upišite svoj grad"
560565
561566#: qml/Wizard/Pages/60-account.qml:24
562567msgid "Personalize Your Device"
563−msgstr ""
568+msgstr "Personalizirajte svoj uređaj"
564569
565570#: qml/Wizard/Pages/60-account.qml:48
566571msgid "Preferred Name"
567−msgstr ""
572+msgstr "Željeno ime"
568573
569574#: qml/Wizard/Pages/70-passwd-type.qml:39
570575msgid "Lock Screen"
571−msgstr ""
576+msgstr "Zaključaj zaslon"
572577
573578#: qml/Wizard/Pages/70-passwd-type.qml:101
574579msgctxt "Label: Type of security method"
575580msgid "Create new password"
576−msgstr ""
581+msgstr "Stvori novu lozinku"
577582
578583#: qml/Wizard/Pages/70-passwd-type.qml:103
579584msgctxt "Label: Type of security method"
580585msgid "Create passcode (numbers only)"
581−msgstr ""
586+msgstr "Stvori sigurnosni kôd (samo brojevi)"
582587
583588#: qml/Wizard/Pages/70-passwd-type.qml:105
584589msgctxt "Label: Type of security method"
585590msgid "No lock code"
586−msgstr ""
591+msgstr "Nema kôda zaključavanja"
587592
588593#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
589594msgid "Privacy Policy"
590−msgstr ""
595+msgstr "Pravila privatnosti"
591596
592597#: qml/Wizard/Pages/75-report-check.qml:26
593598msgid "Help Us Improve"
594−msgstr ""
599+msgstr "Pomognite nam poboljšati"
595600
596601#: qml/Wizard/Pages/75-report-check.qml:59
597602msgid "Improve system performance by sending us crashes and error reports."
598603msgstr ""
604+"Poboljšajte performanse sustava šaljući nam izvješća grešaka i rušenja."
599605
600606#: qml/Wizard/Pages/75-report-check.qml:60
601607msgid "Privacy policy"
602−msgstr ""
608+msgstr "Pravila privatnosti"
603609
604610#: qml/Wizard/Pages/80-finished.qml:89
605611msgid "Welcome to Ubuntu"
606−msgstr ""
612+msgstr "Dobrodošli u Ubuntu"
607613
608614#: qml/Wizard/Pages/80-finished.qml:104
609615msgid "You are ready to use your device now"
610−msgstr ""
616+msgstr "Sada ste spremni koristiti svoj uređaj"
611617
612618#: qml/Wizard/Pages/80-finished.qml:124
613619msgid "Get Started"
614−msgstr ""
620+msgstr "Započnite"
615621
616622#: qml/Wizard/Pages/here-terms.qml:25
617623msgid "Terms & Conditions"
@@ -620,6 +626,7 @@ msgstr "Uvjeti i odredbe"
620626#: qml/Wizard/Pages/here-terms.qml:69
621627msgid "Your device uses positioning technologies provided by HERE."
622628msgstr ""
629+"Vaš uređaj koristi tehnologiju određivanja položaja koju omogućuje HERE."
623630
624631#: qml/Wizard/Pages/here-terms.qml:81
625632msgid ""
@@ -627,21 +634,27 @@ msgid ""
627634"collects information about nearby cell towers and Wi-Fi hotspots around your "
628635"current location whenever your position is being found."
629636msgstr ""
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."
630641
631642#: qml/Wizard/Pages/here-terms.qml:93
632643msgid ""
633644"The information collected is used to analyze the service and to improve the "
634645"use of service, but not to identify you personally."
635646msgstr ""
647+"Prikupljene informacije se koriste za analizu i poboljšanje korištenja "
648+"usluga, ali ne i kako bi Vas osobno identificirali."
636649
637650#: qml/Wizard/Pages/here-terms.qml:106
638651#, qt-format
639652msgid "By continuing, you agree to the HERE platform %1 and %2."
640−msgstr ""
653+msgstr "Nastavkom, pristajete na HERE platformu %1 i %2."
641654
642655#: qml/Wizard/Pages/here-terms.qml:107
643656msgid "Service Terms"
644−msgstr ""
657+msgstr "Uvjeti korištenja"
645658
646659#: qml/Wizard/Pages/passcode-confirm.qml:43
647660#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -650,105 +663,106 @@ msgstr "Potvrdi kôd"
650663
651664#: qml/Wizard/Pages/passcode-confirm.qml:45
652665msgid "Incorrect passcode."
653−msgstr ""
666+msgstr "Neispravan sigurnosni kôd"
654667
655668#: qml/Wizard/Pages/passcode-confirm.qml:45
656669msgctxt "Enter the passcode again"
657670msgid "Please re-enter."
658−msgstr ""
671+msgstr "Ponovno upišite."
659672
660673#: qml/Wizard/Pages/passcode-desktop.qml:30
661674msgid "Lock Screen Passcode"
662−msgstr ""
675+msgstr "Kôd zaključavanja zaslona"
663676
664677#: qml/Wizard/Pages/passcode-desktop.qml:56
665678msgid "Enter 4 numbers to setup your passcode"
666−msgstr ""
679+msgstr "Upišite 4 broja za postavljanje vašeg kôda"
667680
668681#: qml/Wizard/Pages/passcode-desktop.qml:65
669682#: qml/Wizard/Pages/passcode-set.qml:54
670683msgid "Choose passcode"
671−msgstr ""
684+msgstr "Odaberi kôd"
672685
673686#: qml/Wizard/Pages/passcode-desktop.qml:105
674687msgid "Passcode too short"
675−msgstr ""
688+msgstr "Kôd je prekratak"
676689
677690#: qml/Wizard/Pages/passcode-desktop.qml:107
678691msgid "Passcodes match"
679−msgstr ""
692+msgstr "Kôdovi se podudaraju"
680693
681694#: qml/Wizard/Pages/passcode-desktop.qml:109
682695msgid "Passcodes do not match"
683−msgstr ""
696+msgstr "Kôdovi se ne podudaraju"
684697
685698#: qml/Wizard/Pages/passcode-set.qml:62
686699msgid "Passcode must be 4 characters long"
687−msgstr ""
700+msgstr "Kôd mora sadržavati 4 znamenke"
688701
689702#: qml/Wizard/Pages/password-set.qml:30
690703msgid "Lock Screen Password"
691−msgstr ""
704+msgstr "Lozinka zaključavanja zaslona"
692705
693706#: qml/Wizard/Pages/password-set.qml:61
694707msgid "Enter at least 8 characters"
695−msgstr ""
708+msgstr "Upišite najmanje 8 znamenaka"
696709
697710#: qml/Wizard/Pages/password-set.qml:73
698711msgid "Choose password"
699−msgstr ""
712+msgstr "Odaberi lozinku"
700713
701714#: qml/Wizard/Pages/password-set.qml:103
702715msgid "Confirm password"
703−msgstr ""
716+msgstr "Potvrdi lozniku"
704717
705718#: qml/Wizard/Pages/sim.qml:27
706719msgid "No SIM card installed"
707−msgstr ""
720+msgstr "Nema instalirane SIM kartice"
708721
709722#: qml/Wizard/Pages/sim.qml:54
710723msgid "SIM card added"
711−msgstr ""
724+msgstr "SIM kartica dodana"
712725
713726#: qml/Wizard/Pages/sim.qml:55
714727msgid "You must restart the device to access the mobile network."
715−msgstr ""
728+msgstr "Morate ponovno pokrenuti uređaj za pristup mobilnoj mreži."
716729
717730#: qml/Wizard/Pages/sim.qml:59
718731msgid "Restart"
719−msgstr ""
732+msgstr "Ponovno pokreni"
720733
721734#: qml/Wizard/Pages/sim.qml:78
722735msgid "You won’t be able to make calls or use text messaging without a SIM."
723736msgstr ""
737+"Nećete biti u mogućnosti obavljati razgovore i slati poruke bez SIM kartice."
724738
725739#: qml/Wizard/Pages/sim.qml:90
726740msgid "To proceed with no SIM tap Skip."
727−msgstr ""
741+msgstr "Za nastavak bez SIM kartice dotaknite Preskoči."
728742
729743#: qml/Wizard/PasswordMeter.qml:87
730744msgid "Passwords match"
731−msgstr ""
745+msgstr "Lozinke se podudaraju"
732746
733747#: qml/Wizard/PasswordMeter.qml:89
734748msgid "Passwords do not match"
735−msgstr ""
749+msgstr "Lozinke se ne podudaraju"
736750
737751#: qml/Wizard/PasswordMeter.qml:93
738752msgid "Strong password"
739−msgstr ""
753+msgstr "Snažna lozinka"
740754
741755#: qml/Wizard/PasswordMeter.qml:95
742756msgid "Fair password"
743−msgstr ""
757+msgstr "Solidna lozinka"
744758
745759#: qml/Wizard/PasswordMeter.qml:97
746760msgid "Weak password"
747−msgstr ""
761+msgstr "Slaba lozinka"
748762
749763#: qml/Wizard/PasswordMeter.qml:99
750764msgid "Very weak password"
751−msgstr ""
765+msgstr "Vrlo slaba lozinka"
752766
753767#~ msgid "Confirm"
754768#~ msgstr "Potvrdi"
@@ -990,11 +1004,6 @@ msgstr ""
9901004#~ msgid "Long swipe from the right edge."
9911005#~ msgstr "Povuci dugo s desnog ruba"
9921006
993−#~ msgid "Your device is now ready to use."
994−#~ msgstr "Vaš uređaj je sada spreman za upotrebu."
995−
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."
1007+#~ msgid "Hover your mouse on the right edge to view your open apps"
1008+#~ msgstr ""
1009+#~ "Lebdite svojim mišem po desnom rubu kako bi vidjeli otvorene aplikacije"
po/hu.po+13−19
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-03-24 09:19+0000\n"
1212"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-25 05:55+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -451,19 +451,19 @@ msgstr "Csúsztasson felfelé új üzenet írásához"
451451msgid "Swipe up to manage the app"
452452msgstr "Csúsztasson felfelé az alkalmazás kezeléséhez"
453453
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−
458454#: qml/Tutorial/TutorialLeftLong.qml:47
459455msgid "Long swipe from the left edge to open the Today scope"
460456msgstr "Hosszan csúsztasson balról a Ma lencse eléréséhez"
461457
462−#: qml/Tutorial/TutorialRight.qml:54
463−msgid "Hover your mouse on the right edge to view your open apps"
464−msgstr "Húzza az egeret jobbra a nyitott alkalmazások eléréséhez"
458+#: qml/Tutorial/TutorialLeft.qml:47
459+msgid "Swipe from the left edge to open the launcher"
460+msgstr "Csúsztasson balról az indító eléréshez"
465461
466462#: 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
467467msgid "Short or long swipe from the right edge to view your open apps"
468468msgstr ""
469469"Csúsztasson röviden vagy hosszan jobbról a nyitott alkalmazások eléréshez"
@@ -547,7 +547,7 @@ msgstr "Ne határozza meg"
547547
548548#: qml/Wizard/Pages/40-location.qml:260
549549msgid "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."
551551
552552#: qml/Wizard/Pages/50-timezone.qml:29
553553msgid "Time Zone"
@@ -1075,11 +1075,5 @@ msgstr "Nagyon gyenge jelszó"
10751075#~ msgid "You almost got it!"
10761076#~ msgstr "Majdnem megvan!"
10771077
1078−#~ msgid "Your device is now ready to use."
1079−#~ msgstr "Az eszköze készen áll a használatra."
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."
1078+#~ msgid "Hover your mouse on the right edge to view your open apps"
1079+#~ msgstr "Húzza az egeret jobbra a nyitott alkalmazások eléréséhez"
po/hy.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2014-10-28 06:34+0000\n"
1212"Last-Translator: Vahan Harutyunyan <Unknown>\n"
1313"Language-Team: Armenian <hy@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -444,19 +444,19 @@ msgstr ""
444444msgid "Swipe up to manage the app"
445445msgstr ""
446446
447−#: qml/Tutorial/TutorialLeft.qml:47
448−msgid "Swipe from the left edge to open the launcher"
449−msgstr ""
450−
451447#: qml/Tutorial/TutorialLeftLong.qml:47
452448msgid "Long swipe from the left edge to open the Today scope"
453449msgstr ""
454450
455−#: qml/Tutorial/TutorialRight.qml:54
456−msgid "Hover your mouse on the right edge to view your open apps"
451+#: qml/Tutorial/TutorialLeft.qml:47
452+msgid "Swipe from the left edge to open the launcher"
457453msgstr ""
458454
459455#: 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
460460msgid "Short or long swipe from the right edge to view your open apps"
461461msgstr ""
462462
po/ia.po+89−82
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-08-25 19:31+0000\n"
1212"Last-Translator: karm <melo@carmu.com>\n"
1313"Language-Team: Interlingua <ia@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -184,11 +184,11 @@ msgstr "Adder al Favoritos"
184184
185185#: qml/Dash/FiltersPopover.qml:60
186186msgid "Refine your results"
187−msgstr ""
187+msgstr "Poli tu resultatos"
188188
189189#: qml/Dash/FiltersPopover.qml:69
190190msgid "Reset"
191−msgstr ""
191+msgstr "Restabilir"
192192
193193#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
194194msgid "See less"
@@ -205,11 +205,11 @@ msgstr "Cerca"
205205
206206#: qml/Dash/PageHeaderExtraPanel.qml:55
207207msgid "Recent Searches"
208−msgstr ""
208+msgstr "Recercas recente"
209209
210210#: qml/Dash/PageHeaderExtraPanel.qml:66
211211msgid "Clear All"
212−msgstr ""
212+msgstr "Clarar toto"
213213
214214#: qml/Dash/Previews/PreviewActionCombo.qml:35
215215msgid "More..."
@@ -428,51 +428,52 @@ msgstr "Appellar retro"
428428
429429#: qml/Stages/SideStage.qml:76
430430msgid "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"
432432
433433#: qml/Tutorial/TutorialBottom.qml:78
434434msgid "Swipe up to add a contact"
435−msgstr ""
435+msgstr "Striar in alto pro adder un contacto"
436436
437437#: qml/Tutorial/TutorialBottom.qml:80
438438msgid "Swipe up for favorite calculations"
439−msgstr ""
439+msgstr "Striar in alto pro le calculationes favorite"
440440
441441#: qml/Tutorial/TutorialBottom.qml:82
442442msgid "Swipe up for recent calls"
443−msgstr ""
443+msgstr "Striar in alto pro le appellos recente"
444444
445445#: qml/Tutorial/TutorialBottom.qml:84
446446msgid "Swipe up to create a message"
447−msgstr ""
447+msgstr "Striar in alto pro crear un message"
448448
449449#: qml/Tutorial/TutorialBottom.qml:85
450450msgid "Swipe up to manage the app"
451−msgstr ""
452−
453−#: qml/Tutorial/TutorialLeft.qml:47
454−msgid "Swipe from the left edge to open the launcher"
455−msgstr ""
451+msgstr "Striar in alto pro gerer le applicationes"
456452
457453#: qml/Tutorial/TutorialLeftLong.qml:47
458454msgid "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"
460456
461−#: qml/Tutorial/TutorialRight.qml:54
462−msgid "Hover your mouse on the right edge to view your open apps"
463−msgstr ""
457+#: qml/Tutorial/TutorialLeft.qml:47
458+msgid "Swipe from the left edge to open the launcher"
459+msgstr "Striar ab le bordo sinistre pro aperir le lanceator"
464460
465461#: 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
466466msgid "Short or long swipe from the right edge to view your open apps"
467467msgstr ""
468+"Striar breve o longe ab le bordo dextre pro vider tu applicationes aperte"
468469
469470#: qml/Tutorial/TutorialTop.qml:53
470471msgid "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"
472473
473474#: qml/Tutorial/TutorialTop.qml:54
474475msgid "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"
476477
477478#: qml/Wizard/Page.qml:54
478479msgctxt "Button: Go back one page in the Wizard"
@@ -481,7 +482,7 @@ msgstr "Retro"
481482
482483#: qml/Wizard/Pages/10-welcome.qml:27
483484msgid "Language"
484−msgstr ""
485+msgstr "Lingua"
485486
486487#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
487488#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -490,7 +491,7 @@ msgstr ""
490491#: qml/Wizard/Pages/passcode-desktop.qml:124
491492#: qml/Wizard/Pages/password-set.qml:141
492493msgid "Next"
493−msgstr ""
494+msgstr "Sequente"
494495
495496#: qml/Wizard/Pages/30-wifi.qml:29
496497msgid "Connect to Wi‑Fi"
@@ -498,15 +499,15 @@ msgstr "Connecter al Wi‑Fi"
498499
499500#: qml/Wizard/Pages/30-wifi.qml:130
500501msgid "Connected"
501−msgstr ""
502+msgstr "Connexe"
502503
503504#: qml/Wizard/Pages/30-wifi.qml:163
504505msgid "Available Wi-Fi networks"
505−msgstr ""
506+msgstr "Retes Wi-Fi disponibile"
506507
507508#: qml/Wizard/Pages/30-wifi.qml:164
508509msgid "No available Wi-Fi networks"
509−msgstr ""
510+msgstr "Nulle retes Wi-Fi disponibile"
510511
511512#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
512513#: qml/Wizard/Pages/sim.qml:101
@@ -515,98 +516,102 @@ msgstr "Salta"
515516
516517#: qml/Wizard/Pages/40-location.qml:27
517518msgid "Location Services"
518−msgstr ""
519+msgstr "Servicios de position"
519520
520521#: qml/Wizard/Pages/40-location.qml:83
521522msgid ""
522523"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
523524"(recommended)"
524525msgstr ""
526+"Usar GPS, hotspots Wi-Fi e rete mobile anonymemente pro revelar le position "
527+"(recommendate)"
525528
526529#: qml/Wizard/Pages/40-location.qml:105
527530#, qt-format
528531msgid "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."
530533
531534#: qml/Wizard/Pages/40-location.qml:106
532535msgctxt "part of: Nokia HERE terms and conditions"
533536msgid "terms and conditions"
534−msgstr ""
537+msgstr "Terminos & Conditiones"
535538
536539#: qml/Wizard/Pages/40-location.qml:160
537540msgid "GPS only"
538−msgstr ""
541+msgstr "GPS solmente"
539542
540543#: qml/Wizard/Pages/40-location.qml:214
541544msgid "Don't use my location"
542−msgstr ""
545+msgstr "Non usar mi position"
543546
544547#: qml/Wizard/Pages/40-location.qml:260
545548msgid "You can change it later in System Settings."
546−msgstr ""
549+msgstr "Tu poter cambiar lo depois in configurationes del systema."
547550
548551#: qml/Wizard/Pages/50-timezone.qml:29
549552msgid "Time Zone"
550−msgstr ""
553+msgstr "Fuso horari"
551554
552555#: qml/Wizard/Pages/50-timezone.qml:178
553556msgid "Enter your city"
554−msgstr ""
557+msgstr "Insere tu citate"
555558
556559#: qml/Wizard/Pages/60-account.qml:24
557560msgid "Personalize Your Device"
558−msgstr ""
561+msgstr "Personalisa tu dispositivo"
559562
560563#: qml/Wizard/Pages/60-account.qml:48
561564msgid "Preferred Name"
562−msgstr ""
565+msgstr "Preferred Name"
563566
564567#: qml/Wizard/Pages/70-passwd-type.qml:39
565568msgid "Lock Screen"
566−msgstr ""
569+msgstr "Blocar le schermo"
567570
568571#: qml/Wizard/Pages/70-passwd-type.qml:101
569572msgctxt "Label: Type of security method"
570573msgid "Create new password"
571−msgstr ""
574+msgstr "Crear un nove contrasigno"
572575
573576#: qml/Wizard/Pages/70-passwd-type.qml:103
574577msgctxt "Label: Type of security method"
575578msgid "Create passcode (numbers only)"
576−msgstr ""
579+msgstr "Crear codice-contrasigno (numeros sol)"
577580
578581#: qml/Wizard/Pages/70-passwd-type.qml:105
579582msgctxt "Label: Type of security method"
580583msgid "No lock code"
581−msgstr ""
584+msgstr "Nulle codice de bloco"
582585
583586#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
584587msgid "Privacy Policy"
585−msgstr ""
588+msgstr "Regulas del confidentialitate"
586589
587590#: qml/Wizard/Pages/75-report-check.qml:26
588591msgid "Help Us Improve"
589−msgstr ""
592+msgstr "Adjuta nos a meliorar"
590593
591594#: qml/Wizard/Pages/75-report-check.qml:59
592595msgid "Improve system performance by sending us crashes and error reports."
593596msgstr ""
597+"Meliorar le performance del systema per expedir nos errores e reportos de "
598+"error."
594599
595600#: qml/Wizard/Pages/75-report-check.qml:60
596601msgid "Privacy policy"
597−msgstr ""
602+msgstr "Politica de confidentialitate"
598603
599604#: qml/Wizard/Pages/80-finished.qml:89
600605msgid "Welcome to Ubuntu"
601−msgstr ""
606+msgstr "Benvenite a Ubuntu."
602607
603608#: qml/Wizard/Pages/80-finished.qml:104
604609msgid "You are ready to use your device now"
605−msgstr ""
610+msgstr "Tu es preste a usar tu dispositivo nunc"
606611
607612#: qml/Wizard/Pages/80-finished.qml:124
608613msgid "Get Started"
609−msgstr ""
614+msgstr "Initiar"
610615
611616#: qml/Wizard/Pages/here-terms.qml:25
612617msgid "Terms & Conditions"
@@ -614,7 +619,7 @@ msgstr "Terminos & Conditiones"
614619
615620#: qml/Wizard/Pages/here-terms.qml:69
616621msgid "Your device uses positioning technologies provided by HERE."
617−msgstr ""
622+msgstr "Tu dispositivo usa le technologias de positionamento de HERE."
618623
619624#: qml/Wizard/Pages/here-terms.qml:81
620625msgid ""
@@ -622,21 +627,26 @@ msgid ""
622627"collects information about nearby cell towers and Wi-Fi hotspots around your "
623628"current location whenever your position is being found."
624629msgstr ""
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."
625633
626634#: qml/Wizard/Pages/here-terms.qml:93
627635msgid ""
628636"The information collected is used to analyze the service and to improve the "
629637"use of service, but not to identify you personally."
630638msgstr ""
639+"Le information colligite es usate pro analysar le servicio e pro affinar le "
640+"usa de servicio, ma non pro identificar te personalmente"
631641
632642#: qml/Wizard/Pages/here-terms.qml:106
633643#, qt-format
634644msgid "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."
636646
637647#: qml/Wizard/Pages/here-terms.qml:107
638648msgid "Service Terms"
639−msgstr ""
649+msgstr "Terminos de servicio"
640650
641651#: qml/Wizard/Pages/passcode-confirm.qml:43
642652#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -645,69 +655,69 @@ msgstr "Confirma le codice-contrasigno"
645655
646656#: qml/Wizard/Pages/passcode-confirm.qml:45
647657msgid "Incorrect passcode."
648−msgstr ""
658+msgstr "Codice-contrasigno non correcte."
649659
650660#: qml/Wizard/Pages/passcode-confirm.qml:45
651661msgctxt "Enter the passcode again"
652662msgid "Please re-enter."
653−msgstr ""
663+msgstr "Per favor re-inserer"
654664
655665#: qml/Wizard/Pages/passcode-desktop.qml:30
656666msgid "Lock Screen Passcode"
657−msgstr ""
667+msgstr "Codice contrasigno del bloca schermo."
658668
659669#: qml/Wizard/Pages/passcode-desktop.qml:56
660670msgid "Enter 4 numbers to setup your passcode"
661−msgstr ""
671+msgstr "Insere 4 numeros pro configurar tu codice-contrasigno"
662672
663673#: qml/Wizard/Pages/passcode-desktop.qml:65
664674#: qml/Wizard/Pages/passcode-set.qml:54
665675msgid "Choose passcode"
666−msgstr ""
676+msgstr "Seliger le codice-contrasigno"
667677
668678#: qml/Wizard/Pages/passcode-desktop.qml:105
669679msgid "Passcode too short"
670−msgstr ""
680+msgstr "Codice-contrasigno troppo breve"
671681
672682#: qml/Wizard/Pages/passcode-desktop.qml:107
673683msgid "Passcodes match"
674−msgstr ""
684+msgstr "Le codices-contrasigno concorda"
675685
676686#: qml/Wizard/Pages/passcode-desktop.qml:109
677687msgid "Passcodes do not match"
678−msgstr ""
688+msgstr "Le codices-contrasigno non concorda"
679689
680690#: qml/Wizard/Pages/passcode-set.qml:62
681691msgid "Passcode must be 4 characters long"
682−msgstr ""
692+msgstr "Le codice-contrasigno debe esser longe 4 characteres"
683693
684694#: qml/Wizard/Pages/password-set.qml:30
685695msgid "Lock Screen Password"
686−msgstr ""
696+msgstr "Contrasigno del bloco del schermo"
687697
688698#: qml/Wizard/Pages/password-set.qml:61
689699msgid "Enter at least 8 characters"
690−msgstr ""
700+msgstr "Insere al minimo 8 characteres"
691701
692702#: qml/Wizard/Pages/password-set.qml:73
693703msgid "Choose password"
694−msgstr ""
704+msgstr "Seliger un contrasigno"
695705
696706#: qml/Wizard/Pages/password-set.qml:103
697707msgid "Confirm password"
698−msgstr ""
708+msgstr "Confirmar le contrasigno"
699709
700710#: qml/Wizard/Pages/sim.qml:27
701711msgid "No SIM card installed"
702−msgstr ""
712+msgstr "Nulle carta SIM installate"
703713
704714#: qml/Wizard/Pages/sim.qml:54
705715msgid "SIM card added"
706−msgstr ""
716+msgstr "Carta SIM addite"
707717
708718#: qml/Wizard/Pages/sim.qml:55
709719msgid "You must restart the device to access the mobile network."
710−msgstr ""
720+msgstr "Tu debe reinitiar le dispositivo pro acceder le rete mobile."
711721
712722#: qml/Wizard/Pages/sim.qml:59
713723msgid "Restart"
@@ -716,34 +726,35 @@ msgstr "Re-Initiar"
716726#: qml/Wizard/Pages/sim.qml:78
717727msgid "You won’t be able to make calls or use text messaging without a SIM."
718728msgstr ""
729+"Tu non essera capace a facer appellos o usar messages de texto sin un SIM."
719730
720731#: qml/Wizard/Pages/sim.qml:90
721732msgid "To proceed with no SIM tap Skip."
722−msgstr ""
733+msgstr "Pro proceder sin SIM colpa Saltar."
723734
724735#: qml/Wizard/PasswordMeter.qml:87
725736msgid "Passwords match"
726−msgstr ""
737+msgstr "Le contrasignos concorda"
727738
728739#: qml/Wizard/PasswordMeter.qml:89
729740msgid "Passwords do not match"
730−msgstr ""
741+msgstr "Le contrasignos non concorda"
731742
732743#: qml/Wizard/PasswordMeter.qml:93
733744msgid "Strong password"
734−msgstr ""
745+msgstr "Contrasigno forte"
735746
736747#: qml/Wizard/PasswordMeter.qml:95
737748msgid "Fair password"
738−msgstr ""
749+msgstr "Contrasigno passabile"
739750
740751#: qml/Wizard/PasswordMeter.qml:97
741752msgid "Weak password"
742−msgstr ""
753+msgstr "Contrasigno debile"
743754
744755#: qml/Wizard/PasswordMeter.qml:99
745756msgid "Very weak password"
746−msgstr ""
757+msgstr "Contrasigno troppo debile"
747758
748759#~ msgid "Log out"
749760#~ msgstr "Clauder le Session"
@@ -1049,11 +1060,7 @@ msgstr ""
10491060#~ msgid "Yesterday %l:%M %p"
10501061#~ msgstr "Heri"
10511062
1052−#~ msgid "Welcome to your Ubuntu device."
1053−#~ msgstr "Benvenite a tu dispositivo Ubuntu."
1054−
1055−#~ msgid "Please select how you’d like to unlock your device."
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."
1063+#~ msgid "Hover your mouse on the right edge to view your open apps"
1064+#~ msgstr ""
1065+#~ "Passar supra con tu mus sur le bordo dextere pro vider tu applicationes "
1066+#~ "aperte"
po/id.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Indonesian <id@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -447,19 +447,19 @@ msgstr ""
447447msgid "Swipe up to manage the app"
448448msgstr ""
449449
450−#: qml/Tutorial/TutorialLeft.qml:47
451−msgid "Swipe from the left edge to open the launcher"
452−msgstr ""
453−
454450#: qml/Tutorial/TutorialLeftLong.qml:47
455451msgid "Long swipe from the left edge to open the Today scope"
456452msgstr ""
457453
458−#: qml/Tutorial/TutorialRight.qml:54
459−msgid "Hover your mouse on the right edge to view your open apps"
454+#: qml/Tutorial/TutorialLeft.qml:47
455+msgid "Swipe from the left edge to open the launcher"
460456msgstr ""
461457
462458#: 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
463463msgid "Short or long swipe from the right edge to view your open apps"
464464msgstr ""
465465
po/is.po+9−9
@@ -9,7 +9,7 @@ msgid ""
99msgstr ""
1010"Project-Id-Version: po_unity8-is\n"
1111"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"
1313"PO-Revision-Date: 2014-11-13 09:32+0000\n"
1414"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
1515"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
@@ -17,8 +17,8 @@ msgstr ""
1717"Content-Type: text/plain; charset=UTF-8\n"
1818"Content-Transfer-Encoding: 8bit\n"
1919"Plural-Forms: nplurals=2; plural=n != 1;\n"
20−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
21−"X-Generator: Launchpad (build 17958)\n"
20+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
21+"X-Generator: Launchpad (build 17995)\n"
2222"Language: is\n"
2323
2424#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -453,19 +453,19 @@ msgstr ""
453453msgid "Swipe up to manage the app"
454454msgstr ""
455455
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
459−
460456#: qml/Tutorial/TutorialLeftLong.qml:47
461457msgid "Long swipe from the left edge to open the Today scope"
462458msgstr ""
463459
464−#: qml/Tutorial/TutorialRight.qml:54
465−msgid "Hover your mouse on the right edge to view your open apps"
460+#: qml/Tutorial/TutorialLeft.qml:47
461+msgid "Swipe from the left edge to open the launcher"
466462msgstr ""
467463
468464#: 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
469469msgid "Short or long swipe from the right edge to view your open apps"
470470msgstr ""
471471
po/it.po+14−11
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-04-03 16:08+0000\n"
1212"Last-Translator: Milo Casagrande <milo.casagrande@gmail.com>\n"
1313"Language-Team: Italian <it@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-04-04 05:38+0000\n"
19−"X-Generator: Launchpad (build 17972)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -455,20 +455,19 @@ msgstr "Scorrere verso l'alto per creare un messaggio"
455455msgid "Swipe up to manage the app"
456456msgstr "Scorrere verso l'alto per gestire l'applicazione"
457457
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−
462458#: qml/Tutorial/TutorialLeftLong.qml:47
463459msgid "Long swipe from the left edge to open the Today scope"
464460msgstr "Scorrere lentamente dal bordo sinistro per aprire la scope Oggi"
465461
466−#: qml/Tutorial/TutorialRight.qml:54
467−msgid "Hover your mouse on the right edge to view your open apps"
468−msgstr ""
469−"Posizionare il mouse sul bordo destro per vedere le applicazioni aperte"
462+#: qml/Tutorial/TutorialLeft.qml:47
463+msgid "Swipe from the left edge to open the launcher"
464+msgstr "Scorrere dal bordo sinistro per aprire il launcher"
470465
471466#: 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
472471msgid "Short or long swipe from the right edge to view your open apps"
473472msgstr ""
474473"Scorrere lentamente o velocemente dal bordo destro per visualizzare le "
@@ -1083,3 +1082,7 @@ msgstr "Password molto fragile"
10831082
10841083#~ msgid "Call back"
10851084#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-10-05 10:05+0000\n"
1212"Last-Translator: Kentaro Kazuhama <Unknown>\n"
1313"Language-Team: Japanese <ja@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -439,19 +439,19 @@ msgstr ""
439439msgid "Swipe up to manage the app"
440440msgstr ""
441441
442−#: qml/Tutorial/TutorialLeft.qml:47
443−msgid "Swipe from the left edge to open the launcher"
444−msgstr ""
445−
446442#: qml/Tutorial/TutorialLeftLong.qml:47
447443msgid "Long swipe from the left edge to open the Today scope"
448444msgstr ""
449445
450−#: qml/Tutorial/TutorialRight.qml:54
451−msgid "Hover your mouse on the right edge to view your open apps"
446+#: qml/Tutorial/TutorialLeft.qml:47
447+msgid "Swipe from the left edge to open the launcher"
452448msgstr ""
453449
454450#: 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
455455msgid "Short or long swipe from the right edge to view your open apps"
456456msgstr ""
457457
po/km.po+31−34
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-08-20 02:48+0000\n"
1212"Last-Translator: Sophea Sok <sksophea@gmail.com>\n"
1313"Language-Team: Khmer <km@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -29,7 +29,7 @@ msgstr "ភ្ជាប់​ផ្លូវកាត់"
2929
3030#: plugins/Unity/Launcher/launcheritem.cpp:53
3131msgid "Quit"
32−msgstr ""
32+msgstr "ចាកចេញ"
3333
3434#: plugins/Unity/Launcher/launcheritem.cpp:107
3535msgid "Unpin shortcut"
@@ -155,7 +155,7 @@ msgstr ""
155155
156156#: qml/Components/ModeSwitchWarningDialog.qml:88
157157msgid "Close all"
158−msgstr ""
158+msgstr "បិទ​ទាំង​អស់"
159159
160160#: qml/Dash/DashPageHeader.qml:337
161161msgctxt "Button: Open the Ubuntu Store"
@@ -186,7 +186,7 @@ msgstr ""
186186
187187#: qml/Dash/FiltersPopover.qml:69
188188msgid "Reset"
189−msgstr ""
189+msgstr "កំណត់​ឡើង​វិញ​"
190190
191191#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192192msgid "See less"
@@ -207,7 +207,7 @@ msgstr ""
207207
208208#: qml/Dash/PageHeaderExtraPanel.qml:66
209209msgid "Clear All"
210−msgstr ""
210+msgstr "សម្អាត​ទាំងអស់"
211211
212212#: qml/Dash/Previews/PreviewActionCombo.qml:35
213213msgid "More..."
@@ -357,32 +357,29 @@ msgstr ""
357357#, qt-format
358358msgid "%1 hour"
359359msgid_plural "%1 hours"
360−msgstr[0] ""
361−msgstr[1] ""
360+msgstr[0] "%1 ម៉ោង"
362361
363362#: qml/Panel/Indicators/MenuItemFactory.qml:894
364363#, qt-format
365364msgid "%1 minute"
366365msgid_plural "%1 minutes"
367−msgstr[0] ""
368−msgstr[1] ""
366+msgstr[0] "%1 នាទី"
369367
370368#: qml/Panel/Indicators/MenuItemFactory.qml:899
371369#, qt-format
372370msgid "%1 second"
373371msgid_plural "%1 seconds"
374−msgstr[0] ""
375−msgstr[1] ""
372+msgstr[0] "%1 វិនាទី"
376373
377374#: qml/Panel/Indicators/MenuItemFactory.qml:902
378375msgid "0 seconds"
379−msgstr ""
376+msgstr "០ វិនាទី"
380377
381378#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
382379#: qml/Panel/Indicators/MenuItemFactory.qml:904
383380#, qt-format
384381msgid "%1 remaining"
385−msgstr ""
382+msgstr "នៅ​សល់ %1"
386383
387384#: qml/Panel/Indicators/MenuItemFactory.qml:910
388385msgid "In queue…"
@@ -412,7 +409,7 @@ msgstr "បាន​បរាជ័យ ប៉ះ​ ដើម្បី​ព្
412409#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
413410msgctxt "Button: Send a reply message"
414411msgid "Send"
415−msgstr ""
412+msgstr "ផ្ញើ"
416413
417414#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
418415msgctxt "Label: Hint in message indicator line edit"
@@ -422,7 +419,7 @@ msgstr "ឆ្លើយតប"
422419#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
423420msgctxt "Button: Call back on phone"
424421msgid "Call back"
425−msgstr ""
422+msgstr "ហៅ​មកវិញ"
426423
427424#: qml/Stages/SideStage.qml:76
428425msgid "Drag using 3 fingers any application from one window to the other"
@@ -448,19 +445,19 @@ msgstr ""
448445msgid "Swipe up to manage the app"
449446msgstr ""
450447
451−#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Swipe from the left edge to open the launcher"
453−msgstr ""
454−
455448#: qml/Tutorial/TutorialLeftLong.qml:47
456449msgid "Long swipe from the left edge to open the Today scope"
457450msgstr ""
458451
459−#: qml/Tutorial/TutorialRight.qml:54
460−msgid "Hover your mouse on the right edge to view your open apps"
452+#: qml/Tutorial/TutorialLeft.qml:47
453+msgid "Swipe from the left edge to open the launcher"
461454msgstr ""
462455
463456#: 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
464461msgid "Short or long swipe from the right edge to view your open apps"
465462msgstr ""
466463
@@ -479,7 +476,7 @@ msgstr "ថយក្រោយ"
479476
480477#: qml/Wizard/Pages/10-welcome.qml:27
481478msgid "Language"
482−msgstr ""
479+msgstr "ភាសា"
483480
484481#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
485482#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -488,7 +485,7 @@ msgstr ""
488485#: qml/Wizard/Pages/passcode-desktop.qml:124
489486#: qml/Wizard/Pages/password-set.qml:141
490487msgid "Next"
491−msgstr ""
488+msgstr "បន្ទាប់"
492489
493490#: qml/Wizard/Pages/30-wifi.qml:29
494491msgid "Connect to Wi‑Fi"
@@ -496,7 +493,7 @@ msgstr ""
496493
497494#: qml/Wizard/Pages/30-wifi.qml:130
498495msgid "Connected"
499−msgstr ""
496+msgstr "បាន​តភ្ជាប់"
500497
501498#: qml/Wizard/Pages/30-wifi.qml:163
502499msgid "Available Wi-Fi networks"
@@ -545,7 +542,7 @@ msgstr ""
545542
546543#: qml/Wizard/Pages/50-timezone.qml:29
547544msgid "Time Zone"
548−msgstr ""
545+msgstr "តំបន់​ពេល​វេលា"
549546
550547#: qml/Wizard/Pages/50-timezone.qml:178
551548msgid "Enter your city"
@@ -561,7 +558,7 @@ msgstr ""
561558
562559#: qml/Wizard/Pages/70-passwd-type.qml:39
563560msgid "Lock Screen"
564−msgstr ""
561+msgstr "​អេក្រង់ចាក់សោ"
565562
566563#: qml/Wizard/Pages/70-passwd-type.qml:101
567564msgctxt "Label: Type of security method"
@@ -580,7 +577,7 @@ msgstr ""
580577
581578#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
582579msgid "Privacy Policy"
583−msgstr ""
580+msgstr "គោលនយោបាយ​ភាព​ឯកជន"
584581
585582#: qml/Wizard/Pages/75-report-check.qml:26
586583msgid "Help Us Improve"
@@ -592,11 +589,11 @@ msgstr ""
592589
593590#: qml/Wizard/Pages/75-report-check.qml:60
594591msgid "Privacy policy"
595−msgstr ""
592+msgstr "គោលនយោបាយ​ភាព​ឯកជន"
596593
597594#: qml/Wizard/Pages/80-finished.qml:89
598595msgid "Welcome to Ubuntu"
599−msgstr ""
596+msgstr "សូម​ស្វាគមន៍​ការ​មកកាន់​ Ubuntu"
600597
601598#: qml/Wizard/Pages/80-finished.qml:104
602599msgid "You are ready to use your device now"
@@ -693,7 +690,7 @@ msgstr ""
693690
694691#: qml/Wizard/Pages/password-set.qml:103
695692msgid "Confirm password"
696−msgstr ""
693+msgstr "បញ្ជាក់​ពាក្យ​សម្ងាត់"
697694
698695#: qml/Wizard/Pages/sim.qml:27
699696msgid "No SIM card installed"
@@ -721,11 +718,11 @@ msgstr ""
721718
722719#: qml/Wizard/PasswordMeter.qml:87
723720msgid "Passwords match"
724−msgstr ""
721+msgstr "ពាក្យ​សម្ងាត់​ត្រូវ​គ្នា​ហើយ"
725722
726723#: qml/Wizard/PasswordMeter.qml:89
727724msgid "Passwords do not match"
728−msgstr ""
725+msgstr "ពាក្យ​សម្ងាត់​មិន​ដូច​គ្នា​ទេ"
729726
730727#: qml/Wizard/PasswordMeter.qml:93
731728msgid "Strong password"
po/kn.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-06-27 05:43+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kannada <kn@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/ko.po+9−18
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2014-08-19 13:02+0000\n"
1212"Last-Translator: MinSik CHO <Unknown>\n"
1313"Language-Team: Korean <ko@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -436,19 +436,19 @@ msgstr ""
436436msgid "Swipe up to manage the app"
437437msgstr ""
438438
439−#: qml/Tutorial/TutorialLeft.qml:47
440−msgid "Swipe from the left edge to open the launcher"
441−msgstr ""
442−
443439#: qml/Tutorial/TutorialLeftLong.qml:47
444440msgid "Long swipe from the left edge to open the Today scope"
445441msgstr ""
446442
447−#: qml/Tutorial/TutorialRight.qml:54
448−msgid "Hover your mouse on the right edge to view your open apps"
443+#: qml/Tutorial/TutorialLeft.qml:47
444+msgid "Swipe from the left edge to open the launcher"
449445msgstr ""
450446
451447#: 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
452452msgid "Short or long swipe from the right edge to view your open apps"
453453msgstr ""
454454
@@ -1035,12 +1035,3 @@ msgstr ""
10351035
10361036#~ msgid "Call back"
10371037#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-09-10 13:14+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Kurdish <ku@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -446,19 +446,19 @@ msgstr ""
446446msgid "Swipe up to manage the app"
447447msgstr ""
448448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr ""
452−
453449#: qml/Tutorial/TutorialLeftLong.qml:47
454450msgid "Long swipe from the left edge to open the Today scope"
455451msgstr ""
456452
457−#: qml/Tutorial/TutorialRight.qml:54
458−msgid "Hover your mouse on the right edge to view your open apps"
453+#: qml/Tutorial/TutorialLeft.qml:47
454+msgid "Swipe from the left edge to open the launcher"
459455msgstr ""
460456
461457#: 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
462462msgid "Short or long swipe from the right edge to view your open apps"
463463msgstr ""
464464
po/ky.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-06-27 06:17+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kirghiz <ky@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/lo.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2013-10-02 10:00+0000\n"
1212"Last-Translator: Anousak <anousak@gmail.com>\n"
1313"Language-Team: Lao <lo@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/lt.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-05-19 17:15+0000\n"
1212"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
1313"Language-Team: Lithuanian <lt@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -441,19 +441,19 @@ msgstr ""
441441msgid "Swipe up to manage the app"
442442msgstr ""
443443
444−#: qml/Tutorial/TutorialLeft.qml:47
445−msgid "Swipe from the left edge to open the launcher"
446−msgstr ""
447−
448444#: qml/Tutorial/TutorialLeftLong.qml:47
449445msgid "Long swipe from the left edge to open the Today scope"
450446msgstr ""
451447
452−#: qml/Tutorial/TutorialRight.qml:54
453−msgid "Hover your mouse on the right edge to view your open apps"
448+#: qml/Tutorial/TutorialLeft.qml:47
449+msgid "Swipe from the left edge to open the launcher"
454450msgstr ""
455451
456452#: 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
457457msgid "Short or long swipe from the right edge to view your open apps"
458458msgstr ""
459459
po/lv.po+9−9
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity\n"
1010"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"
1212"PO-Revision-Date: 2015-11-22 19:13+0000\n"
1313"Last-Translator: Klavs Anson <anson.klavs@gmail.com>\n"
1414"Language-Team: Latvian <lata-l10n@googlegroups.com>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
1818"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"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121"Language: lv\n"
2222
2323#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -452,19 +452,19 @@ msgstr ""
452452msgid "Swipe up to manage the app"
453453msgstr ""
454454
455−#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Swipe from the left edge to open the launcher"
457−msgstr ""
458−
459455#: qml/Tutorial/TutorialLeftLong.qml:47
460456msgid "Long swipe from the left edge to open the Today scope"
461457msgstr ""
462458
463−#: qml/Tutorial/TutorialRight.qml:54
464−msgid "Hover your mouse on the right edge to view your open apps"
459+#: qml/Tutorial/TutorialLeft.qml:47
460+msgid "Swipe from the left edge to open the launcher"
465461msgstr ""
466462
467463#: 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
468468msgid "Short or long swipe from the right edge to view your open apps"
469469msgstr ""
470470
po/ml.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2013-11-23 11:44+0000\n"
1212"Last-Translator: ST Alfas <Unknown>\n"
1313"Language-Team: Malayalam <ml@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/mr.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-01-14 19:54+0000\n"
1212"Last-Translator: Rohan Deshmukh <Unknown>\n"
1313"Language-Team: Marathi <mr@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/ms.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-01-17 09:05+0000\n"
1212"Last-Translator: abuyop <Unknown>\n"
1313"Language-Team: Malay <ms@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -446,19 +446,19 @@ msgstr ""
446446msgid "Swipe up to manage the app"
447447msgstr ""
448448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr ""
452−
453449#: qml/Tutorial/TutorialLeftLong.qml:47
454450msgid "Long swipe from the left edge to open the Today scope"
455451msgstr ""
456452
457−#: qml/Tutorial/TutorialRight.qml:54
458−msgid "Hover your mouse on the right edge to view your open apps"
453+#: qml/Tutorial/TutorialLeft.qml:47
454+msgid "Swipe from the left edge to open the launcher"
459455msgstr ""
460456
461457#: 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
462462msgid "Short or long swipe from the right edge to view your open apps"
463463msgstr ""
464464
po/my.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-12-12 11:12+0000\n"
1212"Last-Translator: Pyae Sone <Unknown>\n"
1313"Language-Team: Burmese <my@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/nb.po+13−10
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-03-29 08:56+0000\n"
1212"Last-Translator: Åka Sikrom <Unknown>\n"
1313"Language-Team: Norwegian Bokmal <nb@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-30 06:25+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -452,19 +452,19 @@ msgstr "Dra opp for å lage en melding"
452452msgid "Swipe up to manage the app"
453453msgstr "Dra opp for å håndtere programmet"
454454
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−
459455#: qml/Tutorial/TutorialLeftLong.qml:47
460456msgid "Long swipe from the left edge to open the Today scope"
461457msgstr "Dra langt fra venstre kant for å åpne virkefeltet «I dag»"
462458
463−#: qml/Tutorial/TutorialRight.qml:54
464−msgid "Hover your mouse on the right edge to view your open apps"
465−msgstr "Hold musepekeren over høyre kant for å vise åpne programmer"
459+#: qml/Tutorial/TutorialLeft.qml:47
460+msgid "Swipe from the left edge to open the launcher"
461+msgstr "Dra fra venstre kant for å åpne oppstarteren"
466462
467463#: 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
468468msgid "Short or long swipe from the right edge to view your open apps"
469469msgstr "Dra fra høyre kant for å vise åpne programmer"
470470
@@ -1063,3 +1063,6 @@ msgstr "Veldig svakt passord"
10631063
10641064#~ msgid "Tomorrow %H:%M"
10651065#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-12-06 15:11+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Nepali <ne@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/nl.po+26−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-07 07:14+0000\n"
1212"Last-Translator: Hannie Dumoleyn <Unknown>\n"
1313"Language-Team: Dutch <nl@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -189,11 +189,11 @@ msgstr "Toevoegen aan favorieten"
189189
190190#: qml/Dash/FiltersPopover.qml:60
191191msgid "Refine your results"
192−msgstr ""
192+msgstr "Resultaten verfijnen"
193193
194194#: qml/Dash/FiltersPopover.qml:69
195195msgid "Reset"
196−msgstr ""
196+msgstr "Herstellen"
197197
198198#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
199199msgid "See less"
@@ -210,11 +210,11 @@ msgstr "Zoeken"
210210
211211#: qml/Dash/PageHeaderExtraPanel.qml:55
212212msgid "Recent Searches"
213−msgstr ""
213+msgstr "Recente zoekopdrachten"
214214
215215#: qml/Dash/PageHeaderExtraPanel.qml:66
216216msgid "Clear All"
217−msgstr ""
217+msgstr "Alles wissen"
218218
219219#: qml/Dash/Previews/PreviewActionCombo.qml:35
220220msgid "More..."
@@ -239,7 +239,7 @@ msgstr "Voeg recensie toe"
239239
240240#: qml/Dash/Previews/PreviewSharing.qml:66
241241msgid "Preview Share Item"
242−msgstr ""
242+msgstr "Voorbeeld van share-item"
243243
244244#: qml/Dash/PullToRefreshScopeStyle.qml:55
245245msgid "Pull to refresh…"
@@ -434,46 +434,47 @@ msgstr "Terugbellen"
434434#: qml/Stages/SideStage.qml:76
435435msgid "Drag using 3 fingers any application from one window to the other"
436436msgstr ""
437+"Een toepassing met 3 vingers slepen van het ene venster naar het andere"
437438
438439#: qml/Tutorial/TutorialBottom.qml:78
439440msgid "Swipe up to add a contact"
440−msgstr ""
441+msgstr "Omhoog vegen om een contact toe te voegen"
441442
442443#: qml/Tutorial/TutorialBottom.qml:80
443444msgid "Swipe up for favorite calculations"
444−msgstr ""
445+msgstr "Omhoog vegen voor favoriete berekeningen"
445446
446447#: qml/Tutorial/TutorialBottom.qml:82
447448msgid "Swipe up for recent calls"
448−msgstr ""
449+msgstr "Omhoog vegen voor recente gesprekken"
449450
450451#: qml/Tutorial/TutorialBottom.qml:84
451452msgid "Swipe up to create a message"
452−msgstr ""
453+msgstr "Omhoog vegen om een bericht aan te maken"
453454
454455#: qml/Tutorial/TutorialBottom.qml:85
455456msgid "Swipe up to manage the app"
456−msgstr ""
457−
458−#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Swipe from the left edge to open the launcher"
460−msgstr ""
457+msgstr "Omhoog vegen om de app te beheren"
461458
462459#: qml/Tutorial/TutorialLeftLong.qml:47
463460msgid "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"
465462
466−#: qml/Tutorial/TutorialRight.qml:54
467−msgid "Hover your mouse on the right edge to view your open apps"
468−msgstr ""
463+#: qml/Tutorial/TutorialLeft.qml:47
464+msgid "Swipe from the left edge to open the launcher"
465+msgstr "Vanaf de linkerkant vegen om de starter te openen"
469466
470467#: 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"
472469msgstr ""
473470
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+
474475#: qml/Tutorial/TutorialTop.qml:53
475476msgid "Swipe from the top right edge to open the notification bar"
476−msgstr ""
477+msgstr "Vanuit de rechterbovenhoek vegen om de notificatiebalk te openen"
477478
478479#: qml/Tutorial/TutorialTop.qml:54
479480msgid "Swipe from the top edge to open the notification bar"
@@ -1065,11 +1066,5 @@ msgstr ""
10651066#~ msgid "Call back"
10661067#~ msgstr "Terugbellen"
10671068
1068−#~ msgid "Please select how you’d like to unlock your device."
1069−#~ msgstr "Kies a.u.b. hoe u graag uw apparaat zou willen ontgrendelen."
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."
1069+#~ msgid "Hover your mouse on the right edge to view your open apps"
1070+#~ msgstr "Beweeg uw muis naar de rechterkant om uw geopende apps te zien"
po/nn.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-05-12 11:32+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Norwegian Nynorsk <nn@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/oc.po+353−110
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-02-05 20:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Occitan (post 1500) <oc@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -25,68 +25,72 @@ msgstr "Senhal : "
2525#: plugins/Unity/Launcher/launcheritem.cpp:48
2626#: plugins/Unity/Launcher/launcheritem.cpp:107
2727msgid "Pin shortcut"
28−msgstr ""
28+msgstr "Espingolar l'acorchi"
2929
3030#: plugins/Unity/Launcher/launcheritem.cpp:53
3131msgid "Quit"
32−msgstr ""
32+msgstr "Quitar"
3333
3434#: plugins/Unity/Launcher/launcheritem.cpp:107
3535msgid "Unpin shortcut"
36−msgstr ""
36+msgstr "Destacar l'acorchi"
3737
3838#: qml/Components/DelayedLockscreen.qml:49
3939msgid "Device Locked"
40−msgstr ""
40+msgstr "Periferic verrolhat"
4141
4242#: qml/Components/DelayedLockscreen.qml:64
4343msgid "You have been locked out due to too many failed passphrase attempts."
4444msgstr ""
45+"Sètz estat blocat en seguida d'un tròp grand nombre de temptativas de sasida "
46+"d'una frasa secreta erronèa."
4547
4648#: qml/Components/DelayedLockscreen.qml:65
4749msgid "You have been locked out due to too many failed passcode attempts."
4850msgstr ""
51+"Sètz estat blocat en seguida d'un tròp grand nombre de temptativas de sasida "
52+"d'un senhal erronèu."
4953
5054#: qml/Components/DelayedLockscreen.qml:74
5155#, qt-format
5256msgid "Please wait %1 minute and then try again…"
5357msgid_plural "Please wait %1 minutes and then try again…"
54−msgstr[0] ""
55−msgstr[1] ""
58+msgstr[0] "Pacientatz %1 minuta e reensajatz..."
59+msgstr[1] "Pacientatz %1 minutas e reensajatz..."
5660
5761#: qml/Components/Dialogs.qml:144
5862msgctxt "Title: Lock/Log out dialog"
5963msgid "Log out"
60−msgstr ""
64+msgstr "Tampar la session"
6165
6266#: qml/Components/Dialogs.qml:145
6367msgid "Are you sure you want to log out?"
64−msgstr ""
68+msgstr "Sètz segur que volètz vous déconnecter ?"
6569
6670#: qml/Components/Dialogs.qml:147
6771msgctxt "Button: Lock the system"
6872msgid "Lock"
69−msgstr ""
73+msgstr "Verrolhar"
7074
7175#: qml/Components/Dialogs.qml:154
7276msgctxt "Button: Log out from the system"
7377msgid "Log Out"
74−msgstr ""
78+msgstr "Tampar la session"
7579
7680#: qml/Components/Dialogs.qml:161 qml/Components/Dialogs.qml:219
7781#: qml/Dash/DashPageHeader.qml:298 qml/Wizard/Pages/passcode-confirm.qml:32
7882#: qml/Wizard/Pages/passcode-set.qml:32
7983msgid "Cancel"
80−msgstr ""
84+msgstr "Anullar"
8185
8286#: qml/Components/Dialogs.qml:173
8387msgctxt "Title: Reboot dialog"
8488msgid "Reboot"
85−msgstr ""
89+msgstr "Reaviar"
8690
8791#: qml/Components/Dialogs.qml:174
8892msgid "Are you sure you want to reboot?"
89−msgstr ""
93+msgstr "Sètz segur que volètz reaviar ?"
9094
9195#: qml/Components/Dialogs.qml:176
9296msgid "No"
@@ -94,335 +98,349 @@ msgstr "Non"
9498
9599#: qml/Components/Dialogs.qml:183
96100msgid "Yes"
97−msgstr ""
101+msgstr "Òc"
98102
99103#: qml/Components/Dialogs.qml:198
100104msgctxt "Title: Power off/Restart dialog"
101105msgid "Power"
102−msgstr ""
106+msgstr "Alimentacion"
103107
104108#: qml/Components/Dialogs.qml:199
105109msgid ""
106110"Are you sure you would like\n"
107111"to power off?"
108112msgstr ""
113+"Sètz segur que volètz\n"
114+"copar l'alimentacion ?"
109115
110116#: qml/Components/Dialogs.qml:201
111117msgctxt "Button: Power off the system"
112118msgid "Power off"
113−msgstr ""
119+msgstr "Atudar"
114120
115121#: qml/Components/Dialogs.qml:210
116122msgctxt "Button: Restart the system"
117123msgid "Restart"
118−msgstr ""
124+msgstr "Reaviar"
119125
120126#: qml/Components/Lockscreen.qml:231
121127msgid "Return to Call"
122−msgstr ""
128+msgstr "Tornar a l'apèl"
123129
124130#: qml/Components/Lockscreen.qml:231
125131msgid "Emergency Call"
126−msgstr ""
132+msgstr "Apèl d'urgéncia"
127133
128134#: qml/Components/Lockscreen.qml:263
129135msgid "OK"
130−msgstr ""
136+msgstr "D'acòrdi"
131137
132138#: qml/Components/ModeSwitchWarningDialog.qml:32
133139msgid "Apps may have unsaved data:"
134−msgstr ""
140+msgstr "Las aplicacions pòdon aver de donadas pas enregistradas :"
135141
136142#: qml/Components/ModeSwitchWarningDialog.qml:57
137143msgctxt ""
138144"Re-dock means connect the device again to an external screen/mouse/keyboard"
139145msgid "Re-dock, save your work and close these apps to continue."
140146msgstr ""
147+"Rebrancatz-vos sus l'estacion d'acuèlh, enregistratz vòstre trabalh e "
148+"tampatz aquestas aplicacions per contunhar."
141149
142150#: qml/Components/ModeSwitchWarningDialog.qml:63
143151msgid "Or force close now (unsaved data will be lost)."
144152msgstr ""
153+"Ou forçar la tampadura ara (les donadas pas enregistradas seràn perdues)."
145154
146155#: qml/Components/ModeSwitchWarningDialog.qml:75
147156msgid "OK, I will reconnect"
148−msgstr ""
157+msgstr "OK, me vau reconnectar"
149158
150159#: qml/Components/ModeSwitchWarningDialog.qml:76
151160msgid "Reconnect now!"
152−msgstr ""
161+msgstr "Se reconnectar ara !"
153162
154163#: qml/Components/ModeSwitchWarningDialog.qml:88
155164msgid "Close all"
156−msgstr ""
165+msgstr "Tampar tot"
157166
158167#: qml/Dash/DashPageHeader.qml:337
159168msgctxt "Button: Open the Ubuntu Store"
160169msgid "Store"
161−msgstr ""
170+msgstr "Logitèca"
162171
163172#: qml/Dash/DashPageHeader.qml:344
164173msgctxt "Button: Start a search in the current dash scope"
165174msgid "Search"
166−msgstr ""
175+msgstr "Recercar"
167176
168177#: qml/Dash/DashPageHeader.qml:354
169178msgctxt "Button: Show the current dash scope settings"
170179msgid "Settings"
171−msgstr ""
180+msgstr "Paramètres"
172181
173182#: qml/Dash/DashPageHeader.qml:361
174183msgid "Remove from Favorites"
175−msgstr ""
184+msgstr "Levar dels favoris"
176185
177186#: qml/Dash/DashPageHeader.qml:361
178187msgid "Add to Favorites"
179−msgstr ""
188+msgstr "Apondre als favoris"
180189
181190#: qml/Dash/FiltersPopover.qml:60
182191msgid "Refine your results"
183−msgstr ""
192+msgstr "Afinar vòstres resultats"
184193
185194#: qml/Dash/FiltersPopover.qml:69
186195msgid "Reset"
187−msgstr ""
196+msgstr "Reïnicializar"
188197
189198#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190199msgid "See less"
191−msgstr ""
200+msgstr "Veire mens"
192201
193202#: qml/Dash/GenericScopeView.qml:570
194203msgid "See all"
195−msgstr ""
204+msgstr "Veire tot"
196205
197206#: qml/Dash/GenericScopeView.qml:627
198207msgctxt "Label: Hint for dash search line edit"
199208msgid "Search"
200−msgstr ""
209+msgstr "Recercar"
201210
202211#: qml/Dash/PageHeaderExtraPanel.qml:55
203212msgid "Recent Searches"
204−msgstr ""
213+msgstr "Recèrcas recentas"
205214
206215#: qml/Dash/PageHeaderExtraPanel.qml:66
207216msgid "Clear All"
208−msgstr ""
217+msgstr "Escafar tot"
209218
210219#: qml/Dash/Previews/PreviewActionCombo.qml:35
211220msgid "More..."
212−msgstr ""
221+msgstr "Mai..."
213222
214223#: qml/Dash/Previews/PreviewActionCombo.qml:35
215224msgid "Less..."
216−msgstr ""
225+msgstr "Moins..."
217226
218227#: qml/Dash/Previews/PreviewCommentInput.qml:68
219228#: qml/Dash/Previews/PreviewRatingInput.qml:174
220229msgid "Send"
221−msgstr ""
230+msgstr "Mandar"
222231
223232#: qml/Dash/Previews/PreviewRatingInput.qml:84
224233msgid "Rate this"
225−msgstr ""
234+msgstr "Avaloratz aquò"
226235
227236#: qml/Dash/Previews/PreviewRatingInput.qml:129
228237msgid "Add a review"
229−msgstr ""
238+msgstr "Apondre un avís"
230239
231240#: qml/Dash/Previews/PreviewSharing.qml:66
232241msgid "Preview Share Item"
233−msgstr ""
242+msgstr "Apercebut de l'element partejat"
234243
235244#: qml/Dash/PullToRefreshScopeStyle.qml:55
236245msgid "Pull to refresh…"
237−msgstr ""
246+msgstr "Tirer per actualizar..."
238247
239248#: qml/Dash/PullToRefreshScopeStyle.qml:60
240249msgid "Release to refresh…"
241−msgstr ""
250+msgstr "Daissar anar per actualizar..."
242251
243252#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
244253msgid "Enable location data"
245−msgstr ""
254+msgstr "Activar las donadas de localizacion"
246255
247256#: qml/Dash/ScopesList.qml:67
248257msgid "Manage"
249−msgstr ""
258+msgstr "Gerir"
250259
251260#: qml/Dash/ScopesList.qml:113
252261msgid "Home"
253−msgstr ""
262+msgstr "Acuèlh"
254263
255264#: qml/Dash/ScopesList.qml:114
256265msgid "Also installed"
257−msgstr ""
266+msgstr "Tanben installadas"
258267
259268#: qml/DisabledScreenNotice.qml:104
260269msgid ""
261270"Your device is now connected to an external display. Use this screen as a "
262271"touch pad to interact with the pointer."
263272msgstr ""
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."
264275
265276#: qml/Greeter/CoverPage.qml:118
266277msgid "Unlock"
267−msgstr ""
278+msgstr "Desverrolhar"
268279
269280#: qml/Greeter/LoginList.qml:239
270281msgid "Retry"
271−msgstr ""
282+msgstr "Ensajar tornamai"
272283
273284#: qml/Greeter/LoginList.qml:240
274285msgid "Tap to unlock"
275−msgstr ""
286+msgstr "Quichar per desverrolhar"
276287
277288#: qml/Greeter/NarrowView.qml:54
278289msgid "Sorry, incorrect passphrase."
279−msgstr ""
290+msgstr "O planhèm, frasa secreta incorrècta."
280291
281292#: qml/Greeter/NarrowView.qml:55
282293msgid "Sorry, incorrect passcode."
283−msgstr ""
294+msgstr "O planhèm, còde incorrècte."
284295
285296#: qml/Greeter/NarrowView.qml:56
286297msgid "This will be your last attempt."
287−msgstr ""
298+msgstr "Aquò serà vòstra darrièra temptativa."
288299
289300#: qml/Greeter/NarrowView.qml:58
290301msgid ""
291302"If passphrase is entered incorrectly, your phone will conduct a factory "
292303"reset and all personal data will be deleted."
293304msgstr ""
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."
294308
295309#: qml/Greeter/NarrowView.qml:59
296310msgid ""
297311"If passcode is entered incorrectly, your phone will conduct a factory reset "
298312"and all personal data will be deleted."
299313msgstr ""
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."
300317
301318#: qml/Greeter/NarrowView.qml:116
302319#, qt-format
303320msgid "Enter %1"
304−msgstr ""
321+msgstr "Sasissètz %1"
305322
306323#: qml/Greeter/NarrowView.qml:117
307324msgid "Enter passphrase"
308−msgstr ""
325+msgstr "Sasissètz la frasa secreta"
309326
310327#: qml/Greeter/NarrowView.qml:118
311328msgid "Enter passcode"
312−msgstr ""
329+msgstr "Sasissètz lo senhal"
313330
314331#: qml/Greeter/NarrowView.qml:119
315332#, qt-format
316333msgid "Sorry, incorrect %1"
317−msgstr ""
334+msgstr "O planhèm, %1 incorrècte"
318335
319336#: qml/Greeter/NarrowView.qml:120
320337msgid "Sorry, incorrect passphrase"
321−msgstr ""
338+msgstr "O planhèm, frasa secreta incorrecte"
322339
323340#: qml/Greeter/NarrowView.qml:121
324341msgctxt "passphrase"
325342msgid "Please re-enter"
326−msgstr ""
343+msgstr "Veuillez rensagesir"
327344
328345#: qml/Greeter/NarrowView.qml:122
329346msgid "Sorry, incorrect passcode"
330−msgstr ""
347+msgstr "O planhèm, còde incorrècte"
331348
332349#: qml/Notifications/NotificationMenuItemFactory.qml:129
333350msgid "Show password"
334−msgstr ""
351+msgstr "Afichar lo senhal"
335352
336353#: qml/Panel/ActiveCallHint.qml:79
337354msgid "Tap to return to call..."
338−msgstr ""
355+msgstr "Quichatz per tornar a l'apèl..."
339356
340357#: qml/Panel/ActiveCallHint.qml:92
341358msgid "Conference"
342−msgstr ""
359+msgstr "Conferéncia"
343360
344361#: qml/Panel/Indicators/MenuItemFactory.qml:761
345362msgid "Nothing is playing"
346−msgstr ""
363+msgstr "Res es pas en cors de lectura"
347364
348365#: qml/Panel/Indicators/MenuItemFactory.qml:890
349366#, qt-format
350367msgid "%1 hour"
351368msgid_plural "%1 hours"
352−msgstr[0] ""
353−msgstr[1] ""
369+msgstr[0] "%1 ora"
370+msgstr[1] "%1 oras"
354371
355372#: qml/Panel/Indicators/MenuItemFactory.qml:894
356373#, qt-format
357374msgid "%1 minute"
358375msgid_plural "%1 minutes"
359−msgstr[0] ""
360−msgstr[1] ""
376+msgstr[0] "%1 minuta"
377+msgstr[1] "%1 minutas"
361378
362379#: qml/Panel/Indicators/MenuItemFactory.qml:899
363380#, qt-format
364381msgid "%1 second"
365382msgid_plural "%1 seconds"
366−msgstr[0] ""
367−msgstr[1] ""
383+msgstr[0] "%1 segonda"
384+msgstr[1] "%1 segondas"
368385
369386#: qml/Panel/Indicators/MenuItemFactory.qml:902
370387msgid "0 seconds"
371−msgstr ""
388+msgstr "0 segonda"
372389
373390#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
374391#: qml/Panel/Indicators/MenuItemFactory.qml:904
375392#, qt-format
376393msgid "%1 remaining"
377−msgstr ""
394+msgstr "Demòra %1"
378395
379396#: qml/Panel/Indicators/MenuItemFactory.qml:910
380397msgid "In queue…"
381−msgstr ""
398+msgstr "Dins la fia d'espèra..."
382399
383400#: qml/Panel/Indicators/MenuItemFactory.qml:914
384401msgid "Downloading"
385−msgstr ""
402+msgstr "Telecargament en cors"
386403
387404#: qml/Panel/Indicators/MenuItemFactory.qml:916
388405msgid "Paused, tap to resume"
389−msgstr ""
406+msgstr "En pausa, quichatz per reprene"
390407
391408#: qml/Panel/Indicators/MenuItemFactory.qml:918
392409msgid "Canceled"
393−msgstr ""
410+msgstr "Anullat"
394411
395412#: qml/Panel/Indicators/MenuItemFactory.qml:920
396413msgid "Finished"
397−msgstr ""
414+msgstr "Acabat"
398415
399416#: qml/Panel/Indicators/MenuItemFactory.qml:922
400417msgid "Failed, tap to retry"
401−msgstr ""
418+msgstr "Fracàs, quichatz per reensajar"
402419
403420#: qml/Panel/Indicators/MessageMenuItemFactory.qml:155
404421#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
405422msgctxt "Button: Send a reply message"
406423msgid "Send"
407−msgstr ""
424+msgstr "Mandar"
408425
409426#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
410427msgctxt "Label: Hint in message indicator line edit"
411428msgid "Reply"
412−msgstr ""
429+msgstr "Respondre"
413430
414431#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
415432msgctxt "Button: Call back on phone"
416433msgid "Call back"
417−msgstr ""
434+msgstr "Rapelar"
418435
419436#: qml/Stages/SideStage.qml:76
420437msgid "Drag using 3 fingers any application from one window to the other"
421438msgstr ""
439+"Fasètz lisar amb 3 dets quina aplicacion que siá d'una fenèstra a l'autra"
422440
423441#: qml/Tutorial/TutorialBottom.qml:78
424442msgid "Swipe up to add a contact"
425−msgstr ""
443+msgstr "Fasètz lisar cap amont per apondre un contact"
426444
427445#: qml/Tutorial/TutorialBottom.qml:80
428446msgid "Swipe up for favorite calculations"
@@ -434,25 +452,25 @@ msgstr ""
434452
435453#: qml/Tutorial/TutorialBottom.qml:84
436454msgid "Swipe up to create a message"
437−msgstr ""
455+msgstr "Fasètz lisar cap amont per crear un messatge"
438456
439457#: qml/Tutorial/TutorialBottom.qml:85
440458msgid "Swipe up to manage the app"
441−msgstr ""
442−
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
459+msgstr "Fasètz lisar cap amont per gerir l'aplicacion"
446460
447461#: qml/Tutorial/TutorialLeftLong.qml:47
448462msgid "Long swipe from the left edge to open the Today scope"
449463msgstr ""
450464
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
465+#: qml/Tutorial/TutorialLeft.qml:47
466+msgid "Swipe from the left edge to open the launcher"
453467msgstr ""
454468
455469#: 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
456474msgid "Short or long swipe from the right edge to view your open apps"
457475msgstr ""
458476
@@ -467,7 +485,7 @@ msgstr ""
467485#: qml/Wizard/Page.qml:54
468486msgctxt "Button: Go back one page in the Wizard"
469487msgid "Back"
470−msgstr ""
488+msgstr "Precedent"
471489
472490#: qml/Wizard/Pages/10-welcome.qml:27
473491msgid "Language"
@@ -480,32 +498,32 @@ msgstr ""
480498#: qml/Wizard/Pages/passcode-desktop.qml:124
481499#: qml/Wizard/Pages/password-set.qml:141
482500msgid "Next"
483−msgstr ""
501+msgstr "Seguent"
484502
485503#: qml/Wizard/Pages/30-wifi.qml:29
486504msgid "Connect to Wi‑Fi"
487−msgstr ""
505+msgstr "Se connecter al Wi-Fi"
488506
489507#: qml/Wizard/Pages/30-wifi.qml:130
490508msgid "Connected"
491−msgstr ""
509+msgstr "Connectat"
492510
493511#: qml/Wizard/Pages/30-wifi.qml:163
494512msgid "Available Wi-Fi networks"
495−msgstr ""
513+msgstr "Rets Wi-Fi disponiblas"
496514
497515#: qml/Wizard/Pages/30-wifi.qml:164
498516msgid "No available Wi-Fi networks"
499−msgstr ""
517+msgstr "Cap de ret Wi-Fi pas disponibla"
500518
501519#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
502520#: qml/Wizard/Pages/sim.qml:101
503521msgid "Skip"
504−msgstr ""
522+msgstr "Passar"
505523
506524#: qml/Wizard/Pages/40-location.qml:27
507525msgid "Location Services"
508−msgstr ""
526+msgstr "Servicis de localizacion"
509527
510528#: qml/Wizard/Pages/40-location.qml:83
511529msgid ""
@@ -516,12 +534,12 @@ msgstr ""
516534#: qml/Wizard/Pages/40-location.qml:105
517535#, qt-format
518536msgid "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."
520538
521539#: qml/Wizard/Pages/40-location.qml:106
522540msgctxt "part of: Nokia HERE terms and conditions"
523541msgid "terms and conditions"
524−msgstr ""
542+msgstr "condicions generalas d'utilizacion"
525543
526544#: qml/Wizard/Pages/40-location.qml:160
527545msgid "GPS only"
@@ -529,7 +547,7 @@ msgstr ""
529547
530548#: qml/Wizard/Pages/40-location.qml:214
531549msgid "Don't use my location"
532−msgstr ""
550+msgstr "Ne pas utilizar ma position"
533551
534552#: qml/Wizard/Pages/40-location.qml:260
535553msgid "You can change it later in System Settings."
@@ -537,7 +555,7 @@ msgstr ""
537555
538556#: qml/Wizard/Pages/50-timezone.qml:29
539557msgid "Time Zone"
540−msgstr ""
558+msgstr "Fus orari"
541559
542560#: qml/Wizard/Pages/50-timezone.qml:178
543561msgid "Enter your city"
@@ -572,7 +590,7 @@ msgstr ""
572590
573591#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
574592msgid "Privacy Policy"
575−msgstr ""
593+msgstr "Politica de confidentialité"
576594
577595#: qml/Wizard/Pages/75-report-check.qml:26
578596msgid "Help Us Improve"
@@ -600,7 +618,7 @@ msgstr ""
600618
601619#: qml/Wizard/Pages/here-terms.qml:25
602620msgid "Terms & Conditions"
603−msgstr ""
621+msgstr "Condicions generalas d'utilizacion"
604622
605623#: qml/Wizard/Pages/here-terms.qml:69
606624msgid "Your device uses positioning technologies provided by HERE."
@@ -631,7 +649,7 @@ msgstr ""
631649#: qml/Wizard/Pages/passcode-confirm.qml:43
632650#: qml/Wizard/Pages/passcode-desktop.qml:80
633651msgid "Confirm passcode"
634−msgstr ""
652+msgstr "Confirmatz vòstre còde"
635653
636654#: qml/Wizard/Pages/passcode-confirm.qml:45
637655msgid "Incorrect passcode."
@@ -701,7 +719,7 @@ msgstr ""
701719
702720#: qml/Wizard/Pages/sim.qml:59
703721msgid "Restart"
704−msgstr ""
722+msgstr "Reaviar"
705723
706724#: qml/Wizard/Pages/sim.qml:78
707725msgid "You won’t be able to make calls or use text messaging without a SIM."
@@ -734,3 +752,228 @@ msgstr ""
734752#: qml/Wizard/PasswordMeter.qml:99
735753msgid "Very weak password"
736754msgstr ""
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 ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-03-21 05:28+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Oriya <or@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n!=1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/pa.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-04-24 04:29+0000\n"
1212"Last-Translator: Gursharnjit_Singh <ubuntuser13@gmail.com>\n"
1313"Language-Team: Punjabi <pa@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -446,19 +446,19 @@ msgstr ""
446446msgid "Swipe up to manage the app"
447447msgstr ""
448448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr ""
452−
453449#: qml/Tutorial/TutorialLeftLong.qml:47
454450msgid "Long swipe from the left edge to open the Today scope"
455451msgstr ""
456452
457−#: qml/Tutorial/TutorialRight.qml:54
458−msgid "Hover your mouse on the right edge to view your open apps"
453+#: qml/Tutorial/TutorialLeft.qml:47
454+msgid "Swipe from the left edge to open the launcher"
459455msgstr ""
460456
461457#: 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
462462msgid "Short or long swipe from the right edge to view your open apps"
463463msgstr ""
464464
po/pl.po+76−56
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-03-28 20:45+0000\n"
1212"Last-Translator: Krzysztof Tataradziński <Unknown>\n"
1313"Language-Team: Polish <pl@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
1818"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-29 05:41+0000\n"
20−"X-Generator: Launchpad (build 17967)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -140,6 +140,7 @@ msgctxt ""
140140"Re-dock means connect the device again to an external screen/mouse/keyboard"
141141msgid "Re-dock, save your work and close these apps to continue."
142142msgstr ""
143+"Zadokuj ponownie, zapisz co niezapisane i zamknij te aplikacje by kontynuować"
143144
144145#: qml/Components/ModeSwitchWarningDialog.qml:63
145146msgid "Or force close now (unsaved data will be lost)."
@@ -182,11 +183,11 @@ msgstr "Dodaj do ulubionych"
182183
183184#: qml/Dash/FiltersPopover.qml:60
184185msgid "Refine your results"
185−msgstr ""
186+msgstr "Przefiltruj wyniki"
186187
187188#: qml/Dash/FiltersPopover.qml:69
188189msgid "Reset"
189−msgstr ""
190+msgstr "Reset"
190191
191192#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
192193msgid "See less"
@@ -434,47 +435,51 @@ msgstr ""
434435
435436#: qml/Tutorial/TutorialBottom.qml:78
436437msgid "Swipe up to add a contact"
437−msgstr ""
438+msgstr "Przeciągnij w górę, by dodać kontakt"
438439
439440#: qml/Tutorial/TutorialBottom.qml:80
440441msgid "Swipe up for favorite calculations"
441−msgstr ""
442+msgstr "Przeciągnij w górę, by wyświetlić ostatnie obliczenia"
442443
443444#: qml/Tutorial/TutorialBottom.qml:82
444445msgid "Swipe up for recent calls"
445−msgstr ""
446+msgstr "Przeciągnij w górę, by wyświetlić ostatnie połączenia"
446447
447448#: qml/Tutorial/TutorialBottom.qml:84
448449msgid "Swipe up to create a message"
449−msgstr ""
450+msgstr "Przeciągnij w górę, by napisać nową wiadomość"
450451
451452#: qml/Tutorial/TutorialBottom.qml:85
452453msgid "Swipe up to manage the app"
453−msgstr ""
454−
455−#: qml/Tutorial/TutorialLeft.qml:47
456−msgid "Swipe from the left edge to open the launcher"
457−msgstr ""
454+msgstr "Przeciągnij w górę, by zarządzać aplikacją"
458455
459456#: qml/Tutorial/TutorialLeftLong.qml:47
460457msgid "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"
462459
463−#: qml/Tutorial/TutorialRight.qml:54
464−msgid "Hover your mouse on the right edge to view your open apps"
465−msgstr ""
460+#: qml/Tutorial/TutorialLeft.qml:47
461+msgid "Swipe from the left edge to open the launcher"
462+msgstr "Przeciągnięcie od lewej krawędzi otwiera pasek uruchamiania"
466463
467464#: 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
468469msgid "Short or long swipe from the right edge to view your open apps"
469470msgstr ""
471+"Długie lub krótkie przeciągnięcie od prawej krawędzi wyświetla otwarte "
472+"aplikacje"
470473
471474#: qml/Tutorial/TutorialTop.qml:53
472475msgid "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ń"
474477
475478#: qml/Tutorial/TutorialTop.qml:54
476479msgid "Swipe from the top edge to open the notification bar"
477480msgstr ""
481+"Połóż palec na wybraną ikonę górnego paska powiadomień i przeciągnij go w "
482+"dół, by otworzyć żądane menu"
478483
479484#: qml/Wizard/Page.qml:54
480485msgctxt "Button: Go back one page in the Wizard"
@@ -524,16 +529,19 @@ msgid ""
524529"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
525530"(recommended)"
526531msgstr ""
532+"Anonimowe ustalanie lokalizacji za pomocą GPS, Wi-Fi oraz GSM (zalecane)"
527533
528534#: qml/Wizard/Pages/40-location.qml:105
529535#, qt-format
530536msgid "By selecting this option you agree to the Nokia HERE %1."
531537msgstr ""
538+"Zaznaczając tę opcję zgadzasz się z postanowieniami zasad użytkowania Nokia "
539+"HERE %1"
532540
533541#: qml/Wizard/Pages/40-location.qml:106
534542msgctxt "part of: Nokia HERE terms and conditions"
535543msgid "terms and conditions"
536−msgstr ""
544+msgstr "Zasady użytkowania"
537545
538546#: qml/Wizard/Pages/40-location.qml:160
539547msgid "GPS only"
@@ -541,11 +549,11 @@ msgstr "Tylko GPS"
541549
542550#: qml/Wizard/Pages/40-location.qml:214
543551msgid "Don't use my location"
544−msgstr ""
552+msgstr "Nie sprawdzaj mojej lokalizacji"
545553
546554#: qml/Wizard/Pages/40-location.qml:260
547555msgid "You can change it later in System Settings."
548−msgstr ""
556+msgstr "Możesz to później zmienić w ustawianiach systemu"
549557
550558#: qml/Wizard/Pages/50-timezone.qml:29
551559msgid "Time Zone"
@@ -553,15 +561,15 @@ msgstr "Strefa czasowa"
553561
554562#: qml/Wizard/Pages/50-timezone.qml:178
555563msgid "Enter your city"
556−msgstr ""
564+msgstr "Podaj przybliżoną lokalizację"
557565
558566#: qml/Wizard/Pages/60-account.qml:24
559567msgid "Personalize Your Device"
560−msgstr ""
568+msgstr "Personalizacja urządzenia"
561569
562570#: qml/Wizard/Pages/60-account.qml:48
563571msgid "Preferred Name"
564−msgstr ""
572+msgstr "Imię"
565573
566574#: qml/Wizard/Pages/70-passwd-type.qml:39
567575msgid "Lock Screen"
@@ -570,17 +578,17 @@ msgstr "Blokada ekranu"
570578#: qml/Wizard/Pages/70-passwd-type.qml:101
571579msgctxt "Label: Type of security method"
572580msgid "Create new password"
573−msgstr ""
581+msgstr "Hasło"
574582
575583#: qml/Wizard/Pages/70-passwd-type.qml:103
576584msgctxt "Label: Type of security method"
577585msgid "Create passcode (numbers only)"
578−msgstr ""
586+msgstr "Kod (tylko cyfry)"
579587
580588#: qml/Wizard/Pages/70-passwd-type.qml:105
581589msgctxt "Label: Type of security method"
582590msgid "No lock code"
583−msgstr ""
591+msgstr "Brak zabezpieczeń"
584592
585593#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
586594msgid "Privacy Policy"
@@ -588,11 +596,14 @@ msgstr "Polityka prywatności"
588596
589597#: qml/Wizard/Pages/75-report-check.qml:26
590598msgid "Help Us Improve"
591−msgstr ""
599+msgstr "Pomóż ulepszać system"
592600
593601#: qml/Wizard/Pages/75-report-check.qml:59
594602msgid "Improve system performance by sending us crashes and error reports."
595603msgstr ""
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ć."
596607
597608#: qml/Wizard/Pages/75-report-check.qml:60
598609msgid "Privacy policy"
@@ -604,7 +615,7 @@ msgstr "Witamy w Ubuntu"
604615
605616#: qml/Wizard/Pages/80-finished.qml:104
606617msgid "You are ready to use your device now"
607−msgstr ""
618+msgstr "Twoje urządzenie jest gotowe do działania!"
608619
609620#: qml/Wizard/Pages/80-finished.qml:124
610621msgid "Get Started"
@@ -616,7 +627,7 @@ msgstr "Zasady i warunki"
616627
617628#: qml/Wizard/Pages/here-terms.qml:69
618629msgid "Your device uses positioning technologies provided by HERE."
619−msgstr ""
630+msgstr "Twoje urządzenie odnajduje lokalizację za pomocą serwisu HERE."
620631
621632#: qml/Wizard/Pages/here-terms.qml:81
622633msgid ""
@@ -624,21 +635,25 @@ msgid ""
624635"collects information about nearby cell towers and Wi-Fi hotspots around your "
625636"current location whenever your position is being found."
626637msgstr ""
638+"Aby była ona jak najdokładniejsza, HERE szuka informacji także o nadajnikach "
639+"sieci GSM oraz sieciach Wi-Fi."
627640
628641#: qml/Wizard/Pages/here-terms.qml:93
629642msgid ""
630643"The information collected is used to analyze the service and to improve the "
631644"use of service, but not to identify you personally."
632645msgstr ""
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."
633648
634649#: qml/Wizard/Pages/here-terms.qml:106
635650#, qt-format
636651msgid "By continuing, you agree to the HERE platform %1 and %2."
637−msgstr ""
652+msgstr "Kontynuując akcpetujesz %1 oraz %2."
638653
639654#: qml/Wizard/Pages/here-terms.qml:107
640655msgid "Service Terms"
641−msgstr ""
656+msgstr "Zasady"
642657
643658#: qml/Wizard/Pages/passcode-confirm.qml:43
644659#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -647,69 +662,69 @@ msgstr "Potwierdź kod"
647662
648663#: qml/Wizard/Pages/passcode-confirm.qml:45
649664msgid "Incorrect passcode."
650−msgstr ""
665+msgstr "Niepoprawny kod"
651666
652667#: qml/Wizard/Pages/passcode-confirm.qml:45
653668msgctxt "Enter the passcode again"
654669msgid "Please re-enter."
655−msgstr ""
670+msgstr "Spróbuj ponownie"
656671
657672#: qml/Wizard/Pages/passcode-desktop.qml:30
658673msgid "Lock Screen Passcode"
659−msgstr ""
674+msgstr "Kod blokady ekranu"
660675
661676#: qml/Wizard/Pages/passcode-desktop.qml:56
662677msgid "Enter 4 numbers to setup your passcode"
663−msgstr ""
678+msgstr "Podaj 4 cyfry nowego kodu"
664679
665680#: qml/Wizard/Pages/passcode-desktop.qml:65
666681#: qml/Wizard/Pages/passcode-set.qml:54
667682msgid "Choose passcode"
668−msgstr ""
683+msgstr "Nowy kod"
669684
670685#: qml/Wizard/Pages/passcode-desktop.qml:105
671686msgid "Passcode too short"
672−msgstr ""
687+msgstr "Kod za krótki"
673688
674689#: qml/Wizard/Pages/passcode-desktop.qml:107
675690msgid "Passcodes match"
676−msgstr ""
691+msgstr "Kody zgodne"
677692
678693#: qml/Wizard/Pages/passcode-desktop.qml:109
679694msgid "Passcodes do not match"
680−msgstr ""
695+msgstr "Kody nie zgadzają się"
681696
682697#: qml/Wizard/Pages/passcode-set.qml:62
683698msgid "Passcode must be 4 characters long"
684−msgstr ""
699+msgstr "Kod musi składać się z 4 cyfr"
685700
686701#: qml/Wizard/Pages/password-set.qml:30
687702msgid "Lock Screen Password"
688−msgstr ""
703+msgstr "Hasło blokady ekranu"
689704
690705#: qml/Wizard/Pages/password-set.qml:61
691706msgid "Enter at least 8 characters"
692−msgstr ""
707+msgstr "Podaj co najmniej 8 znaków"
693708
694709#: qml/Wizard/Pages/password-set.qml:73
695710msgid "Choose password"
696−msgstr ""
711+msgstr "Nowe hasło"
697712
698713#: qml/Wizard/Pages/password-set.qml:103
699714msgid "Confirm password"
700−msgstr ""
715+msgstr "Potwierdź hasło"
701716
702717#: qml/Wizard/Pages/sim.qml:27
703718msgid "No SIM card installed"
704−msgstr ""
719+msgstr "Brak karty SIM"
705720
706721#: qml/Wizard/Pages/sim.qml:54
707722msgid "SIM card added"
708−msgstr ""
723+msgstr "Znaleziono kartę SIM"
709724
710725#: qml/Wizard/Pages/sim.qml:55
711726msgid "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."
713728
714729#: qml/Wizard/Pages/sim.qml:59
715730msgid "Restart"
@@ -718,34 +733,36 @@ msgstr "Uruchom ponownie"
718733#: qml/Wizard/Pages/sim.qml:78
719734msgid "You won’t be able to make calls or use text messaging without a SIM."
720735msgstr ""
736+"Brak karty SIM nie pozwala na wysyłanie wiadomości SMS oraz wykonywanie "
737+"połączeń przez sieć GSM."
721738
722739#: qml/Wizard/Pages/sim.qml:90
723740msgid "To proceed with no SIM tap Skip."
724−msgstr ""
741+msgstr "Pomiń, by kontynuować bez karty SIM"
725742
726743#: qml/Wizard/PasswordMeter.qml:87
727744msgid "Passwords match"
728−msgstr ""
745+msgstr "Hasła zgodne"
729746
730747#: qml/Wizard/PasswordMeter.qml:89
731748msgid "Passwords do not match"
732−msgstr ""
749+msgstr "Hasła nie zgadzają się."
733750
734751#: qml/Wizard/PasswordMeter.qml:93
735752msgid "Strong password"
736−msgstr ""
753+msgstr "Silne hasło"
737754
738755#: qml/Wizard/PasswordMeter.qml:95
739756msgid "Fair password"
740−msgstr ""
757+msgstr "Dostateczne hasło"
741758
742759#: qml/Wizard/PasswordMeter.qml:97
743760msgid "Weak password"
744−msgstr ""
761+msgstr "Słabe hasło"
745762
746763#: qml/Wizard/PasswordMeter.qml:99
747764msgid "Very weak password"
748−msgstr ""
765+msgstr "Bardzo słabe hasło"
749766
750767#~ msgid "Confirm"
751768#~ msgstr "Potwierdź"
@@ -1049,3 +1066,6 @@ msgstr ""
10491066
10501067#~ msgid "Call back"
10511068#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"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"
1313"Language-Team: Portuguese <pt@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -187,11 +187,11 @@ msgstr "Adicionar aos favoritos"
187187
188188#: qml/Dash/FiltersPopover.qml:60
189189msgid "Refine your results"
190−msgstr ""
190+msgstr "Redefina os seus resultados"
191191
192192#: qml/Dash/FiltersPopover.qml:69
193193msgid "Reset"
194−msgstr ""
194+msgstr "Repor"
195195
196196#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
197197msgid "See less"
@@ -208,11 +208,11 @@ msgstr "Procurar"
208208
209209#: qml/Dash/PageHeaderExtraPanel.qml:55
210210msgid "Recent Searches"
211−msgstr ""
211+msgstr "Procuras recentes"
212212
213213#: qml/Dash/PageHeaderExtraPanel.qml:66
214214msgid "Clear All"
215−msgstr ""
215+msgstr "Limpar todos"
216216
217217#: qml/Dash/Previews/PreviewActionCombo.qml:35
218218msgid "More..."
@@ -431,51 +431,51 @@ msgstr "Ligar de volta"
431431
432432#: qml/Stages/SideStage.qml:76
433433msgid "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"
435435
436436#: qml/Tutorial/TutorialBottom.qml:78
437437msgid "Swipe up to add a contact"
438−msgstr ""
438+msgstr "Deslize para adicionar um contacto"
439439
440440#: qml/Tutorial/TutorialBottom.qml:80
441441msgid "Swipe up for favorite calculations"
442−msgstr ""
442+msgstr "Deslize para cima para marcar os seus cálculos"
443443
444444#: qml/Tutorial/TutorialBottom.qml:82
445445msgid "Swipe up for recent calls"
446−msgstr ""
446+msgstr "Deslize para cima para ver as chamadas recentes"
447447
448448#: qml/Tutorial/TutorialBottom.qml:84
449449msgid "Swipe up to create a message"
450−msgstr ""
450+msgstr "Deslize para cima para criar uma mensagem nova"
451451
452452#: qml/Tutorial/TutorialBottom.qml:85
453453msgid "Swipe up to manage the app"
454−msgstr ""
455−
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
454+msgstr "Deslize para cima para gerir a app"
459455
460456#: qml/Tutorial/TutorialLeftLong.qml:47
461457msgid "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"
463459
464−#: qml/Tutorial/TutorialRight.qml:54
465−msgid "Hover your mouse on the right edge to view your open apps"
466−msgstr ""
460+#: qml/Tutorial/TutorialLeft.qml:47
461+msgid "Swipe from the left edge to open the launcher"
462+msgstr "Deslize da margem esquerda para abrir o Launcher"
467463
468464#: 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"
470466msgstr ""
471467
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+
472472#: qml/Tutorial/TutorialTop.qml:53
473473msgid "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"
475475
476476#: qml/Tutorial/TutorialTop.qml:54
477477msgid "Swipe from the top edge to open the notification bar"
478−msgstr ""
478+msgstr "Deslize da margem esquerda para abrir as notificações"
479479
480480#: qml/Wizard/Page.qml:54
481481msgctxt "Button: Go back one page in the Wizard"
@@ -484,7 +484,7 @@ msgstr "Retroceder"
484484
485485#: qml/Wizard/Pages/10-welcome.qml:27
486486msgid "Language"
487−msgstr ""
487+msgstr "Idioma"
488488
489489#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
490490#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -493,7 +493,7 @@ msgstr ""
493493#: qml/Wizard/Pages/passcode-desktop.qml:124
494494#: qml/Wizard/Pages/password-set.qml:141
495495msgid "Next"
496−msgstr ""
496+msgstr "Próximo"
497497
498498#: qml/Wizard/Pages/30-wifi.qml:29
499499msgid "Connect to Wi‑Fi"
@@ -501,15 +501,15 @@ msgstr "Ligar ao Wi-Fi"
501501
502502#: qml/Wizard/Pages/30-wifi.qml:130
503503msgid "Connected"
504−msgstr ""
504+msgstr "Ligado"
505505
506506#: qml/Wizard/Pages/30-wifi.qml:163
507507msgid "Available Wi-Fi networks"
508−msgstr ""
508+msgstr "Redes Wi-Fi disponíveis"
509509
510510#: qml/Wizard/Pages/30-wifi.qml:164
511511msgid "No available Wi-Fi networks"
512−msgstr ""
512+msgstr "Sem redes Wi-Fi disponíveis"
513513
514514#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
515515#: qml/Wizard/Pages/sim.qml:101
@@ -518,98 +518,101 @@ msgstr "Saltar"
518518
519519#: qml/Wizard/Pages/40-location.qml:27
520520msgid "Location Services"
521−msgstr ""
521+msgstr "Serviços de localização"
522522
523523#: qml/Wizard/Pages/40-location.qml:83
524524msgid ""
525525"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
526526"(recommended)"
527527msgstr ""
528+"Usar GPS, hotspots Wi-Fi e rede móvel anonimamente para detetar a sua "
529+"localização (recomendado)"
528530
529531#: qml/Wizard/Pages/40-location.qml:105
530532#, qt-format
531533msgid "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."
533535
534536#: qml/Wizard/Pages/40-location.qml:106
535537msgctxt "part of: Nokia HERE terms and conditions"
536538msgid "terms and conditions"
537−msgstr ""
539+msgstr "termos e condições"
538540
539541#: qml/Wizard/Pages/40-location.qml:160
540542msgid "GPS only"
541−msgstr ""
543+msgstr "Apenas GPS"
542544
543545#: qml/Wizard/Pages/40-location.qml:214
544546msgid "Don't use my location"
545−msgstr ""
547+msgstr "Não use a minha localização"
546548
547549#: qml/Wizard/Pages/40-location.qml:260
548550msgid "You can change it later in System Settings."
549−msgstr ""
551+msgstr "Pode alterar mais tarde nas Definições"
550552
551553#: qml/Wizard/Pages/50-timezone.qml:29
552554msgid "Time Zone"
553−msgstr ""
555+msgstr "Fuso horário"
554556
555557#: qml/Wizard/Pages/50-timezone.qml:178
556558msgid "Enter your city"
557−msgstr ""
559+msgstr "Introduza a sua cidade"
558560
559561#: qml/Wizard/Pages/60-account.qml:24
560562msgid "Personalize Your Device"
561−msgstr ""
563+msgstr "Personalize o seu dispositivo"
562564
563565#: qml/Wizard/Pages/60-account.qml:48
564566msgid "Preferred Name"
565−msgstr ""
567+msgstr "Nome preferido"
566568
567569#: qml/Wizard/Pages/70-passwd-type.qml:39
568570msgid "Lock Screen"
569−msgstr ""
571+msgstr "Bloquear ecrã"
570572
571573#: qml/Wizard/Pages/70-passwd-type.qml:101
572574msgctxt "Label: Type of security method"
573575msgid "Create new password"
574−msgstr ""
576+msgstr "Criar nova palavra-passe"
575577
576578#: qml/Wizard/Pages/70-passwd-type.qml:103
577579msgctxt "Label: Type of security method"
578580msgid "Create passcode (numbers only)"
579−msgstr ""
581+msgstr "Criar código (números apenas)"
580582
581583#: qml/Wizard/Pages/70-passwd-type.qml:105
582584msgctxt "Label: Type of security method"
583585msgid "No lock code"
584−msgstr ""
586+msgstr "Sem código de bloqueio"
585587
586588#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
587589msgid "Privacy Policy"
588−msgstr ""
590+msgstr "Política de privacidade"
589591
590592#: qml/Wizard/Pages/75-report-check.qml:26
591593msgid "Help Us Improve"
592−msgstr ""
594+msgstr "Ajude-nos a melhorar"
593595
594596#: qml/Wizard/Pages/75-report-check.qml:59
595597msgid "Improve system performance by sending us crashes and error reports."
596598msgstr ""
599+"Melhore a performance do sistema ao enviar-nos relatórios de erros e falhas."
597600
598601#: qml/Wizard/Pages/75-report-check.qml:60
599602msgid "Privacy policy"
600−msgstr ""
603+msgstr "Política de privacidade"
601604
602605#: qml/Wizard/Pages/80-finished.qml:89
603606msgid "Welcome to Ubuntu"
604−msgstr ""
607+msgstr "Bem-vindo (a) ao Ubuntu"
605608
606609#: qml/Wizard/Pages/80-finished.qml:104
607610msgid "You are ready to use your device now"
608−msgstr ""
611+msgstr "Está pronto (a) para usar o seu dispositivo"
609612
610613#: qml/Wizard/Pages/80-finished.qml:124
611614msgid "Get Started"
612−msgstr ""
615+msgstr "Começar"
613616
614617#: qml/Wizard/Pages/here-terms.qml:25
615618msgid "Terms & Conditions"
@@ -618,6 +621,7 @@ msgstr "Termos e condições"
618621#: qml/Wizard/Pages/here-terms.qml:69
619622msgid "Your device uses positioning technologies provided by HERE."
620623msgstr ""
624+"O seu dispositivo usa tecnologias de posicionamento fornecidas pela HERE."
621625
622626#: qml/Wizard/Pages/here-terms.qml:81
623627msgid ""
@@ -625,21 +629,26 @@ msgid ""
625629"collects information about nearby cell towers and Wi-Fi hotspots around your "
626630"current location whenever your position is being found."
627631msgstr ""
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."
628635
629636#: qml/Wizard/Pages/here-terms.qml:93
630637msgid ""
631638"The information collected is used to analyze the service and to improve the "
632639"use of service, but not to identify you personally."
633640msgstr ""
641+"A informação recolhida é usada analisar e melhorar o serviço, não para o "
642+"identificar."
634643
635644#: qml/Wizard/Pages/here-terms.qml:106
636645#, qt-format
637646msgid "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."
639648
640649#: qml/Wizard/Pages/here-terms.qml:107
641650msgid "Service Terms"
642−msgstr ""
651+msgstr "Termos de serviço"
643652
644653#: qml/Wizard/Pages/passcode-confirm.qml:43
645654#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -648,69 +657,69 @@ msgstr "Confirme o código"
648657
649658#: qml/Wizard/Pages/passcode-confirm.qml:45
650659msgid "Incorrect passcode."
651−msgstr ""
660+msgstr "Código incorreto."
652661
653662#: qml/Wizard/Pages/passcode-confirm.qml:45
654663msgctxt "Enter the passcode again"
655664msgid "Please re-enter."
656−msgstr ""
665+msgstr "Por favor, volte a introduzir."
657666
658667#: qml/Wizard/Pages/passcode-desktop.qml:30
659668msgid "Lock Screen Passcode"
660−msgstr ""
669+msgstr "Código de ecrã de bloqueio"
661670
662671#: qml/Wizard/Pages/passcode-desktop.qml:56
663672msgid "Enter 4 numbers to setup your passcode"
664−msgstr ""
673+msgstr "Introduza 4 números para definir o seu código"
665674
666675#: qml/Wizard/Pages/passcode-desktop.qml:65
667676#: qml/Wizard/Pages/passcode-set.qml:54
668677msgid "Choose passcode"
669−msgstr ""
678+msgstr "Escolha o código"
670679
671680#: qml/Wizard/Pages/passcode-desktop.qml:105
672681msgid "Passcode too short"
673−msgstr ""
682+msgstr "Código muito curto"
674683
675684#: qml/Wizard/Pages/passcode-desktop.qml:107
676685msgid "Passcodes match"
677−msgstr ""
686+msgstr "Códigos coincidem"
678687
679688#: qml/Wizard/Pages/passcode-desktop.qml:109
680689msgid "Passcodes do not match"
681−msgstr ""
690+msgstr "Códigos não coincidem"
682691
683692#: qml/Wizard/Pages/passcode-set.qml:62
684693msgid "Passcode must be 4 characters long"
685−msgstr ""
694+msgstr "Os códigos devem ter 4 dígitos"
686695
687696#: qml/Wizard/Pages/password-set.qml:30
688697msgid "Lock Screen Password"
689−msgstr ""
698+msgstr "Palavra-passe de ecrã de bloqueio"
690699
691700#: qml/Wizard/Pages/password-set.qml:61
692701msgid "Enter at least 8 characters"
693−msgstr ""
702+msgstr "Introduza no mínimo 8 caracteres"
694703
695704#: qml/Wizard/Pages/password-set.qml:73
696705msgid "Choose password"
697−msgstr ""
706+msgstr "Escolha a palavra-passe"
698707
699708#: qml/Wizard/Pages/password-set.qml:103
700709msgid "Confirm password"
701−msgstr ""
710+msgstr "Confirme a palavra-passe"
702711
703712#: qml/Wizard/Pages/sim.qml:27
704713msgid "No SIM card installed"
705−msgstr ""
714+msgstr "Sem cartão SIM inserido"
706715
707716#: qml/Wizard/Pages/sim.qml:54
708717msgid "SIM card added"
709−msgstr ""
718+msgstr "Cartão SIM adicionado"
710719
711720#: qml/Wizard/Pages/sim.qml:55
712721msgid "You must restart the device to access the mobile network."
713−msgstr ""
722+msgstr "Deve reiniciar o seu dispositivo para aceder à rede móvel."
714723
715724#: qml/Wizard/Pages/sim.qml:59
716725msgid "Restart"
@@ -718,35 +727,35 @@ msgstr "Reiniciar"
718727
719728#: qml/Wizard/Pages/sim.qml:78
720729msgid "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."
722731
723732#: qml/Wizard/Pages/sim.qml:90
724733msgid "To proceed with no SIM tap Skip."
725−msgstr ""
734+msgstr "Para continuar sem um cartão SIM toque em Saltar."
726735
727736#: qml/Wizard/PasswordMeter.qml:87
728737msgid "Passwords match"
729−msgstr ""
738+msgstr "As palavras-passe coincidem"
730739
731740#: qml/Wizard/PasswordMeter.qml:89
732741msgid "Passwords do not match"
733−msgstr ""
742+msgstr "As palavras-passe não coincidem"
734743
735744#: qml/Wizard/PasswordMeter.qml:93
736745msgid "Strong password"
737−msgstr ""
746+msgstr "Palavra-passe forte"
738747
739748#: qml/Wizard/PasswordMeter.qml:95
740749msgid "Fair password"
741−msgstr ""
750+msgstr "Palavra-passe razoável"
742751
743752#: qml/Wizard/PasswordMeter.qml:97
744753msgid "Weak password"
745−msgstr ""
754+msgstr "Palavra-passe fraca"
746755
747756#: qml/Wizard/PasswordMeter.qml:99
748757msgid "Very weak password"
749−msgstr ""
758+msgstr "Palavra-passe muito fraca"
750759
751760#~ msgid "Top edge"
752761#~ msgstr "Margem superior"
@@ -1049,15 +1058,6 @@ msgstr ""
10491058#~ msgid "Loading. Please Wait..."
10501059#~ msgstr "A carregar. Por favor, aguarde..."
10511060
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−
10611061#~ msgid "Choose your passcode"
10621062#~ msgstr "Escolha o código"
10631063
@@ -1070,3 +1070,6 @@ msgstr ""
10701070#~ msgstr ""
10711071#~ "Isto pode ser desligado nas <b>Definições</b> debaixo da <b>Segurança eamp; "
10721072#~ "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 ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-08-05 04:40+0000\n"
1212"Last-Translator: Julio Alexander Sieg <julio.sieg@gmail.com>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -29,7 +29,7 @@ msgstr "Fixar atalho"
2929
3030#: plugins/Unity/Launcher/launcheritem.cpp:53
3131msgid "Quit"
32−msgstr ""
32+msgstr "Sair"
3333
3434#: plugins/Unity/Launcher/launcheritem.cpp:107
3535msgid "Unpin shortcut"
@@ -135,7 +135,7 @@ msgstr "OK"
135135
136136#: qml/Components/ModeSwitchWarningDialog.qml:32
137137msgid "Apps may have unsaved data:"
138−msgstr ""
138+msgstr "Os aplicativos podem conter dados não salvos:"
139139
140140#: qml/Components/ModeSwitchWarningDialog.qml:57
141141msgctxt ""
@@ -145,19 +145,19 @@ msgstr ""
145145
146146#: qml/Components/ModeSwitchWarningDialog.qml:63
147147msgid "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)."
149149
150150#: qml/Components/ModeSwitchWarningDialog.qml:75
151151msgid "OK, I will reconnect"
152−msgstr ""
152+msgstr "Ok, eu irei reconectar"
153153
154154#: qml/Components/ModeSwitchWarningDialog.qml:76
155155msgid "Reconnect now!"
156−msgstr ""
156+msgstr "Reconecte agora!"
157157
158158#: qml/Components/ModeSwitchWarningDialog.qml:88
159159msgid "Close all"
160−msgstr ""
160+msgstr "Fechar tudo"
161161
162162#: qml/Dash/DashPageHeader.qml:337
163163msgctxt "Button: Open the Ubuntu Store"
@@ -188,7 +188,7 @@ msgstr ""
188188
189189#: qml/Dash/FiltersPopover.qml:69
190190msgid "Reset"
191−msgstr ""
191+msgstr "Redefinir"
192192
193193#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
194194msgid "See less"
@@ -205,11 +205,11 @@ msgstr "Pesquisar"
205205
206206#: qml/Dash/PageHeaderExtraPanel.qml:55
207207msgid "Recent Searches"
208−msgstr ""
208+msgstr "Pesquisas recentes"
209209
210210#: qml/Dash/PageHeaderExtraPanel.qml:66
211211msgid "Clear All"
212−msgstr ""
212+msgstr "Limpar tudo"
213213
214214#: qml/Dash/Previews/PreviewActionCombo.qml:35
215215msgid "More..."
@@ -226,7 +226,7 @@ msgstr "Enviar"
226226
227227#: qml/Dash/Previews/PreviewRatingInput.qml:84
228228msgid "Rate this"
229−msgstr "Avaliar isto"
229+msgstr "Avalie"
230230
231231#: qml/Dash/Previews/PreviewRatingInput.qml:129
232232msgid "Add a review"
@@ -234,7 +234,7 @@ msgstr "Adicionar uma análise"
234234
235235#: qml/Dash/Previews/PreviewSharing.qml:66
236236msgid "Preview Share Item"
237−msgstr ""
237+msgstr "Visualizar item compartilhado"
238238
239239#: qml/Dash/PullToRefreshScopeStyle.qml:55
240240msgid "Pull to refresh…"
@@ -331,7 +331,7 @@ msgstr "Desculpe, senha incorreta"
331331#: qml/Greeter/NarrowView.qml:121
332332msgctxt "passphrase"
333333msgid "Please re-enter"
334−msgstr ""
334+msgstr "Por favor, digite novamente"
335335
336336#: qml/Greeter/NarrowView.qml:122
337337msgid "Sorry, incorrect passcode"
@@ -412,7 +412,7 @@ msgstr "Falhou, toque para tentar novamente"
412412#: qml/Panel/Indicators/MessageMenuItemFactory.qml:214
413413msgctxt "Button: Send a reply message"
414414msgid "Send"
415−msgstr ""
415+msgstr "Enviar"
416416
417417#: qml/Panel/Indicators/MessageMenuItemFactory.qml:156
418418msgctxt "Label: Hint in message indicator line edit"
@@ -422,7 +422,7 @@ msgstr "Responder"
422422#: qml/Panel/Indicators/MessageMenuItemFactory.qml:213
423423msgctxt "Button: Call back on phone"
424424msgid "Call back"
425−msgstr ""
425+msgstr "Retornar chamada"
426426
427427#: qml/Stages/SideStage.qml:76
428428msgid "Drag using 3 fingers any application from one window to the other"
@@ -448,19 +448,19 @@ msgstr ""
448448msgid "Swipe up to manage the app"
449449msgstr ""
450450
451−#: qml/Tutorial/TutorialLeft.qml:47
452−msgid "Swipe from the left edge to open the launcher"
453−msgstr ""
454−
455451#: qml/Tutorial/TutorialLeftLong.qml:47
456452msgid "Long swipe from the left edge to open the Today scope"
457453msgstr ""
458454
459−#: qml/Tutorial/TutorialRight.qml:54
460−msgid "Hover your mouse on the right edge to view your open apps"
455+#: qml/Tutorial/TutorialLeft.qml:47
456+msgid "Swipe from the left edge to open the launcher"
461457msgstr ""
462458
463459#: 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
464464msgid "Short or long swipe from the right edge to view your open apps"
465465msgstr ""
466466
po/ro.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-06 17:47+0000\n"
1212"Last-Translator: Meriuță Cornel <meriutacornel@neacornel.eu>\n"
1313"Language-Team: Romanian <ro@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
1818"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -456,19 +456,19 @@ msgstr ""
456456msgid "Swipe up to manage the app"
457457msgstr ""
458458
459−#: qml/Tutorial/TutorialLeft.qml:47
460−msgid "Swipe from the left edge to open the launcher"
461−msgstr ""
462−
463459#: qml/Tutorial/TutorialLeftLong.qml:47
464460msgid "Long swipe from the left edge to open the Today scope"
465461msgstr ""
466462
467−#: qml/Tutorial/TutorialRight.qml:54
468−msgid "Hover your mouse on the right edge to view your open apps"
463+#: qml/Tutorial/TutorialLeft.qml:47
464+msgid "Swipe from the left edge to open the launcher"
469465msgstr ""
470466
471467#: 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
472472msgid "Short or long swipe from the right edge to view your open apps"
473473msgstr ""
474474
po/ru.po+36−30
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-07-06 05:33+0000\n"
1212"Last-Translator: ☠Jay ZDLin☠ <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -190,7 +190,7 @@ msgstr ""
190190
191191#: qml/Dash/FiltersPopover.qml:69
192192msgid "Reset"
193−msgstr ""
193+msgstr "Сбросить"
194194
195195#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
196196msgid "See less"
@@ -207,11 +207,11 @@ msgstr "Поиск"
207207
208208#: qml/Dash/PageHeaderExtraPanel.qml:55
209209msgid "Recent Searches"
210−msgstr ""
210+msgstr "Недавние поиски"
211211
212212#: qml/Dash/PageHeaderExtraPanel.qml:66
213213msgid "Clear All"
214−msgstr ""
214+msgstr "Очистить всё"
215215
216216#: qml/Dash/Previews/PreviewActionCombo.qml:35
217217msgid "More..."
@@ -267,6 +267,8 @@ msgid ""
267267"Your device is now connected to an external display. Use this screen as a "
268268"touch pad to interact with the pointer."
269269msgstr ""
270+"Ваше устройство подключено к внешнему дисплею. Используйте этот экран как "
271+"сенсорную панель для управления указателем."
270272
271273#: qml/Greeter/CoverPage.qml:118
272274msgid "Unlock"
@@ -453,19 +455,19 @@ msgstr ""
453455msgid "Swipe up to manage the app"
454456msgstr ""
455457
456−#: qml/Tutorial/TutorialLeft.qml:47
457−msgid "Swipe from the left edge to open the launcher"
458−msgstr ""
459−
460458#: qml/Tutorial/TutorialLeftLong.qml:47
461459msgid "Long swipe from the left edge to open the Today scope"
462460msgstr ""
463461
464−#: qml/Tutorial/TutorialRight.qml:54
465−msgid "Hover your mouse on the right edge to view your open apps"
462+#: qml/Tutorial/TutorialLeft.qml:47
463+msgid "Swipe from the left edge to open the launcher"
466464msgstr ""
467465
468466#: 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
469471msgid "Short or long swipe from the right edge to view your open apps"
470472msgstr ""
471473
@@ -484,7 +486,7 @@ msgstr "Назад"
484486
485487#: qml/Wizard/Pages/10-welcome.qml:27
486488msgid "Language"
487−msgstr ""
489+msgstr "Язык"
488490
489491#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
490492#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -501,7 +503,7 @@ msgstr "Подключение к Wi‑Fi"
501503
502504#: qml/Wizard/Pages/30-wifi.qml:130
503505msgid "Connected"
504−msgstr ""
506+msgstr "Подключено"
505507
506508#: qml/Wizard/Pages/30-wifi.qml:163
507509msgid "Available Wi-Fi networks"
@@ -538,7 +540,7 @@ msgstr ""
538540
539541#: qml/Wizard/Pages/40-location.qml:160
540542msgid "GPS only"
541−msgstr ""
543+msgstr "Только GPS"
542544
543545#: qml/Wizard/Pages/40-location.qml:214
544546msgid "Don't use my location"
@@ -550,11 +552,11 @@ msgstr ""
550552
551553#: qml/Wizard/Pages/50-timezone.qml:29
552554msgid "Time Zone"
553−msgstr ""
555+msgstr "Часовой пояс"
554556
555557#: qml/Wizard/Pages/50-timezone.qml:178
556558msgid "Enter your city"
557−msgstr ""
559+msgstr "Введите ваш город"
558560
559561#: qml/Wizard/Pages/60-account.qml:24
560562msgid "Personalize Your Device"
@@ -571,7 +573,7 @@ msgstr ""
571573#: qml/Wizard/Pages/70-passwd-type.qml:101
572574msgctxt "Label: Type of security method"
573575msgid "Create new password"
574−msgstr ""
576+msgstr "Создать новый пароль"
575577
576578#: qml/Wizard/Pages/70-passwd-type.qml:103
577579msgctxt "Label: Type of security method"
@@ -601,7 +603,7 @@ msgstr ""
601603
602604#: qml/Wizard/Pages/80-finished.qml:89
603605msgid "Welcome to Ubuntu"
604−msgstr ""
606+msgstr "Добро пожаловать в Ubuntu"
605607
606608#: qml/Wizard/Pages/80-finished.qml:104
607609msgid "You are ready to use your device now"
@@ -653,7 +655,7 @@ msgstr ""
653655#: qml/Wizard/Pages/passcode-confirm.qml:45
654656msgctxt "Enter the passcode again"
655657msgid "Please re-enter."
656−msgstr ""
658+msgstr "Введите заново."
657659
658660#: qml/Wizard/Pages/passcode-desktop.qml:30
659661msgid "Lock Screen Passcode"
@@ -682,7 +684,7 @@ msgstr ""
682684
683685#: qml/Wizard/Pages/passcode-set.qml:62
684686msgid "Passcode must be 4 characters long"
685−msgstr ""
687+msgstr "Код должен содержать 4 символа"
686688
687689#: qml/Wizard/Pages/password-set.qml:30
688690msgid "Lock Screen Password"
@@ -690,7 +692,7 @@ msgstr ""
690692
691693#: qml/Wizard/Pages/password-set.qml:61
692694msgid "Enter at least 8 characters"
693−msgstr ""
695+msgstr "Введите не менее 8 символов"
694696
695697#: qml/Wizard/Pages/password-set.qml:73
696698msgid "Choose password"
@@ -698,19 +700,19 @@ msgstr ""
698700
699701#: qml/Wizard/Pages/password-set.qml:103
700702msgid "Confirm password"
701−msgstr ""
703+msgstr "Подтвердите пароль"
702704
703705#: qml/Wizard/Pages/sim.qml:27
704706msgid "No SIM card installed"
705−msgstr ""
707+msgstr "SIM-карта не вставлена"
706708
707709#: qml/Wizard/Pages/sim.qml:54
708710msgid "SIM card added"
709−msgstr ""
711+msgstr "Добавлена SIM-карта"
710712
711713#: qml/Wizard/Pages/sim.qml:55
712714msgid "You must restart the device to access the mobile network."
713−msgstr ""
715+msgstr "Необходимо перезапустить устройство для доступа к мобильной сети."
714716
715717#: qml/Wizard/Pages/sim.qml:59
716718msgid "Restart"
@@ -719,6 +721,7 @@ msgstr "Перезагрузить"
719721#: qml/Wizard/Pages/sim.qml:78
720722msgid "You won’t be able to make calls or use text messaging without a SIM."
721723msgstr ""
724+"Без SIM-карты невозможно делать звонки или отправлять текстовые сообщения."
722725
723726#: qml/Wizard/Pages/sim.qml:90
724727msgid "To proceed with no SIM tap Skip."
@@ -726,11 +729,11 @@ msgstr ""
726729
727730#: qml/Wizard/PasswordMeter.qml:87
728731msgid "Passwords match"
729−msgstr ""
732+msgstr "Пароли совпадают"
730733
731734#: qml/Wizard/PasswordMeter.qml:89
732735msgid "Passwords do not match"
733−msgstr ""
736+msgstr "Пароли не совпадают"
734737
735738#: qml/Wizard/PasswordMeter.qml:93
736739msgid "Strong password"
@@ -742,11 +745,11 @@ msgstr ""
742745
743746#: qml/Wizard/PasswordMeter.qml:97
744747msgid "Weak password"
745−msgstr ""
748+msgstr "Слабый пароль"
746749
747750#: qml/Wizard/PasswordMeter.qml:99
748751msgid "Very weak password"
749−msgstr ""
752+msgstr "Very weak password"
750753
751754#~ msgid "Type or say a command"
752755#~ msgstr "Введите или произнесите команду"
@@ -1067,3 +1070,6 @@ msgstr ""
10671070
10681071#~ msgid "Call back"
10691072#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-11-10 12:09+0000\n"
1212"Last-Translator: Rockworld <sumoisrock@gmail.com>\n"
1313"Language-Team: Shan <shn@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/si.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Sinhalese <si@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -442,19 +442,19 @@ msgstr ""
442442msgid "Swipe up to manage the app"
443443msgstr ""
444444
445−#: qml/Tutorial/TutorialLeft.qml:47
446−msgid "Swipe from the left edge to open the launcher"
447−msgstr ""
448−
449445#: qml/Tutorial/TutorialLeftLong.qml:47
450446msgid "Long swipe from the left edge to open the Today scope"
451447msgstr ""
452448
453−#: qml/Tutorial/TutorialRight.qml:54
454−msgid "Hover your mouse on the right edge to view your open apps"
449+#: qml/Tutorial/TutorialLeft.qml:47
450+msgid "Swipe from the left edge to open the launcher"
455451msgstr ""
456452
457453#: 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
458458msgid "Short or long swipe from the right edge to view your open apps"
459459msgstr ""
460460
po/sk.po+13−10
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2016-03-26 15:29+0000\n"
1212"Last-Translator: P_E_T_O <Unknown>\n"
1313"Language-Team: Slovak <sk@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"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"
19−"X-Generator: Launchpad (build 17967)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020"Language: sk\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -459,19 +459,19 @@ msgstr "Potiahnuť dohora pre vytvorenie správy"
459459msgid "Swipe up to manage the app"
460460msgstr "Potiahnuť dohora pre spravovanie aplikácie"
461461
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−
466462#: qml/Tutorial/TutorialLeftLong.qml:47
467463msgid "Long swipe from the left edge to open the Today scope"
468464msgstr "Dlhé potiahnutie od ľavého okraja pre otvorenie scope Dnes"
469465
470−#: qml/Tutorial/TutorialRight.qml:54
471−msgid "Hover your mouse on the right edge to view your open apps"
472−msgstr "Prejdite myšou od pravého okraja pre zobrazenie otvorených aplikácií"
466+#: qml/Tutorial/TutorialLeft.qml:47
467+msgid "Swipe from the left edge to open the launcher"
468+msgstr "Potiahnite od ľavého okraja pre otvorenie spúšťača"
473469
474470#: 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
475475msgid "Short or long swipe from the right edge to view your open apps"
476476msgstr ""
477477"Krátke alebo dlhé potiahnutie od pravého okraja pre zobrazenie otvorených "
@@ -942,3 +942,6 @@ msgstr "Heslo je veľmi slabé"
942942#, qt-format
943943#~ msgid "%1 〉"
944944#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-01-31 18:34+0000\n"
1212"Last-Translator: Bernard Banko <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
1818"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
20−"X-Generator: Launchpad (build 17958)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -143,6 +143,8 @@ msgctxt ""
143143"Re-dock means connect the device again to an external screen/mouse/keyboard"
144144msgid "Re-dock, save your work and close these apps to continue."
145145msgstr ""
146+"Za nadaljevanje ponovno usidrajte napravo, shranite svoje delo in zaprite te "
147+"programe"
146148
147149#: qml/Components/ModeSwitchWarningDialog.qml:63
148150msgid "Or force close now (unsaved data will be lost)."
@@ -185,11 +187,11 @@ msgstr "Dodaj med priljubljene"
185187
186188#: qml/Dash/FiltersPopover.qml:60
187189msgid "Refine your results"
188−msgstr ""
190+msgstr "Prečistite rezultate"
189191
190192#: qml/Dash/FiltersPopover.qml:69
191193msgid "Reset"
192−msgstr ""
194+msgstr "Ponastavi"
193195
194196#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
195197msgid "See less"
@@ -206,11 +208,11 @@ msgstr "Iskanje"
206208
207209#: qml/Dash/PageHeaderExtraPanel.qml:55
208210msgid "Recent Searches"
209−msgstr ""
211+msgstr "Zadnja iskanja"
210212
211213#: qml/Dash/PageHeaderExtraPanel.qml:66
212214msgid "Clear All"
213−msgstr ""
215+msgstr "Počisti vse"
214216
215217#: qml/Dash/Previews/PreviewActionCombo.qml:35
216218msgid "More..."
@@ -266,6 +268,8 @@ msgid ""
266268"Your device is now connected to an external display. Use this screen as a "
267269"touch pad to interact with the pointer."
268270msgstr ""
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."
269273
270274#: qml/Greeter/CoverPage.qml:118
271275msgid "Unlock"
@@ -433,51 +437,51 @@ msgstr "Pokliči nazaj"
433437
434438#: qml/Stages/SideStage.qml:76
435439msgid "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"
437441
438442#: qml/Tutorial/TutorialBottom.qml:78
439443msgid "Swipe up to add a contact"
440−msgstr ""
444+msgstr "Za dodajanje stika potegnite navzgor"
441445
442446#: qml/Tutorial/TutorialBottom.qml:80
443447msgid "Swipe up for favorite calculations"
444−msgstr ""
448+msgstr "Za priljubljene izračune potegnite navzgor"
445449
446450#: qml/Tutorial/TutorialBottom.qml:82
447451msgid "Swipe up for recent calls"
448−msgstr ""
452+msgstr "Za zadnje klice potegnite navzgor"
449453
450454#: qml/Tutorial/TutorialBottom.qml:84
451455msgid "Swipe up to create a message"
452−msgstr ""
456+msgstr "Za ustvarjanje sporočila potegnite navzgor"
453457
454458#: qml/Tutorial/TutorialBottom.qml:85
455459msgid "Swipe up to manage the app"
456−msgstr ""
457−
458−#: qml/Tutorial/TutorialLeft.qml:47
459−msgid "Swipe from the left edge to open the launcher"
460−msgstr ""
460+msgstr "Za upravljanje programa potegnite navzgor"
461461
462462#: qml/Tutorial/TutorialLeftLong.qml:47
463463msgid "Long swipe from the left edge to open the Today scope"
464−msgstr ""
464+msgstr "Nadolgo potegnite levi rob za odpiranje vira Danes"
465465
466−#: qml/Tutorial/TutorialRight.qml:54
467−msgid "Hover your mouse on the right edge to view your open apps"
468−msgstr ""
466+#: qml/Tutorial/TutorialLeft.qml:47
467+msgid "Swipe from the left edge to open the launcher"
468+msgstr "Potegnite levi rob za prikaz zaganjalnika"
469469
470470#: 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"
472472msgstr ""
473473
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+
474478#: qml/Tutorial/TutorialTop.qml:53
475479msgid "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"
477481
478482#: qml/Tutorial/TutorialTop.qml:54
479483msgid "Swipe from the top edge to open the notification bar"
480−msgstr ""
484+msgstr "Za odpiranje obvestilne plošče potegnite zgornji rob"
481485
482486#: qml/Wizard/Page.qml:54
483487msgctxt "Button: Go back one page in the Wizard"
@@ -486,7 +490,7 @@ msgstr "Nazaj"
486490
487491#: qml/Wizard/Pages/10-welcome.qml:27
488492msgid "Language"
489−msgstr ""
493+msgstr "Jezik"
490494
491495#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
492496#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -495,7 +499,7 @@ msgstr ""
495499#: qml/Wizard/Pages/passcode-desktop.qml:124
496500#: qml/Wizard/Pages/password-set.qml:141
497501msgid "Next"
498−msgstr ""
502+msgstr "Naslednji"
499503
500504#: qml/Wizard/Pages/30-wifi.qml:29
501505msgid "Connect to Wi‑Fi"
@@ -503,15 +507,15 @@ msgstr "Poveži se z Wi-Fi-jem"
503507
504508#: qml/Wizard/Pages/30-wifi.qml:130
505509msgid "Connected"
506−msgstr ""
510+msgstr "Povezano"
507511
508512#: qml/Wizard/Pages/30-wifi.qml:163
509513msgid "Available Wi-Fi networks"
510−msgstr ""
514+msgstr "Razpoložljiva omrežja Wi-Fi"
511515
512516#: qml/Wizard/Pages/30-wifi.qml:164
513517msgid "No available Wi-Fi networks"
514−msgstr ""
518+msgstr "Ni razpoložljivih omrežij Wi-Fi"
515519
516520#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
517521#: qml/Wizard/Pages/sim.qml:101
@@ -520,98 +524,100 @@ msgstr "Preskoči"
520524
521525#: qml/Wizard/Pages/40-location.qml:27
522526msgid "Location Services"
523−msgstr ""
527+msgstr "Storitve odkrivanja položaja"
524528
525529#: qml/Wizard/Pages/40-location.qml:83
526530msgid ""
527531"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
528532"(recommended)"
529533msgstr ""
534+"Za odkrivanje položaja anonimno uporabi GPS, vstopne točke Wi-Fi in mobilna "
535+"omrežja (priporočeno)"
530536
531537#: qml/Wizard/Pages/40-location.qml:105
532538#, qt-format
533539msgid "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."
535541
536542#: qml/Wizard/Pages/40-location.qml:106
537543msgctxt "part of: Nokia HERE terms and conditions"
538544msgid "terms and conditions"
539−msgstr ""
545+msgstr "pogoji uporabe"
540546
541547#: qml/Wizard/Pages/40-location.qml:160
542548msgid "GPS only"
543−msgstr ""
549+msgstr "Samo GPS"
544550
545551#: qml/Wizard/Pages/40-location.qml:214
546552msgid "Don't use my location"
547−msgstr ""
553+msgstr "Ne uporabljaj mojega položaja"
548554
549555#: qml/Wizard/Pages/40-location.qml:260
550556msgid "You can change it later in System Settings."
551−msgstr ""
557+msgstr "Izbiro lahko kasneje spremenite v Sistemskih nastavitvah."
552558
553559#: qml/Wizard/Pages/50-timezone.qml:29
554560msgid "Time Zone"
555−msgstr ""
561+msgstr "Časovni pas"
556562
557563#: qml/Wizard/Pages/50-timezone.qml:178
558564msgid "Enter your city"
559−msgstr ""
565+msgstr "Vnesite svoje mesto"
560566
561567#: qml/Wizard/Pages/60-account.qml:24
562568msgid "Personalize Your Device"
563−msgstr ""
569+msgstr "Prilagodite si svojo napravo"
564570
565571#: qml/Wizard/Pages/60-account.qml:48
566572msgid "Preferred Name"
567−msgstr ""
573+msgstr "Najljubše ime"
568574
569575#: qml/Wizard/Pages/70-passwd-type.qml:39
570576msgid "Lock Screen"
571−msgstr ""
577+msgstr "Zakleni zaslon"
572578
573579#: qml/Wizard/Pages/70-passwd-type.qml:101
574580msgctxt "Label: Type of security method"
575581msgid "Create new password"
576−msgstr ""
582+msgstr "Ustvari novo geslo"
577583
578584#: qml/Wizard/Pages/70-passwd-type.qml:103
579585msgctxt "Label: Type of security method"
580586msgid "Create passcode (numbers only)"
581−msgstr ""
587+msgstr "Ustvari kodo (samo številke)"
582588
583589#: qml/Wizard/Pages/70-passwd-type.qml:105
584590msgctxt "Label: Type of security method"
585591msgid "No lock code"
586−msgstr ""
592+msgstr "Brez kode za zaklep"
587593
588594#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
589595msgid "Privacy Policy"
590−msgstr ""
596+msgstr "Pravila zasebnosti"
591597
592598#: qml/Wizard/Pages/75-report-check.qml:26
593599msgid "Help Us Improve"
594−msgstr ""
600+msgstr "Pomagajte nam izboljšati"
595601
596602#: qml/Wizard/Pages/75-report-check.qml:59
597603msgid "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."
599605
600606#: qml/Wizard/Pages/75-report-check.qml:60
601607msgid "Privacy policy"
602−msgstr ""
608+msgstr "Pravila zasebnosti"
603609
604610#: qml/Wizard/Pages/80-finished.qml:89
605611msgid "Welcome to Ubuntu"
606−msgstr ""
612+msgstr "Dobrodošli v Ubuntuju"
607613
608614#: qml/Wizard/Pages/80-finished.qml:104
609615msgid "You are ready to use your device now"
610−msgstr ""
616+msgstr "Sedaj imate vse pripravljeno za uporabo svoje naprave"
611617
612618#: qml/Wizard/Pages/80-finished.qml:124
613619msgid "Get Started"
614−msgstr ""
620+msgstr "Začnite"
615621
616622#: qml/Wizard/Pages/here-terms.qml:25
617623msgid "Terms & Conditions"
@@ -620,6 +626,8 @@ msgstr "Pogoji uporabe"
620626#: qml/Wizard/Pages/here-terms.qml:69
621627msgid "Your device uses positioning technologies provided by HERE."
622628msgstr ""
629+"Vaša naprava uporablja tehnologije določanja položaja, ki jih zagotavlja "
630+"HERE."
623631
624632#: qml/Wizard/Pages/here-terms.qml:81
625633msgid ""
@@ -627,21 +635,26 @@ msgid ""
627635"collects information about nearby cell towers and Wi-Fi hotspots around your "
628636"current location whenever your position is being found."
629637msgstr ""
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."
630641
631642#: qml/Wizard/Pages/here-terms.qml:93
632643msgid ""
633644"The information collected is used to analyze the service and to improve the "
634645"use of service, but not to identify you personally."
635646msgstr ""
647+"Ti podatki se zbirajo z namenom analize storitve in njene boljše izrabe in "
648+"ne za ugotavljanje vaše istovetnosti."
636649
637650#: qml/Wizard/Pages/here-terms.qml:106
638651#, qt-format
639652msgid "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."
641654
642655#: qml/Wizard/Pages/here-terms.qml:107
643656msgid "Service Terms"
644−msgstr ""
657+msgstr "Pogoji uporabe"
645658
646659#: qml/Wizard/Pages/passcode-confirm.qml:43
647660#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -650,69 +663,69 @@ msgstr "Potrdite geslo"
650663
651664#: qml/Wizard/Pages/passcode-confirm.qml:45
652665msgid "Incorrect passcode."
653−msgstr ""
666+msgstr "Napačna koda"
654667
655668#: qml/Wizard/Pages/passcode-confirm.qml:45
656669msgctxt "Enter the passcode again"
657670msgid "Please re-enter."
658−msgstr ""
671+msgstr "Vnesite ponovno."
659672
660673#: qml/Wizard/Pages/passcode-desktop.qml:30
661674msgid "Lock Screen Passcode"
662−msgstr ""
675+msgstr "Koda za zaklep zaslona"
663676
664677#: qml/Wizard/Pages/passcode-desktop.qml:56
665678msgid "Enter 4 numbers to setup your passcode"
666−msgstr ""
679+msgstr "Za določitev kode vnesite 4 številke"
667680
668681#: qml/Wizard/Pages/passcode-desktop.qml:65
669682#: qml/Wizard/Pages/passcode-set.qml:54
670683msgid "Choose passcode"
671−msgstr ""
684+msgstr "Izberite kodo"
672685
673686#: qml/Wizard/Pages/passcode-desktop.qml:105
674687msgid "Passcode too short"
675−msgstr ""
688+msgstr "Koda prekratka"
676689
677690#: qml/Wizard/Pages/passcode-desktop.qml:107
678691msgid "Passcodes match"
679−msgstr ""
692+msgstr "Kodi se ujemata"
680693
681694#: qml/Wizard/Pages/passcode-desktop.qml:109
682695msgid "Passcodes do not match"
683−msgstr ""
696+msgstr "Kodi se ne ujemata"
684697
685698#: qml/Wizard/Pages/passcode-set.qml:62
686699msgid "Passcode must be 4 characters long"
687−msgstr ""
700+msgstr "Koda mora biti dolga 4 znake"
688701
689702#: qml/Wizard/Pages/password-set.qml:30
690703msgid "Lock Screen Password"
691−msgstr ""
704+msgstr "Geslo za zaklep zaslona"
692705
693706#: qml/Wizard/Pages/password-set.qml:61
694707msgid "Enter at least 8 characters"
695−msgstr ""
708+msgstr "Vnesite najmanj 8 znakov"
696709
697710#: qml/Wizard/Pages/password-set.qml:73
698711msgid "Choose password"
699−msgstr ""
712+msgstr "Izberite geslo"
700713
701714#: qml/Wizard/Pages/password-set.qml:103
702715msgid "Confirm password"
703−msgstr ""
716+msgstr "Potrdite geslo"
704717
705718#: qml/Wizard/Pages/sim.qml:27
706719msgid "No SIM card installed"
707−msgstr ""
720+msgstr "Kartica SIM ni nameščena"
708721
709722#: qml/Wizard/Pages/sim.qml:54
710723msgid "SIM card added"
711−msgstr ""
724+msgstr "Kartica SIM dodana"
712725
713726#: qml/Wizard/Pages/sim.qml:55
714727msgid "You must restart the device to access the mobile network."
715−msgstr ""
728+msgstr "Za dostop do mobilnega omrežja morate napravo ponovno zagnati."
716729
717730#: qml/Wizard/Pages/sim.qml:59
718731msgid "Restart"
@@ -721,34 +734,35 @@ msgstr "Ponovni zagon"
721734#: qml/Wizard/Pages/sim.qml:78
722735msgid "You won’t be able to make calls or use text messaging without a SIM."
723736msgstr ""
737+"Brez kartice SIM ne boste mogli klicati ali uporabljati kratkih sporočil."
724738
725739#: qml/Wizard/Pages/sim.qml:90
726740msgid "To proceed with no SIM tap Skip."
727−msgstr ""
741+msgstr "Za nadaljevanje brez kartice SIM tapnite Preskoči"
728742
729743#: qml/Wizard/PasswordMeter.qml:87
730744msgid "Passwords match"
731−msgstr ""
745+msgstr "Gesli se ujemata"
732746
733747#: qml/Wizard/PasswordMeter.qml:89
734748msgid "Passwords do not match"
735−msgstr ""
749+msgstr "Gesli se ne ujemata"
736750
737751#: qml/Wizard/PasswordMeter.qml:93
738752msgid "Strong password"
739−msgstr ""
753+msgstr "Močno geslo"
740754
741755#: qml/Wizard/PasswordMeter.qml:95
742756msgid "Fair password"
743−msgstr ""
757+msgstr "Sprejemljivo geslo"
744758
745759#: qml/Wizard/PasswordMeter.qml:97
746760msgid "Weak password"
747−msgstr ""
761+msgstr "Šibko geslo"
748762
749763#: qml/Wizard/PasswordMeter.qml:99
750764msgid "Very weak password"
751−msgstr ""
765+msgstr "Zelo šibko geslo"
752766
753767#~ msgid "Confirm"
754768#~ msgstr "Potrdi"
@@ -1059,3 +1073,6 @@ msgstr ""
10591073
10601074#~ msgid "%a %d %b %l:%M %p"
10611075#~ 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 @@
22# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
33# This file is distributed under the same license as the unity8 package.
44# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5−#
5+# Indrit Bashkimi <indrit.bashkimi@gmail.com>, 2016.
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11−"PO-Revision-Date: 2015-11-30 21:05+0000\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11+"PO-Revision-Date: 2016-04-21 06:03+0000\n"
1212"Last-Translator: Indrit Bashkimi <indrit.bashkimi@gmail.com>\n"
13−"Language-Team: Albanian <sq@li.org>\n"
13+"Language-Team: sq\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:07+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:03+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
20+"Language: sq\n"
2021
2122#: plugins/IntegratedLightDM/Greeter.cpp:112
2223msgid "Password: "
@@ -180,11 +181,11 @@ msgstr "Shto në të preferuarit"
180181
181182#: qml/Dash/FiltersPopover.qml:60
182183msgid "Refine your results"
183−msgstr ""
184+msgstr "Përmirëso rezultatet"
184185
185186#: qml/Dash/FiltersPopover.qml:69
186187msgid "Reset"
187−msgstr ""
188+msgstr "Rivendos"
188189
189190#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190191msgid "See less"
@@ -201,7 +202,7 @@ msgstr "Kërko"
201202
202203#: qml/Dash/PageHeaderExtraPanel.qml:55
203204msgid "Recent Searches"
204−msgstr ""
205+msgstr "Kërkimet e fundit"
205206
206207#: qml/Dash/PageHeaderExtraPanel.qml:66
207208msgid "Clear All"
@@ -209,11 +210,11 @@ msgstr ""
209210
210211#: qml/Dash/Previews/PreviewActionCombo.qml:35
211212msgid "More..."
212−msgstr "Më Tepër..."
213+msgstr "Më tepër..."
213214
214215#: qml/Dash/Previews/PreviewActionCombo.qml:35
215216msgid "Less..."
216−msgstr "Më Pak..."
217+msgstr "Më pak..."
217218
218219#: qml/Dash/Previews/PreviewCommentInput.qml:68
219220#: qml/Dash/Previews/PreviewRatingInput.qml:174
@@ -378,7 +379,7 @@ msgstr "Koha e mbetur: %1"
378379
379380#: qml/Panel/Indicators/MenuItemFactory.qml:910
380381msgid "In queue…"
381−msgstr "Në pritje..."
382+msgstr "Në pritje…"
382383
383384#: qml/Panel/Indicators/MenuItemFactory.qml:914
384385msgid "Downloading"
@@ -440,19 +441,19 @@ msgstr ""
440441msgid "Swipe up to manage the app"
441442msgstr ""
442443
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447444#: qml/Tutorial/TutorialLeftLong.qml:47
448445msgid "Long swipe from the left edge to open the Today scope"
449446msgstr ""
450447
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
448+#: qml/Tutorial/TutorialLeft.qml:47
449+msgid "Swipe from the left edge to open the launcher"
453450msgstr ""
454451
455452#: 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
456457msgid "Short or long swipe from the right edge to view your open apps"
457458msgstr ""
458459
@@ -471,7 +472,7 @@ msgstr "Prapa"
471472
472473#: qml/Wizard/Pages/10-welcome.qml:27
473474msgid "Language"
474−msgstr ""
475+msgstr "Gjuha"
475476
476477#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
477478#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -525,11 +526,11 @@ msgstr ""
525526
526527#: qml/Wizard/Pages/40-location.qml:160
527528msgid "GPS only"
528−msgstr ""
529+msgstr "vetëm GPS"
529530
530531#: qml/Wizard/Pages/40-location.qml:214
531532msgid "Don't use my location"
532−msgstr ""
533+msgstr "Mos përdor vendodhjen time"
533534
534535#: qml/Wizard/Pages/40-location.qml:260
535536msgid "You can change it later in System Settings."
@@ -549,7 +550,7 @@ msgstr ""
549550
550551#: qml/Wizard/Pages/60-account.qml:48
551552msgid "Preferred Name"
552−msgstr ""
553+msgstr "Emri i preferuar"
553554
554555#: qml/Wizard/Pages/70-passwd-type.qml:39
555556msgid "Lock Screen"
@@ -558,7 +559,7 @@ msgstr ""
558559#: qml/Wizard/Pages/70-passwd-type.qml:101
559560msgctxt "Label: Type of security method"
560561msgid "Create new password"
561−msgstr ""
562+msgstr "Krijo fjalëkalim të ri"
562563
563564#: qml/Wizard/Pages/70-passwd-type.qml:103
564565msgctxt "Label: Type of security method"
@@ -588,11 +589,11 @@ msgstr ""
588589
589590#: qml/Wizard/Pages/80-finished.qml:89
590591msgid "Welcome to Ubuntu"
591−msgstr ""
592+msgstr "Mirëserdhe në Ubuntu"
592593
593594#: qml/Wizard/Pages/80-finished.qml:104
594595msgid "You are ready to use your device now"
595−msgstr ""
596+msgstr "Tani je gati për të përdorur pajisjen"
596597
597598#: qml/Wizard/Pages/80-finished.qml:124
598599msgid "Get Started"
@@ -681,11 +682,11 @@ msgstr ""
681682
682683#: qml/Wizard/Pages/password-set.qml:73
683684msgid "Choose password"
684−msgstr ""
685+msgstr "Zgjidh fjalëkalimin"
685686
686687#: qml/Wizard/Pages/password-set.qml:103
687688msgid "Confirm password"
688−msgstr ""
689+msgstr "Konfirmo fjalëkalimin"
689690
690691#: qml/Wizard/Pages/sim.qml:27
691692msgid "No SIM card installed"
@@ -693,7 +694,7 @@ msgstr ""
693694
694695#: qml/Wizard/Pages/sim.qml:54
695696msgid "SIM card added"
696−msgstr ""
697+msgstr "Skeda SIM u shtua"
697698
698699#: qml/Wizard/Pages/sim.qml:55
699700msgid "You must restart the device to access the mobile network."
@@ -705,7 +706,7 @@ msgstr ""
705706
706707#: qml/Wizard/Pages/sim.qml:78
707708msgid "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."
709710
710711#: qml/Wizard/Pages/sim.qml:90
711712msgid "To proceed with no SIM tap Skip."
@@ -713,27 +714,27 @@ msgstr ""
713714
714715#: qml/Wizard/PasswordMeter.qml:87
715716msgid "Passwords match"
716−msgstr ""
717+msgstr "Fjalëkalimet përputhen"
717718
718719#: qml/Wizard/PasswordMeter.qml:89
719720msgid "Passwords do not match"
720−msgstr ""
721+msgstr "Fjalëkalimet nuk përputhen"
721722
722723#: qml/Wizard/PasswordMeter.qml:93
723724msgid "Strong password"
724−msgstr ""
725+msgstr "Fjalëkalim i fuqishëm"
725726
726727#: qml/Wizard/PasswordMeter.qml:95
727728msgid "Fair password"
728−msgstr ""
729+msgstr "Fjalëkalim çka"
729730
730731#: qml/Wizard/PasswordMeter.qml:97
731732msgid "Weak password"
732−msgstr ""
733+msgstr "Fjalëkalim i dobët"
733734
734735#: qml/Wizard/PasswordMeter.qml:99
735736msgid "Very weak password"
736−msgstr ""
737+msgstr "Fjalëkalim shumë i dobët"
737738
738739#~ msgid "Top edge"
739740#~ msgstr "Cepi i sipërm"
po/sr.po+13−19
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity\n"
1010"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"
1212"PO-Revision-Date: 2016-03-24 12:36+0000\n"
1313"Last-Translator: Bojan Bogdanović <Unknown>\n"
1414"Language-Team: српски <xfce4@xfce4.org>\n"
@@ -17,8 +17,8 @@ msgstr ""
1717"Content-Transfer-Encoding: 8bit\n"
1818"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1919"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
20−"X-Launchpad-Export-Date: 2016-03-25 05:55+0000\n"
21−"X-Generator: Launchpad (build 17967)\n"
20+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
21+"X-Generator: Launchpad (build 17995)\n"
2222"Language: sr\n"
2323
2424#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -456,19 +456,19 @@ msgstr "Превуците нагоре да креирате поруку"
456456msgid "Swipe up to manage the app"
457457msgstr "Превуците нагоре да урављате програмом"
458458
459−#: qml/Tutorial/TutorialLeft.qml:47
460−msgid "Swipe from the left edge to open the launcher"
461−msgstr "Превуците са леве ивице да отворите покретач"
462−
463459#: qml/Tutorial/TutorialLeftLong.qml:47
464460msgid "Long swipe from the left edge to open the Today scope"
465461msgstr "Дуго превлачење са леве ивице да отворите опсег Данас"
466462
467−#: qml/Tutorial/TutorialRight.qml:54
468−msgid "Hover your mouse on the right edge to view your open apps"
469−msgstr "Задржите миша инад десне ивице да видите отворене програме"
463+#: qml/Tutorial/TutorialLeft.qml:47
464+msgid "Swipe from the left edge to open the launcher"
465+msgstr "Превуците са леве ивице да отворите покретач"
470466
471467#: 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
472472msgid "Short or long swipe from the right edge to view your open apps"
473473msgstr ""
474474"Каратко или дуго превлачење са десне ивице да видите ваше отворене програме"
@@ -1029,12 +1029,6 @@ msgstr "Веома слаба лозинка"
10291029#~ msgid "View all your running tasks."
10301030#~ msgstr "Прегледајте све покренуте задатке."
10311031
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−
10381032#~ msgid "Let the phone detect your location:"
10391033#~ msgstr "Допустите да телефон препозна ваш положај:"
10401034
@@ -1069,11 +1063,11 @@ msgstr "Веома слаба лозинка"
10691063#~ "Ово можете да искључите у <b>Подешавањима система</b> под ставком "
10701064#~ "<b>Безбедност и приватност</b>"
10711065
1072−#~ msgid "Your device is now ready to use."
1073−#~ msgstr "Ваш уређај је сада спреман за употребу."
1074−
10751066#~ msgid "Please try again."
10761067#~ msgstr "Покушајте поново."
10771068
10781069#~ msgid "Choose your passcode"
10791070#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-03-25 05:01+0000\n"
1212"Last-Translator: Josef Andersson <Unknown>\n"
1313"Language-Team: Swedish\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-26 05:44+0000\n"
19−"X-Generator: Launchpad (build 17967)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020"Language: sv\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -450,19 +450,19 @@ msgstr "Svep uppåt för att skapa ett meddelande"
450450msgid "Swipe up to manage the app"
451451msgstr "Svep uppåt för att hantera programmet"
452452
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−
457453#: qml/Tutorial/TutorialLeftLong.qml:47
458454msgid "Long swipe from the left edge to open the Today scope"
459455msgstr "Gör ett lång svep från vänstra kanten för öppna vyn Idag"
460456
461−#: qml/Tutorial/TutorialRight.qml:54
462−msgid "Hover your mouse on the right edge to view your open apps"
463−msgstr "Hovra din mus över högra kanten för att se dina öppna program"
457+#: qml/Tutorial/TutorialLeft.qml:47
458+msgid "Swipe from the left edge to open the launcher"
459+msgstr "Svep från vänstra kanten för att öppna programstartaren"
464460
465461#: 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
466466msgid "Short or long swipe from the right edge to view your open apps"
467467msgstr ""
468468"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"
10681068
10691069#~ msgid "Call back"
10701070#~ 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 ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-17 20:02+0000\n"
1212"Last-Translator: Valentine <mwangi_valentino@yahoo.com>\n"
1313"Language-Team: Swahili <sw@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -446,19 +446,19 @@ msgstr ""
446446msgid "Swipe up to manage the app"
447447msgstr ""
448448
449−#: qml/Tutorial/TutorialLeft.qml:47
450−msgid "Swipe from the left edge to open the launcher"
451−msgstr ""
452−
453449#: qml/Tutorial/TutorialLeftLong.qml:47
454450msgid "Long swipe from the left edge to open the Today scope"
455451msgstr ""
456452
457−#: qml/Tutorial/TutorialRight.qml:54
458−msgid "Hover your mouse on the right edge to view your open apps"
453+#: qml/Tutorial/TutorialLeft.qml:47
454+msgid "Swipe from the left edge to open the launcher"
459455msgstr ""
460456
461457#: 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
462462msgid "Short or long swipe from the right edge to view your open apps"
463463msgstr ""
464464
po/ta.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2013-10-24 11:36+0000\n"
1212"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
1313"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020"Language: ta\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -441,19 +441,19 @@ msgstr ""
441441msgid "Swipe up to manage the app"
442442msgstr ""
443443
444−#: qml/Tutorial/TutorialLeft.qml:47
445−msgid "Swipe from the left edge to open the launcher"
446−msgstr ""
447−
448444#: qml/Tutorial/TutorialLeftLong.qml:47
449445msgid "Long swipe from the left edge to open the Today scope"
450446msgstr ""
451447
452−#: qml/Tutorial/TutorialRight.qml:54
453−msgid "Hover your mouse on the right edge to view your open apps"
448+#: qml/Tutorial/TutorialLeft.qml:47
449+msgid "Swipe from the left edge to open the launcher"
454450msgstr ""
455451
456452#: 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
457457msgid "Short or long swipe from the right edge to view your open apps"
458458msgstr ""
459459
po/te.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2014-07-19 10:04+0000\n"
1212"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
1313"Language-Team: Telugu <te@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/th.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-10-02 04:55+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Thai <th@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/tr.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-03-22 15:56+0000\n"
1212"Last-Translator: Arda Ünlü <aarda.uunlu@gmail.com>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -444,19 +444,19 @@ msgstr ""
444444msgid "Swipe up to manage the app"
445445msgstr ""
446446
447−#: qml/Tutorial/TutorialLeft.qml:47
448−msgid "Swipe from the left edge to open the launcher"
449−msgstr ""
450−
451447#: qml/Tutorial/TutorialLeftLong.qml:47
452448msgid "Long swipe from the left edge to open the Today scope"
453449msgstr ""
454450
455−#: qml/Tutorial/TutorialRight.qml:54
456−msgid "Hover your mouse on the right edge to view your open apps"
451+#: qml/Tutorial/TutorialLeft.qml:47
452+msgid "Swipe from the left edge to open the launcher"
457453msgstr ""
458454
459455#: 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
460460msgid "Short or long swipe from the right edge to view your open apps"
461461msgstr ""
462462
po/ug.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2015-12-01 07:37+0000\n"
1212"Last-Translator: Eltikin <eltikinuyghur@hotmail.com>\n"
1313"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -442,19 +442,19 @@ msgstr ""
442442msgid "Swipe up to manage the app"
443443msgstr ""
444444
445−#: qml/Tutorial/TutorialLeft.qml:47
446−msgid "Swipe from the left edge to open the launcher"
447−msgstr ""
448−
449445#: qml/Tutorial/TutorialLeftLong.qml:47
450446msgid "Long swipe from the left edge to open the Today scope"
451447msgstr ""
452448
453−#: qml/Tutorial/TutorialRight.qml:54
454−msgid "Hover your mouse on the right edge to view your open apps"
449+#: qml/Tutorial/TutorialLeft.qml:47
450+msgid "Swipe from the left edge to open the launcher"
455451msgstr ""
456452
457453#: 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
458458msgid "Short or long swipe from the right edge to view your open apps"
459459msgstr ""
460460
po/uk.po+13−10
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-04-01 17:32+0000\n"
1212"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
1313"Language-Team: Ukrainian <uk@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2016-04-02 06:24+0000\n"
20−"X-Generator: Launchpad (build 17972)\n"
19+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
20+"X-Generator: Launchpad (build 17995)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -459,19 +459,19 @@ msgstr "Проведіть догори, щоб написати нове пов
459459msgid "Swipe up to manage the app"
460460msgstr "Проведіть пальцем догори, щоб керувати додатком"
461461
462−#: qml/Tutorial/TutorialLeft.qml:47
463−msgid "Swipe from the left edge to open the launcher"
464−msgstr "Проведіть від лівого краю екрану, щоб відкрити меню запуску"
465−
466462#: qml/Tutorial/TutorialLeftLong.qml:47
467463msgid "Long swipe from the left edge to open the Today scope"
468464msgstr "Довге проведення від лівого краю відкриває область «Сьогодні»"
469465
470−#: qml/Tutorial/TutorialRight.qml:54
471−msgid "Hover your mouse on the right edge to view your open apps"
472−msgstr "Наведіть вказівник на правий кут, щоб побачити відкриті застосунки"
466+#: qml/Tutorial/TutorialLeft.qml:47
467+msgid "Swipe from the left edge to open the launcher"
468+msgstr "Проведіть від лівого краю екрану, щоб відкрити меню запуску"
473469
474470#: 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
475475msgid "Short or long swipe from the right edge to view your open apps"
476476msgstr ""
477477"Коротке або довге проведення від правого краю відкриває перегляд списку "
@@ -1086,3 +1086,6 @@ msgstr "Дуже слабкий пароль"
10861086
10871087#~ msgid "Call back"
10881088#~ 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 @@
11# SOME DESCRIPTIVE TITLE.
22# 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.
44# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
55#
66#, fuzzy
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"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"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/ur.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-05-05 03:12+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Urdu <ur@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/uz.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-07-04 16:03+0000\n"
1212"Last-Translator: Learner <muzaffar.habibullayev@yandex.ru>\n"
1313"Language-Team: Uzbek <uz@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/vi.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-01-15 01:19+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Vietnamese <vi@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/wo.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2015-10-29 11:16+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Wolof <wo@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -444,19 +444,19 @@ msgstr ""
444444msgid "Swipe up to manage the app"
445445msgstr ""
446446
447−#: qml/Tutorial/TutorialLeft.qml:47
448−msgid "Swipe from the left edge to open the launcher"
449−msgstr ""
450−
451447#: qml/Tutorial/TutorialLeftLong.qml:47
452448msgid "Long swipe from the left edge to open the Today scope"
453449msgstr ""
454450
455−#: qml/Tutorial/TutorialRight.qml:54
456−msgid "Hover your mouse on the right edge to view your open apps"
451+#: qml/Tutorial/TutorialLeft.qml:47
452+msgid "Swipe from the left edge to open the launcher"
457453msgstr ""
458454
459455#: 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
460460msgid "Short or long swipe from the right edge to view your open apps"
461461msgstr ""
462462
po/xh.po+9−9
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2013-09-28 13:20+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Xhosa <xh@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/zh_CN.po+87−93
@@ -7,16 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2016-03-23 10:01+0000\n"
11−"PO-Revision-Date: 2015-07-27 10:26+0000\n"
12−"Last-Translator: Ian Li <Unknown>\n"
10+"POT-Creation-Date: 2016-04-21 13:47+0000\n"
11+"PO-Revision-Date: 2016-04-13 06:27+0000\n"
12+"Last-Translator: YunQiang Su <wzssyqa@gmail.com>\n"
1313"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -138,7 +138,7 @@ msgstr "应用中可能有未保存数据:"
138138msgctxt ""
139139"Re-dock means connect the device again to an external screen/mouse/keyboard"
140140msgid "Re-dock, save your work and close these apps to continue."
141−msgstr ""
141+msgstr "重新连接,保存你的工作并关闭这些应用并继续。"
142142
143143#: qml/Components/ModeSwitchWarningDialog.qml:63
144144msgid "Or force close now (unsaved data will be lost)."
@@ -181,11 +181,11 @@ msgstr "添加到收藏夹"
181181
182182#: qml/Dash/FiltersPopover.qml:60
183183msgid "Refine your results"
184−msgstr ""
184+msgstr "精进查找结果"
185185
186186#: qml/Dash/FiltersPopover.qml:69
187187msgid "Reset"
188−msgstr ""
188+msgstr "重置"
189189
190190#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
191191msgid "See less"
@@ -202,11 +202,11 @@ msgstr "搜索"
202202
203203#: qml/Dash/PageHeaderExtraPanel.qml:55
204204msgid "Recent Searches"
205−msgstr ""
205+msgstr "近期搜索"
206206
207207#: qml/Dash/PageHeaderExtraPanel.qml:66
208208msgid "Clear All"
209−msgstr ""
209+msgstr "全部清除"
210210
211211#: qml/Dash/Previews/PreviewActionCombo.qml:35
212212msgid "More..."
@@ -261,7 +261,7 @@ msgstr "已安装"
261261msgid ""
262262"Your device is now connected to an external display. Use this screen as a "
263263"touch pad to interact with the pointer."
264−msgstr ""
264+msgstr "你的设备现在已经连接到一个外部显示。将这个屏幕当作一块触控板使用来与指针互动。"
265265
266266#: qml/Greeter/CoverPage.qml:118
267267msgid "Unlock"
@@ -416,51 +416,51 @@ msgstr "回电"
416416
417417#: qml/Stages/SideStage.qml:76
418418msgid "Drag using 3 fingers any application from one window to the other"
419−msgstr ""
419+msgstr "使用三指将任何应用从一个窗口拖拽至另一个"
420420
421421#: qml/Tutorial/TutorialBottom.qml:78
422422msgid "Swipe up to add a contact"
423−msgstr ""
423+msgstr "向上划以添加联系人"
424424
425425#: qml/Tutorial/TutorialBottom.qml:80
426426msgid "Swipe up for favorite calculations"
427−msgstr ""
427+msgstr "向上划打开常用计算"
428428
429429#: qml/Tutorial/TutorialBottom.qml:82
430430msgid "Swipe up for recent calls"
431−msgstr ""
431+msgstr "向上划打开近期通话"
432432
433433#: qml/Tutorial/TutorialBottom.qml:84
434434msgid "Swipe up to create a message"
435−msgstr ""
435+msgstr "上滑创建一条信息"
436436
437437#: qml/Tutorial/TutorialBottom.qml:85
438438msgid "Swipe up to manage the app"
439−msgstr ""
440−
441−#: qml/Tutorial/TutorialLeft.qml:47
442−msgid "Swipe from the left edge to open the launcher"
443−msgstr ""
439+msgstr "上滑管理应用"
444440
445441#: qml/Tutorial/TutorialLeftLong.qml:47
446442msgid "Long swipe from the left edge to open the Today scope"
447−msgstr ""
443+msgstr "从左侧边缘长距离滑动打开“今日”分类"
448444
449−#: qml/Tutorial/TutorialRight.qml:54
450−msgid "Hover your mouse on the right edge to view your open apps"
451−msgstr ""
445+#: qml/Tutorial/TutorialLeft.qml:47
446+msgid "Swipe from the left edge to open the launcher"
447+msgstr "从左侧边缘滑动打开启动器"
452448
453449#: qml/Tutorial/TutorialRight.qml:55
454−msgid "Short or long swipe from the right edge to view your open apps"
450+msgid "Push your mouse against the right edge to view your open apps"
455451msgstr ""
456452
453+#: qml/Tutorial/TutorialRight.qml:56
454+msgid "Short or long swipe from the right edge to view your open apps"
455+msgstr "从右侧边缘短距离或长距离滑动查看打开的应用"
456+
457457#: qml/Tutorial/TutorialTop.qml:53
458458msgid "Swipe from the top right edge to open the notification bar"
459−msgstr ""
459+msgstr "从顶部右侧边缘滑动打开通知栏"
460460
461461#: qml/Tutorial/TutorialTop.qml:54
462462msgid "Swipe from the top edge to open the notification bar"
463−msgstr ""
463+msgstr "从顶部滑动打开通知栏"
464464
465465#: qml/Wizard/Page.qml:54
466466msgctxt "Button: Go back one page in the Wizard"
@@ -469,7 +469,7 @@ msgstr "上一步"
469469
470470#: qml/Wizard/Pages/10-welcome.qml:27
471471msgid "Language"
472−msgstr ""
472+msgstr "语言"
473473
474474#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
475475#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -478,7 +478,7 @@ msgstr ""
478478#: qml/Wizard/Pages/passcode-desktop.qml:124
479479#: qml/Wizard/Pages/password-set.qml:141
480480msgid "Next"
481−msgstr ""
481+msgstr "下一步"
482482
483483#: qml/Wizard/Pages/30-wifi.qml:29
484484msgid "Connect to Wi‑Fi"
@@ -486,15 +486,15 @@ msgstr "连接 Wi-Fi"
486486
487487#: qml/Wizard/Pages/30-wifi.qml:130
488488msgid "Connected"
489−msgstr ""
489+msgstr "已连接"
490490
491491#: qml/Wizard/Pages/30-wifi.qml:163
492492msgid "Available Wi-Fi networks"
493−msgstr ""
493+msgstr "可用的 Wi-Fi 网络"
494494
495495#: qml/Wizard/Pages/30-wifi.qml:164
496496msgid "No available Wi-Fi networks"
497−msgstr ""
497+msgstr "没有可用的 Wi-Fi 网络"
498498
499499#: qml/Wizard/Pages/30-wifi.qml:206 qml/Wizard/Pages/60-account.qml:65
500500#: qml/Wizard/Pages/sim.qml:101
@@ -503,98 +503,98 @@ msgstr "跳过"
503503
504504#: qml/Wizard/Pages/40-location.qml:27
505505msgid "Location Services"
506−msgstr ""
506+msgstr "定位服务"
507507
508508#: qml/Wizard/Pages/40-location.qml:83
509509msgid ""
510510"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
511511"(recommended)"
512−msgstr ""
512+msgstr "使用 GPS、Wi-Fi 热点和移动网络匿名检测位置(推荐)"
513513
514514#: qml/Wizard/Pages/40-location.qml:105
515515#, qt-format
516516msgid "By selecting this option you agree to the Nokia HERE %1."
517−msgstr ""
517+msgstr "选择该选项同意 Nokia HERE %1。"
518518
519519#: qml/Wizard/Pages/40-location.qml:106
520520msgctxt "part of: Nokia HERE terms and conditions"
521521msgid "terms and conditions"
522−msgstr ""
522+msgstr "术语和条款"
523523
524524#: qml/Wizard/Pages/40-location.qml:160
525525msgid "GPS only"
526−msgstr ""
526+msgstr "仅 GPS"
527527
528528#: qml/Wizard/Pages/40-location.qml:214
529529msgid "Don't use my location"
530−msgstr ""
530+msgstr "不使用我的位置"
531531
532532#: qml/Wizard/Pages/40-location.qml:260
533533msgid "You can change it later in System Settings."
534−msgstr ""
534+msgstr "可以稍后在系统设置中更改。"
535535
536536#: qml/Wizard/Pages/50-timezone.qml:29
537537msgid "Time Zone"
538−msgstr ""
538+msgstr "时区"
539539
540540#: qml/Wizard/Pages/50-timezone.qml:178
541541msgid "Enter your city"
542−msgstr ""
542+msgstr "输入您的城市"
543543
544544#: qml/Wizard/Pages/60-account.qml:24
545545msgid "Personalize Your Device"
546−msgstr ""
546+msgstr "个性化您的设备"
547547
548548#: qml/Wizard/Pages/60-account.qml:48
549549msgid "Preferred Name"
550−msgstr ""
550+msgstr "首选名称"
551551
552552#: qml/Wizard/Pages/70-passwd-type.qml:39
553553msgid "Lock Screen"
554−msgstr ""
554+msgstr "锁屏"
555555
556556#: qml/Wizard/Pages/70-passwd-type.qml:101
557557msgctxt "Label: Type of security method"
558558msgid "Create new password"
559−msgstr ""
559+msgstr "创建新密码"
560560
561561#: qml/Wizard/Pages/70-passwd-type.qml:103
562562msgctxt "Label: Type of security method"
563563msgid "Create passcode (numbers only)"
564−msgstr ""
564+msgstr "创建密码 (仅数字)"
565565
566566#: qml/Wizard/Pages/70-passwd-type.qml:105
567567msgctxt "Label: Type of security method"
568568msgid "No lock code"
569−msgstr ""
569+msgstr "无锁码"
570570
571571#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
572572msgid "Privacy Policy"
573−msgstr ""
573+msgstr "隐私政策"
574574
575575#: qml/Wizard/Pages/75-report-check.qml:26
576576msgid "Help Us Improve"
577−msgstr ""
577+msgstr "帮助我们改进"
578578
579579#: qml/Wizard/Pages/75-report-check.qml:59
580580msgid "Improve system performance by sending us crashes and error reports."
581−msgstr ""
581+msgstr "向我们发送崩溃和错误报告来提高系统性能。"
582582
583583#: qml/Wizard/Pages/75-report-check.qml:60
584584msgid "Privacy policy"
585−msgstr ""
585+msgstr "隐私政策"
586586
587587#: qml/Wizard/Pages/80-finished.qml:89
588588msgid "Welcome to Ubuntu"
589−msgstr ""
589+msgstr "欢迎使用 Ubuntu"
590590
591591#: qml/Wizard/Pages/80-finished.qml:104
592592msgid "You are ready to use your device now"
593−msgstr ""
593+msgstr "现在可以使用您的设备了"
594594
595595#: qml/Wizard/Pages/80-finished.qml:124
596596msgid "Get Started"
597−msgstr ""
597+msgstr "入门"
598598
599599#: qml/Wizard/Pages/here-terms.qml:25
600600msgid "Terms & Conditions"
@@ -602,29 +602,29 @@ msgstr "条款与条件"
602602
603603#: qml/Wizard/Pages/here-terms.qml:69
604604msgid "Your device uses positioning technologies provided by HERE."
605−msgstr ""
605+msgstr "你的设备使用的定位技术由 HERE 提供。"
606606
607607#: qml/Wizard/Pages/here-terms.qml:81
608608msgid ""
609609"To provide you with positioning services and to improve their quality, HERE "
610610"collects information about nearby cell towers and Wi-Fi hotspots around your "
611611"current location whenever your position is being found."
612−msgstr ""
612+msgstr "为提供定位服务并提高服务质量,每当你的位置被发现时,HERE会收集你周围的有关手机信号塔和 Wi-Fi 热点的信息。"
613613
614614#: qml/Wizard/Pages/here-terms.qml:93
615615msgid ""
616616"The information collected is used to analyze the service and to improve the "
617617"use of service, but not to identify you personally."
618−msgstr ""
618+msgstr "收集的信息用于分析服务和改进服务的使用,并不会识别你的身份。"
619619
620620#: qml/Wizard/Pages/here-terms.qml:106
621621#, qt-format
622622msgid "By continuing, you agree to the HERE platform %1 and %2."
623−msgstr ""
623+msgstr "继续,你将同意 HERE 平台 %1 和 %2。"
624624
625625#: qml/Wizard/Pages/here-terms.qml:107
626626msgid "Service Terms"
627−msgstr ""
627+msgstr "服务条款"
628628
629629#: qml/Wizard/Pages/passcode-confirm.qml:43
630630#: qml/Wizard/Pages/passcode-desktop.qml:80
@@ -633,105 +633,105 @@ msgstr "确认新密码"
633633
634634#: qml/Wizard/Pages/passcode-confirm.qml:45
635635msgid "Incorrect passcode."
636−msgstr ""
636+msgstr "不正确的密码。"
637637
638638#: qml/Wizard/Pages/passcode-confirm.qml:45
639639msgctxt "Enter the passcode again"
640640msgid "Please re-enter."
641−msgstr ""
641+msgstr "请重新输入。"
642642
643643#: qml/Wizard/Pages/passcode-desktop.qml:30
644644msgid "Lock Screen Passcode"
645−msgstr ""
645+msgstr "锁屏密码"
646646
647647#: qml/Wizard/Pages/passcode-desktop.qml:56
648648msgid "Enter 4 numbers to setup your passcode"
649−msgstr ""
649+msgstr "输入 4 个数字来设置你的密码"
650650
651651#: qml/Wizard/Pages/passcode-desktop.qml:65
652652#: qml/Wizard/Pages/passcode-set.qml:54
653653msgid "Choose passcode"
654−msgstr ""
654+msgstr "选择密码"
655655
656656#: qml/Wizard/Pages/passcode-desktop.qml:105
657657msgid "Passcode too short"
658−msgstr ""
658+msgstr "密码太短"
659659
660660#: qml/Wizard/Pages/passcode-desktop.qml:107
661661msgid "Passcodes match"
662−msgstr ""
662+msgstr "密码匹配"
663663
664664#: qml/Wizard/Pages/passcode-desktop.qml:109
665665msgid "Passcodes do not match"
666−msgstr ""
666+msgstr "密码不匹配"
667667
668668#: qml/Wizard/Pages/passcode-set.qml:62
669669msgid "Passcode must be 4 characters long"
670−msgstr ""
670+msgstr "密码必须为 4 个字符长度"
671671
672672#: qml/Wizard/Pages/password-set.qml:30
673673msgid "Lock Screen Password"
674−msgstr ""
674+msgstr "锁屏密码"
675675
676676#: qml/Wizard/Pages/password-set.qml:61
677677msgid "Enter at least 8 characters"
678−msgstr ""
678+msgstr "输入至少8个字符"
679679
680680#: qml/Wizard/Pages/password-set.qml:73
681681msgid "Choose password"
682−msgstr ""
682+msgstr "设置密码"
683683
684684#: qml/Wizard/Pages/password-set.qml:103
685685msgid "Confirm password"
686−msgstr ""
686+msgstr "确认密码"
687687
688688#: qml/Wizard/Pages/sim.qml:27
689689msgid "No SIM card installed"
690−msgstr ""
690+msgstr "没有安装 SIM 卡"
691691
692692#: qml/Wizard/Pages/sim.qml:54
693693msgid "SIM card added"
694−msgstr ""
694+msgstr "SIM 卡已添加"
695695
696696#: qml/Wizard/Pages/sim.qml:55
697697msgid "You must restart the device to access the mobile network."
698−msgstr ""
698+msgstr "你必须重启设备才能访问移动网络"
699699
700700#: qml/Wizard/Pages/sim.qml:59
701701msgid "Restart"
702−msgstr ""
702+msgstr "重启"
703703
704704#: qml/Wizard/Pages/sim.qml:78
705705msgid "You won’t be able to make calls or use text messaging without a SIM."
706−msgstr ""
706+msgstr "没有 SIM 卡你将不能拨打电话或使用短信。"
707707
708708#: qml/Wizard/Pages/sim.qml:90
709709msgid "To proceed with no SIM tap Skip."
710−msgstr ""
710+msgstr "点击跳过继续无 SIM 卡"
711711
712712#: qml/Wizard/PasswordMeter.qml:87
713713msgid "Passwords match"
714−msgstr ""
714+msgstr "密码匹配"
715715
716716#: qml/Wizard/PasswordMeter.qml:89
717717msgid "Passwords do not match"
718−msgstr ""
718+msgstr "密码不匹配"
719719
720720#: qml/Wizard/PasswordMeter.qml:93
721721msgid "Strong password"
722−msgstr ""
722+msgstr "密码强度:强"
723723
724724#: qml/Wizard/PasswordMeter.qml:95
725725msgid "Fair password"
726−msgstr ""
726+msgstr "密码强度:合理"
727727
728728#: qml/Wizard/PasswordMeter.qml:97
729729msgid "Weak password"
730−msgstr ""
730+msgstr "密码强度:较弱"
731731
732732#: qml/Wizard/PasswordMeter.qml:99
733733msgid "Very weak password"
734−msgstr ""
734+msgstr "密码强度:非常弱"
735735
736736#~ msgid "Confirm"
737737#~ msgstr "确认"
@@ -1019,11 +1019,5 @@ msgstr ""
10191019#~ msgid "Call back"
10201020#~ msgstr "回电"
10211021
1022−#~ msgid "Welcome to your Ubuntu device."
1023−#~ msgstr "欢迎使用您的Ubuntu设备。"
1024−
1025−#~ msgid "Please select how you’d like to unlock your device."
1026−#~ msgstr "请选择你偏好的设备解锁方式。"
1027−
1028−#~ msgid "Your device is now ready to use."
1029−#~ msgstr "您的设备已就绪。"
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 ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"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"
1111"PO-Revision-Date: 2014-08-10 11:45+0000\n"
1212"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
1313"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -440,19 +440,19 @@ msgstr ""
440440msgid "Swipe up to manage the app"
441441msgstr ""
442442
443−#: qml/Tutorial/TutorialLeft.qml:47
444−msgid "Swipe from the left edge to open the launcher"
445−msgstr ""
446−
447443#: qml/Tutorial/TutorialLeftLong.qml:47
448444msgid "Long swipe from the left edge to open the Today scope"
449445msgstr ""
450446
451−#: qml/Tutorial/TutorialRight.qml:54
452−msgid "Hover your mouse on the right edge to view your open apps"
447+#: qml/Tutorial/TutorialLeft.qml:47
448+msgid "Swipe from the left edge to open the launcher"
453449msgstr ""
454450
455451#: 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
456456msgid "Short or long swipe from the right edge to view your open apps"
457457msgstr ""
458458
po/zh_TW.po+11−20
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"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"
1111"PO-Revision-Date: 2016-02-24 04:40+0000\n"
1212"Last-Translator: Po-Hsu Lin <po-hsu.lin@canonical.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-03-24 06:08+0000\n"
19−"X-Generator: Launchpad (build 17958)\n"
18+"X-Launchpad-Export-Date: 2016-04-26 06:04+0000\n"
19+"X-Generator: Launchpad (build 17995)\n"
2020"Language: zh_TW\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
@@ -184,7 +184,7 @@ msgstr ""
184184
185185#: qml/Dash/FiltersPopover.qml:69
186186msgid "Reset"
187−msgstr ""
187+msgstr "重設"
188188
189189#: qml/Dash/GenericScopeView.qml:570 qml/Dash/GenericScopeView.qml:755
190190msgid "See less"
@@ -437,19 +437,19 @@ msgstr ""
437437msgid "Swipe up to manage the app"
438438msgstr ""
439439
440−#: qml/Tutorial/TutorialLeft.qml:47
441−msgid "Swipe from the left edge to open the launcher"
442−msgstr ""
443−
444440#: qml/Tutorial/TutorialLeftLong.qml:47
445441msgid "Long swipe from the left edge to open the Today scope"
446442msgstr ""
447443
448−#: qml/Tutorial/TutorialRight.qml:54
449−msgid "Hover your mouse on the right edge to view your open apps"
444+#: qml/Tutorial/TutorialLeft.qml:47
445+msgid "Swipe from the left edge to open the launcher"
450446msgstr ""
451447
452448#: 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
453453msgid "Short or long swipe from the right edge to view your open apps"
454454msgstr ""
455455
@@ -468,7 +468,7 @@ msgstr "返回"
468468
469469#: qml/Wizard/Pages/10-welcome.qml:27
470470msgid "Language"
471−msgstr ""
471+msgstr "語言"
472472
473473#: qml/Wizard/Pages/10-welcome.qml:156 qml/Wizard/Pages/30-wifi.qml:206
474474#: qml/Wizard/Pages/40-location.qml:271 qml/Wizard/Pages/50-timezone.qml:267
@@ -1035,12 +1035,3 @@ msgstr ""
10351035
10361036#~ msgid "%a %d %b %l:%M %p"
10371037#~ 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 {
5151 var comp = Qt.createComponent(Qt.resolvedUrl("ModeSwitchWarningDialog.qml"))
5252 d.modeSwitchWarningPopup = comp.createObject(root, {model: legacyAppsModel});
5353 d.modeSwitchWarningPopup.forceClose.connect(function() {
54− while (legacyAppsModel.count > 0) {
55− ApplicationManager.stopApplication(legacyAppsModel.get(0).appId);
54+ for (var i = legacyAppsModel.count - 1; i >= 0; i--) {
55+ ApplicationManager.stopApplication(legacyAppsModel.get(i).appId);
5656 }
5757 d.modeSwitchWarningPopup.hide();
5858 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 {
6464 d.selectUser(d.currentIndex, true);
6565 }
6666
67− function notifyAppFocused(appId) {
67+ function notifyAppFocusRequested(appId) {
6868 if (!active) {
6969 return;
7070 }
@@ -81,19 +81,20 @@ Showable {
8181 }
8282 }
8383
84− function notifyAboutToFocusApp(appId) {
84+ // Notify that the user has explicitly requested the given app through unity8 GUI.
85+ function notifyUserRequestedApp(appId) {
8586 if (!active) {
8687 return;
8788 }
8889
8990 // A hint that we're about to focus an app. This way we can look
9091 // 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
9293 // app, in order to show lockscreen instead of new app.
9394 d.startUnlock(false /* toTheRight */);
9495 }
9596
96− // This is a just a glorified notifyAboutToFocusApp(), but it does one
97+ // This is a just a glorified notifyUserRequestedApp(), but it does one
9798 // other thing: it hides any cover pages to the RIGHT, because the user
9899 // just came from a launcher drag starting on the left.
99100 // It also returns a boolean value, indicating whether there was a visual
qml/Launcher/LauncherPanel.qml+1
@@ -98,6 +98,7 @@ Rectangle {
9898 AbstractButton {
9999 id: dashItem
100100 anchors.fill: parent
101+ activeFocusOnPress: false
101102 onClicked: root.showDashHome()
102103 }
103104 Rectangle {
qml/OrientedShell.qml+27−12
@@ -57,9 +57,17 @@ Rectangle {
5757 invertedPortrait: deviceConfiguration.invertedPortraitOrientation
5858 }
5959 }
60− // to be overwritten by tests
61− property var unity8Settings: GSettings { schema.id: "com.canonical.Unity8" }
62− property var oskSettings: GSettings { schema.id: "com.canonical.keyboard.maliit" }
60+
61+ GSettings {
62+ id: unity8Settings
63+ schema.id: "com.canonical.Unity8"
64+ }
65+
66+ GSettings {
67+ id: oskSettings
68+ objectName: "oskSettings"
69+ schema.id: "com.canonical.keyboard.maliit"
70+ }
6371
6472 property int physicalOrientation: Screen.orientation
6573 property bool orientationLocked: OrientationLock.enabled
@@ -90,22 +98,26 @@ Rectangle {
9098 }
9199
92100 readonly property int pointerInputDevices: miceModel.count + touchPadModel.count
93− onPointerInputDevicesChanged: {
94− console.log("Pointer input devices changed:", pointerInputDevices, "current mode:", root.unity8Settings.usageMode, "old device count", miceModel.oldCount + touchPadModel.oldCount)
95− if (root.unity8Settings.usageMode === "Windowed") {
101+ onPointerInputDevicesChanged: calculateUsageMode()
102+
103+ function calculateUsageMode() {
104+ if (unity8Settings.usageMode === undefined)
105+ return; // gsettings isn't loaded yet, we'll try again in Component.onCompleted
106+
107+ console.log("Pointer input devices changed:", pointerInputDevices, "current mode:", unity8Settings.usageMode, "old device count", miceModel.oldCount + touchPadModel.oldCount)
108+ if (unity8Settings.usageMode === "Windowed") {
96109 if (pointerInputDevices === 0) {
97110 // All pointer devices have been unplugged. Move to staged.
98− root.unity8Settings.usageMode = "Staged";
111+ unity8Settings.usageMode = "Staged";
99112 }
100113 } else {
101− var longEdgeWidth = Math.max(root.width, root.height)
102− if (longEdgeWidth > units.gu(90)){
114+ if (Math.min(root.width, root.height) > units.gu(60)) {
103115 if (pointerInputDevices > 0 && pointerInputDevices > miceModel.oldCount + touchPadModel.oldCount) {
104− root.unity8Settings.usageMode = "Windowed";
116+ unity8Settings.usageMode = "Windowed";
105117 }
106118 } else {
107119 // Make sure we initialize to something sane
108− root.unity8Settings.usageMode = "Staged";
120+ unity8Settings.usageMode = "Staged";
109121 }
110122 }
111123 miceModel.oldCount = miceModel.count;
@@ -154,6 +166,9 @@ Rectangle {
154166 if (orientationLocked) {
155167 orientation = orientationLock.savedOrientation;
156168 }
169+
170+ calculateUsageMode();
171+
157172 // We need to manually update this on startup as the binding
158173 // below doesn't seem to have any effect at that stage
159174 oskSettings.disableHeight = !shell.oskEnabled || shell.usageScenario == "desktop"
@@ -248,7 +263,7 @@ Rectangle {
248263 forceOSKEnabled
249264
250265 usageScenario: {
251− if (root.unity8Settings.usageMode === "Windowed") {
266+ if (unity8Settings.usageMode === "Windowed") {
252267 return "desktop";
253268 } else {
254269 if (deviceConfiguration.category === "phone") {
qml/Shell.qml+69−102
@@ -42,6 +42,7 @@ import Unity.Session 0.1
4242import Unity.DashCommunicator 0.1
4343import Unity.Indicators 0.1 as Indicators
4444import Cursor 1.0
45+import WindowManager 0.1
4546
4647
4748Item {
@@ -96,20 +97,50 @@ Item {
9697 }
9798 }
9899
99− // For autopilot consumption
100− readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
101−
102− // internal props from here onwards
103100 readonly property var mainApp:
104101 applicationsDisplayLoader.item ? applicationsDisplayLoader.item.mainApp : null
105− readonly property var mainAppWindow:
106− applicationsDisplayLoader.item ? applicationsDisplayLoader.item.mainAppWindow : null
102+ onMainAppChanged: {
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
107138
108139 // Disable everything while greeter is waiting, so that the user can't swipe
109140 // the greeter or launcher until we know whether the session is locked.
110141 enabled: greeter && !greeter.waiting
111142
112− property real edgeSize: units.gu(2)
143+ property real edgeSize: units.gu(settings.edgeDragWidth)
113144
114145 WallpaperResolver {
115146 id: wallpaperResolver
@@ -141,9 +172,6 @@ Item {
141172
142173 Component.onCompleted: {
143174 theme.name = "Ubuntu.Components.Themes.SuruDark"
144− if (ApplicationManager.count > 0) {
145− ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
146− }
147175 finishStartUpTimer.start();
148176 }
149177
@@ -200,36 +228,10 @@ Item {
200228 width: parent.width
201229 height: parent.height
202230
203− Connections {
204− target: ApplicationManager
205−
206− // This signal is also fired when we try to focus the current app
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− }
231+ TopLevelSurfaceList {
232+ id: topLevelSurfaceList
233+ objectName: "topLevelSurfaceList"
234+ applicationsModel: ApplicationManager
233235 }
234236
235237 Loader {
@@ -260,6 +262,10 @@ Item {
260262 return "Stages/DesktopStage.qml";
261263 }
262264 }
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.
263269 onQmlComponentChanged: {
264270 if (item) item.stageAboutToBeUnloaded();
265271 source = qmlComponent;
@@ -272,6 +278,11 @@ Item {
272278
273279 onInteractiveChanged: { if (interactive) { focus = true; } }
274280
281+ Binding {
282+ target: applicationsDisplayLoader.item
283+ property: "focus"
284+ value: true
285+ }
275286 Binding {
276287 target: applicationsDisplayLoader.item
277288 property: "objectName"
@@ -358,6 +369,16 @@ Item {
358369 property: "leftMargin"
359370 value: shell.usageScenario == "desktop" && !settings.autohideLauncher ? launcher.panelWidth: 0
360371 }
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+ }
361382 }
362383 }
363384
@@ -372,16 +393,6 @@ Item {
372393 z: notifications.useModal || panel.indicators.shown || wizard.active || tutorial.running ? overlay.z + 1 : overlay.z - 1
373394 }
374395
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−
385396 Loader {
386397 id: greeterLoader
387398 anchors.fill: parent
@@ -473,7 +484,7 @@ Item {
473484 }
474485
475486 function showHome() {
476− greeter.notifyAboutToFocusApp("unity8-dash");
487+ greeter.notifyUserRequestedApp("unity8-dash");
477488
478489 var animate = !lightDM.greeter.active && !stages.shown
479490 dash.setCurrentScope(0, animate, false)
@@ -522,9 +533,10 @@ Item {
522533 greeterShown: greeter.shown
523534 }
524535
525− readonly property bool topmostApplicationIsFullscreen: mainApp && mainApp.fullscreen
526−
527− fullscreenMode: (topmostApplicationIsFullscreen && !lightDM.greeter.active && launcher.progress == 0)
536+ readonly property bool focusedSurfaceIsFullscreen: MirFocusController.focusedSurface
537+ ? MirFocusController.focusedSurface.state === Mir.FullscreenState
538+ : false
539+ fullscreenMode: (focusedSurfaceIsFullscreen && !lightDM.greeter.active && launcher.progress == 0)
528540 || greeter.hasLockedApp
529541 locked: greeter && greeter.active
530542 }
@@ -557,7 +569,7 @@ Item {
557569 }
558570 }
559571 onLauncherApplicationSelected: {
560− greeter.notifyAboutToFocusApp(appId);
572+ greeter.notifyUserRequestedApp(appId);
561573 shell.activateApplication(appId);
562574 }
563575 onShownChanged: {
@@ -721,53 +733,8 @@ Item {
721733 onMouseMoved: { cursor.opacity = 1; }
722734 }
723735
724− // keymap switching
725− GlobalShortcut {
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()
736+ // non-visual object
737+ KeymapSwitcher {}
771738
772739 Rectangle {
773740 id: shutdownFadeOutRectangle
qml/Stages/AbstractStage.qml+9−3
@@ -18,12 +18,19 @@ import QtQuick 2.4
1818import Ubuntu.Components 1.3
1919import GSettings 1.0
2020
21−Rectangle {
21+FocusScope {
2222 id: root
2323
24− color: "#060606"
24+ property alias color: backRect.color
25+ Rectangle {
26+ id: backRect
27+ color: "#060606"
28+ anchors.fill: parent
29+ }
2530
2631 // Controls to be set from outside
32+ property QtObject applicationManager
33+ property QtObject topLevelSurfaceList
2734 property bool altTabPressed
2835 property url background
2936 property bool beingResized
@@ -45,7 +52,6 @@ Rectangle {
4552
4653 // To be read from outside
4754 property var mainApp: null
48− property var mainAppWindow: null
4955 property int mainAppWindowOrientationAngle: 0
5056 property bool orientationChangesEnabled
5157 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
2020
2121FocusScope {
2222 id: root
23− implicitWidth: sessionContainer.implicitWidth
24− implicitHeight: sessionContainer.implicitHeight
23+ implicitWidth: surfaceContainer.implicitWidth
24+ implicitHeight: surfaceContainer.implicitHeight
2525
2626 // to be read from outside
27− property alias interactive: sessionContainer.interactive
27+ property alias interactive: surfaceContainer.interactive
2828 property bool orientationChangesEnabled: d.supportsSurfaceResize ? d.surfaceOldEnoughToBeResized : true
29− readonly property string title: sessionContainer.surface && sessionContainer.surface.name !== "" ?
30− sessionContainer.surface.name : d.name
29+ readonly property string title: surface && surface.name !== "" ? surface.name : d.name
3130
3231 // 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+ }
3441
3542 // to be set from outside
43+ property QtObject surface
3644 property QtObject application
3745 property int surfaceOrientationAngle
38− property alias resizeSurface: sessionContainer.resizeSurface
46+ property alias resizeSurface: surfaceContainer.resizeSurface
3947 property int requestedWidth: -1
4048 property int requestedHeight: -1
4149
42− function switchToKeymap(keymap) {
43− sessionContainer.surfaceContainer.switchToKeymap(keymap);
44− }
50+ readonly property int minimumWidth: surface ? surface.minimumWidth : 0
51+ readonly property int minimumHeight: surface ? surface.minimumHeight : 0
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
4556
46− readonly property int minimumWidth: sessionContainer.surface ? sessionContainer.surface.minimumWidth : 0
47− readonly property int minimumHeight: sessionContainer.surface ? sessionContainer.surface.minimumHeight : 0
48− readonly property int maximumWidth: sessionContainer.surface ? sessionContainer.surface.maximumWidth : 0
49− readonly property int maximumHeight: sessionContainer.surface ? sessionContainer.surface.maximumHeight : 0
50− readonly property int widthIncrement: sessionContainer.surface ? sessionContainer.surface.widthIncrement : 0
51− readonly property int heightIncrement: sessionContainer.surface ? sessionContainer.surface.heightIncrement : 0
57+ onSurfaceChanged: {
58+ // The order in which the instructions are executed here matters, to that the correct state
59+ // transitions in stateGroup take place.
60+ // More specifically, the moment surfaceContainer.surface gets updated relative to the
61+ // other instructions.
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+ }
5275
5376 QtObject {
5477 id: d
5578
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+
5694 // helpers so that we don't have to check for the existence of an application everywhere
5795 // (in order to avoid breaking qml binding due to a javascript exception)
5896 readonly property string name: root.application ? root.application.name : ""
@@ -66,17 +104,7 @@ FocusScope {
66104 readonly property color splashColorFooter: root.application ? root.application.splashColorFooter : "#00000000"
67105
68106 // Whether the Application had a surface before but lost it.
69− property bool hadSurface: sessionContainer.surfaceContainer.hadSurface
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− }
107+ property bool hadSurface: false
80108
81109 //FIXME - this is a hack to avoid the first few rendered frames as they
82110 // might show the UI accommodating due to surface resizes on startup.
@@ -103,7 +131,9 @@ FocusScope {
103131 Timer {
104132 id: surfaceInitTimer
105133 interval: 100
106− onTriggered: { if (sessionContainer.surface) {d.surfaceInitialized = true;} }
134+ onTriggered: {
135+ if (root.surface && root.surface.live) {d.surfaceInitialized = true;}
136+ }
107137 }
108138
109139 Timer {
@@ -121,13 +151,11 @@ FocusScope {
121151 function take() {
122152 // Save memory by using a half-resolution (thus quarter size) screenshot.
123153 // Do not make this a binding, we can only take the screenshot once!
124− sourceSize.width = root.width / 2;
125− sourceSize.height = root.height / 2;
126−
127− // Format: "image://application/$APP_ID/$CURRENT_TIME_MS"
128− // eg: "image://application/calculator-app/123456"
129− var timeMs = new Date().getTime();
130− source = "image://application/" + root.application.appId + "/" + timeMs;
154+ surfaceContainer.grabToImage(
155+ function(result) {
156+ screenshotImage.source = result.url;
157+ },
158+ Qt.size(root.width / 2, root.height / 2));
131159 }
132160 }
133161
@@ -150,46 +178,33 @@ FocusScope {
150178 }
151179 }
152180
153− SessionContainer {
154− id: sessionContainer
155− // A fake application might not even have a session property.
156− session: application && application.session ? application.session : null
157−
181+ SurfaceContainer {
182+ id: surfaceContainer
158183 requestedWidth: root.requestedWidth
159184 requestedHeight: root.requestedHeight
160−
161185 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−
171186 focus: true
172187 }
173188
174− // SessionContainer size drives ApplicationWindow size
189+ // SurfaceContainer size drives ApplicationWindow size
175190 Binding {
176191 target: root; property: "width"
177− value: stateGroup.state === "surface" ? sessionContainer.width : root.requestedWidth
192+ value: stateGroup.state === "surface" ? surfaceContainer.width : root.requestedWidth
178193 when: root.requestedWidth >= 0
179194 }
180195 Binding {
181196 target: root; property: "height"
182− value: stateGroup.state === "surface" ? sessionContainer.height : root.requestedHeight
197+ value: stateGroup.state === "surface" ? surfaceContainer.height : root.requestedHeight
183198 when: root.requestedHeight >= 0
184199 }
185200
186− // ApplicationWindow size drives SessionContainer size
201+ // ApplicationWindow size drives SurfaceContainer size
187202 Binding {
188− target: sessionContainer; property: "width"; value: root.width
203+ target: surfaceContainer; property: "width"; value: root.width
189204 when: root.requestedWidth < 0
190205 }
191206 Binding {
192− target: sessionContainer; property: "height"; value: root.height
207+ target: surfaceContainer; property: "height"; value: root.height
193208 when: root.requestedHeight < 0
194209 }
195210
@@ -200,32 +215,43 @@ FocusScope {
200215 State {
201216 name: "void"
202217 when:
203− d.hadSurface && (!sessionContainer.surface || !d.surfaceInitialized)
218+ d.hadSurface && (!root.surface || !d.surfaceInitialized)
204219 &&
205220 screenshotImage.status !== Image.Ready
206221 },
207222 State {
208223 name: "splashScreen"
209224 when:
210− !d.hadSurface && (!sessionContainer.surface || !d.surfaceInitialized)
225+ !d.hadSurface && (!root.surface || !d.surfaceInitialized)
211226 &&
212227 screenshotImage.status !== Image.Ready
213228 },
214229 State {
215230 name: "surface"
216231 when:
217− (sessionContainer.surface && d.surfaceInitialized)
232+ (root.surface && d.surfaceInitialized)
218233 &&
219− (d.applicationState !== ApplicationInfoInterface.Stopped
220− || screenshotImage.status !== Image.Ready)
234+ (d.liveSurface ||
235+ (d.applicationState !== ApplicationInfoInterface.Running
236+ && screenshotImage.status !== Image.Ready))
221237 },
222238 State {
223239 name: "screenshot"
224240 when:
225241 screenshotImage.status === Image.Ready
226242 &&
227− (d.applicationState === ApplicationInfoInterface.Stopped
228− || !sessionContainer.surface || !d.surfaceInitialized)
243+ (d.applicationState !== ApplicationInfoInterface.Running
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
229255 }
230256 ]
231257
@@ -233,17 +259,17 @@ FocusScope {
233259 Transition {
234260 from: ""; to: "splashScreen"
235261 PropertyAction { target: splashLoader; property: "active"; value: true }
236− PropertyAction { target: sessionContainer.surfaceContainer
262+ PropertyAction { target: surfaceContainer
237263 property: "visible"; value: false }
238264 },
239265 Transition {
240266 from: "splashScreen"; to: "surface"
241267 SequentialAnimation {
242− PropertyAction { target: sessionContainer.surfaceContainer
268+ PropertyAction { target: surfaceContainer
243269 property: "opacity"; value: 0.0 }
244− PropertyAction { target: sessionContainer.surfaceContainer
270+ PropertyAction { target: surfaceContainer
245271 property: "visible"; value: true }
246− UbuntuNumberAnimation { target: sessionContainer.surfaceContainer; property: "opacity";
272+ UbuntuNumberAnimation { target: surfaceContainer; property: "opacity";
247273 from: 0.0; to: 1.0
248274 duration: UbuntuAnimation.BriskDuration }
249275 ScriptAction { script: {
@@ -259,12 +285,12 @@ FocusScope {
259285 surfaceIsOldTimer.stop();
260286 d.surfaceOldEnoughToBeResized = false;
261287 splashLoader.active = true;
262− sessionContainer.surfaceContainer.visible = true;
288+ surfaceContainer.visible = true;
263289 } }
264290 UbuntuNumberAnimation { target: splashLoader; property: "opacity";
265291 from: 0.0; to: 1.0
266292 duration: UbuntuAnimation.BriskDuration }
267− PropertyAction { target: sessionContainer.surfaceContainer
293+ PropertyAction { target: surfaceContainer
268294 property: "visible"; value: false }
269295 }
270296 },
@@ -280,15 +306,16 @@ FocusScope {
280306 from: 0.0; to: 1.0
281307 duration: UbuntuAnimation.BriskDuration }
282308 ScriptAction { script: {
283− sessionContainer.surfaceContainer.visible = false;
284− if (sessionContainer.session) { sessionContainer.session.release(); }
309+ surfaceContainer.visible = false;
310+ surfaceContainer.surface = null;
311+ d.hadSurface = true;
285312 } }
286313 }
287314 },
288315 Transition {
289316 from: "screenshot"; to: "surface"
290317 SequentialAnimation {
291− PropertyAction { target: sessionContainer.surfaceContainer
318+ PropertyAction { target: surfaceContainer
292319 property: "visible"; value: true }
293320 UbuntuNumberAnimation { target: screenshotImage; property: "opacity";
294321 from: 1.0; to: 0.0
@@ -316,22 +343,31 @@ FocusScope {
316343 ScriptAction { script: {
317344 surfaceIsOldTimer.stop();
318345 d.surfaceOldEnoughToBeResized = false;
319− sessionContainer.surfaceContainer.visible = false;
320− if (sessionContainer.session) { sessionContainer.session.release(); }
346+ surfaceContainer.visible = false;
321347 } }
322348 },
323349 Transition {
324350 from: "void"; to: "surface"
325351 SequentialAnimation {
326− PropertyAction { target: sessionContainer.surfaceContainer; property: "opacity"; value: 0.0 }
327− PropertyAction { target: sessionContainer.surfaceContainer; property: "visible"; value: true }
328− UbuntuNumberAnimation { target: sessionContainer.surfaceContainer; property: "opacity";
352+ PropertyAction { target: surfaceContainer; property: "opacity"; value: 0.0 }
353+ PropertyAction { target: surfaceContainer; property: "visible"; value: true }
354+ UbuntuNumberAnimation { target: surfaceContainer; property: "opacity";
329355 from: 0.0; to: 1.0
330356 duration: UbuntuAnimation.BriskDuration }
331357 ScriptAction { script: {
332358 surfaceIsOldTimer.start();
333359 } }
334360 }
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+ }
335371 }
336372 ]
337373 }
qml/Stages/DecoratedWindow.qml+5−5
@@ -26,10 +26,10 @@ FocusScope {
2626 width: applicationWindow.width
2727 height: (decorationShown ? decoration.height : 0) + applicationWindow.height
2828
29− property alias window: applicationWindow
3029 property alias application: applicationWindow.application
30+ property alias surface: applicationWindow.surface
3131 property alias active: decoration.active
32− property alias title: decoration.title
32+ readonly property alias title: applicationWindow.title
3333 property alias fullscreen: applicationWindow.fullscreen
3434
3535 readonly property bool decorationShown: !fullscreen
@@ -79,11 +79,11 @@ FocusScope {
7979 WindowDecoration {
8080 id: decoration
8181 target: root.parent
82− objectName: application ? "appWindowDecoration_" + application.appId : "appWindowDecoration_null"
82+ objectName: "appWindowDecoration"
8383 anchors { left: parent.left; top: parent.top; right: parent.right }
8484 height: units.gu(3)
8585 width: root.width
86− title: window.title
86+ title: applicationWindow.title
8787 visible: root.decorationShown
8888
8989 onClose: root.close();
@@ -94,7 +94,7 @@ FocusScope {
9494
9595 ApplicationWindow {
9696 id: applicationWindow
97− objectName: application ? "appWindow_" + application.appId : "appWindow_null"
97+ objectName: "appWindow"
9898 anchors.top: parent.top
9999 anchors.topMargin: decoration.height
100100 anchors.left: parent.left
qml/Stages/DesktopSpread.qml+22−18
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.3
2020import Ubuntu.Gestures 0.1
2121import Unity.Application 0.1
2222import "../Components"
23+import Utils 0.1
2324
2425FocusScope {
2526 id: root
@@ -69,12 +70,12 @@ FocusScope {
6970 }
7071
7172 function selectNext(isAutoRepeat) {
72− if (isAutoRepeat && spreadRepeater.highlightedIndex >= ApplicationManager.count -1) {
73+ if (isAutoRepeat && spreadRepeater.highlightedIndex >= topLevelSurfaceList.count -1) {
7374 return; // AutoRepeat is not allowed to wrap around
7475 }
7576
76− spreadRepeater.highlightedIndex = (spreadRepeater.highlightedIndex + 1) % ApplicationManager.count;
77− var newContentX = ((spreadFlickable.contentWidth) / (ApplicationManager.count + 1)) * Math.max(0, Math.min(ApplicationManager.count - 5, spreadRepeater.highlightedIndex - 3));
77+ spreadRepeater.highlightedIndex = (spreadRepeater.highlightedIndex + 1) % topLevelSurfaceList.count;
78+ var newContentX = ((spreadFlickable.contentWidth) / (topLevelSurfaceList.count + 1)) * Math.max(0, Math.min(topLevelSurfaceList.count - 5, spreadRepeater.highlightedIndex - 3));
7879 if (spreadFlickable.contentX < newContentX || spreadRepeater.highlightedIndex == 0) {
7980 spreadFlickable.snapTo(newContentX)
8081 }
@@ -85,10 +86,10 @@ FocusScope {
8586 return; // AutoRepeat is not allowed to wrap around
8687 }
8788
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;
8990 spreadRepeater.highlightedIndex = newIndex;
90− var newContentX = ((spreadFlickable.contentWidth) / (ApplicationManager.count + 1)) * Math.max(0, Math.min(ApplicationManager.count - 5, spreadRepeater.highlightedIndex - 1));
91− if (spreadFlickable.contentX > newContentX || newIndex == ApplicationManager.count -1) {
91+ var newContentX = ((spreadFlickable.contentWidth) / (topLevelSurfaceList.count + 1)) * Math.max(0, Math.min(topLevelSurfaceList.count - 5, spreadRepeater.highlightedIndex - 1));
92+ if (spreadFlickable.contentX > newContentX || newIndex == topLevelSurfaceList.count -1) {
9293 spreadFlickable.snapTo(newContentX)
9394 }
9495 }
@@ -98,8 +99,8 @@ FocusScope {
9899 if (spreadContainer.visible) {
99100 root.playFocusAnimation(spreadRepeater.highlightedIndex)
100101 }
101− var application = ApplicationManager.get(spreadRepeater.highlightedIndex);
102− ApplicationManager.requestFocusApplication(application.appId);
102+ var surface = topLevelSurfaceList.surfaceAt(spreadRepeater.highlightedIndex);
103+ surface.requestFocus();
103104 }
104105 }
105106
@@ -144,7 +145,7 @@ FocusScope {
144145 Repeater {
145146 id: spreadRepeater
146147 objectName: "spreadRepeater"
147− model: ApplicationManager
148+ model: topLevelSurfaceList
148149
149150 property int highlightedIndex: -1
150151 property int closingIndex: -1
@@ -182,7 +183,8 @@ FocusScope {
182183 objectName: "clippedSpreadDelegate"
183184 anchors.left: parent.left
184185 anchors.top: parent.top
185− application: ApplicationManager.get(index)
186+ application: model.application
187+ surface: model.surface
186188 width: spreadMaths.spreadHeight
187189 height: spreadMaths.spreadHeight
188190
@@ -216,7 +218,7 @@ FocusScope {
216218 id: spreadMaths
217219 flickable: spreadFlickable
218220 itemIndex: index
219− totalItems: Math.max(6, ApplicationManager.count)
221+ totalItems: Math.max(6, topLevelSurfaceList.count)
220222 sceneHeight: root.height
221223 itemHeight: spreadDelegate.height
222224 }
@@ -310,7 +312,7 @@ FocusScope {
310312 Layout.preferredWidth: height * 8 / 7.6
311313 image: Image {
312314 anchors.fill: parent
313− source: model.icon
315+ source: model.application.icon
314316 Rectangle {
315317 anchors.fill: parent
316318 color: "black"
@@ -324,7 +326,9 @@ FocusScope {
324326 Label {
325327 Layout.fillWidth: true
326328 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
328332 wrapMode: Text.WordWrap
329333 elide: Text.ElideRight
330334 maximumLineCount: 2
@@ -354,7 +358,7 @@ FocusScope {
354358 anchors.margins: -units.gu(2)
355359 onClicked: {
356360 spreadRepeater.closingIndex = index;
357− ApplicationManager.stopApplication(model.appId)
361+ model.surface.close();
358362 }
359363 }
360364 }
@@ -421,7 +425,7 @@ FocusScope {
421425 objectName: "spreadFlickable"
422426 anchors.fill: parent
423427 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)
425429 enabled: false
426430
427431 function snapTo(contentX) {
@@ -523,7 +527,7 @@ FocusScope {
523527 Label {
524528 id: currentSelectedLabel
525529 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 : ""
527531 visible: false
528532 fontSize: "large"
529533 }
@@ -545,7 +549,7 @@ FocusScope {
545549 from: "*"
546550 to: "altTab"
547551 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) }
549553 PauseAnimation { duration: spreadContainer.animateIn ? 0 : 140 }
550554 PropertyAction { target: workspaceSelector; property: "visible" }
551555 PropertyAction { target: spreadContainer; property: "visible" }
qml/Stages/DesktopSpreadDelegate.qml+4−3
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -25,12 +25,13 @@ Item {
2525
2626 property alias window: applicationWindow
2727 property alias application: applicationWindow.application
28+ property alias surface: applicationWindow.surface
2829
2930 property bool highlightShown: false
3031 property real shadowOpacity: 1
3132
32− property int windowWidth: application && application.session && application.session.lastSurface ? application.session.lastSurface.size.width : 0
33− property int windowHeight: application && application.session && application.session.lastSurface ? application.session.lastSurface.size.height : 0
33+ property int windowWidth: surface ? surface.size.width : 0
34+ property int windowHeight: surface ? surface.size.height : 0
3435
3536 state: "normal"
3637 states: [
qml/Stages/DesktopStage.qml+158−101
@@ -39,47 +39,18 @@ AbstractStage {
3939 // Used by TutorialRight
4040 property bool spreadShown: spread.state == "altTab"
4141
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
4743
4844 // application windows never rotate independently
4945 mainAppWindowOrientationAngle: shellOrientationAngle
5046
5147 orientationChangesEnabled: true
5248
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−
7849 GlobalShortcut {
7950 id: closeWindowShortcut
8051 shortcut: Qt.AltModifier|Qt.Key_F4
81− onTriggered: ApplicationManager.stopApplication(priv.focusedAppId)
82− active: priv.focusedAppId !== ""
52+ onTriggered: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.close(); } }
53+ active: priv.focusedAppDelegate !== null
8354 }
8455
8556 GlobalShortcut {
@@ -123,40 +94,40 @@ AbstractStage {
12394 active: priv.focusedAppDelegate !== null
12495 }
12596
97+ Connections {
98+ target: root.topLevelSurfaceList
99+ onCountChanged: {
100+ if (spread.state == "altTab") {
101+ spread.cancel();
102+ }
103+ }
104+ }
105+
126106 QtObject {
127107 id: priv
108+ objectName: "DesktopStagePrivate"
128109
129− readonly property string focusedAppId: ApplicationManager.focusedApplicationId
130− readonly property var focusedAppDelegate: {
131− var index = indexOf(focusedAppId);
132− return index >= 0 && index < appRepeater.count ? appRepeater.itemAt(index) : null
110+ property var focusedAppDelegate: null
111+ onFocusedAppDelegateChanged: {
112+ if (spread.state == "altTab") {
113+ spread.state = "";
114+ }
133115 }
134− onFocusedAppDelegateChanged: updateForegroundMaximizedApp();
135116
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
138118
139119 function updateForegroundMaximizedApp() {
140− var tmp = -1;
141− var tmpAppId = -1;
142− for (var i = appRepeater.count - 1; i >= 0; i--) {
120+ var found = false;
121+ for (var i = 0; i < appRepeater.count && !found; i++) {
143122 var item = appRepeater.itemAt(i);
144123 if (item && item.visuallyMaximized) {
145− tmpAppId = i;
146− tmp = Math.max(tmp, item.normalZ);
124+ foregroundMaximizedAppDelegate = item;
125+ found = true;
147126 }
148127 }
149− foregroundMaximizedAppZ = tmp;
150− foregroundMaximizedAppIndex = tmpAppId;
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− }
128+ if (!found) {
129+ foregroundMaximizedAppDelegate = null;
158130 }
159− return -1;
160131 }
161132
162133 function minimizeAllWindows() {
@@ -166,16 +137,13 @@ AbstractStage {
166137 appDelegate.minimize();
167138 }
168139 }
169−
170− ApplicationManager.unfocusCurrentApplication(); // no app should have focus at this point
171140 }
172141
173142 function focusNext() {
174− ApplicationManager.unfocusCurrentApplication();
175143 for (var i = 0; i < appRepeater.count; i++) {
176144 var appDelegate = appRepeater.itemAt(i);
177145 if (appDelegate && !appDelegate.minimized) {
178− ApplicationManager.focusApplication(appDelegate.appId);
146+ appDelegate.focus = true;
179147 return;
180148 }
181149 }
@@ -184,15 +152,14 @@ AbstractStage {
184152
185153 Connections {
186154 target: PanelState
187− onClose: {
188− ApplicationManager.stopApplication(ApplicationManager.focusedApplicationId)
155+ onClose: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.close(); } }
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+ }
189162 }
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− }
196163 }
197164
198165 Binding {
@@ -220,7 +187,7 @@ AbstractStage {
220187 Binding {
221188 target: PanelState
222189 property: "dropShadow"
223− value: priv.focusedAppDelegate && !priv.focusedAppDelegate.maximized && priv.foregroundMaximizedAppIndex !== -1
190+ value: priv.focusedAppDelegate && !priv.focusedAppDelegate.maximized && priv.foregroundMaximizedAppDelegate !== null
224191 }
225192
226193 Component.onDestruction: {
@@ -229,6 +196,27 @@ AbstractStage {
229196 PanelState.dropShadow = false;
230197 }
231198
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+ }
232220
233221 FocusScope {
234222 id: appContainer
@@ -244,20 +232,25 @@ AbstractStage {
244232 fillMode: Image.PreserveAspectCrop
245233 }
246234
247− Repeater {
235+ TopLevelSurfaceRepeater {
248236 id: appRepeater
249− model: ApplicationManager
237+ model: topLevelSurfaceList
250238 objectName: "appRepeater"
251239
252240 delegate: FocusScope {
253241 id: appDelegate
254− objectName: "appDelegate_" + appId
242+ objectName: "appDelegate_" + model.id
255243 // z might be overriden in some cases by effects, but we need z ordering
256244 // 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+ }
258251 z: normalZ
259252 y: PanelState.panelHeight
260− focus: appId === priv.focusedAppId
253+
261254 width: decoratedWindow.width
262255 height: decoratedWindow.height
263256 property int requestedWidth: -1
@@ -282,38 +275,99 @@ AbstractStage {
282275 readonly property alias minimized: appDelegatePrivate.minimized
283276 readonly property alias fullscreen: decoratedWindow.fullscreen
284277
285− readonly property string appId: model.appId
278+ readonly property var application: model.application
286279 property bool animationsEnabled: true
287280 property alias title: decoratedWindow.title
288− readonly property string appName: model.name
281+ readonly property string appName: model.application ? model.application.name : ""
289282 property bool visuallyMaximized: false
290283 property bool visuallyMinimized: false
291284
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+ }
293309
294310 onFocusChanged: {
295− if (focus && ApplicationManager.focusedApplicationId !== appId) {
296− ApplicationManager.focusApplication(appId);
311+ if (appRepeater.startingUp)
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+ }
297356 }
298357 }
299358
300359 onVisuallyMaximizedChanged: priv.updateForegroundMaximizedApp()
301360
302− visible: !visuallyMinimized &&
303− !greeter.fullyShown &&
304− (priv.foregroundMaximizedAppZ === -1 || priv.foregroundMaximizedAppZ <= z) ||
305− decoratedWindow.fullscreen ||
306− (spread.state == "altTab" && index === spread.highlightedIndex)
361+ visible: (
362+ !visuallyMinimized
363+ && !greeter.fullyShown
364+ && (priv.foregroundMaximizedAppDelegate === null || priv.foregroundMaximizedAppDelegate.normalZ <= z)
365+ )
366+ || decoratedWindow.fullscreen
367+ || (spread.state == "altTab" && index === spread.highlightedIndex)
307368
308− Binding {
309− target: ApplicationManager.get(index)
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
369+ function close() {
370+ model.surface.close();
317371 }
318372
319373 function maximize(animated) {
@@ -355,7 +409,8 @@ AbstractStage {
355409 maximizeLeft();
356410 else if (maximizedRight)
357411 maximizeRight();
358− ApplicationManager.focusApplication(appId);
412+
413+ focus = true;
359414 }
360415
361416 function playFocusAnimation() {
@@ -373,7 +428,7 @@ AbstractStage {
373428
374429 states: [
375430 State {
376− name: "fullscreen"; when: decoratedWindow.fullscreen
431+ name: "fullscreen"; when: decoratedWindow.fullscreen && !appDelegate.minimized
377432 PropertyChanges {
378433 target: appDelegate;
379434 x: 0;
@@ -466,6 +521,7 @@ AbstractStage {
466521 ScriptAction {
467522 script: {
468523 if (appDelegate.minimized) {
524+ appDelegate.focus = false;
469525 priv.focusNext();
470526 }
471527 }
@@ -490,7 +546,7 @@ AbstractStage {
490546 id: previewBinding
491547 target: appDelegate
492548 property: "z"
493− value: ApplicationManager.count + 1
549+ value: topLevelSurfaceList.count + 1
494550 when: index == spread.highlightedIndex && spread.ready
495551 }
496552
@@ -501,12 +557,12 @@ AbstractStage {
501557 minWidth: units.gu(10)
502558 minHeight: units.gu(10)
503559 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
505561 screenWidth: appContainer.width
506562 screenHeight: appContainer.height
507563 leftMargin: root.leftMargin
508564
509− onPressed: { ApplicationManager.focusApplication(model.appId) }
565+ onPressed: { appDelegate.focus = true; }
510566
511567 Component.onCompleted: {
512568 loadWindowState();
@@ -533,24 +589,25 @@ AbstractStage {
533589 objectName: "decoratedWindow"
534590 anchors.left: appDelegate.left
535591 anchors.top: appDelegate.top
536− application: ApplicationManager.get(index)
537− active: ApplicationManager.focusedApplicationId === model.appId
592+ application: model.application
593+ surface: model.surface
594+ active: appDelegate.focus
538595 focus: true
539596
540597 requestedWidth: appDelegate.requestedWidth
541598 requestedHeight: appDelegate.requestedHeight
542599
543− onClose: ApplicationManager.stopApplication(model.appId)
600+ onClose: { appDelegate.close(); }
544601 onMaximize: appDelegate.maximized || appDelegate.maximizedLeft || appDelegate.maximizedRight
545602 ? appDelegate.restoreFromMaximized() : appDelegate.maximize()
546603 onMinimize: appDelegate.minimize()
547− onDecorationPressed: { ApplicationManager.focusApplication(model.appId) }
604+ onDecorationPressed: { appDelegate.focus = true; }
548605 }
549606
550607 WindowedFullscreenPolicy {
551608 id: fullscreenPolicy
552609 active: true
553− application: decoratedWindow.application
610+ surface: model.surface
554611 }
555612 }
556613 }
qml/Stages/PhoneStage.qml+152−91
@@ -26,7 +26,6 @@ import "../Components"
2626AbstractStage {
2727 id: root
2828
29− property QtObject applicationManager: ApplicationManager
3029 property bool focusFirstApp: true // If false, focused app will appear on right edge like other apps
3130 property bool altTabEnabled: true
3231 property real startScale: 1.1
@@ -107,11 +106,7 @@ AbstractStage {
107106 }
108107 }
109108
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
115110
116111 orientationChangesEnabled: priv.focusedAppOrientationChangesEnabled
117112 && !priv.focusedAppDelegateIsDislocated
@@ -160,72 +155,27 @@ AbstractStage {
160155 onTriggered: { root.beingResized = false; }
161156 }
162157
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−
202158 QtObject {
203159 id: priv
204160
205− property string focusedAppId: root.applicationManager.focusedApplicationId
206161 property bool focusedAppOrientationChangesEnabled: false
207162 readonly property int firstSpreadIndex: root.focusFirstApp ? 1 : 0
208− readonly property var focusedAppDelegate: {
209− var index = indexOf(focusedAppId);
210− return index >= 0 && index < spreadRepeater.count ? spreadRepeater.itemAt(index) : null
211− }
163+ property var focusedAppDelegate
164+ // NB! This may differ from applicationManager.focusedApplicationId if focusedAppDelegate
165+ // contains a screenshot instead of a surface.
166+ property string focusedAppId: focusedAppDelegate ? focusedAppDelegate.application.appId : ""
212167
213168 property real oldInverseProgress: 0
214169 property bool animateX: false
215170 property int highlightIndex: 0
216171
217− onFocusedAppDelegateChanged: {
218− if (focusedAppDelegate) {
219− focusedAppDelegate.focus = true;
220− }
221− }
222−
223− property bool focusedAppDelegateIsDislocated: focusedAppDelegate &&
172+ property bool focusedAppDelegateIsDislocated: focusedAppDelegate ?
224173 (focusedAppDelegate.x !== 0 || focusedAppDelegate.xBehavior.running)
174+ : false
225175
226176 function indexOf(appId) {
227− for (var i = 0; i < root.applicationManager.count; i++) {
228− if (root.applicationManager.get(i).appId == appId) {
177+ for (var i = 0; i < spreadRepeater.count; i++) {
178+ if (spreadRepeater.itemAt(i).application.appId == appId) {
229179 return i;
230180 }
231181 }
@@ -239,8 +189,8 @@ AbstractStage {
239189 function reset() {
240190 // The app that's about to go to foreground has to be focused, otherwise
241191 // it would leave us in an inconsistent state.
242− if (!root.applicationManager.focusedApplicationId && root.applicationManager.count > 0) {
243− root.applicationManager.focusApplication(root.applicationManager.get(0).appId);
192+ if (!MirFocusController.focusedSurface && spreadRepeater.count > 0) {
193+ spreadRepeater.itemAt(0).focus = true;
244194 }
245195
246196 spreadView.selectedIndex = -1;
@@ -260,6 +210,36 @@ AbstractStage {
260210 }
261211 }
262212
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+
263243 Flickable {
264244 id: spreadView
265245 objectName: "spreadView"
@@ -310,13 +290,38 @@ AbstractStage {
310290 // rely on having Flickable.contentX keeping an out-of-bounds value when it's set programatically
311291 // (as opposed to having contentX reaching an out-of-bounds value through dragging, which will trigger
312292 // the Flickable.boundsBehavior upon release).
313− onContentXChanged: { forceItToRemainStillIfBeingResized(); }
293+ onContentXChanged: {
294+ if (!undoContentXReset()) {
295+ forceItToRemainStillIfBeingResized();
296+ }
297+ }
314298 onShiftChanged: { forceItToRemainStillIfBeingResized(); }
315299 function forceItToRemainStillIfBeingResized() {
316300 if (root.beingResized && contentX != -spreadView.shift) {
317301 contentX = -spreadView.shift;
318302 }
319303 }
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>
320325
321326 Behavior on contentX {
322327 enabled: root.altTabPressed
@@ -379,7 +384,7 @@ AbstractStage {
379384 snapAnimation.start();
380385 return;
381386 }
382− if (root.applicationManager.count <= index) {
387+ if (topLevelSurfaceList.count <= index) {
383388 // In case we're trying to snap to some non existing app, lets snap back to the first one
384389 index = 0;
385390 }
@@ -416,7 +421,8 @@ AbstractStage {
416421 ScriptAction {
417422 script: {
418423 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;
420426
421427 spreadView.selectedIndex = -1;
422428 spreadView.phase = 0;
@@ -431,7 +437,7 @@ AbstractStage {
431437 // This width controls how much the spread can be flicked left/right. It's composed of:
432438 // tileDistance * app count (with a minimum of 3 apps, in order to also allow moving 1 and 2 apps a bit)
433439 // + 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
435441 height: parent.height
436442 Behavior on width {
437443 enabled: spreadView.closingIndex >= 0
@@ -451,13 +457,30 @@ AbstractStage {
451457 }
452458 }
453459
454− Repeater {
460+ TopLevelSurfaceRepeater {
455461 id: spreadRepeater
456462 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+
458481 delegate: TransformedSpreadDelegate {
459482 id: appDelegate
460− objectName: "appDelegate" + index
483+ objectName: "spreadDelegate_" + model.id
461484 startAngle: 45
462485 endAngle: 5
463486 startScale: root.startScale
@@ -469,28 +492,61 @@ AbstractStage {
469492 selected: spreadView.selectedIndex == index
470493 otherSelected: spreadView.selectedIndex >= 0 && !selected
471494 interactive: !spreadView.interactive && spreadView.phase === 0
472− && priv.fullyShowingFocusedApp && root.interactive && isFocused
495+ && priv.fullyShowingFocusedApp && root.interactive && focus
473496 swipeToCloseEnabled: spreadView.interactive && root.interactive && !snapAnimation.running
474497 maximizedAppTopMargin: root.maximizedAppTopMargin
475498 dropShadow: spreadView.active || priv.focusedAppDelegateIsDislocated
476499 focusFirstApp: root.focusFirstApp
477500 highlightShown: root.altTabPressed && index === priv.highlightIndex
478501
479− readonly property bool isDash: model.appId == "unity8-dash"
480−
481− Binding {
482− target: appDelegate.application
483− property: "exemptFromLifecycle"
484− value: !model.isTouchApp || isExemptFromLifecycle(model.appId)
502+ readonly property bool isDash: model.application.appId == "unity8-dash"
503+
504+ Component.onCompleted: {
505+ // NB: We're differentiating if this delegate was created in response to a new entry in the model
506+ // or if the Repeater is just populating itself with delegates to match the model it received.
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+ }
485516 }
486517
487− Binding {
488− target: appDelegate.application
489− property: "requestedState"
490− value: (isDash && root.keepDashRunning)
491− || (!root.suspended && appDelegate.focus)
492− ? ApplicationInfoInterface.RequestedRunning
493− : ApplicationInfoInterface.RequestedSuspended
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 {
532+ appDelegate.focus = true;
533+ }
534+ }
535+ Connections {
536+ target: model.surface
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+ }
494550 }
495551
496552 z: isDash && !spreadView.active ? -1 : behavioredIndex
@@ -511,7 +567,8 @@ AbstractStage {
511567 return spreadView.width + spreadIndex * spreadView.tileDistance;
512568 }
513569
514− application: root.applicationManager.get(index)
570+ application: model.application
571+ surface: model.surface
515572 closeable: !isDash
516573
517574 property real behavioredIndex: index
@@ -595,11 +652,7 @@ AbstractStage {
595652
596653 onClicked: {
597654 if (root.altTabEnabled && spreadView.phase == 2) {
598− if (root.applicationManager.focusedApplicationId == root.applicationManager.get(index).appId) {
599− spreadView.snapTo(index);
600− } else {
601− root.applicationManager.requestFocusApplication(root.applicationManager.get(index).appId);
602− }
655+ spreadView.snapTo(index);
603656 }
604657 }
605658
@@ -613,7 +666,15 @@ AbstractStage {
613666
614667 onClosed: {
615668 spreadView.closingIndex = index;
616− root.applicationManager.stopApplication(root.applicationManager.get(index).appId);
669+ if (appDelegate.surface) {
670+ appDelegate.surface.close();
671+ } else if (appDelegate.application) {
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+ }
617678 }
618679
619680 Binding {
@@ -631,7 +692,7 @@ AbstractStage {
631692
632693 StagedFullscreenPolicy {
633694 id: fullscreenPolicy
634− application: appDelegate.application
695+ surface: model.surface
635696 }
636697
637698 Connections {
@@ -639,7 +700,7 @@ AbstractStage {
639700 onStageAboutToBeUnloaded: fullscreenPolicy.active = false
640701 }
641702 }
642− }
703+ } // Repeater {
643704 }
644705 }
645706
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 @@
11/*
2− * Copyright 2014-2015 Canonical Ltd.
2+ * Copyright 2014-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -37,7 +37,6 @@ FocusScope {
3737 | Qt.LandscapeOrientation
3838 | Qt.InvertedPortraitOrientation
3939 | Qt.InvertedLandscapeOrientation
40− readonly property alias appWindow: appWindow
4140
4241 // to be set from outside
4342 property bool interactive: true
@@ -46,6 +45,7 @@ FocusScope {
4645 property alias swipeToCloseEnabled: dragArea.enabled
4746 property bool closeable
4847 property alias application: appWindow.application
48+ property alias surface: appWindow.surface
4949 property int shellOrientationAngle
5050 property int shellOrientation
5151 property QtObject orientations
@@ -251,7 +251,7 @@ FocusScope {
251251 }
252252 PropertyChanges {
253253 target: appWindow
254− surfaceOrientationAngle: orientationAngle
254+ surfaceOrientationAngle: appWindowWithShadow.orientationAngle
255255 }
256256 },
257257 State {
@@ -293,7 +293,7 @@ FocusScope {
293293
294294 ApplicationWindow {
295295 id: appWindow
296− objectName: application ? "appWindow_" + application.appId : "appWindow_null"
296+ objectName: "appWindow"
297297 focus: true
298298 anchors {
299299 fill: parent
qml/Stages/StagedFullscreenPolicy.qml+12−14
@@ -27,31 +27,29 @@ import Unity.Application 0.1
2727// Chrome not set and state change to fulscreen -> client window stays "fullscreen"
2828QtObject {
2929 property bool active: true
30− property QtObject application: null
3130
32− readonly property var lastSurface: application && application.session ?
33− application.session.lastSurface : null
34− onLastSurfaceChanged: {
35− if (!active || !lastSurface) return;
36− if (lastSurface.shellChrome === Mir.LowChrome) {
37− lastSurface.state = Mir.FullscreenState;
31+ property var surface: null
32+ onSurfaceChanged: {
33+ if (!active || !surface) return;
34+ if (surface.shellChrome === Mir.LowChrome) {
35+ surface.state = Mir.FullscreenState;
3836 }
3937 }
4038
4139 property var _connections: Connections {
42− target: lastSurface
40+ target: surface
4341 onShellChromeChanged: {
44− if (!active || !lastSurface) return;
45− if (lastSurface.shellChrome === Mir.LowChrome) {
46− lastSurface.state = Mir.FullscreenState;
42+ if (!active || !surface) return;
43+ if (surface.shellChrome === Mir.LowChrome) {
44+ surface.state = Mir.FullscreenState;
4745 } else {
48− lastSurface.state = Mir.RestoredState;
46+ surface.state = Mir.RestoredState;
4947 }
5048 }
5149 onStateChanged: {
5250 if (!active) return;
53− if (lastSurface.state === Mir.RestoredState && lastSurface.shellChrome === Mir.LowChrome) {
54− lastSurface.state = Mir.FullscreenState;
51+ if (surface.state === Mir.RestoredState && surface.shellChrome === Mir.LowChrome) {
52+ surface.state = Mir.FullscreenState;
5553 }
5654 }
5755 }
qml/Stages/SurfaceContainer.qml+97−53
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2014-2015 Canonical Ltd.
2+ * Copyright 2014-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -19,39 +19,27 @@ import Ubuntu.Components 1.3
1919import Ubuntu.Gestures 0.1 // For TouchGate
2020import Utils 0.1 // for InputWatcher
2121import Unity.Application 0.1 // for MirSurfaceItem
22−import AccountsService 0.1
2322
2423FocusScope {
2524 id: root
2625 objectName: "surfaceContainer"
2726
27+ // Must be set from outside
2828 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
3429
30+ // Might be changed from outside
3531 property int requestedWidth: -1
3632 property int requestedHeight: -1
37−
38− property string savedKeymap: AccountsService.keymaps[0] // start with the user default
33+ property bool interactive
34+ property int surfaceOrientationAngle: 0
35+ property bool resizeSurface: true
36+ property bool inPromptSession: false
3937
4038 onSurfaceChanged: {
41− if (surface) {
42− surfaceItem.surface = surface;
43− root.hadSurface = false;
44− switchToKeymap(savedKeymap);
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− }
39+ // Not a binding because animations might remove the surface from the surfaceItem
40+ // programatically (in order to signal that a zombie surface is free for deletion),
41+ // even though root.surface is still !null.
42+ surfaceItem.surface = surface;
5543 }
5644
5745 InputWatcher {
@@ -96,11 +84,16 @@ FocusScope {
9684 }
9785
9886 enabled: root.interactive
99− focus: true
10087 antialiasing: !root.interactive
10188 orientationAngle: root.surfaceOrientationAngle
10289 }
10390
91+ TouchGate {
92+ targetItem: surfaceItem
93+ anchors.fill: root
94+ enabled: surfaceItem.enabled
95+ }
96+
10497 // MirSurface size drives SurfaceContainer size
10598 Binding {
10699 target: surfaceItem; property: "width"; value: root.surface ? root.surface.size.width : 0
@@ -129,39 +122,90 @@ FocusScope {
129122 when: root.requestedHeight < 0
130123 }
131124
125+ Repeater {
126+ id: childSurfacesRepeater
127+ objectName: "childSurfacesRepeater"
128+ model: root.surface ? root.surface.promptSurfaceList : null
132129
133− TouchGate {
134− objectName: "touchGate-"+name
135− targetItem: surfaceItem
136− anchors.fill: root
137− enabled: surfaceItem.enabled
130+ delegate: Loader {
131+ objectName: "childDelegate" + index
132+ anchors.fill: root
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+ }
138170 }
139171
140− states: [
141− State {
142− name: "zombie"
143− when: surfaceItem.surface && !surfaceItem.live
172+ Loader {
173+ id: animationsLoader
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"
188+ value: surfaceItem
189+ }
190+ Binding {
191+ target: animationsLoader.item
192+ when: animationsLoader.item
193+ property: "container"
194+ value: root
144195 }
145− ]
146− transitions: [
147− Transition {
148− from: ""; to: "zombie"
149− SequentialAnimation {
150− UbuntuNumberAnimation { target: surfaceItem; property: "opacity"; to: 0.0
151− duration: UbuntuAnimation.BriskDuration }
152− PropertyAction { target: surfaceItem; property: "visible"; value: false }
153− ScriptAction { script: {
154− surfaceItem.surface = null;
155− root.hadSurface = true;
156− } }
196+ }
197+
198+ QtObject {
199+ id: d
200+ property var focusedChild: {
201+ if (childSurfacesRepeater.count == 0) {
202+ return surfaceItem;
203+ } else {
204+ return childSurfacesRepeater.itemAt(childSurfacesRepeater.count - 1);
157205 }
158− },
159− Transition {
160− from: "zombie"; to: ""
161− ScriptAction { script: {
162− surfaceItem.opacity = 1.0;
163− surfaceItem.visible = true;
164− } }
165206 }
166− ]
207+ onFocusedChildChanged: {
208+ focusedChild.focus = true;
209+ }
210+ }
167211}
qml/Stages/TabletStage.qml+300−239
@@ -27,19 +27,24 @@ AbstractStage {
2727 objectName: "stages"
2828 anchors.fill: parent
2929
30+ // <tutorial-hacks> The Tutorial looks into our implementation details
3031 property alias sideStageVisible: spreadView.sideStageVisible
3132 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>
3236
3337 // Functions to be called from outside
3438 function updateFocusedAppOrientation() {
35− var mainStageAppIndex = priv.indexOf(priv.mainStageAppId);
36− if (mainStageAppIndex >= 0 && mainStageAppIndex < spreadRepeater.count) {
37− spreadRepeater.itemAt(mainStageAppIndex).matchShellOrientation();
39+ var mainStageIndex = root.topLevelSurfaceList.indexForId(priv.mainStageItemId);
40+
41+ if (priv.mainStageItemId && mainStageIndex >= 0 && mainStageIndex < spreadRepeater.count) {
42+ spreadRepeater.itemAt(mainStageIndex).matchShellOrientation();
3843 }
3944
4045 for (var i = 0; i < spreadRepeater.count; ++i) {
4146
42− if (i === mainStageAppIndex) {
47+ if (i === mainStageIndex) {
4348 continue;
4449 }
4550
@@ -60,16 +65,14 @@ AbstractStage {
6065 }
6166 }
6267 function updateFocusedAppOrientationAnimated() {
63− var mainStageAppIndex = priv.indexOf(priv.mainStageAppId);
64− if (mainStageAppIndex >= 0 && mainStageAppIndex < spreadRepeater.count) {
65− spreadRepeater.itemAt(mainStageAppIndex).animateToShellOrientation();
68+ var mainStageIndex = root.topLevelSurfaceList.indexForId(priv.mainStageItemId);
69+ if (priv.mainStageItemId && mainStageIndex >= 0 && mainStageIndex < spreadRepeater.count) {
70+ spreadRepeater.itemAt(mainStageIndex).animateToShellOrientation();
6671 }
6772
68− if (priv.sideStageAppId) {
69− var sideStageAppIndex = priv.indexOf(priv.sideStageAppId);
70− if (sideStageAppIndex >= 0 && sideStageAppIndex < spreadRepeater.count) {
71− spreadRepeater.itemAt(sideStageAppIndex).matchShellOrientation();
72− }
73+ var sideStageIndex = root.topLevelSurfaceList.indexForId(priv.sideStageItemId);
74+ if (sideStageIndex >= 0 && sideStageIndex < spreadRepeater.count) {
75+ spreadRepeater.itemAt(sideStageIndex).matchShellOrientation();
7376 }
7477 }
7578
@@ -79,15 +82,22 @@ AbstractStage {
7982 }
8083 }
8184
82− mainAppWindow: priv.focusedAppDelegate ? priv.focusedAppDelegate.appWindow : null
83−
8485 orientationChangesEnabled: priv.mainAppOrientationChangesEnabled
8586
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+
8696 supportedOrientations: {
8797 if (mainApp) {
8898 var orientations = mainApp.supportedOrientations;
8999 orientations |= Qt.LandscapeOrientation | Qt.InvertedLandscapeOrientation;
90− if (priv.sideStageAppId && !spreadView.surfaceDragging) {
100+ if (priv.sideStageItemId && !spreadView.surfaceDragging) {
91101 // If we have a sidestage app, support Portrait orientation
92102 // so that it will switch the sidestage app to mainstage on rotate
93103 orientations |= Qt.PortraitOrientation|Qt.InvertedPortraitOrientation;
@@ -118,7 +128,7 @@ AbstractStage {
118128 if (inverseProgress == 0 && priv.oldInverseProgress > 0) {
119129 // left edge drag released. Minimum distance is given by design.
120130 if (priv.oldInverseProgress > units.gu(22)) {
121− ApplicationManager.requestFocusApplication("unity8-dash");
131+ root.applicationManager.requestFocusApplication("unity8-dash");
122132 }
123133 }
124134 priv.oldInverseProgress = inverseProgress;
@@ -156,17 +166,51 @@ AbstractStage {
156166 }
157167 }
158168
169+ Connections {
170+ target: root.topLevelSurfaceList
171+ onListChanged: priv.updateMainAndSideStageIndexes()
172+ }
173+
159174 QtObject {
160175 id: priv
161176 objectName: "stagesPriv"
162177
163− property string focusedAppId: ApplicationManager.focusedApplicationId
164− readonly property var focusedAppDelegate: {
165− var index = indexOf(focusedAppId);
166− return index >= 0 && index < spreadRepeater.count ? spreadRepeater.itemAt(index) : null
178+ function updateMainAndSideStageIndexes() {
179+ var choseMainStage = false;
180+ var choseSideStage = false;
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+ }
167210 }
168211
169− property string oldFocusedAppId: ""
212+ property var focusedAppDelegate: null
213+
170214 property bool mainAppOrientationChangesEnabled: false
171215
172216 property real landscapeHeight: root.orientations.native_ == Qt.LandscapeOrientation ?
@@ -175,36 +219,21 @@ AbstractStage {
175219 property bool shellIsLandscape: root.shellOrientation === Qt.LandscapeOrientation
176220 || root.shellOrientation === Qt.InvertedLandscapeOrientation
177221
178− property string mainStageAppId
179− property string sideStageAppId
222+ property var mainStageDelegate: null
223+ property var sideStageDelegate: null
224+
225+ property int mainStageItemId: 0
226+ property int sideStageItemId: 0
180227
181− // For convenience, keep properties of the first two apps in the model
182− property string appId0
183− property string appId1
228+ property string mainStageAppId: ""
229+ property string sideStageAppId: ""
184230
185231 property int oldInverseProgress: 0
186232
187233 property int highlightIndex: 0
188234
189− onFocusedAppIdChanged: updateStageApps()
190−
191− onFocusedAppDelegateChanged: {
192− if (focusedAppDelegate) {
193− focusedAppDelegate.focus = true;
194− }
195− }
196−
197235 property bool focusedAppDelegateIsDislocated: focusedAppDelegate &&
198236 (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−
208237 function evaluateOneWayFlick(gesturePoints) {
209238 // Need to have at least 3 points to recognize it as a flick
210239 if (gesturePoints.length < 3) {
@@ -233,88 +262,45 @@ AbstractStage {
233262 spreadView.contentX = highlightIndex * spreadView.contentWidth / (spreadRepeater.count + 2)
234263 }
235264
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−
272265 readonly property bool sideStageEnabled: root.shellOrientation == Qt.LandscapeOrientation ||
273266 root.shellOrientation == Qt.InvertedLandscapeOrientation
274− Component.onCompleted: updateStageApps();
275267 }
276268
277− Connections {
278− target: ApplicationManager
279− onFocusRequested: {
280− if (spreadView.interactive) {
281− spreadView.snapTo(priv.indexOf(appId));
282− } else {
283− ApplicationManager.focusApplication(appId);
269+ Instantiator {
270+ model: root.applicationManager
271+ delegate: QtObject {
272+ property var stateBinding: Binding {
273+ readonly property bool isDash: model.application ? model.application.appId == "unity8-dash" : false
274+ target: model.application
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
284287 }
285− }
286288
287− onApplicationAdded: {
288− if (spreadView.phase == 2) {
289− spreadView.snapTo(ApplicationManager.count - 1);
290− } else {
291− spreadView.phase = 0;
292− spreadView.contentX = -spreadView.shift;
293− ApplicationManager.focusApplication(appId);
289+ property var lifecycleBinding: Binding {
290+ target: model.application
291+ property: "exemptFromLifecycle"
292+ value: model.application
293+ ? (!model.application.isTouchApp || isExemptFromLifecycle(model.application.appId))
294+ : false
294295 }
295296 }
297+ }
296298
297− onApplicationRemoved: {
298− if (priv.mainStageAppId == appId) {
299− ApplicationManager.focusApplication("unity8-dash")
300− }
301− if (priv.sideStageAppId == appId) {
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− }
299+ Binding {
300+ target: MirFocusController
301+ property: "focusedSurface"
302+ value: priv.focusedAppDelegate ? priv.focusedAppDelegate.surface : null
303+ when: root.parent && !spreadRepeater.startingUp
318304 }
319305
320306 Flickable {
@@ -365,16 +351,45 @@ AbstractStage {
365351 property int selectedIndex: -1
366352 property int draggedDelegateCount: 0
367353 property int closingIndex: -1
368− property var selectedApplication: selectedIndex !== -1 ? ApplicationManager.get(selectedIndex) : null
369−
370− // FIXME: Workaround Flickable's not keepping its contentX still when resized
371− onContentXChanged: { forceItToRemainStillIfBeingResized(); }
354+ property var selectedDelegate: selectedIndex !== -1 ? spreadRepeater.itemAt(selectedIndex) : null
355+
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()) {
363+ forceItToRemainStillIfBeingResized();
364+ }
365+ }
372366 onShiftChanged: { forceItToRemainStillIfBeingResized(); }
373367 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.
375382 contentX = -shift;
383+ return true;
376384 }
385+
386+ contentWidthOnLastContentXChange = contentWidth;
387+ lastContentX = contentX;
388+ return false;
377389 }
390+ property real contentWidthOnLastContentXChange: -1
391+ property real lastContentX: 0
392+ // </FIXME-contentX>
378393
379394 property bool animateX: true
380395 property bool beingResized: root.beingResized
@@ -387,31 +402,33 @@ AbstractStage {
387402 }
388403 }
389404
390− property real sideStageDragProgress: sideStage.progress
391− property bool sideStageVisible: priv.sideStageAppId
392405 property real sideStageWidth: units.gu(40)
393406
394407 property bool surfaceDragging: triGestureArea.recognisedDrag
395408
396− // In case the ApplicationManager already holds an app when starting up we're missing animations
409+ readonly property bool sideStageVisible: priv.sideStageItemId != 0
410+
411+ // In case applicationManager already holds an app when starting up we're missing animations
397412 // Make sure we end up in the same state
398413 Component.onCompleted: {
399414 spreadView.contentX = -spreadView.shift
400415 }
401416
402417 property int nextInStack: {
418+ var mainStageIndex = priv.mainStageDelegate ? priv.mainStageDelegate.index : -1;
419+ var sideStageIndex = priv.sideStageDelegate ? priv.sideStageDelegate.index : -1;
403420 switch (state) {
404421 case "main":
405− if (ApplicationManager.count > 1) {
422+ if (root.topLevelSurfaceList.count > 1) {
406423 return 1;
407424 }
408425 return -1;
409426 case "mainAndOverlay":
410− if (ApplicationManager.count <= 2) {
427+ if (root.topLevelSurfaceList.count <= 2) {
411428 return -1;
412429 }
413− if (priv.appId0 == priv.mainStageAppId || priv.appId0 == priv.sideStageAppId) {
414− if (priv.appId1 == priv.mainStageAppId || priv.appId1 == priv.sideStageAppId) {
430+ if (mainStageIndex == 0 || sideStageIndex == 0) {
431+ if (mainStageIndex == 1 || sideStageIndex == 1) {
415432 return 2;
416433 }
417434 return 1;
@@ -422,7 +439,7 @@ AbstractStage {
422439 }
423440 return -1;
424441 }
425− property int nextZInStack: indexToZIndex(nextInStack)
442+ property int nextZInStack
426443
427444 states: [
428445 State {
@@ -442,13 +459,13 @@ AbstractStage {
442459 }
443460 ]
444461 state: {
445− if ((priv.mainStageAppId && !priv.sideStageAppId) || !priv.sideStageEnabled) {
462+ if ((priv.mainStageItemId && !priv.sideStageItemId) || !priv.sideStageEnabled) {
446463 return "main";
447464 }
448− if (!priv.mainStageAppId && priv.sideStageAppId) {
465+ if (!priv.mainStageItemId && priv.sideStageItemId) {
449466 return "overlay";
450467 }
451− if (priv.mainStageAppId && priv.sideStageAppId) {
468+ if (priv.mainStageItemId && priv.sideStageItemId) {
452469 return "mainAndOverlay";
453470 }
454471 return "empty";
@@ -513,38 +530,41 @@ AbstractStage {
513530 // only shuffle when we've got a main and overlay
514531 if (state !== "mainAndOverlay") return index;
515532
516− var app = ApplicationManager.get(index);
533+ var app = root.topLevelSurfaceList.applicationAt(index);
517534 if (!app) {
518535 return index;
519536 }
537+ var stage = spreadRepeater.itemAt(index) ? spreadRepeater.itemAt(index).stage : app.stage;
520538
521539 // don't shuffle indexes greater than "actives or next"
522540 if (index > 2) return index;
523541
524− if (app.appId === priv.mainStageAppId) {
542+ var mainStageIndex = root.topLevelSurfaceList.indexForId(priv.mainStageItemId);
543+
544+ if (index == mainStageIndex) {
525545 // Active main stage always at 0
526546 return 0;
527547 }
528548
529549 if (spreadView.nextInStack > 0) {
530− var nextAppInStack = ApplicationManager.get(spreadView.nextInStack);
550+ var stageOfNextInStack = spreadRepeater.itemAt(spreadView.nextInStack).stage;
531551
532552 if (index === spreadView.nextInStack) {
533553 // this is the next app in stack.
534554
535− if (app.stage === ApplicationInfoInterface.SideStage) {
555+ if (stage === ApplicationInfoInterface.SideStage) {
536556 // 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);
538558 }
539559 return 1;
540560 }
541− if (nextAppInStack.stage === ApplicationInfoInterface.SideStage) {
561+ if (stageOfNextInStack === ApplicationInfoInterface.SideStage) {
542562 // if the next app in stack is a sidestage app, it must order on top of other side stage app
543563 return 1;
544564 }
545− return Math.min(2, ApplicationManager.count-1);
565+ return Math.min(2, root.topLevelSurfaceList.count-1);
546566 }
547− return Math.min(index+1, ApplicationManager.count-1);
567+ return Math.min(index+1, root.topLevelSurfaceList.count-1);
548568 }
549569
550570 SequentialAnimation {
@@ -562,12 +582,13 @@ AbstractStage {
562582 script: {
563583 if (spreadView.selectedIndex >= 0) {
564584 var newIndex = spreadView.selectedIndex;
565− var application = ApplicationManager.get(newIndex);
566− if (application.stage === ApplicationInfoInterface.SideStage) {
585+ var application = root.topLevelSurfaceList.applicationAt(newIndex);
586+ var spreadDelegate = spreadRepeater.itemAt(newIndex);
587+ if (spreadDelegate.stage === ApplicationInfoInterface.SideStage) {
567588 sideStage.showNow();
568589 }
569590 spreadView.selectedIndex = -1;
570− ApplicationManager.focusApplication(application.appId);
591+ spreadDelegate.focus = true;
571592 spreadView.phase = 0;
572593 spreadView.contentX = -spreadView.shift;
573594 }
@@ -583,7 +604,7 @@ AbstractStage {
583604 MouseArea {
584605 id: spreadRow
585606 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)
587608 height: root.height
588609
589610 onClicked: {
@@ -601,8 +622,8 @@ AbstractStage {
601622 enabled: priv.sideStageEnabled
602623
603624 onDropped: {
604− priv.setAppStage(drag.source.appId, ApplicationInfoInterface.MainStage, true);
605− ApplicationManager.focusApplication(drag.source.appId);
625+ drop.source.spreadDelegate.stage = ApplicationInfoInterface.MainStage;
626+ drop.source.spreadDelegate.focus = true;
606627 }
607628 keys: "SideStage"
608629 }
@@ -613,12 +634,12 @@ AbstractStage {
613634 height: priv.landscapeHeight
614635 x: spreadView.width - width
615636 z: {
616− if (!priv.mainStageAppId) return 0;
637+ if (!priv.mainStageItemId) return 0;
617638
618− if (priv.sideStageAppId && spreadView.nextInStack > 0) {
619− var nextAppInStack = ApplicationManager.get(spreadView.nextInStack);
639+ if (priv.sideStageItemId && spreadView.nextInStack > 0) {
640+ var nextDelegateInStack = spreadRepeater.itemAt(spreadView.nextInStack);
620641
621− if (nextAppInStack.stage === ApplicationInfoInterface.MainStage) {
642+ if (nextDelegateInStack.stage === ApplicationInfoInterface.MainStage) {
622643 // if the next app in stack is a main stage app, put the sidestage on top of it.
623644 return 2;
624645 }
@@ -633,12 +654,11 @@ AbstractStage {
633654 Behavior on opacity { UbuntuNumberAnimation {} }
634655
635656 onShownChanged: {
636− if (!shown && ApplicationManager.focusedApplicationId == priv.sideStageAppId) {
637− ApplicationManager.requestFocusApplication(priv.mainStageAppId);
638− }
639− priv.updateStageApps();
640− if (shown && priv.sideStageAppId) {
641− ApplicationManager.requestFocusApplication(priv.sideStageAppId);
657+ if (!shown && priv.sideStageDelegate && priv.focusedAppDelegate === priv.sideStageDelegate
658+ && priv.mainStageDelegate) {
659+ priv.mainStageDelegate.focus = true;
660+ } else if (shown && priv.sideStageDelegate) {
661+ priv.sideStageDelegate.focus = true;
642662 }
643663 }
644664
@@ -657,8 +677,8 @@ AbstractStage {
657677 }
658678 onDropped: {
659679 if (drop.keys == "MainStage") {
660− priv.setAppStage(drop.source.appId, ApplicationInfoInterface.SideStage, true);
661− ApplicationManager.requestFocusApplication(drop.source.appId);
680+ drop.source.spreadDelegate.stage = ApplicationInfoInterface.SideStage;
681+ drop.source.spreadDelegate.focus = true;
662682 }
663683 }
664684 drag {
@@ -671,41 +691,102 @@ AbstractStage {
671691 }
672692 }
673693
674− Repeater {
694+ TopLevelSurfaceRepeater {
675695 id: spreadRepeater
676696 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+ }
678722
679723 delegate: TransformedTabletSpreadDelegate {
680724 id: spreadTile
681− objectName: model.appId ? "tabletSpreadDelegate_" + model.appId
682− : "tabletSpreadDelegate_null";
725+ objectName: "spreadDelegate_" + model.id
726+
727+ readonly property int index: model.index
683728 width: spreadView.width
684729 height: spreadView.height
685− active: appId == priv.mainStageAppId || appId == priv.sideStageAppId
730+ active: model.id == priv.mainStageItemId || model.id == priv.sideStageItemId
686731 zIndex: selected && stage == ApplicationInfoInterface.MainStage ? 0 : spreadView.indexToZIndex(index)
732+ onZIndexChanged: {
733+ if (spreadView.nextInStack == model.index) {
734+ spreadView.nextZInStack = zIndex;
735+ }
736+ }
687737 selected: spreadView.selectedIndex == index
688738 otherSelected: spreadView.selectedIndex >= 0 && !selected
689− isInSideStage: priv.sideStageAppId === appId
739+ isInSideStage: priv.sideStageItemId == model.id
690740 interactive: !spreadView.interactive && spreadView.phase === 0 && root.interactive
691741 swipeToCloseEnabled: spreadView.interactive && !snapAnimation.running
692742 maximizedAppTopMargin: root.maximizedAppTopMargin
693− dragOffset: !isDash && appId == priv.mainStageAppId && root.inverseProgress > 0 && spreadView.phase === 0 ? root.inverseProgress : 0
694− application: ApplicationManager.get(index)
743+ dragOffset: !isDash && model.id == priv.mainStageItemId && root.inverseProgress > 0
744+ && spreadView.phase === 0 ? root.inverseProgress : 0
745+ application: model.application
746+ surface: model.surface
695747 closeable: !isDash
696748 highlightShown: root.altTabPressed && priv.highlightIndex == zIndex
697749
698− readonly property bool wantsMainStage: model.stage == ApplicationInfoInterface.MainStage
750+ readonly property bool wantsMainStage: stage == ApplicationInfoInterface.MainStage
699751
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+ }
702779
703− stage: model.stage
704780 fullscreen: {
705− if (mainApp && stage === ApplicationInfoInterface.SideStage) {
706− return mainApp.fullscreen;
781+ if (priv.mainStageDelegate && stage === ApplicationInfoInterface.SideStage) {
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;
707789 }
708− return application ? application.fullscreen : false;
709790 }
710791
711792 supportedOrientations: {
@@ -726,23 +807,6 @@ AbstractStage {
726807 }
727808 }
728809
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−
746810 // FIXME: A regular binding doesn't update any more after closing an app.
747811 // Using a Binding for now.
748812 Binding {
@@ -762,34 +826,33 @@ AbstractStage {
762826 onSideStageEnabledChanged: refreshStage()
763827 }
764828
829+ property bool _constructing: true;
830+ onStageChanged: {
831+ if (!_constructing) {
832+ priv.updateMainAndSideStageIndexes();
833+ }
834+ }
835+
765836 Component.onCompleted: {
766− refreshStage()
767− stageChanged.connect(priv.updateStageApps);
837+ // a top level window is always the focused one when it first appears, unfocusing
838+ // any preexisting one
839+ focus = true;
840+ refreshStage();
841+ _constructing = false;
842+ }
843+ Component.onDestruction: {
844+ WindowStateStorage.saveStage(model.application.appId, stage);
768845 }
769846
770847 function refreshStage() {
771− var stage = ApplicationInfoInterface.MainStage;
848+ var newStage = ApplicationInfoInterface.MainStage;
772849 if (priv.sideStageEnabled) {
773850 if (application && application.supportedOrientations & (Qt.PortraitOrientation|Qt.InvertedPortraitOrientation)) {
774− stage = WindowStateStorage.getStage(appId);
851+ newStage = WindowStateStorage.getStage(application.appId);
775852 }
776853 }
777854
778− if (model.stage !== stage) {
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− })
855+ stage = newStage;
793856 }
794857
795858 progress: {
@@ -875,13 +938,10 @@ AbstractStage {
875938 script: {
876939 // rotate immediately.
877940 spreadTile.matchShellOrientation();
878− if (ApplicationManager.focusedApplicationId === spreadTile.appId &&
941+ if (priv.focusedAppDelegate === spreadTile &&
879942 priv.sideStageEnabled && !sideStage.shown) {
880943 // Sidestage was focused, so show the side stage.
881944 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();
885945 }
886946 }
887947 }
@@ -892,10 +952,10 @@ AbstractStage {
892952 SequentialAnimation {
893953 ScriptAction {
894954 script: {
895− if (priv.sideStageAppId === spreadTile.appId &&
955+ if (priv.sideStageDelegate === spreadTile &&
896956 mainApp && (mainApp.supportedOrientations & (Qt.PortraitOrientation|Qt.InvertedPortraitOrientation)) == 0) {
897957 // The mainstage app did not natively support portrait orientation, so focus the sidestage.
898− ApplicationManager.requestFocusApplication(spreadTile.appId);
958+ spreadTile.focus = true;
899959 }
900960 }
901961 }
@@ -924,28 +984,26 @@ AbstractStage {
924984
925985 onClosed: {
926986 spreadView.closingIndex = index;
927− ApplicationManager.stopApplication(ApplicationManager.get(index).appId);
928− }
929−
930− onFocusChanged: {
931− if (focus && ApplicationManager.focusedApplicationId !== appId) {
932− ApplicationManager.focusApplication(appId);
933− }
934−
935− if (focus && priv.sideStageEnabled && stage === ApplicationInfoInterface.SideStage) {
936− sideStage.show();
987+ if (spreadTile.surface) {
988+ spreadTile.surface.close();
989+ } else if (spreadTile.application) {
990+ root.applicationManager.stopApplication(spreadTile.application.appId);
991+ } else {
992+ // should never happen
993+ console.warn("Can't close topLevelSurfaceList entry as it has neither"
994+ + " a surface nor an application");
937995 }
938996 }
939997
940998 Binding {
941999 target: root
942− when: model.appId == priv.mainStageAppId
1000+ when: model.id == priv.mainStageItemId
9431001 property: "mainAppWindowOrientationAngle"
9441002 value: appWindowOrientationAngle
9451003 }
9461004 Binding {
9471005 target: priv
948− when: model.appId == priv.mainStageAppId
1006+ when: model.id == priv.mainStageItemId
9491007 property: "mainAppOrientationChangesEnabled"
9501008 value: orientationChangesEnabled
9511009 }
@@ -959,7 +1017,7 @@ AbstractStage {
9591017
9601018 StagedFullscreenPolicy {
9611019 id: fullscreenPolicy
962− application: spreadTile.application
1020+ surface: model.surface
9631021 }
9641022 Connections {
9651023 target: root
@@ -975,17 +1033,19 @@ AbstractStage {
9751033 anchors.fill: parent
9761034 enabled: priv.sideStageEnabled && !spreadView.active
9771035 property var dragObject: null
978− property string appId: ""
1036+
1037+ property Item spreadDelegate
1038+
9791039 dragComponent: dragComponent
980− dragComponentProperties: { "appId": appId }
1040+ dragComponentProperties: { "spreadDelegate": spreadDelegate }
9811041
9821042 onPressed: {
983− function matchDelegate(obj) { return String(obj.objectName).indexOf("tabletSpreadDelegate") >= 0; }
1043+ function matchDelegate(obj) { return String(obj.objectName).indexOf("spreadDelegate") >= 0; }
9841044
9851045 var delegateAtCenter = Functions.itemAt(spreadRow, x, y, matchDelegate);
9861046 if (!delegateAtCenter) return;
9871047
988− appId = delegateAtCenter.appId;
1048+ spreadDelegate = delegateAtCenter;
9891049 }
9901050
9911051 onClicked: {
@@ -1005,11 +1065,11 @@ AbstractStage {
10051065
10061066 Component {
10071067 id: dragComponent
1008− SessionContainer {
1009− property string appId: ""
1010− property var application: ApplicationManager.findApplication(appId)
1068+ SurfaceContainer {
1069+ property Item spreadDelegate
1070+
1071+ surface: spreadDelegate ? spreadDelegate.surface : null
10111072
1012− session: application ? application.session : null
10131073 interactive: false
10141074 resizeSurface: false
10151075 focus: false
@@ -1021,10 +1081,11 @@ AbstractStage {
10211081 Drag.hotSpot.y: height/2
10221082 // only accept opposite stage.
10231083 Drag.keys: {
1024− if (!application) return "Disabled";
1084+ if (!surface) return "Disabled";
10251085
1026− if (application.stage === ApplicationInfo.MainStage) {
1027− if (application.supportedOrientations & (Qt.PortraitOrientation|Qt.InvertedPortraitOrientation)) {
1086+ if (spreadDelegate.stage === ApplicationInfo.MainStage) {
1087+ if (spreadDelegate.application.supportedOrientations
1088+ & (Qt.PortraitOrientation|Qt.InvertedPortraitOrientation)) {
10281089 return "MainStage";
10291090 }
10301091 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 @@
11/*
2− * Copyright 2014 Canonical Ltd.
2+ * Copyright 2014,2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -312,7 +312,7 @@ SpreadDelegate {
312312 // non-fullscreen window when they're stacked on top of each other on the
313313 // far left of the spread.
314314 Translate {
315− y: !fullscreen && appWindowRotation === 180
315+ y: !root.fullscreen && appWindowRotation === 180
316316 ? priv.topMarginProgress * maximizedAppTopMargin
317317 : 0
318318 },
@@ -326,7 +326,7 @@ SpreadDelegate {
326326 switch (appWindowRotation) {
327327 case 90:
328328 case 270:
329− if (fullscreen) {
329+ if (root.fullscreen) {
330330 return 1;
331331 } else {
332332 return 1 + priv.topMarginProgress * maximizedAppTopMargin / spreadView.width;
@@ -340,7 +340,7 @@ SpreadDelegate {
340340 yScale: {
341341 switch (appWindowRotation) {
342342 case 0:
343− if (fullscreen) {
343+ if (root.fullscreen) {
344344 return 1 - priv.topMarginProgress * maximizedAppTopMargin / spreadView.height;
345345 } else {
346346 return 1;
qml/Stages/TransformedTabletSpreadDelegate.qml+29−23
@@ -31,7 +31,6 @@ SpreadDelegate {
3131 // Set this to true when this tile a currently active on either the MS or the SS.
3232 property bool active: false
3333
34− property int stage
3534 property int zIndex
3635 property real progress: 0
3736 property real animatedProgress: 0
@@ -48,13 +47,15 @@ SpreadDelegate {
4847
4948 property bool isInSideStage: false
5049
50+ property int stage: ApplicationInfoInterface.MainStage
51+
5152 property int dragOffset: 0
5253 readonly property alias xTranslateAnimating: xTranslateAnimation.running
5354 readonly property bool offScreen: priv.xTranslate >= 0
5455
5556 dropShadow: spreadView.active ||
5657 (active
57− && (stage == ApplicationInfoInterface.MainStage || !priv.shellIsLandscape)
58+ && (root.stage == ApplicationInfoInterface.MainStage || !priv.shellIsLandscape)
5859 && priv.xTranslate != 0)
5960
6061 onSelectedChanged: {
@@ -90,7 +91,7 @@ SpreadDelegate {
9091 id: priv
9192
9293 // 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
9495 // true if the next tile in the stack is the nextInStack one. This one will be moved a bit to the left
9596 property bool movedActive: spreadView.nextZInStack == zIndex + 1
9697 property real animatedEndDistance: linearAnimation(0, 2, root.endDistance, 0, root.progress)
@@ -142,7 +143,7 @@ SpreadDelegate {
142143 Behavior on xTranslate {
143144 enabled: !spreadView.active &&
144145 !snapAnimation.running &&
145− model.appId !== "unity8-dash" &&
146+ root.application.appId !== "unity8-dash" &&
146147 spreadView.animateX &&
147148 !spreadView.beingResized &&
148149 priv.state !== "sideStage"
@@ -156,8 +157,9 @@ SpreadDelegate {
156157 var newTranslate = 0;
157158
158159 // selected app or opposite stage active app.
159− if (isSelected || (otherSelected && root.active && spreadView.selectedApplication && spreadView.selectedApplication.stage !== stage)) {
160− if (stage == ApplicationInfoInterface.MainStage) {
160+ if (isSelected || (otherSelected && root.active && spreadView.selectedDelegate
161+ && spreadView.selectedDelegate.stage !== root.stage)) {
162+ if (root.stage == ApplicationInfoInterface.MainStage) {
161163 return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.width, root.progress);
162164 } else {
163165 return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.sideStageWidth, root.progress);
@@ -168,8 +170,8 @@ SpreadDelegate {
168170
169171 // 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
170172 // 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 &&
172− ApplicationManager.get(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage;
173+ var shouldMoveAway = spreadView.nextInStack >= 0 && priv.movedActive && root.stage === ApplicationInfoInterface.MainStage &&
174+ topLevelSurfaceList.applicationAt(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage;
173175
174176 if (active) {
175177 newTranslate -= root.width
@@ -178,7 +180,7 @@ SpreadDelegate {
178180 newTranslate += linearAnimation(0, spreadView.positionMarker2, 0, -units.gu(4), root.animatedProgress);
179181 }
180182 newTranslate += root.dragOffset;
181− } else if (!spreadView.active && model.appId == "unity8-dash") {
183+ } else if (!spreadView.active && root.application.appId == "unity8-dash") {
182184 newTranslate -= root.width;
183185 }
184186
@@ -190,14 +192,14 @@ SpreadDelegate {
190192
191193 if (spreadView.phase == 0) {
192194 if (nextInStack) {
193− if (stage == ApplicationInfoInterface.MainStage) {
195+ if (root.stage == ApplicationInfoInterface.MainStage) {
194196 if (spreadView.sideStageVisible && root.progress > 0) {
195197 // Move it so it appears from behind the side stage immediately
196198 newTranslate += -spreadView.sideStageWidth;
197199 }
198200 }
199201
200− if (stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
202+ if (root.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
201203 // This is when we only drag the side stage in, without rotation or snapping
202204 newTranslate = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.sideStageWidth, root.animatedProgress);
203205 } else {
@@ -210,7 +212,7 @@ SpreadDelegate {
210212
211213 if (spreadView.phase == 1) {
212214 if (nextInStack) {
213− if (stage == ApplicationInfoInterface.MainStage) {
215+ if (root.stage == ApplicationInfoInterface.MainStage) {
214216 var startValue = -spreadView.sideStageWidth * spreadView.snapPosition + (spreadView.sideStageVisible ? -spreadView.sideStageWidth : 0);
215217 newTranslate += linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, startValue, priv.phase2StartTranslate, root.animatedProgress);
216218 } else {
@@ -250,7 +252,8 @@ SpreadDelegate {
250252 }
251253
252254 // 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)) {
254257 return linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress);
255258 } else if (otherSelected) {
256259 return selectedScale;
@@ -258,7 +261,7 @@ SpreadDelegate {
258261
259262 if (spreadView.phase == 0) {
260263 if (nextInStack) {
261− if (stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
264+ if (root.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
262265 return 1;
263266 } else {
264267 var targetScale = root.dragStartScale - ((root.dragStartScale - 1) * spreadView.snapPosition);
@@ -272,7 +275,7 @@ SpreadDelegate {
272275 if (spreadView.phase == 1) {
273276 if (nextInStack) {
274277 var startScale = 1;
275− if (stage !== ApplicationInfoInterface.SideStage || spreadView.sideStageVisible) {
278+ if (root.stage !== ApplicationInfoInterface.SideStage || spreadView.sideStageVisible) {
276279 startScale = root.dragStartScale - ((root.dragStartScale - 1) * spreadView.snapPosition);
277280 }
278281 return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, startScale, priv.phase2StartScale, root.animatedProgress);
@@ -295,7 +298,8 @@ SpreadDelegate {
295298 }
296299
297300 // 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)) {
299303 return linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress);
300304 } else if (otherSelected) {
301305 return selectedAngle;
@@ -304,12 +308,12 @@ SpreadDelegate {
304308 // The tile should rotate a bit when another one comes on top, but not when only dragging the side stage in
305309 var shouldMoveAway = spreadView.nextInStack == -1 ||
306310 spreadView.nextInStack >= 0 && priv.movedActive &&
307− (ApplicationManager.get(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage ||
308− stage == ApplicationInfoInterface.SideStage);
311+ (topLevelSurfaceList.applicationAt(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage ||
312+ root.stage == ApplicationInfoInterface.SideStage);
309313
310314 if (spreadView.phase == 0) {
311315 if (nextInStack) {
312− if (stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
316+ if (root.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
313317 return 0;
314318 } else {
315319 return linearAnimation(0, spreadView.positionMarker2, root.startAngle, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress);
@@ -321,7 +325,7 @@ SpreadDelegate {
321325 }
322326 if (spreadView.phase == 1) {
323327 if (nextInStack) {
324− if (stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
328+ if (root.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
325329 return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 0, priv.phase2StartAngle, root.animatedProgress);
326330 } else {
327331 return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), priv.phase2StartAngle, root.animatedProgress);
@@ -345,7 +349,8 @@ SpreadDelegate {
345349 if (root.isSelected) return 1;
346350
347351 if (otherSelected) {
348− if (root.active && spreadView.selectedApplication && spreadView.selectedApplication.stage !== stage) {
352+ if (root.active && spreadView.selectedDelegate
353+ && spreadView.selectedDelegate.stage !== root.stage) {
349354 return 1;
350355 }
351356 return linearAnimation(selectedProgress, negativeProgress, selectedOpacity, 0, root.progress);
@@ -355,7 +360,8 @@ SpreadDelegate {
355360
356361 property real topMarginProgress: {
357362 // 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)) {
359365 return linearAnimation(selectedProgress, negativeProgress, selectedTopMarginProgress, 0, root.progress);
360366 }
361367
@@ -379,7 +385,7 @@ SpreadDelegate {
379385 when: root.isInSideStage && spreadView.shiftedContentX == 0 && spreadView.phase == 0
380386 PropertyChanges {
381387 target: priv;
382− xTranslate: -spreadView.sideStageWidth + spreadView.sideStageWidth * (1-spreadView.sideStageDragProgress)
388+ xTranslate: -spreadView.sideStageWidth + spreadView.sideStageWidth * (1-sideStage.progress)
383389 }
384390 }
385391 ]
qml/Stages/WindowedFullscreenPolicy.qml+5−7
@@ -23,19 +23,17 @@ import Unity.Application 0.1
2323// state of the window is returned to restored.
2424QtObject {
2525 property bool active: true
26− property QtObject application: null
26+ property QtObject surface: null
2727
28− readonly property var lastSurface: application && application.session ?
29− application.session.lastSurface : null
3028 property bool _firstTimeSurface: true
3129
32− onLastSurfaceChanged: {
33− if (!active || !lastSurface) return;
30+ onSurfaceChanged: {
31+ if (!active || !surface) return;
3432 if (!_firstTimeSurface) return;
3533 _firstTimeSurface = false;
3634
37− if (lastSurface.state === Mir.FullscreenState && lastSurface.shellChrome === Mir.LowChrome) {
38− lastSurface.state = Mir.RestoredState;
35+ if (surface.state === Mir.FullscreenState && surface.shellChrome === Mir.LowChrome) {
36+ surface.state = Mir.RestoredState;
3937 }
4038 }
4139}
qml/Tutorial/TutorialBottom.qml+1−1
@@ -47,7 +47,7 @@ TutorialPage {
4747 readonly property real sideStageWidth: root.usageScenario === "tablet" && stage.sideStageVisible ?
4848 stage.sideStageWidth : 0
4949 readonly property bool isMainStageApp: usageScenario !== "tablet" ||
50− application.stage === ApplicationInfoInterface.MainStage
50+ stage.stageFocusedSurface === ApplicationInfoInterface.MainStage
5151 readonly property real dragAreaHeight: units.gu(3) // based on PageWithBottomEdge.qml
5252 readonly property real targetDistance: height * 0.2 + dragAreaHeight // based on PageWithBottomEdge.qml
5353
tests/mocks/GSettings.1.0/fake_gsettings.cpp+126−38
@@ -21,9 +21,11 @@
2121GSettingsControllerQml* GSettingsControllerQml::s_controllerInstance = 0;
2222
2323GSettingsControllerQml::GSettingsControllerQml()
24− : m_usageMode("Staged")
24+ : m_disableHeight(false)
25+ , m_usageMode("Staged")
2526 , m_autohideLauncher(false)
2627 , m_launcherWidth(8)
28+ , m_edgeDragWidth(2)
2729{
2830}
2931
@@ -38,6 +40,19 @@ GSettingsControllerQml* GSettingsControllerQml::instance() {
3840 return s_controllerInstance;
3941}
4042
43+bool GSettingsControllerQml::disableHeight() const
44+{
45+ return m_disableHeight;
46+}
47+
48+void GSettingsControllerQml::setDisableHeight(bool val)
49+{
50+ if (val != m_disableHeight) {
51+ m_disableHeight = val;
52+ Q_EMIT disableHeightChanged();
53+ }
54+}
55+
4156QString GSettingsControllerQml::pictureUri() const
4257{
4358 return m_pictureUri;
@@ -116,6 +131,19 @@ void GSettingsControllerQml::setLauncherWidth(int launcherWidth)
116131 }
117132}
118133
134+uint GSettingsControllerQml::edgeDragWidth() const
135+{
136+ return m_edgeDragWidth;
137+}
138+
139+void GSettingsControllerQml::setEdgeDragWidth(uint edgeDragWidth)
140+{
141+ if (m_edgeDragWidth != edgeDragWidth) {
142+ m_edgeDragWidth = edgeDragWidth;
143+ Q_EMIT edgeDragWidthChanged(edgeDragWidth);
144+ }
145+}
146+
119147GSettingsSchemaQml::GSettingsSchemaQml(QObject *parent): QObject(parent) {
120148}
121149
@@ -146,9 +174,26 @@ void GSettingsSchemaQml::setPath(const QByteArray &path) {
146174}
147175
148176GSettingsQml::GSettingsQml(QObject *parent)
149− : QObject(parent)
177+ : QObject(parent),
178+ m_valid(false)
150179{
151180 m_schema = new GSettingsSchemaQml(this);
181+}
182+
183+void GSettingsQml::classBegin()
184+{
185+}
186+
187+void GSettingsQml::componentComplete()
188+{
189+ // Emulate what the real GSettings module does, and only return undefined
190+ // values until we are completed loading.
191+ m_valid = true;
192+
193+ // FIXME: We should make this dynamic, instead of hard-coding all possible
194+ // properties in one object. We should create properties based on the schema.
195+ connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::disableHeightChanged,
196+ this, &GSettingsQml::disableHeightChanged);
152197 connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::pictureUriChanged,
153198 this, &GSettingsQml::pictureUriChanged);
154199 connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::usageModeChanged,
@@ -161,104 +206,147 @@ GSettingsQml::GSettingsQml(QObject *parent)
161206 this, &GSettingsQml::autohideLauncherChanged);
162207 connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::launcherWidthChanged,
163208 this, &GSettingsQml::launcherWidthChanged);
209+ connect(GSettingsControllerQml::instance(), &GSettingsControllerQml::edgeDragWidthChanged,
210+ this, &GSettingsQml::edgeDragWidthChanged);
211+
212+ Q_EMIT disableHeightChanged();
213+ Q_EMIT pictureUriChanged();
214+ Q_EMIT usageModeChanged();
215+ Q_EMIT lockedOutTimeChanged();
216+ Q_EMIT lifecycleExemptAppidsChanged();
217+ Q_EMIT autohideLauncherChanged();
218+ Q_EMIT launcherWidthChanged();
219+ Q_EMIT edgeDragWidthChanged();
164220}
165221
166222GSettingsSchemaQml * GSettingsQml::schema() const {
167223 return m_schema;
168224}
169225
170−QString GSettingsQml::pictureUri() const
226+QVariant GSettingsQml::disableHeight() const
227+{
228+ if (m_valid && m_schema->id() == "com.canonical.keyboard.maliit") {
229+ return GSettingsControllerQml::instance()->disableHeight();
230+ } else {
231+ return QVariant();
232+ }
233+}
234+
235+void GSettingsQml::setDisableHeight(const QVariant &val)
236+{
237+ if (m_valid && m_schema->id() == "com.canonical.keyboard.maliit") {
238+ GSettingsControllerQml::instance()->setDisableHeight(val.toBool());
239+ }
240+}
241+
242+QVariant GSettingsQml::pictureUri() const
171243{
172− if (m_schema->id() == "org.gnome.desktop.background") {
244+ if (m_valid && m_schema->id() == "org.gnome.desktop.background") {
173245 return GSettingsControllerQml::instance()->pictureUri();
174246 } else {
175− return "";
247+ return QVariant();
176248 }
177249}
178250
179−void GSettingsQml::setPictureUri(const QString &str)
251+void GSettingsQml::setPictureUri(const QVariant &str)
180252{
181− if (m_schema->id() == "org.gnome.desktop.background") {
182− GSettingsControllerQml::instance()->setPictureUri(str);
253+ if (m_valid && m_schema->id() == "org.gnome.desktop.background") {
254+ GSettingsControllerQml::instance()->setPictureUri(str.toString());
183255 }
184256}
185257
186−QString GSettingsQml::usageMode() const
258+QVariant GSettingsQml::usageMode() const
187259{
188− if (m_schema->id() == "com.canonical.Unity8") {
260+ if (m_valid && m_schema->id() == "com.canonical.Unity8") {
189261 return GSettingsControllerQml::instance()->usageMode();
190262 } else {
191− return "";
263+ return QVariant();
192264 }
193265}
194266
195−void GSettingsQml::setUsageMode(const QString &usageMode)
267+void GSettingsQml::setUsageMode(const QVariant &usageMode)
196268{
197− if (m_schema->id() == "com.canonical.Unity8") {
198− GSettingsControllerQml::instance()->setUsageMode(usageMode);
269+ if (m_valid && m_schema->id() == "com.canonical.Unity8") {
270+ GSettingsControllerQml::instance()->setUsageMode(usageMode.toString());
199271 }
200272}
201273
202−qint64 GSettingsQml::lockedOutTime() const
274+QVariant GSettingsQml::lockedOutTime() const
203275{
204− if (m_schema->id() == "com.canonical.Unity8.Greeter") {
276+ if (m_valid && m_schema->id() == "com.canonical.Unity8.Greeter") {
205277 return GSettingsControllerQml::instance()->lockedOutTime();
206278 } else {
207− return 0;
279+ return QVariant();
208280 }
209281}
210282
211−void GSettingsQml::setLockedOutTime(qint64 timestamp)
283+void GSettingsQml::setLockedOutTime(const QVariant &timestamp)
212284{
213− if (m_schema->id() == "com.canonical.Unity8.Greeter") {
214− GSettingsControllerQml::instance()->setLockedOutTime(timestamp);
285+ if (m_valid && m_schema->id() == "com.canonical.Unity8.Greeter") {
286+ GSettingsControllerQml::instance()->setLockedOutTime(timestamp.value<qint64>());
215287 }
216288}
217289
218−QStringList GSettingsQml::lifecycleExemptAppids() const
290+QVariant GSettingsQml::lifecycleExemptAppids() const
219291{
220− if (m_schema->id() == "com.canonical.qtmir") {
292+ if (m_valid && m_schema->id() == "com.canonical.qtmir") {
221293 return GSettingsControllerQml::instance()->lifecycleExemptAppids();
222294 } else {
223− return QStringList();
295+ return QVariant();
224296 }
225297}
226298
227−bool GSettingsQml::autohideLauncher() const
299+QVariant GSettingsQml::autohideLauncher() const
228300{
229− if (m_schema->id() == "com.canonical.Unity8") {
301+ if (m_valid && m_schema->id() == "com.canonical.Unity8") {
230302 return GSettingsControllerQml::instance()->autohideLauncher();
231303 } else {
232− return false;
304+ return QVariant();
233305 }
234306}
235307
236−int GSettingsQml::launcherWidth() const
308+QVariant GSettingsQml::launcherWidth() const
237309{
238− if (m_schema->id() == "com.canonical.Unity8") {
310+ if (m_valid && m_schema->id() == "com.canonical.Unity8") {
239311 return GSettingsControllerQml::instance()->launcherWidth();
240312 } else {
241− return false;
313+ return QVariant();
314+ }
315+}
316+
317+QVariant GSettingsQml::edgeDragWidth() const
318+{
319+ if (m_valid && m_schema->id() == "com.canonical.Unity8") {
320+ return GSettingsControllerQml::instance()->edgeDragWidth();
321+ } else {
322+ return QVariant();
323+ }
324+}
325+
326+void GSettingsQml::setLifecycleExemptAppids(const QVariant &appIds)
327+{
328+ if (m_valid && m_schema->id() == "com.canonical.qtmir") {
329+ GSettingsControllerQml::instance()->setLifecycleExemptAppids(appIds.toStringList());
242330 }
243331}
244332
245−void GSettingsQml::setLifecycleExemptAppids(const QStringList &appIds)
333+void GSettingsQml::setAutohideLauncher(const QVariant &autohideLauncher)
246334{
247− if (m_schema->id() == "com.canonical.qtmir") {
248− GSettingsControllerQml::instance()->setLifecycleExemptAppids(appIds);
335+ if (m_valid && m_schema->id() == "com.canonical.Unity8") {
336+ GSettingsControllerQml::instance()->setAutohideLauncher(autohideLauncher.toBool());
249337 }
250338}
251339
252−void GSettingsQml::setAutohideLauncher(bool autohideLauncher)
340+void GSettingsQml::setLauncherWidth(const QVariant &launcherWidth)
253341{
254− if (m_schema->id() == "com.canonical.Unity8") {
255− GSettingsControllerQml::instance()->setAutohideLauncher(autohideLauncher);
342+ if (m_valid && m_schema->id() == "com.canonical.Unity8") {
343+ GSettingsControllerQml::instance()->setLauncherWidth(launcherWidth.toInt());
256344 }
257345}
258346
259−void GSettingsQml::setLauncherWidth(int launcherWidth)
347+void GSettingsQml::setEdgeDragWidth(const QVariant &edgeDragWidth)
260348{
261− if (m_schema->id() == "com.canonical.Unity8") {
262− GSettingsControllerQml::instance()->setLauncherWidth(launcherWidth);
349+ if (m_valid && m_schema->id() == "com.canonical.Unity8") {
350+ GSettingsControllerQml::instance()->setEdgeDragWidth(edgeDragWidth.toUInt());
263351 }
264352}
tests/mocks/GSettings.1.0/fake_gsettings.h+51−26
@@ -19,7 +19,9 @@
1919
2020#include <QList>
2121#include <QObject>
22+#include <QQmlParserStatus>
2223#include <QStringList>
24+#include <QVariant>
2325
2426class GSettingsSchemaQml: public QObject
2527{
@@ -41,47 +43,60 @@ private:
4143 QByteArray m_path;
4244};
4345
44−class GSettingsQml: public QObject
46+class GSettingsQml: public QObject, public QQmlParserStatus
4547{
4648 Q_OBJECT
49+ Q_INTERFACES(QQmlParserStatus)
4750
4851 Q_PROPERTY(GSettingsSchemaQml* schema READ schema NOTIFY schemaChanged)
49− Q_PROPERTY(QString pictureUri READ pictureUri WRITE setPictureUri NOTIFY pictureUriChanged)
50− Q_PROPERTY(QString usageMode READ usageMode WRITE setUsageMode NOTIFY usageModeChanged)
51− Q_PROPERTY(qint64 lockedOutTime READ lockedOutTime WRITE setLockedOutTime NOTIFY lockedOutTimeChanged)
52− Q_PROPERTY(QStringList lifecycleExemptAppids READ lifecycleExemptAppids WRITE setLifecycleExemptAppids NOTIFY lifecycleExemptAppidsChanged)
53− Q_PROPERTY(bool autohideLauncher READ autohideLauncher WRITE setAutohideLauncher NOTIFY autohideLauncherChanged)
54− Q_PROPERTY(int launcherWidth READ launcherWidth WRITE setLauncherWidth NOTIFY launcherWidthChanged)
52+ Q_PROPERTY(QVariant disableHeight READ disableHeight WRITE setDisableHeight NOTIFY disableHeightChanged)
53+ Q_PROPERTY(QVariant pictureUri READ pictureUri WRITE setPictureUri NOTIFY pictureUriChanged)
54+ Q_PROPERTY(QVariant usageMode READ usageMode WRITE setUsageMode NOTIFY usageModeChanged)
55+ Q_PROPERTY(QVariant lockedOutTime READ lockedOutTime WRITE setLockedOutTime NOTIFY lockedOutTimeChanged)
56+ Q_PROPERTY(QVariant lifecycleExemptAppids READ lifecycleExemptAppids WRITE setLifecycleExemptAppids NOTIFY lifecycleExemptAppidsChanged)
57+ Q_PROPERTY(QVariant autohideLauncher READ autohideLauncher WRITE setAutohideLauncher NOTIFY autohideLauncherChanged)
58+ Q_PROPERTY(QVariant launcherWidth READ launcherWidth WRITE setLauncherWidth NOTIFY launcherWidthChanged)
59+ Q_PROPERTY(QVariant edgeDragWidth READ edgeDragWidth WRITE setEdgeDragWidth NOTIFY edgeDragWidthChanged)
5560
5661public:
5762 GSettingsQml(QObject *parent = nullptr);
5863
59− GSettingsSchemaQml * schema() const;
60− QString pictureUri() const;
61− QString usageMode() const;
62− qint64 lockedOutTime() const;
63− QStringList lifecycleExemptAppids() const;
64− bool autohideLauncher() const;
65− int launcherWidth() const;
64+ void classBegin();
65+ void componentComplete();
6666
67− void setPictureUri(const QString &str);
68− void setUsageMode(const QString &usageMode);
69− void setLockedOutTime(qint64 timestamp);
70− void setLifecycleExemptAppids(const QStringList &appIds);
71− void setAutohideLauncher(bool autohideLauncher);
72− void setLauncherWidth(int launcherWidth);
67+ GSettingsSchemaQml * schema() const;
68+ QVariant disableHeight() const;
69+ QVariant pictureUri() const;
70+ QVariant usageMode() const;
71+ QVariant lockedOutTime() const;
72+ QVariant lifecycleExemptAppids() const;
73+ QVariant autohideLauncher() const;
74+ QVariant launcherWidth() const;
75+ QVariant edgeDragWidth() const;
76+
77+ void setDisableHeight(const QVariant &val);
78+ void setPictureUri(const QVariant &str);
79+ void setUsageMode(const QVariant &usageMode);
80+ void setLockedOutTime(const QVariant &timestamp);
81+ void setLifecycleExemptAppids(const QVariant &appIds);
82+ void setAutohideLauncher(const QVariant &autohideLauncher);
83+ void setLauncherWidth(const QVariant &launcherWidth);
84+ void setEdgeDragWidth(const QVariant &edgeDragWidth);
7385
7486Q_SIGNALS:
87+ void disableHeightChanged();
7588 void schemaChanged();
76− void pictureUriChanged(const QString&);
77− void usageModeChanged(const QString&);
78− void lockedOutTimeChanged(qint64);
79− void lifecycleExemptAppidsChanged(const QStringList &);
80− void autohideLauncherChanged(bool);
81− void launcherWidthChanged(int launcherWidth);
89+ void pictureUriChanged();
90+ void usageModeChanged();
91+ void lockedOutTimeChanged();
92+ void lifecycleExemptAppidsChanged();
93+ void autohideLauncherChanged();
94+ void launcherWidthChanged();
95+ void edgeDragWidthChanged();
8296
8397private:
8498 GSettingsSchemaQml* m_schema;
99+ bool m_valid;
85100
86101 friend class GSettingsSchemaQml;
87102};
@@ -94,6 +109,9 @@ public:
94109 static GSettingsControllerQml* instance();
95110 ~GSettingsControllerQml();
96111
112+ bool disableHeight() const;
113+ Q_INVOKABLE void setDisableHeight(bool val);
114+
97115 QString pictureUri() const;
98116 Q_INVOKABLE void setPictureUri(const QString &str);
99117
@@ -112,23 +130,30 @@ public:
112130 int launcherWidth() const;
113131 Q_INVOKABLE void setLauncherWidth(int launcherWidth);
114132
133+ uint edgeDragWidth() const;
134+ Q_INVOKABLE void setEdgeDragWidth(uint edgeDragWidth);
135+
115136Q_SIGNALS:
137+ void disableHeightChanged();
116138 void pictureUriChanged(const QString&);
117139 void usageModeChanged(const QString&);
118140 void lockedOutTimeChanged(qint64 timestamp);
119141 void lifecycleExemptAppidsChanged(const QStringList&);
120142 void autohideLauncherChanged(bool autohideLauncher);
121143 void launcherWidthChanged(int launcherWidth);
144+ void edgeDragWidthChanged(uint edgeDragWidth);
122145
123146private:
124147 GSettingsControllerQml();
125148
149+ bool m_disableHeight;
126150 QString m_pictureUri;
127151 QString m_usageMode;
128152 qint64 m_lockedOutTime;
129153 QStringList m_lifecycleExemptAppids;
130154 bool m_autohideLauncher;
131155 int m_launcherWidth;
156+ uint m_edgeDragWidth;
132157
133158 static GSettingsControllerQml* s_controllerInstance;
134159 QList<GSettingsQml *> m_registeredGSettings;
tests/mocks/Unity/Application/ApplicationInfo.cpp+181−108
@@ -16,8 +16,7 @@
1616
1717#include "ApplicationInfo.h"
1818#include "MirSurface.h"
19−#include "Session.h"
20−#include "SessionManager.h"
19+#include "SurfaceManager.h"
2120
2221#include <paths.h>
2322
@@ -25,97 +24,114 @@
2524#include <QQuickItem>
2625#include <QQuickView>
2726#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
2954
3055ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
3156 : ApplicationInfoInterface(appId, parent)
3257 , 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)
4858{
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);
4965}
5066
5167ApplicationInfo::ApplicationInfo(QObject *parent)
52− : ApplicationInfoInterface(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+ : ApplicationInfo(QString(), parent)
6869{
6970}
7071
7172ApplicationInfo::~ApplicationInfo()
7273{
73− delete m_session;
7474}
7575
76−void ApplicationInfo::createSession()
76+void ApplicationInfo::createSurface()
7777{
78− if (m_session || state() == ApplicationInfo::Stopped) { return; }
79−
80− setSession(SessionManager::singleton()->createSession(appId(), m_screenshotFileName));
81−}
78+ if (state() == ApplicationInfo::Stopped) { return; }
8279
83−void ApplicationInfo::destroySession()
84−{
85− Session *session = this->session();
86− setSession(nullptr);
87− delete session;
88−}
80+ QString surfaceName = name();
81+ if (m_surfaceList.count() > 0) {
82+ surfaceName.append(QString(" %1").arg(m_surfaceList.count()+1));
83+ }
8984
90−void ApplicationInfo::setSession(Session* session)
91−{
92− if (m_session == session)
85+ auto surfaceManager = SurfaceManager::instance();
86+ if (!surfaceManager) {
87+ WARNING_MSG("No SurfaceManager");
9388 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();
10089 }
10190
102− m_session = session;
103−
104− if (m_session) {
105− m_session->setApplication(this);
106− m_session->setParent(this);
107− m_session->setFullscreen(m_fullscreen);
108− SessionManager::singleton()->registerSession(m_session);
109− connect(m_session, &Session::surfaceAdded,
110− this, &ApplicationInfo::onSessionSurfaceAdded);
111− connect(m_session, &Session::fullscreenChanged, this, &ApplicationInfo::fullscreenChanged);
91+ auto surface = surfaceManager->createSurface(surfaceName,
92+ Mir::NormalType,
93+ fullscreen() ? Mir::FullscreenState : Mir::MaximizedState,
94+ m_screenshotFileName);
95+
96+ surface->setShellChrome(m_shellChrome);
97+
98+ m_surfaceList.appendSurface(surface);
99+
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);
112127
113− if (!m_manualSurfaceCreation) {
114− QTimer::singleShot(500, m_session, &Session::createSurface);
128+ if (m_state == Starting) {
129+ if (m_requestedState == RequestedRunning) {
130+ setState(Running);
131+ } else {
132+ setState(Suspended);
115133 }
116134 }
117−
118− Q_EMIT sessionChanged(m_session);
119135}
120136
121137void ApplicationInfo::setIconId(const QString &iconId)
@@ -138,10 +154,6 @@ void ApplicationInfo::setScreenshotId(const QString &screenshotId)
138154
139155 if (screenshotFileName != m_screenshotFileName) {
140156 m_screenshotFileName = screenshotFileName;
141−
142− if (m_session) {
143− m_session->setScreenshot(screenshotFileName);
144− }
145157 }
146158}
147159
@@ -172,38 +184,53 @@ void ApplicationInfo::setStage(Stage value)
172184void ApplicationInfo::setState(State value)
173185{
174186 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+
175199 m_state = value;
176200 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− }
185201 }
186202}
187203
188−void ApplicationInfo::setFocused(bool value)
204+void ApplicationInfo::close()
189205{
190− if (value != m_focused) {
191− m_focused = value;
192− Q_EMIT focusedChanged(value);
206+ DEBUG_MSG("");
207+
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();
193216 }
194217}
195218
196219void ApplicationInfo::setFullscreen(bool value)
197220{
198221 m_fullscreen = value;
199− if (m_session) {
200− m_session->setFullscreen(value);
222+ if (m_surfaceList.rowCount() > 0) {
223+ m_surfaceList.get(0)->setState(Mir::FullscreenState);
201224 }
202225}
203226
204227bool ApplicationInfo::fullscreen() const
205228{
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+ }
207234}
208235
209236void ApplicationInfo::setManualSurfaceCreation(bool value)
@@ -241,15 +268,28 @@ ApplicationInfo::RequestedState ApplicationInfo::requestedState() const
241268
242269void ApplicationInfo::setRequestedState(RequestedState value)
243270{
244− if (m_requestedState != value) {
245− m_requestedState = value;
246− Q_EMIT requestedStateChanged(m_requestedState);
271+ if (m_requestedState == value) {
272+ return;
273+ }
274+ DEBUG_MSG((value == RequestedRunning ? "RequestedRunning" : "RequestedSuspended") );
247275
248− if (m_requestedState == RequestedRunning && m_state == Suspended) {
276+ m_requestedState = value;
277+ Q_EMIT requestedStateChanged(m_requestedState);
278+
279+ if (m_requestedState == RequestedRunning) {
280+
281+ if (m_state == Suspended) {
282+ Q_ASSERT(m_liveSurfaceCount > 0);
249283 setState(Running);
250− } else if (m_requestedState == RequestedSuspended && m_state == Running) {
251− setState(Suspended);
284+ } else if (m_state == Stopped) {
285+ Q_ASSERT(m_liveSurfaceCount == 0);
286+ // it's restarting
287+ setState(Starting);
252288 }
289+
290+ } else if (m_requestedState == RequestedSuspended && m_state == Running
291+ && m_closingSurfaces.isEmpty()) {
292+ setState(Suspended);
253293 }
254294}
255295
@@ -263,18 +303,6 @@ void ApplicationInfo::setIsTouchApp(bool isTouchApp)
263303 m_isTouchApp = isTouchApp;
264304}
265305
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−
278306bool ApplicationInfo::exemptFromLifecycle() const
279307{
280308 return m_exemptFromLifecycle;
@@ -305,7 +333,52 @@ void ApplicationInfo::setInitialSurfaceSize(const QSize &size)
305333void ApplicationInfo::setShellChrome(Mir::ShellChrome shellChrome)
306334{
307335 m_shellChrome = shellChrome;
308− if (m_session && m_session->lastSurface()) {
309− m_session->lastSurface()->setShellChrome(shellChrome);
336+ if (m_surfaceList.rowCount() > 0) {
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();
310383 }
311384}
tests/mocks/Unity/Application/ApplicationInfo.h+39−24
@@ -20,25 +20,32 @@
2020#include <QObject>
2121
2222class MirSurface;
23−class Session;
2423
2524// unity-api
2625#include <unity/shell/application/ApplicationInfoInterface.h>
2726#include <unity/shell/application/Mir.h>
2827
28+#include "MirSurfaceListModel.h"
29+
30+#include <QList>
31+#include <QTimer>
32+
2933using namespace unity::shell::application;
3034
3135class ApplicationInfo : public ApplicationInfoInterface {
3236 Q_OBJECT
3337
38+ ////
39+ // FIXME: Remove those
3440 Q_PROPERTY(bool fullscreen READ fullscreen WRITE setFullscreen NOTIFY fullscreenChanged)
35− Q_PROPERTY(Session* session READ session NOTIFY sessionChanged)
3641
3742 // Only exists in this fake implementation
3843
3944 // whether the test code will explicitly control the creation of the application surface
4045 Q_PROPERTY(bool manualSurfaceCreation READ manualSurfaceCreation WRITE setManualSurfaceCreation NOTIFY manualSurfaceCreationChanged)
4146
47+ Q_PROPERTY(QString screenshot READ screenshot CONSTANT)
48+
4249public:
4350 ApplicationInfo(QObject *parent = nullptr);
4451 ApplicationInfo(const QString &appId, QObject *parent = nullptr);
@@ -66,8 +73,7 @@ public:
6673 Q_INVOKABLE void setState(State value);
6774 State state() const override { return m_state; }
6875
69− void setFocused(bool value);
70− bool focused() const override { return m_focused; }
76+ bool focused() const override;
7177
7278 QString splashTitle() const override { return QString(); }
7379 QUrl splashImage() const override { return QUrl(); }
@@ -100,21 +106,26 @@ public:
100106 void setInitialSurfaceSize(const QSize &size) override;
101107
102108 Q_INVOKABLE void setShellChrome(Mir::ShellChrome shellChrome);
103−public:
104− void setSession(Session* session);
105− Session* session() const { return m_session; }
109+
110+ MirSurfaceListInterface* surfaceList() override { return &m_surfaceList; }
111+
112+ void setFocused(bool value);
113+
114+ //////
115+ // internal mock stuff
116+ void close();
117+ void requestFocus();
106118
107119Q_SIGNALS:
108− void sessionChanged(Session*);
109120 void fullscreenChanged(bool value);
110121 void manualSurfaceCreationChanged(bool value);
122+ void closed();
111123
112124public Q_SLOTS:
113− Q_INVOKABLE void createSession();
114− Q_INVOKABLE void destroySession();
125+ Q_INVOKABLE void createSurface();
115126
116127private Q_SLOTS:
117− void onSessionSurfaceAdded(MirSurface*);
128+ void onSurfaceCountChanged();
118129
119130private:
120131 void setIcon(const QUrl &value);
@@ -124,20 +135,24 @@ private:
124135 QString m_appId;
125136 QString m_name;
126137 QUrl m_icon;
127− Stage m_stage;
128− State m_state;
129− bool m_focused;
130− bool m_fullscreen;
131− Session* m_session;
132− Qt::ScreenOrientations m_supportedOrientations;
133− bool m_rotatesWindowContents;
134− RequestedState m_requestedState;
135− bool m_isTouchApp;
136− bool m_exemptFromLifecycle;
138+ Stage m_stage{MainStage};
139+ State m_state{Stopped};
140+ bool m_fullscreen{false};
141+ Qt::ScreenOrientations m_supportedOrientations{Qt::PortraitOrientation |
142+ Qt::LandscapeOrientation |
143+ Qt::InvertedPortraitOrientation |
144+ Qt::InvertedLandscapeOrientation};
145+ bool m_rotatesWindowContents{false};
146+ RequestedState m_requestedState{RequestedRunning};
147+ bool m_isTouchApp{true};
148+ bool m_exemptFromLifecycle{false};
137149 QSize m_initialSurfaceSize;
138−
139− bool m_manualSurfaceCreation;
140− Mir::ShellChrome m_shellChrome;
150+ MirSurfaceListModel m_surfaceList;
151+ int m_liveSurfaceCount{0};
152+ QTimer m_surfaceCreationTimer;
153+ QList<MirSurface*> m_closingSurfaces;
154+ bool m_manualSurfaceCreation{false};
155+ Mir::ShellChrome m_shellChrome{Mir::NormalChrome};
141156};
142157
143158Q_DECLARE_METATYPE(ApplicationInfo*)
tests/mocks/Unity/Application/ApplicationManager.cpp+109−74
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013-2015 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -16,8 +16,7 @@
1616
1717#include "ApplicationManager.h"
1818#include "ApplicationInfo.h"
19−#include "Session.h"
20−#include "ApplicationTestInterface.h"
19+#include "MirSurface.h"
2120
2221#include <paths.h>
2322#include <csignal>
@@ -31,28 +30,20 @@
3130#include <QDateTime>
3231#include <QtDBus/QtDBus>
3332
34−ApplicationManager *ApplicationManager::the_application_manager = nullptr;
33+#define APPLICATIONMANAGER_DEBUG 0
3534
36−ApplicationManager *ApplicationManager::singleton()
37−{
38− if (!the_application_manager) {
39− the_application_manager = new ApplicationManager();
35+#if APPLICATIONMANAGER_DEBUG
36+#define DEBUG_MSG(params) qDebug().nospace() << "ApplicationManager::" << __func__ << " " << params
37+#else
38+#define DEBUG_MSG(params) ((void)0)
39+#endif
4040
41− // Emit signal to notify Upstart that Mir is ready to receive client connections
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−}
41+namespace unityapi = unity::shell::application;
4942
5043ApplicationManager::ApplicationManager(QObject *parent)
5144 : ApplicationManagerInterface(parent)
5245{
53− m_roleNames.insert(RoleSession, "session");
54− m_roleNames.insert(RoleFullscreen, "fullscreen");
55−
46+ DEBUG_MSG("");
5647 buildListOfAvailableApplications();
5748
5849 // polling to find out when the toplevel window has been created as there's
@@ -61,6 +52,19 @@ ApplicationManager::ApplicationManager(QObject *parent)
6152 this, &ApplicationManager::onWindowCreatedTimerTimeout);
6253 m_windowCreatedTimer.setSingleShot(false);
6354 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+ }
6468}
6569
6670ApplicationManager::~ApplicationManager()
@@ -78,7 +82,6 @@ void ApplicationManager::onWindowCreatedTimerTimeout()
7882void ApplicationManager::onWindowCreated()
7983{
8084 startApplication("unity8-dash");
81− focusApplication("unity8-dash");
8285}
8386
8487int ApplicationManager::rowCount(const QModelIndex& parent) const {
@@ -109,10 +112,8 @@ QVariant ApplicationManager::data(const QModelIndex& index, int role) const {
109112 return app->isTouchApp();
110113 case RoleExemptFromLifecycle:
111114 return app->exemptFromLifecycle();
112− case RoleSession:
113− return QVariant::fromValue(app->session());
114− case RoleFullscreen:
115− return app->fullscreen();
115+ case RoleApplication:
116+ return QVariant::fromValue(static_cast<unityapi::ApplicationInfoInterface*>(app));
116117 default:
117118 return QVariant();
118119 }
@@ -144,19 +145,17 @@ QModelIndex ApplicationManager::findIndex(ApplicationInfo* application)
144145 return QModelIndex();
145146}
146147
147−void ApplicationManager::add(ApplicationInfo *application) {
148+bool ApplicationManager::add(ApplicationInfo *application) {
148149 if (!application || m_runningApplications.contains(application)) {
149− return;
150+ return false;
150151 }
152+ DEBUG_MSG(application->appId());
153+
154+ application->setState(ApplicationInfo::Starting);
151155
152156 beginInsertRows(QModelIndex(), m_runningApplications.size(), m_runningApplications.size());
153157 m_runningApplications.append(application);
154158
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− });
160159 connect(application, &ApplicationInfo::focusedChanged, this, [application, this]() {
161160 QModelIndex appIndex = findIndex(application);
162161 if (!appIndex.isValid()) return;
@@ -173,19 +172,27 @@ void ApplicationManager::add(ApplicationInfo *application) {
173172 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleStage);
174173 });
175174
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+
176182 endInsertRows();
177− Q_EMIT applicationAdded(application->appId());
178183 Q_EMIT countChanged();
179184 if (count() == 1) Q_EMIT emptyChanged(isEmpty()); // was empty but not anymore
185+
186+ return true;
180187}
181188
182189void ApplicationManager::remove(ApplicationInfo *application) {
183190 int i = m_runningApplications.indexOf(application);
184191 if (i != -1) {
192+ DEBUG_MSG(application->appId());
185193 beginRemoveRows(QModelIndex(), i, i);
186194 m_runningApplications.removeAt(i);
187195 endRemoveRows();
188− Q_EMIT applicationRemoved(application->appId());
189196 Q_EMIT countChanged();
190197 if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
191198 }
@@ -209,18 +216,29 @@ void ApplicationManager::move(int from, int to) {
209216ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
210217 const QStringList &arguments)
211218{
219+ DEBUG_MSG(appId);
212220 Q_UNUSED(arguments)
213− ApplicationInfo *application = add(appId);
221+
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
214231 if (!application)
215− return 0;
216− application->setState(ApplicationInfo::Starting);
232+ return nullptr;
233+
234+ Q_EMIT application->focusRequested(); // we assume that an application that's starting up wants focus
217235
218236 return application;
219237}
220238
221239ApplicationInfo* ApplicationManager::add(QString appId)
222240{
223− ApplicationInfo *application = 0;
241+ ApplicationInfo *application = nullptr;
224242
225243 for (ApplicationInfo *availableApp : m_availableApplications) {
226244 if (availableApp->appId() == appId) {
@@ -229,23 +247,23 @@ ApplicationInfo* ApplicationManager::add(QString appId)
229247 }
230248 }
231249
232− if (application)
233− add(application);
250+ if (application) {
251+ if (!add(application)) {
252+ application = nullptr;
253+ }
254+ }
234255
235256 return application;
236257}
237258
238259bool ApplicationManager::stopApplication(const QString &appId)
239260{
261+ DEBUG_MSG(appId);
240262 ApplicationInfo *application = findApplication(appId);
241263 if (application == nullptr)
242264 return false;
243265
244− if (application->appId() == focusedApplicationId()) {
245− unfocusCurrentApplication();
246− }
247− application->setState(ApplicationInfo::Stopped);
248− remove(application);
266+ application->close();
249267 return true;
250268}
251269
@@ -258,44 +276,17 @@ QString ApplicationManager::focusedApplicationId() const {
258276 return QString();
259277}
260278
261−bool ApplicationManager::focusApplication(const QString &appId)
279+bool ApplicationManager::requestFocusApplication(const QString &appId)
262280{
263281 ApplicationInfo *application = findApplication(appId);
264282 if (application == nullptr)
265283 return false;
266284
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();
276286
277− // move app to top of stack
278− move(m_runningApplications.indexOf(application), 0);
279− Q_EMIT focusedApplicationIdChanged();
280287 return true;
281288}
282289
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−
299290void ApplicationManager::buildListOfAvailableApplications()
300291{
301292 /*
@@ -328,7 +319,6 @@ void ApplicationManager::buildListOfAvailableApplications()
328319 application->setName("Camera");
329320 application->setScreenshotId("camera");
330321 application->setIconId("camera");
331− application->setShellChrome(Mir::LowChrome);
332322 application->setFullscreen(true);
333323 application->setSupportedOrientations(Qt::PortraitOrientation
334324 | Qt::LandscapeOrientation
@@ -473,3 +463,48 @@ bool ApplicationManager::isEmpty() const
473463{
474464 return m_runningApplications.isEmpty();
475465}
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 @@
11/*
2− * Copyright (C) 2013-2014 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -26,12 +26,19 @@
2626// unity-api
2727#include <unity/shell/application/ApplicationManagerInterface.h>
2828
29+namespace unity {
30+ namespace shell {
31+ namespace application {
32+ class MirSurfaceInterface;
33+ }
34+ }
35+}
36+
2937class QQuickItem;
3038using namespace unity::shell::application;
3139
3240class ApplicationManager : public ApplicationManagerInterface {
3341 Q_OBJECT
34− Q_FLAGS(ExecFlags)
3542
3643 Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged)
3744 Q_PROPERTY(QStringList availableApplications READ availableApplications NOTIFY availableApplicationsChanged)
@@ -40,13 +47,6 @@ class ApplicationManager : public ApplicationManagerInterface {
4047 ApplicationManager(QObject *parent = nullptr);
4148 virtual ~ApplicationManager();
4249
43− static ApplicationManager *singleton();
44−
45− enum MoreRoles {
46− RoleSession = RoleExemptFromLifecycle+1,
47− RoleFullscreen,
48− };
49−
5050 // QAbstractItemModel methods.
5151 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
5252 QVariant data(const QModelIndex& index, int role) const override;
@@ -57,8 +57,6 @@ class ApplicationManager : public ApplicationManagerInterface {
5757
5858 // Application control methods
5959 Q_INVOKABLE bool requestFocusApplication(const QString &appId) override;
60− Q_INVOKABLE bool focusApplication(const QString &appId) override;
61− Q_INVOKABLE void unfocusCurrentApplication() override;
6260 Q_INVOKABLE ApplicationInfo *startApplication(const QString &appId, const QStringList &arguments = QStringList()) override;
6361 Q_INVOKABLE bool stopApplication(const QString &appId) override;
6462
@@ -79,17 +77,17 @@ class ApplicationManager : public ApplicationManagerInterface {
7977
8078 private Q_SLOTS:
8179 void onWindowCreatedTimerTimeout();
80+ void updateFocusedApplication();
8281
8382 private:
84− void add(ApplicationInfo *application);
83+ bool add(ApplicationInfo *application);
8584 void remove(ApplicationInfo* application);
8685 void buildListOfAvailableApplications();
8786 void onWindowCreated();
87+ ApplicationInfo *findApplication(MirSurface* surface);
8888 QList<ApplicationInfo*> m_runningApplications;
8989 QList<ApplicationInfo*> m_availableApplications;
9090 QTimer m_windowCreatedTimer;
91−
92− static ApplicationManager *the_application_manager;
9391};
9492
9593Q_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
22 plugin.cpp
33 ApplicationInfo.cpp
44 ApplicationManager.cpp
5− ApplicationScreenshotProvider.cpp
6− ApplicationTestInterface.cpp
75 MirSurface.cpp
86 MirSurfaceItem.cpp
7+ MirSurfaceListModel.cpp
98 ObjectListModel.h
10− Session.cpp
11− SessionManager.cpp
129 SurfaceManager.cpp
13− SessionModel.h
1410 UbuntuKeyboardInfo.cpp
1511 VirtualKeyboard.cpp
1612 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
@@ -18,6 +14,8 @@ set(FakeUnityApplicationQml_SOURCES
1814 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
1915 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirSurfaceInterface.h
2016 ${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
2119 resources/surfaces.qrc
2220)
2321
tests/mocks/Unity/Application/MirSurface.cpp+191−30
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -19,13 +19,49 @@
1919#include <QDebug>
2020#include <QQmlEngine>
2121
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+
2259MirSurface::MirSurface(const QString& name,
2360 Mir::Type type,
2461 Mir::State state,
2562 const QUrl& screenshot,
26− const QUrl &qmlFilePath,
27− QObject *parent)
28− : unity::shell::application::MirSurfaceInterface(parent)
63+ const QUrl &qmlFilePath)
64+ : unity::shell::application::MirSurfaceInterface(nullptr)
2965 , m_name(name)
3066 , m_type(type)
3167 , m_state(state)
@@ -40,17 +76,28 @@ MirSurface::MirSurface(const QString& name,
4076 , m_slowToResize(false)
4177 , m_shellChrome(Mir::NormalChrome)
4278{
43−// qDebug() << "MirSurface::MirSurface() " << name;
79+ DEBUG_MSG("");
80+
4481 QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
4582
4683 m_delayedResizeTimer.setInterval(600);
4784 m_delayedResizeTimer.setSingleShot(true);
4885 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); });
4990}
5091
5192MirSurface::~MirSurface()
5293{
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+ }
54101}
55102
56103QString MirSurface::name() const
@@ -73,6 +120,7 @@ void MirSurface::setState(Mir::State state)
73120 if (state == m_state)
74121 return;
75122
123+ DEBUG_MSG(stateToStr(state));
76124 m_state = state;
77125 Q_EMIT stateChanged(state);
78126}
@@ -89,10 +137,10 @@ bool MirSurface::visible() const
89137
90138void MirSurface::setLive(bool live)
91139{
92−// qDebug().nospace() << "MirSurface::setLive("<<live<<") " << name();
93140 if (live == m_live)
94141 return;
95142
143+ DEBUG_MSG(live);
96144 m_live = live;
97145 Q_EMIT liveChanged(live);
98146
@@ -134,6 +182,20 @@ void MirSurface::setOrientationAngle(Mir::OrientationAngle angle)
134182 Q_EMIT orientationAngleChanged(angle);
135183}
136184
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+
137199Mir::ShellChrome MirSurface::shellChrome() const
138200{
139201 return m_shellChrome;
@@ -144,41 +206,21 @@ void MirSurface::setShellChrome(Mir::ShellChrome shellChrome)
144206 if (shellChrome == m_shellChrome)
145207 return;
146208
209+ DEBUG_MSG(shellChrome);
147210 m_shellChrome = shellChrome;
148211 Q_EMIT shellChromeChanged(shellChrome);
149212}
150213
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−
170214void MirSurface::registerView(qintptr viewId)
171215{
172216 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());
175218}
176219
177220void MirSurface::unregisterView(qintptr viewId)
178221{
179−// qDebug().nospace() << "MirSurface[" << name() << "]::unregisterView(" << viewId << ")"
180−// << " after=" << m_views.count() << " live=" << m_live;
181222 m_views.remove(viewId);
223+ DEBUG_MSG(viewId << " after=" << m_views.count() << " live=" << m_live);
182224 if (!m_live && m_views.count() == 0) {
183225 deleteLater();
184226 }
@@ -294,6 +336,7 @@ bool MirSurface::isSlowToResize() const
294336void MirSurface::setSlowToResize(bool value)
295337{
296338 if (m_slowToResize != value) {
339+ DEBUG_MSG(value);
297340 m_slowToResize = value;
298341 Q_EMIT slowToResizeChanged();
299342 if (!m_slowToResize && m_delayedResizeTimer.isActive()) {
@@ -350,3 +393,121 @@ void MirSurface::setHeightIncrement(int value)
350393 Q_EMIT heightIncrementChanged(m_heightIncrement);
351394 }
352395}
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 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -23,8 +23,31 @@
2323#include <QHash>
2424
2525// unity-api
26+#include <unity/shell/application/MirFocusControllerInterface.h>
2627#include <unity/shell/application/MirSurfaceInterface.h>
2728
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+
2851class MirSurface : public unity::shell::application::MirSurfaceInterface
2952{
3053 Q_OBJECT
@@ -41,8 +64,7 @@ public:
4164 Mir::Type type,
4265 Mir::State state,
4366 const QUrl& screenshot,
44− const QUrl &qmlFilePath = QUrl(),
45− QObject *parent = nullptr);
67+ const QUrl &qmlFilePath = QUrl());
4668 virtual ~MirSurface();
4769
4870 ////
@@ -74,10 +96,20 @@ public:
7496 int widthIncrement() const override { return m_widthIncrement; }
7597 int heightIncrement() const override { return m_heightIncrement; }
7698
99+ virtual void setKeymap(const QString &);
100+ virtual QString keymap() const;
101+
77102 Mir::ShellChrome shellChrome() const override;
78− QString keymapLayout() const override;
79− QString keymapVariant() const override;
80− Q_INVOKABLE void setKeymap(const QString &layout, const QString &variant) override;
103+
104+ bool focused() const override;
105+
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;
81113
82114 ////
83115 // API for tests
@@ -85,11 +117,6 @@ public:
85117 Q_INVOKABLE void setLive(bool live);
86118 Q_INVOKABLE void setShellChrome(Mir::ShellChrome shellChrome);
87119
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−
93120 int width() const;
94121 int height() const;
95122
@@ -103,6 +130,8 @@ public:
103130 Q_INVOKABLE void setWidthIncrement(int);
104131 Q_INVOKABLE void setHeightIncrement(int);
105132
133+ Q_INVOKABLE void createPromptSurface();
134+
106135 /////
107136 // internal mock stuff
108137
@@ -114,7 +143,16 @@ public:
114143 bool activeFocus() const;
115144 void setActiveFocus(bool);
116145
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+
117153Q_SIGNALS:
154+ ////
155+ // API for tests
118156 void widthChanged();
119157 void heightChanged();
120158 void slowToResizeChanged();
@@ -123,6 +161,8 @@ Q_SIGNALS:
123161 // internal mock stuff
124162 void screenshotUrlChanged(QUrl);
125163 void activeFocusChanged(bool);
164+ void raiseRequested();
165+ void closeRequested();
126166
127167private Q_SLOTS:
128168 void applyDelayedResize();
@@ -135,6 +175,7 @@ private:
135175 const Mir::Type m_type;
136176 Mir::State m_state;
137177 Mir::OrientationAngle m_orientationAngle;
178+
138179 QUrl m_screenshotUrl;
139180 QUrl m_qmlFilePath;
140181 bool m_live;
@@ -150,19 +191,22 @@ private:
150191 int m_widthIncrement{0};
151192 int m_heightIncrement{0};
152193
194+ QString m_keymap;
195+
153196 bool m_slowToResize;
154197 QTimer m_delayedResizeTimer;
155198 QSize m_delayedResize;
156199 QSize m_pendingResize;
157200
158201 Mir::ShellChrome m_shellChrome;
202+ MirSurfaceListModel m_promptSurfaceList;
159203
160204 struct View {
161205 bool visible;
162206 };
163207 QHash<qintptr, View> m_views;
164208
165− QPair<QString,QString> m_keyMap; // pair of layout+variant
209+ QTimer m_zombieTimer;
166210};
167211
168212#endif // MOCK_MIR_SURFACE_H
tests/mocks/Unity/Application/MirSurfaceItem.cpp+13−7
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -29,6 +29,14 @@
2929
3030using namespace unity::shell::application;
3131
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+
3240MirSurfaceItem::MirSurfaceItem(QQuickItem *parent)
3341 : MirSurfaceItemInterface(parent)
3442 , m_qmlSurface(nullptr)
@@ -41,7 +49,7 @@ MirSurfaceItem::MirSurfaceItem(QQuickItem *parent)
4149 , m_mousePressCount(0)
4250 , m_mouseReleaseCount(0)
4351{
44−// qDebug() << "MirSurfaceItem::MirSurfaceItem() " << (void*)(this) << name();
52+ DEBUG_MSG((void*)(this) << name());
4553 setAcceptedMouseButtons(Qt::LeftButton | Qt::MiddleButton | Qt::RightButton |
4654 Qt::ExtraButton1 | Qt::ExtraButton2 | Qt::ExtraButton3 | Qt::ExtraButton4 |
4755 Qt::ExtraButton5 | Qt::ExtraButton6 | Qt::ExtraButton7 | Qt::ExtraButton8 |
@@ -53,7 +61,7 @@ MirSurfaceItem::MirSurfaceItem(QQuickItem *parent)
5361
5462MirSurfaceItem::~MirSurfaceItem()
5563{
56−// qDebug() << "MirSurfaceItem::~MirSurfaceItem() " << (void*)(this) << name();
64+ DEBUG_MSG((void*)(this) << name());
5765 setSurface(nullptr);
5866}
5967
@@ -150,7 +158,7 @@ void MirSurfaceItem::onComponentStatusChanged(QQmlComponent::Status status)
150158
151159void MirSurfaceItem::createQmlContentItem()
152160{
153−// qDebug() << "MirSurfaceItem::createQmlContentItem()";
161+ DEBUG_MSG("");
154162
155163 m_qmlItem = qobject_cast<QQuickItem*>(m_qmlContentComponent->create());
156164 m_qmlItem->setParentItem(this);
@@ -213,9 +221,7 @@ void MirSurfaceItem::mouseReleaseEvent(QMouseEvent * event)
213221
214222void MirSurfaceItem::setSurface(MirSurfaceInterface* surface)
215223{
216−// qDebug().nospace() << "MirSurfaceItem::setSurface() this=" << (void*)(this)
217−// << " name=" << name()
218−// << " surface=" << surface;
224+ DEBUG_MSG("this=" << (void*)(this) << " name=" << name() << " surface=" << surface);
219225
220226 if (m_qmlSurface == surface) {
221227 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 @@
2020// Qt
2121#include <QAbstractListModel>
2222
23+#include <QDebug>
24+
2325template<class TYPE>
2426class ObjectListModel : public QAbstractListModel
2527{
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 @@
11/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -16,17 +16,15 @@
1616
1717#include "SurfaceManager.h"
1818
19+#include "ApplicationInfo.h"
1920#include "VirtualKeyboard.h"
2021
2122#include <paths.h>
2223
2324SurfaceManager *SurfaceManager::the_surface_manager = nullptr;
2425
25−SurfaceManager *SurfaceManager::singleton()
26+SurfaceManager *SurfaceManager::instance()
2627{
27− if (!the_surface_manager) {
28− the_surface_manager = new SurfaceManager();
29− }
3028 return the_surface_manager;
3129}
3230
@@ -34,7 +32,10 @@ SurfaceManager::SurfaceManager(QObject *parent) :
3432 QObject(parent)
3533 , m_virtualKeyboard(nullptr)
3634{
37− m_virtualKeyboard = new VirtualKeyboard(this);
35+ Q_ASSERT(the_surface_manager == nullptr);
36+ the_surface_manager = this;
37+
38+ m_virtualKeyboard = new VirtualKeyboard;
3839 connect(m_virtualKeyboard, &QObject::destroyed, this, [this](QObject *obj) {
3940 MirSurface* surface = qobject_cast<MirSurface*>(obj);
4041 m_virtualKeyboard = nullptr;
@@ -43,10 +44,16 @@ SurfaceManager::SurfaceManager(QObject *parent) :
4344 });
4445}
4546
47+SurfaceManager::~SurfaceManager()
48+{
49+ Q_ASSERT(the_surface_manager == this);
50+ the_surface_manager = nullptr;
51+}
52+
4653MirSurface *SurfaceManager::createSurface(const QString& name,
47− Mir::Type type,
48− Mir::State state,
49− const QUrl& screenshot)
54+ Mir::Type type,
55+ Mir::State state,
56+ const QUrl& screenshot)
5057{
5158 MirSurface* surface = new MirSurface(name, type, state, screenshot);
5259 connect(surface, &QObject::destroyed, this, [this](QObject *obj) {
tests/mocks/Unity/Application/SurfaceManager.h+5−2
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -22,6 +22,8 @@
2222#include "MirSurface.h"
2323#include "VirtualKeyboard.h"
2424
25+class ApplicationInfo;
26+
2527class SurfaceManager : public QObject
2628{
2729 Q_OBJECT
@@ -35,8 +37,9 @@ class SurfaceManager : public QObject
3537
3638public:
3739 explicit SurfaceManager(QObject *parent = 0);
40+ virtual ~SurfaceManager();
3841
39− static SurfaceManager *singleton();
42+ static SurfaceManager *instance();
4043
4144 Q_INVOKABLE MirSurface* createSurface(const QString& name,
4245 Mir::Type type,
tests/mocks/Unity/Application/UbuntuKeyboardInfo.cpp−2
@@ -16,8 +16,6 @@
1616
1717#include "UbuntuKeyboardInfo.h"
1818
19−UbuntuKeyboardInfo *UbuntuKeyboardInfo::m_instance = nullptr;
20−
2119UbuntuKeyboardInfo::UbuntuKeyboardInfo(QObject *parent)
2220 : QObject(parent),
2321 m_x(0),
tests/mocks/Unity/Application/UbuntuKeyboardInfo.h−9
@@ -40,13 +40,6 @@ public:
4040 void setWidth(qreal value);
4141 void setHeight(qreal value);
4242
43− static UbuntuKeyboardInfo *singleton() {
44− if (!m_instance) {
45− m_instance = new UbuntuKeyboardInfo;
46− }
47− return m_instance;
48− }
49−
5043Q_SIGNALS:
5144 void xChanged(qreal x);
5245 void yChanged(qreal y);
@@ -59,8 +52,6 @@ private:
5952 qint32 m_y;
6053 qint32 m_width;
6154 qint32 m_height;
62−
63− static UbuntuKeyboardInfo *m_instance;
6455};
6556
6657#endif // UBUNTU_KEYBOARD_INFO_H
tests/mocks/Unity/Application/VirtualKeyboard.cpp+2−3
@@ -22,13 +22,12 @@
2222
2323#include <QDebug>
2424
25−VirtualKeyboard::VirtualKeyboard(QObject *parent)
25+VirtualKeyboard::VirtualKeyboard()
2626 : MirSurface("input-method",
2727 Mir::InputMethodType,
2828 Mir::MinimizedState,
2929 QUrl("qrc:///Unity/Application/vkb_portrait.png"),
30− QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"),
31− parent)
30+ QUrl("qrc:///Unity/Application/VirtualKeyboard.qml"))
3231{
3332}
3433
tests/mocks/Unity/Application/VirtualKeyboard.h+1−1
@@ -25,7 +25,7 @@ class VirtualKeyboard : public MirSurface
2525{
2626 Q_OBJECT
2727public:
28− explicit VirtualKeyboard(QObject *parent = nullptr);
28+ explicit VirtualKeyboard();
2929 ~VirtualKeyboard();
3030};
3131
tests/mocks/Unity/Application/plugin.cpp+33−38
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013-2015 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -17,12 +17,8 @@
1717#include "plugin.h"
1818#include "ApplicationInfo.h"
1919#include "ApplicationManager.h"
20−#include "ApplicationScreenshotProvider.h"
21−#include "Session.h"
2220#include "MirSurfaceItem.h"
2321#include "SurfaceManager.h"
24−#include "SessionManager.h"
25−#include "ApplicationTestInterface.h"
2622#include "UbuntuKeyboardInfo.h"
2723
2824// unity-api
@@ -31,62 +27,65 @@
3127#include <qqml.h>
3228#include <QQmlEngine>
3329
34−static QObject* applicationManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
35− Q_UNUSED(engine);
36− Q_UNUSED(scriptEngine);
37− return ApplicationManager::singleton();
38−}
30+namespace {
3931
40−static QObject* surfaceManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
41− Q_UNUSED(engine);
42− Q_UNUSED(scriptEngine);
43− return SurfaceManager::singleton();
32+// Creates the singletons that are called throughout C++ code
33+void createUnityApplicationSharedSingletons()
34+{
35+ // they have to be created in a specific order
36+ if (!MirFocusController::instance()) {
37+ new MirFocusController;
38+ }
39+ if (!SurfaceManager::instance()) {
40+ new SurfaceManager;
41+ }
4442}
4543
46−static QObject* sessionManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
47− Q_UNUSED(engine);
48− Q_UNUSED(scriptEngine);
49− return SessionManager::singleton();
44+QObject* applicationManagerSingleton(QQmlEngine*, QJSEngine*)
45+{
46+ createUnityApplicationSharedSingletons();
47+ return new ApplicationManager;
5048}
5149
52−static QObject* ubuntuKeyboardInfoSingleton(QQmlEngine*, QJSEngine*) {
53− return UbuntuKeyboardInfo::singleton();
50+QObject* surfaceManagerSingleton(QQmlEngine*, QJSEngine*)
51+{
52+ createUnityApplicationSharedSingletons();
53+ return SurfaceManager::instance();
5454}
5555
56+QObject* ubuntuKeyboardInfoSingleton(QQmlEngine*, QJSEngine*)
57+{
58+ createUnityApplicationSharedSingletons();
59+ return new UbuntuKeyboardInfo;
60+}
5661
57−ApplicationTestInterface* s_appTestInterface = nullptr;
58−
59−static QObject* applicationTestInterface(QQmlEngine* engine, QJSEngine* scriptEngine) {
60− Q_UNUSED(engine);
61− Q_UNUSED(scriptEngine);
62− if (!s_appTestInterface) {
63− s_appTestInterface = new ApplicationTestInterface(engine);
64− }
65− return s_appTestInterface;
62+QObject* mirFocusControllerSingleton(QQmlEngine*, QJSEngine*)
63+{
64+ createUnityApplicationSharedSingletons();
65+ return MirFocusController::instance();
6666}
6767
68+} // anonymous namespace
69+
6870void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
6971{
70− qRegisterMetaType<Session*>("Session*");
7172 qRegisterMetaType<ApplicationInfo*>("ApplicationInfo*");
72− qRegisterMetaType<SessionModel*>("SessionModel*");
7373 qRegisterMetaType<unity::shell::application::MirSurfaceInterface*>("unity::shell::application::MirSurfaceInterface*");
74+ qRegisterMetaType<unity::shell::application::MirSurfaceListInterface*>("unity::shell::application::MirSurfaceListInterface*");
7475 qRegisterMetaType<Mir::Type>("Mir::Type");
7576 qRegisterMetaType<Mir::State>("Mir::State");
7677
7778 qmlRegisterUncreatableType<unity::shell::application::ApplicationManagerInterface>(uri, 0, 1, "ApplicationManagerInterface", "Abstract interface. Cannot be created in QML");
7879 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");
8080 qmlRegisterUncreatableType<MirSurface>(uri, 0, 1, "MirSurface", "MirSurface can't be instantiated from QML");
8181 qmlRegisterUncreatableType<unity::shell::application::MirSurfaceInterface>(
8282 uri, 0, 1, "MirSurface", "MirSurface can't be instantiated from QML");
83+ qmlRegisterSingletonType<MirFocusController>(uri, 0, 1, "MirFocusController", mirFocusControllerSingleton);
8384 qmlRegisterType<MirSurfaceItem>(uri, 0, 1, "MirSurfaceItem");
8485 qmlRegisterType<ApplicationInfo>(uri, 0, 1, "ApplicationInfo");
8586
8687 qmlRegisterSingletonType<ApplicationManager>(uri, 0, 1, "ApplicationManager", applicationManagerSingleton);
8788 qmlRegisterSingletonType<SurfaceManager>(uri, 0, 1, "SurfaceManager", surfaceManagerSingleton);
88− qmlRegisterSingletonType<SessionManager>(uri, 0, 1, "SessionManager", sessionManagerSingleton);
89− qmlRegisterSingletonType<ApplicationTestInterface>(uri, 0, 1, "ApplicationTest", applicationTestInterface);
9089 qmlRegisterSingletonType<UbuntuKeyboardInfo>(uri, 0, 1, "UbuntuKeyboardInfo", ubuntuKeyboardInfoSingleton);
9190
9291 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)
9594void FakeUnityApplicationQmlPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
9695{
9796 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);
10297}
tests/mocks/Utils/CMakeLists.txt+4
@@ -22,6 +22,10 @@ set(QMLPLUGIN_SRC
2222 ${CMAKE_SOURCE_DIR}/plugins/Utils/deviceconfigparser.cpp
2323 ${CMAKE_SOURCE_DIR}/plugins/Utils/globalfunctions.cpp
2424 ${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
2529 constants.cpp
2630 plugin.cpp
2731 windowstatestorage.cpp
tests/mocks/Utils/plugin.cpp+1−1
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * 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:
6464 void setExemptFromLifecycle(bool) override {}
6565 QSize initialSurfaceSize() const override { return QSize(); }
6666 void setInitialSurfaceSize(const QSize &) override {}
67+ MirSurfaceListInterface* surfaceList() override { return nullptr; }
6768
6869 // Methods used for mocking (not in the interface)
6970 void setFocused(bool focused) { m_focused = focused; Q_EMIT focusedChanged(focused); }
@@ -106,7 +107,7 @@ public:
106107 }
107108 return false;
108109 }
109− bool focusApplication(const QString &appId) override {
110+ bool focusApplication(const QString &appId) {
110111 Q_FOREACH(MockApp* app, m_list) {
111112 app->setFocused(app->appId() == appId);
112113 }
@@ -114,8 +115,6 @@ public:
114115 return true;
115116 }
116117
117− void unfocusCurrentApplication() override { }
118−
119118 void addApplication(MockApp *app) {
120119 beginInsertRows(QModelIndex(), count(), count());
121120 m_list.append(app);
tests/qmltests/CMakeLists.txt−1
@@ -88,7 +88,6 @@ add_unity8_qmltest(Stages DesktopStage)
8888add_unity8_qmltest(Stages PhoneStage)
8989add_unity8_qmltest(Stages SpreadDelegate)
9090add_unity8_qmltest(Stages SurfaceContainer)
91−add_unity8_qmltest(Stages SessionContainer)
9291add_unity8_qmltest(Stages TabletStage)
9392add_unity8_qmltest(Stages WindowResizeArea)
9493add_unity8_qmltest(Stages Splash)
tests/qmltests/Dash/tst_DashShell.qml+6−2
@@ -91,8 +91,12 @@ Item {
9191 var stopY = startY;
9292 touchFlick(shell, startX, startY, stopX, stopY);
9393
94− // Now do a long launcher movement
95− touchFlick(shell, stopX, startY, startX, stopY);
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;
99+ touchFlick(shell, startX, startY, stopX, stopY);
96100
97101 var launcher = findChild(shell, "launcher");
98102 var buttonShowDashHome = findChild(launcher, "buttonShowDashHome");
tests/qmltests/Greeter/tst_Greeter.qml+2−2
@@ -361,7 +361,7 @@ Item {
361361 }
362362
363363 function test_notifyAboutToFocusApp() {
364− greeter.notifyAboutToFocusApp("fake-app");
364+ greeter.notifyUserRequestedApp("fake-app");
365365 compare(viewTryToUnlockSpy.count, 1);
366366 compare(viewTryToUnlockSpy.signalArguments[0][0], false);
367367 }
@@ -500,7 +500,7 @@ Item {
500500
501501 // Test opening a locked app
502502 greeter.lockedApp = "test-app";
503− greeter.notifyAppFocused("test-app");
503+ greeter.notifyAppFocusRequested("test-app");
504504 verify(greeter.hasLockedApp);
505505 verify(!greeter.shown);
506506
tests/qmltests/Panel/tst_ActiveCallHint.qml+3−2
@@ -96,11 +96,12 @@ Item {
9696 function test_activeHint(data) {
9797 if (data.dialer) {
9898 var application = ApplicationManager.startApplication("dialer-app");
99− ApplicationManager.focusApplication("dialer-app");
99+ tryCompare(application.surfaceList, "count", 1);
100+ MirFocusController.focusedSurface = application.surfaceList.get(0);
100101 tryCompare(ApplicationManager, "focusedApplicationId", "dialer-app");
101102 tryCompare(application, "state", ApplicationInfoInterface.Running);
102103
103− if (!data.focused) { ApplicationManager.unfocusCurrentApplication(); }
104+ if (!data.focused) { MirFocusController.focusedSurface = null; }
104105 }
105106 callManager.foregroundCall = data.call;
106107 callManager.callIndicatorVisible = data.visible;
tests/qmltests/Panel/tst_Panel.qml+2−2
@@ -29,7 +29,7 @@ IndicatorTest {
2929 id: root
3030 width: units.gu(100)
3131 height: units.gu(71)
32− color: "white"
32+ color: "black"
3333
3434 Component.onCompleted: theme.name = "Ubuntu.Components.Themes.SuruDark"
3535
@@ -464,7 +464,7 @@ IndicatorTest {
464464
465465 callManager.foregroundCall = phoneCall;
466466
467− ApplicationManager.focusApplication("unity8-dash");
467+ MirFocusController.focusedSurface = ApplicationManager.findApplication("unity8-dash").surfaceList.get(0);
468468 tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash");
469469
470470 mouseClick(panel.indicators,
tests/qmltests/Stages/ApplicationCheckBox.qml+104−58
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -19,11 +19,17 @@ import QtQuick.Layouts 1.1
1919import Ubuntu.Components 1.3
2020import Unity.Application 0.1
2121
22−RowLayout {
22+Column {
2323 id: root
2424 property string appId
2525 property bool checked: false
2626
27+ function createSurface() {
28+ if (d.application) {
29+ d.application.createSurface();
30+ }
31+ }
32+
2733 enabled: appId !== "unity8-dash"
2834
2935 onCheckedChanged: {
@@ -38,77 +44,117 @@ RowLayout {
3844 d.bindGuard = false;
3945 }
4046
41− QtObject {
42− id: d
43− property bool bindGuard: false
44− property var application: null
45− Component.onCompleted: {
46− application = ApplicationManager.findApplication(root.appId);
47+ RowLayout {
48+
49+ QtObject {
50+ id: d
51+ property bool bindGuard: false
52+ property var application: null
53+ Component.onCompleted: {
54+ application = ApplicationManager.findApplication(root.appId);
55+ }
4756 }
48− }
4957
50− Connections {
51− target: ApplicationManager
52− onCountChanged: {
53− d.application = ApplicationManager.findApplication(root.appId);
58+ Connections {
59+ target: ApplicationManager
60+ onCountChanged: {
61+ d.application = ApplicationManager.findApplication(root.appId);
62+ }
5463 }
55− }
5664
57− Layout.fillWidth: true
58− CheckBox {
59− id: checkbox
60− checked: false
61− activeFocusOnPress: false
65+ Layout.fillWidth: true
66+ CheckBox {
67+ id: checkbox
68+ checked: false
69+ activeFocusOnPress: false
6270
63− onTriggered: {
64− if (d.bindGuard) { return; }
65− d.bindGuard = true;
71+ onTriggered: {
72+ if (d.bindGuard) { return; }
73+ d.bindGuard = true;
6674
67− if (checked) {
68− ApplicationManager.startApplication(root.appId);
69− } else {
70− ApplicationManager.stopApplication(root.appId);
75+ if (checked) {
76+ ApplicationManager.startApplication(root.appId);
77+ } else {
78+ ApplicationManager.stopApplication(root.appId);
79+ }
80+ d.bindGuard = false;
7181 }
72− d.bindGuard = false;
73− }
74− onCheckedChanged: {
75− if (d.bindGuard) { return; }
76− d.bindGuard = true;
82+ onCheckedChanged: {
83+ if (d.bindGuard) { return; }
84+ d.bindGuard = true;
7785
78− root.checked = checked;
86+ root.checked = checked;
7987
80− d.bindGuard = false;
88+ d.bindGuard = false;
89+ }
90+ Binding {
91+ target: checkbox
92+ property: "checked"
93+ value: d.application != null
94+ }
8195 }
82− Binding {
83− target: checkbox
84− property: "checked"
85− value: d.application != null
96+ Label {
97+ id: appIdLabel
98+ text: root.appId
99+ color: "white"
100+ anchors.verticalCenter: parent.verticalCenter
86101 }
87− }
88− Label {
89− id: appIdLabel
90− text: root.appId
91− color: "white"
92− anchors.verticalCenter: parent.verticalCenter
93− }
94− Rectangle {
95− color: {
96− if (d.application) {
97− if (d.application.state === ApplicationInfoInterface.Starting) {
98− return "yellow";
99− } else if (d.application.state === ApplicationInfoInterface.Running) {
100− return "green";
101− } else if (d.application.state === ApplicationInfoInterface.Suspended) {
102− return "blue";
102+ Rectangle {
103+ color: {
104+ if (d.application) {
105+ if (d.application.state === ApplicationInfoInterface.Starting) {
106+ return "yellow";
107+ } else if (d.application.state === ApplicationInfoInterface.Running) {
108+ return "green";
109+ } else if (d.application.state === ApplicationInfoInterface.Suspended) {
110+ return "blue";
111+ } else {
112+ return "darkred";
113+ }
103114 } else {
104115 return "darkred";
105116 }
106− } else {
107− return "darkred";
117+ }
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+ }
108157 }
109158 }
110− width: height
111− height: appIdLabel.height * 0.7
112− anchors.verticalCenter: parent.verticalCenter
113159 }
114160}
tests/qmltests/Stages/RecursingChildSessionControl.qml+10−61
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2014 Canonical Ltd.
2+ * Copyright 2014,2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -22,16 +22,7 @@ import Unity.Application 0.1
2222ColumnLayout {
2323 id: root
2424
25− property var session
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− }
25+ property var surface
3526
3627 Column {
3728 id: column
@@ -41,7 +32,7 @@ ColumnLayout {
4132
4233 Repeater {
4334 id: repeater
44− model: root.childSessions
35+ model: root.surface ? root.surface.promptSurfaceList : null
4536 delegate: Rectangle {
4637 border {
4738 color: "black"
@@ -71,8 +62,7 @@ ColumnLayout {
7162 }
7263
7364 onLoaded: {
74− item.session = modelData;
75− item.removable = true;
65+ item.surface = model.surface;
7666 }
7767 }
7868 }
@@ -83,62 +73,21 @@ ColumnLayout {
8373 Layout.fillWidth: true
8474 spacing: units.gu(1)
8575
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−
11676 RowLayout {
11777 id: buttonLayout
11878
11979 Button {
120− enabled: root.session
80+ enabled: root.surface
12181 activeFocusOnPress: false
122− text: removable ? "Remove" : "Release"
123− onClicked: {
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− }
82+ text: "Remove"
83+ onClicked: { root.surface.close(); }
13284 }
13385
13486 Button {
135− enabled: root.session !== null
87+ enabled: root.surface !== null
13688 activeFocusOnPress: false
137− text: "Add Child"
138− onClicked: {
139− var screenshot = Math.round(Math.random()*100 % (screenshotIds.length-1));
140− var session = ApplicationTest.addChildSession(root.session, root.screenshotIds[screenshot], true);
141− }
89+ text: "Add Prompt Surface"
90+ onClicked: { root.surface.createPromptSurface(); }
14291 }
14392 }
14493 }
tests/qmltests/Stages/tst_ApplicationWindow.qml+73−59
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2014-2015 Canonical Ltd.
2+ * Copyright 2014-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -34,16 +34,9 @@ Rectangle {
3434 root.fakeApplication = ApplicationManager.add("gallery-app");
3535 root.fakeApplication.manualSurfaceCreation = true;
3636 root.fakeApplication.setState(ApplicationInfoInterface.Starting);
37+ applicationWindowLoader.item.application = root.fakeApplication;
3738 }
3839 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− }
4740
4841 Loader {
4942 id: applicationWindowLoader
@@ -58,7 +51,6 @@ Rectangle {
5851 sourceComponent: Component {
5952 ApplicationWindow {
6053 anchors.fill: parent
61− application: fakeApplication
6254 surfaceOrientationAngle: 0
6355 interactive: true
6456 focus: true
@@ -86,18 +78,27 @@ Rectangle {
8678 Layout.fillWidth: true
8779
8880 CheckBox {
89− id: sessionCheckbox; checked: false
81+ id: surfaceCheckbox;
82+ checked: false;
9083 activeFocusOnPress: false
9184 onCheckedChanged: {
92− if (checked && !fakeApplication.session) {
93− fakeApplication.createSession();
94− } else if (!checked && fakeApplication.session) {
95− fakeApplication.destroySession();
85+ if (applicationWindowLoader.status !== Loader.Ready)
86+ return;
87+
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+ }
9697 }
9798 }
9899 }
99100 Label {
100− text: "Session"
101+ text: "Surface"
101102 anchors.verticalCenter: parent.verticalCenter
102103 }
103104 }
@@ -117,7 +118,7 @@ Rectangle {
117118 id: sessionControl
118119 anchors { left: parent.left; right: parent.right; }
119120
120− session: fakeSession
121+ surface: applicationWindowLoader.item ? applicationWindowLoader.item.surface : null
121122 }
122123 }
123124
@@ -143,7 +144,15 @@ Rectangle {
143144 }
144145 onSelectedApplicationStateChanged: {
145146 // state is a read-only property, thus we have to call the setter function
146− fakeApplication.setState(selectedApplicationState);
147+ if (fakeApplication && fakeApplication.state != selectedApplicationState) {
148+ fakeApplication.setState(selectedApplicationState);
149+ }
150+ }
151+ Connections {
152+ target: fakeApplication
153+ onStateChanged: {
154+ testCase.setApplicationState(state);
155+ }
147156 }
148157 }
149158
@@ -197,6 +206,8 @@ Rectangle {
197206 }
198207 }
199208
209+ property var applicationWindow: applicationWindowLoader.item
210+
200211 // holds some of the internal ApplicationWindow objects we probe during the tests
201212 property var stateGroup: null
202213
@@ -213,11 +224,6 @@ Rectangle {
213224 findInterestingApplicationWindowChildren();
214225 }
215226
216− function initSession() {
217− sessionCheckbox.checked = true;
218− sessionControl.surfaceCheckbox.checked = true;
219− }
220−
221227 function cleanup() {
222228 forgetApplicationWindowChildren();
223229
@@ -238,10 +244,17 @@ Rectangle {
238244 // deleted, so you end up with two instances in memory.
239245 tryCompare(applicationWindowLoader, "itemDestroyed", true);
240246
241− appStateSelector.selectedIndex = 0;
242− sessionCheckbox.checked = false;
247+ setApplicationState(appStarting);
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);
243254
244255 applicationWindowLoader.active = true;
256+
257+ applicationWindowLoader.item.application = root.fakeApplication;
245258 }
246259
247260 function test_showSplashUntilAppFullyInit_data() {
@@ -256,7 +269,7 @@ Rectangle {
256269 verify(stateGroup.state === "splashScreen");
257270
258271 if (data.swapInitOrder) {
259− initSession();
272+ surfaceCheckbox.checked = true;
260273 } else {
261274 setApplicationState(appRunning);
262275 }
@@ -266,14 +279,14 @@ Rectangle {
266279 if (data.swapInitOrder) {
267280 setApplicationState(appRunning);
268281 } else {
269− initSession();
282+ surfaceCheckbox.checked = true;
270283 }
271284
272285 tryCompare(stateGroup, "state", "surface");
273286 }
274287
275288 function test_suspendedAppShowsSurface() {
276− initSession();
289+ surfaceCheckbox.checked = true;
277290 setApplicationState(appRunning);
278291
279292 tryCompare(stateGroup, "state", "surface");
@@ -287,7 +300,7 @@ Rectangle {
287300 }
288301
289302 function test_killedAppShowsScreenshot() {
290− initSession();
303+ surfaceCheckbox.checked = true;
291304 setApplicationState(appRunning);
292305 tryCompare(stateGroup, "state", "surface");
293306
@@ -297,16 +310,17 @@ Rectangle {
297310 verify(fakeApplication.surface !== null);
298311
299312 // kill it!
313+ surfaceCheckbox.checked = false;
300314 setApplicationState(appStopped);
301315
302316 tryCompare(stateGroup, "state", "screenshot");
303− tryCompare(fakeApplication, "session", null);
317+ tryCompare(fakeApplication.surfaceList, "count", 0);
304318 }
305319
306320 function test_restartApp() {
307− var screenshotImage = findChild(applicationWindowLoader.item, "screenshotImage");
321+ var screenshotImage = findChild(applicationWindow, "screenshotImage");
308322
309− initSession();
323+ surfaceCheckbox.checked = true;
310324 setApplicationState(appRunning);
311325 tryCompare(stateGroup, "state", "surface");
312326 waitUntilTransitionsEnd(stateGroup);
@@ -314,109 +328,109 @@ Rectangle {
314328 setApplicationState(appSuspended);
315329
316330 // kill it
331+ surfaceCheckbox.checked = false;
317332 setApplicationState(appStopped);
318333
319334 tryCompare(stateGroup, "state", "screenshot");
320335 waitUntilTransitionsEnd(stateGroup);
321− tryCompare(fakeApplication, "session", null);
336+ tryCompare(applicationWindow, "surface", null);
322337
323338 // and restart it
324339 setApplicationState(appStarting);
325340
326341 waitUntilTransitionsEnd(stateGroup);
327342 verify(stateGroup.state === "screenshot");
328− verify(fakeSession === null);
343+ verify(applicationWindow.surface === null);
329344
330345 setApplicationState(appRunning);
331346
332347 waitUntilTransitionsEnd(stateGroup);
333348 verify(stateGroup.state === "screenshot");
334349
335− initSession();
350+ surfaceCheckbox.checked = true;
336351
337352 tryCompare(stateGroup, "state", "surface");
338353 tryCompare(screenshotImage, "status", Image.Null);
339354 }
340355
341356 function test_appCrashed() {
342− initSession();
357+ surfaceCheckbox.checked = true;
343358 setApplicationState(appRunning);
344359 tryCompare(stateGroup, "state", "surface");
345360 waitUntilTransitionsEnd(stateGroup);
346361
347362 // oh, it crashed...
363+ surfaceCheckbox.checked = false;
348364 setApplicationState(appStopped);
349365
350366 tryCompare(stateGroup, "state", "screenshot");
351− tryCompare(fakeApplication, "session", null);
367+ tryCompare(applicationWindow, "surface", null);
352368 }
353369
354370 function test_keepSurfaceWhileInvisible() {
355− initSession();
371+ surfaceCheckbox.checked = true;
356372 setApplicationState(appRunning);
357373 tryCompare(stateGroup, "state", "surface");
358374 waitUntilTransitionsEnd(stateGroup);
359− verify(fakeSession.lastSurface !== null);
375+ verify(applicationWindow.surface !== null);
360376
361− applicationWindowLoader.item.visible = false;
377+ applicationWindow.visible = false;
362378
363379 waitUntilTransitionsEnd(stateGroup);
364380 verify(stateGroup.state === "surface");
365− verify(fakeSession.lastSurface !== null);
381+ verify(applicationWindow.surface !== null);
366382
367− applicationWindowLoader.item.visible = true;
383+ applicationWindow.visible = true;
368384
369385 waitUntilTransitionsEnd(stateGroup);
370386 verify(stateGroup.state === "surface");
371− verify(fakeSession.lastSurface !== null);
387+ verify(applicationWindow.surface !== null);
372388 }
373389
374390 function test_touchesReachSurfaceWhenItsShown() {
375391 setApplicationState(appRunning);
376− initSession();
392+ surfaceCheckbox.checked = true;
377393
378394 tryCompare(stateGroup, "state", "surface");
379395
380396 waitUntilTransitionsEnd(stateGroup);
381397
382− var surfaceItem = findChild(applicationWindowLoader.item, "surfaceItem");
398+ var surfaceItem = findChild(applicationWindow, "surfaceItem");
383399 verify(surfaceItem);
384− verify(surfaceItem.surface === fakeSession.lastSurface);
400+ verify(surfaceItem.surface === applicationWindow.surface);
385401
386402 surfaceItem.touchPressCount = 0;
387403 surfaceItem.touchReleaseCount = 0;
388404
389− tap(applicationWindowLoader.item,
390− applicationWindowLoader.item.width / 2, applicationWindowLoader.item.height / 2);
405+ tap(applicationWindow);
391406
392407 verify(surfaceItem.touchPressCount === 1);
393408 verify(surfaceItem.touchReleaseCount === 1);
394409 }
395410
396411 function test_showNothingOnSuddenSurfaceLoss() {
397− initSession();
412+ surfaceCheckbox.checked = true;
398413 setApplicationState(appRunning);
399414 tryCompare(stateGroup, "state", "surface");
400415 waitUntilTransitionsEnd(stateGroup);
401416
402− sessionControl.surfaceCheckbox.checked = false;
417+ applicationWindow.surface = null;
403418
404419 tryCompare(stateGroup, "state", "void");
405420 }
406421
407422 function test_surfaceActiveFocusFollowsAppWindowInterative() {
408− fakeApplication.createSession();
409− applicationWindowLoader.item.interactive = false;
410− applicationWindowLoader.item.interactive = true;
411− fakeSession.createSurface();
423+ applicationWindow.interactive = false;
424+ applicationWindow.interactive = true;
425+ surfaceCheckbox.checked = true;
412426
413− compare(fakeSession.lastSurface.activeFocus, true);
427+ compare(applicationWindow.surface.activeFocus, true);
414428
415− applicationWindowLoader.item.interactive = false;
416− compare(fakeSession.lastSurface.activeFocus, false);
429+ applicationWindow.interactive = false;
430+ compare(applicationWindow.surface.activeFocus, false);
417431
418− applicationWindowLoader.item.interactive = true;
419− compare(fakeSession.lastSurface.activeFocus, true);
432+ applicationWindow.interactive = true;
433+ compare(applicationWindow.surface.activeFocus, true);
420434 }
421435 }
422436}
tests/qmltests/Stages/tst_DesktopStage.qml+243−161
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2015 Canonical, Ltd.
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.3
2020import Ubuntu.Components.ListItems 1.3
2121import Unity.Application 0.1
2222import Unity.Test 0.1
23+import WindowManager 0.1
2324import Utils 0.1
2425
2526import ".." // For EdgeBarrierControls
@@ -53,6 +54,11 @@ Item {
5354 }
5455 }
5556
57+ TopLevelSurfaceList {
58+ id: topSurfaceList
59+ applicationsModel: ApplicationManager
60+ }
61+
5662 Loader {
5763 id: desktopStageLoader
5864 x: ((root.width - controls.width) - width) / 2
@@ -68,6 +74,7 @@ Item {
6874 color: "white"
6975 anchors.fill: parent
7076 background: "../../../qml/graphics/tablet_background.jpg"
77+ focus: true
7178
7279 Component.onCompleted: {
7380 edgeBarrierControls.target = testCase.findChild(this, "edgeBarrierController");
@@ -76,6 +83,8 @@ Item {
7683 desktopStageLoader.itemDestroyed = true;
7784 }
7885 orientations: Orientations {}
86+ applicationManager: ApplicationManager
87+ topLevelSurfaceList: topSurfaceList
7988 }
8089 }
8190 }
@@ -103,7 +112,7 @@ Item {
103112 activeFocusOnPress: false
104113 onClicked: {
105114 if (ApplicationManager.focusedApplicationId) {
106− var surface = ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).session.lastSurface;
115+ var surface = ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).surfaceList.get(0);
107116 surface.slowToResize = true;
108117 }
109118 }
@@ -137,6 +146,19 @@ Item {
137146
138147 property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
139148
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+
140162 function cleanup() {
141163 desktopStageLoader.itemDestroyed = false;
142164 desktopStageLoader.active = false;
@@ -149,43 +171,71 @@ Item {
149171 // Shell instance gets destroyed.
150172 tryCompare(desktopStageLoader, "itemDestroyed", true);
151173
152− killAllRunningApps();
174+ killApps();
175+
176+ root.resetGeometry();
153177
154178 desktopStageLoader.active = true;
155179 tryCompare(desktopStageLoader, "status", Loader.Ready);
156− root.resetGeometry();
157− }
158180
159− function killAllRunningApps() {
160− while (ApplicationManager.count > 0) {
161− ApplicationManager.stopApplication(ApplicationManager.get(0).appId);
162− }
163− compare(ApplicationManager.count, 0)
164181 }
165182
166− function waitUntilAppSurfaceShowsUp(appId) {
167− var appWindow = findChild(desktopStage, "appWindow_" + appId);
183+ function waitUntilAppSurfaceShowsUp(surfaceId) {
184+ var appDelegate = findChild(desktopStage, "appDelegate_" + surfaceId);
185+ verify(appDelegate);
186+ var appWindow = findChild(appDelegate, "appWindow");
168187 verify(appWindow);
169188 var appWindowStates = findInvisibleChild(appWindow, "applicationWindowStateGroup");
170189 verify(appWindowStates);
171190 tryCompare(appWindowStates, "state", "surface");
172191 }
173192
193+ /*
194+ Returns the appDelegate of the first surface created by the app with the specified appId
195+ */
174196 function startApplication(appId) {
175− var app = ApplicationManager.findApplication(appId);
176− if (!app) {
197+ try {
198+ var app = ApplicationManager.findApplication(appId);
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;
177210 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");
178232 }
179− verify(app);
180− waitUntilAppSurfaceShowsUp(appId);
181− verify(app.session.lastSurface);
182− return app;
183233 }
184234
185235 function test_appFocusSwitch_data() {
186236 return [
187− {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
188− {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
237+ {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "gmail-webapp" ], focusfrom: 0, focusTo: 1 },
238+ {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "gmail-webapp" ], focusfrom: 1, focusTo: 0 },
189239 ]
190240 }
191241
@@ -193,10 +243,10 @@ Item {
193243 data.apps.forEach(startApplication);
194244
195245 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);
197247
198248 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);
200250 }
201251
202252 function test_tappingOnWindowChangesFocusedApp_data() {
@@ -207,21 +257,24 @@ Item {
207257 }
208258
209259 function test_tappingOnWindowChangesFocusedApp(data) {
210− data.apps.forEach(startApplication);
211− var fromAppId = data.apps[data.focusfrom];
212− var toAppId = data.apps[data.focusTo]
260+ var appDelegates = [];
261+ for (var i = 0; i < data.apps.length; i++) {
262+ appDelegates[i] = startApplication(data.apps[i]);
263+ }
264+ var fromDelegate = appDelegates[data.focusfrom];
265+ var toDelegate = appDelegates[data.focusTo];
213266
214− var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
267+ var fromAppWindow = findChild(fromDelegate, "appWindow");
215268 verify(fromAppWindow);
216269 tap(fromAppWindow);
217− compare(fromAppWindow.application.session.lastSurface.activeFocus, true);
218− compare(ApplicationManager.focusedApplicationId, fromAppId);
270+ compare(fromDelegate.surface.activeFocus, true);
271+ compare(MirFocusController.focusedSurface, fromDelegate.surface);
219272
220− var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
273+ var toAppWindow = findChild(toDelegate, "appWindow");
221274 verify(toAppWindow);
222275 tap(toAppWindow);
223− compare(toAppWindow.application.session.lastSurface.activeFocus, true);
224− compare(ApplicationManager.focusedApplicationId, toAppId);
276+ compare(toDelegate.surface.activeFocus, true);
277+ compare(MirFocusController.focusedSurface, toDelegate.surface);
225278 }
226279
227280 function test_clickingOnWindowChangesFocusedApp_data() {
@@ -229,21 +282,24 @@ Item {
229282 }
230283
231284 function test_clickingOnWindowChangesFocusedApp(data) {
232− data.apps.forEach(startApplication);
233− var fromAppId = data.apps[data.focusfrom];
234− var toAppId = data.apps[data.focusTo]
285+ var appDelegates = [];
286+ for (var i = 0; i < data.apps.length; i++) {
287+ appDelegates[i] = startApplication(data.apps[i]);
288+ }
289+ var fromDelegate = appDelegates[data.focusfrom];
290+ var toDelegate = appDelegates[data.focusTo];
235291
236− var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
292+ var fromAppWindow = findChild(fromDelegate, "appWindow");
237293 verify(fromAppWindow);
238294 mouseClick(fromAppWindow);
239− compare(fromAppWindow.application.session.lastSurface.activeFocus, true);
240− compare(ApplicationManager.focusedApplicationId, fromAppId);
295+ compare(fromDelegate.surface.activeFocus, true);
296+ compare(MirFocusController.focusedSurface, fromDelegate.surface);
241297
242− var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
298+ var toAppWindow = findChild(toDelegate, "appWindow");
243299 verify(toAppWindow);
244300 mouseClick(toAppWindow);
245− compare(toAppWindow.application.session.lastSurface.activeFocus, true);
246− compare(ApplicationManager.focusedApplicationId, toAppId);
301+ compare(toDelegate.surface.activeFocus, true);
302+ compare(MirFocusController.focusedSurface, toDelegate.surface);
247303 }
248304
249305 function test_tappingOnDecorationFocusesApplication_data() {
@@ -253,24 +309,49 @@ Item {
253309 ]
254310 }
255311
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+
256330 function test_tappingOnDecorationFocusesApplication(data) {
257− data.apps.forEach(startApplication);
331+ var appDelegates = [];
332+ for (var i = 0; i < data.apps.length; i++) {
333+ appDelegates[i] = startApplication(data.apps[i]);
334+ }
335+
336+ var fromDelegate = appDelegates[data.focusfrom];
337+ var toDelegate = appDelegates[data.focusTo];
258338
259− var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
339+ var fromAppDecoration = findChild(fromDelegate, "appWindowDecoration");
260340 verify(fromAppDecoration);
261341 tap(fromAppDecoration);
262342
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);
266344
267− var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
345+ var toAppDecoration = findChild(toDelegate, "appWindowDecoration");
268346 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+
269352 tap(toAppDecoration);
270353
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);
274355 }
275356
276357 function test_clickingOnDecorationFocusesApplication_data() {
@@ -278,159 +359,170 @@ Item {
278359 }
279360
280361 function test_clickingOnDecorationFocusesApplication(data) {
281− data.apps.forEach(startApplication);
362+ var appDelegates = [];
363+ for (var i = 0; i < data.apps.length; i++) {
364+ appDelegates[i] = startApplication(data.apps[i]);
365+ }
366+ var fromDelegate = appDelegates[data.focusfrom];
367+ var toDelegate = appDelegates[data.focusTo];
282368
283− var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
369+ var fromAppDecoration = findChild(fromDelegate, "appWindowDecoration");
284370 verify(fromAppDecoration);
285371 mouseClick(fromAppDecoration);
286− tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.lastSurface, "activeFocus", true);
372+ tryCompare(fromDelegate.surface, "activeFocus", true);
287373
288− var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
374+ var toAppDecoration = findChild(toDelegate, "appWindowDecoration");
289375 verify(toAppDecoration);
290376 mouseClick(toAppDecoration);
291− tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.lastSurface, "activeFocus", true);
377+ tryCompare(toDelegate.surface, "activeFocus", true);
292378 }
293379
294380 function test_windowMaximize() {
295− var apps = ["unity8-dash", "dialer-app", "camera-app"];
296− apps.forEach(startApplication);
297− var appName = "dialer-app";
298− var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
299− verify(appDelegate);
300− ApplicationManager.focusApplication(appName);
381+ var dialerDelegate = startApplication("dialer-app");
382+ startApplication("camera-app");
383+
384+ tryCompareFunction(function(){ return dialerDelegate.surface !== null; }, true);
385+ dialerDelegate.surface.requestFocus();
386+ tryCompare(dialerDelegate, "focus", true);
387+
301388 keyClick(Qt.Key_Up, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Up shortcut to maximize
302− tryCompare(appDelegate, "maximized", true);
303− tryCompare(appDelegate, "minimized", false);
389+ tryCompare(dialerDelegate, "maximized", true);
390+ tryCompare(dialerDelegate, "minimized", false);
304391 }
305392
306393 function test_windowMaximizeLeft() {
307− var apps = ["unity8-dash", "dialer-app", "camera-app"];
308− apps.forEach(startApplication);
309− var appName = "dialer-app";
310− var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
311− verify(appDelegate);
312− ApplicationManager.focusApplication(appName);
394+ var dialerDelegate = startApplication("dialer-app");
395+ startApplication("camera-app");
396+
397+ tryCompareFunction(function(){ return dialerDelegate.surface !== null; }, true);
398+ dialerDelegate.surface.requestFocus();
399+ tryCompare(dialerDelegate, "focus", true);
400+
313401 keyClick(Qt.Key_Left, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Left shortcut to maximizeLeft
314− tryCompare(appDelegate, "maximized", false);
315− tryCompare(appDelegate, "minimized", false);
316− tryCompare(appDelegate, "maximizedLeft", true);
317− tryCompare(appDelegate, "maximizedRight", false);
402+ tryCompare(dialerDelegate, "maximized", false);
403+ tryCompare(dialerDelegate, "minimized", false);
404+ tryCompare(dialerDelegate, "maximizedLeft", true);
405+ tryCompare(dialerDelegate, "maximizedRight", false);
318406 }
319407
320408 function test_windowMaximizeRight() {
321− var apps = ["unity8-dash", "dialer-app", "camera-app"];
322− apps.forEach(startApplication);
323− var appName = "dialer-app";
324− var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
325− verify(appDelegate);
326− ApplicationManager.focusApplication(appName);
409+ var dialerDelegate = startApplication("dialer-app");
410+ startApplication("camera-app");
411+
412+ tryCompareFunction(function(){ return dialerDelegate.surface !== null; }, true);
413+ dialerDelegate.surface.requestFocus();
414+ tryCompare(dialerDelegate, "focus", true);
415+
327416 keyClick(Qt.Key_Right, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Right shortcut to maximizeRight
328− tryCompare(appDelegate, "maximized", false);
329− tryCompare(appDelegate, "minimized", false);
330− tryCompare(appDelegate, "maximizedLeft", false);
331− tryCompare(appDelegate, "maximizedRight", true);
417+ tryCompare(dialerDelegate, "maximized", false);
418+ tryCompare(dialerDelegate, "minimized", false);
419+ tryCompare(dialerDelegate, "maximizedLeft", false);
420+ tryCompare(dialerDelegate, "maximizedRight", true);
332421 }
333422
334423 function test_windowMinimize() {
335− var apps = ["unity8-dash", "dialer-app", "camera-app"];
336− apps.forEach(startApplication);
337− var appName = "dialer-app";
338− var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
339− verify(appDelegate);
340− ApplicationManager.focusApplication(appName);
424+ var dialerDelegate = startApplication("dialer-app");
425+ startApplication("camera-app");
426+
427+ tryCompareFunction(function(){ return dialerDelegate.surface !== null; }, true);
428+ dialerDelegate.surface.requestFocus();
429+ tryCompare(dialerDelegate, "focus", true);
430+
341431 keyClick(Qt.Key_Down, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Down shortcut to minimize
342− tryCompare(appDelegate, "maximized", false);
343− tryCompare(appDelegate, "minimized", true);
432+ tryCompare(dialerDelegate, "maximized", false);
433+ tryCompare(dialerDelegate, "minimized", true);
344434 verify(ApplicationManager.focusedApplicationId != ""); // verify we don't lose focus when minimizing an app
345435 }
346436
347437 function test_windowMinimizeAll() {
348438 var apps = ["unity8-dash", "dialer-app", "camera-app"];
349439 apps.forEach(startApplication);
350− verify(ApplicationManager.count == 3);
440+ verify(topSurfaceList.count == 3);
351441 keyClick(Qt.Key_D, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+D shortcut to minimize all
352442 tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify no app is focused
353443 }
354444
355445 function test_windowClose() {
356− var apps = ["unity8-dash", "dialer-app", "camera-app"];
357− apps.forEach(startApplication);
358− verify(ApplicationManager.count == 3);
359− var appName = "dialer-app";
360− var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
361− verify(appDelegate);
362− ApplicationManager.focusApplication(appName);
446+ var dialerSurfaceId = topSurfaceList.nextId;
447+ var dialerDelegate = startApplication("dialer-app");
448+ verify(topSurfaceList.indexForId(dialerSurfaceId) !== -1);
449+ startApplication("gmail-webapp");
450+ verify(topSurfaceList.count == 3);
451+
452+ mouseClick(dialerDelegate);
453+
454+ var desktopStagePriv = findInvisibleChild(desktopStage, "DesktopStagePrivate");
455+ tryCompare(desktopStagePriv, "focusedAppDelegate", dialerDelegate);
456+
363457 keyClick(Qt.Key_F4, Qt.AltModifier); // Alt+F4 shortcut to close
364− verify(ApplicationManager.count == 2); // verify the app is gone
365− verify(ApplicationManager.findApplication(appName) === null); // and it's not in running apps
458+
459+ // verify the surface is gone
460+ tryCompare(topSurfaceList, "count", 2);
461+ verify(topSurfaceList.indexForId(dialerSurfaceId) === -1);
366462 }
367463
368464 function test_smashCursorKeys() {
369− var apps = ["unity8-dash", "dialer-app", "camera-app"];
465+ var apps = ["dialer-app", "gmail-webapp"];
370466 apps.forEach(startApplication);
371− verify(ApplicationManager.count == 3);
467+ verify(topSurfaceList.count == 3);
372468 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
374470
375471 // now try pressing all 4 arrow keys + ctrl + meta
376472 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
378474 }
379475
380476 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);
382480
383− var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
384− verify(dashDelegate);
481+ var decoratedWindow = findDecoratedWindow(dashSurfaceId);
482+ verify(decoratedWindow);
385483
386− findChild(dashDelegate, "decoratedWindow").minimize();
387− tryCompare(dashApp.session.lastSurface, "visible", false);
484+ tryCompare(dashSurface, "visible", true);
485+ decoratedWindow.minimize();
486+ tryCompare(dashSurface, "visible", false);
388487 }
389488
390489 function test_maximizeApplicationHidesSurfacesBehindIt() {
391− var dashApp = startApplication("unity8-dash");
392− var dialerApp = startApplication("dialer-app");
393− var gmailApp = startApplication("gmail-webapp");
490+ var dashDelegate = startApplication("unity8-dash");
491+ var dialerDelegate = startApplication("dialer-app");
492+ var gmailDelegate = startApplication("gmail-webapp");
394493
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
403495 dialerDelegate.maximize();
404496 tryCompare(dialerDelegate, "visuallyMaximized", true);
405497
406− tryCompare(dashApp.session.lastSurface, "visible", false);
407− compare(gmailApp.session.lastSurface.visible, true);
498+ tryCompare(dashDelegate.surface, "visible", false);
499+ compare(gmailDelegate.surface.visible, true);
408500
409− // restore
501+ // restore without raising
410502 dialerDelegate.restoreFromMaximized();
411− compare(dashApp.session.lastSurface.visible, true);
412− compare(gmailApp.session.lastSurface.visible, true);
503+ compare(dashDelegate.surface.visible, true);
504+ compare(gmailDelegate.surface.visible, true);
413505 }
414506
415507 function test_applicationsBecomeVisibleWhenOccludingAppRemoved() {
416− var dashApp = startApplication("unity8-dash");
417− var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
418− verify(dashDelegate);
508+ var dashApp = topSurfaceList.applicationAt(0);
419509
420− var dialerApp = startApplication("dialer-app");
421− var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app");
510+ var dialerSurfaceId = topSurfaceList.nextId;
511+ var dialerDelegate = startApplication("dialer-app");
422512 verify(dialerDelegate);
513+ var dialerApp = dialerDelegate.application;
423514
424515 var dialerMaximizeButton = findChild(dialerDelegate, "maximizeWindowButton");
425516 verify(dialerMaximizeButton);
426517 mouseClick(dialerMaximizeButton);
427518
428− var mapApp = startApplication("map");
429− var mapDelegate = findChild(desktopStage, "appDelegate_map");
519+ var mapSurfaceId = topSurfaceList.nextId;
520+ var mapDelegate = startApplication("map");
430521 verify(mapDelegate);
522+ var mapApp = mapDelegate.application;
431523
432− var gmailApp = startApplication("gmail-webapp");
433− var gmailDelegate = findChild(desktopStage, "appDelegate_gmail-webapp");
524+ var gmailSurfaceId = topSurfaceList.nextId;
525+ var gmailDelegate = startApplication("gmail-webapp");
434526 verify(gmailDelegate);
435527
436528 var gmailMaximizeButton = findChild(gmailDelegate, "maximizeWindowButton");
@@ -440,29 +532,27 @@ Item {
440532 tryCompare(dialerDelegate, "visuallyMaximized", true);
441533 tryCompare(gmailDelegate, "visuallyMaximized", true);
442534
443− tryCompare(dashApp.session.lastSurface, "visible", false);
444− tryCompare(dialerApp.session.lastSurface, "visible", false);
445− tryCompare(mapApp.session.lastSurface, "visible", false);
535+ tryCompare(dashApp.surfaceList.get(0), "visible", false);
536+ tryCompare(dialerApp.surfaceList.get(0), "visible", false);
537+ tryCompare(mapApp.surfaceList.get(0), "visible", false);
446538
447539 ApplicationManager.stopApplication("gmail-webapp");
448540
449− compare(mapApp.session.lastSurface.visible, true);
450− tryCompare(dialerApp.session.lastSurface, "visible", true);
451− tryCompare(dashApp.session.lastSurface, "visible", false); // still occluded by maximised dialer
541+ tryCompare(mapApp.surfaceList.get(0), "visible", true);
542+ tryCompare(dialerApp.surfaceList.get(0), "visible", true);
543+ tryCompare(dashApp.surfaceList.get(0), "visible", false); // still occluded by maximised dialer
452544 }
453545
454546 function test_maximisedAppStaysVisibleWhenAppStarts() {
455− var dashApp = startApplication("unity8-dash");
456− var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
457− verify(dashDelegate);
547+ var dashDelegate = startApplication("unity8-dash");
548+
458549 // maximize
459550 var dashMaximizeButton = findChild(dashDelegate, "maximizeWindowButton");
460551 verify(dashMaximizeButton);
461552 mouseClick(dashMaximizeButton);
462553 tryCompare(dashDelegate, "visuallyMaximized", true);
463554
464− var dialerApp = startApplication("dialer-app");
465− var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app");
555+ var dialerDelegate = startApplication("dialer-app");
466556 verify(dialerDelegate);
467557
468558 compare(dialerDelegate.visible, true, "Dialer should be visible");
@@ -470,14 +560,11 @@ Item {
470560 }
471561
472562 function test_occlusionWithMultipleMaximized() {
473− var dashApp = startApplication("unity8-dash");
474− var dashAppDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
563+ var dashAppDelegate = startApplication("unity8-dash");
475564
476− var dialerApp = startApplication("dialer-app");
477− var dialerAppDelegate = findChild(desktopStage, "appDelegate_dialer-app");
565+ var dialerAppDelegate = startApplication("dialer-app");
478566
479− var facebookApp = startApplication("facebook-webapp");
480− var facebookAppDelegate = findChild(desktopStage, "appDelegate_facebook-webapp");
567+ var facebookAppDelegate = startApplication("facebook-webapp");
481568
482569 // all of them are in restored state now. all should be visible
483570 tryCompare(dashAppDelegate, "visible", true);
@@ -491,13 +578,13 @@ Item {
491578 tryCompare(facebookAppDelegate, "visible", true);
492579
493580 // 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;
495582 tryCompare(dashAppDelegate, "visible", true);
496583 tryCompare(dialerAppDelegate, "visible", false);
497584 tryCompare(facebookAppDelegate, "visible", true);
498585
499586 // Now focus the dialer app. all 3 should be visible again
500− ApplicationManager.focusApplication("dialer-app");
587+ dialerAppDelegate.focus = true;
501588 tryCompare(dashAppDelegate, "visible", true);
502589 tryCompare(dialerAppDelegate, "visible", true);
503590 tryCompare(facebookAppDelegate, "visible", true);
@@ -510,20 +597,15 @@ Item {
510597 }
511598
512599 function test_dropShadow() {
513− // verify the drop shadow is not visible initially
514− verify(PanelState.dropShadow == false);
515−
516600 // start an app, maximize it
517− var facebookApp = startApplication("facebook-webapp");
518− var facebookAppDelegate = findChild(desktopStage, "appDelegate_facebook-webapp");
601+ var facebookAppDelegate = startApplication("facebook-webapp");
519602 facebookAppDelegate.maximize();
520603
521604 // verify the drop shadow is still not visible
522605 verify(PanelState.dropShadow == false);
523606
524607 // start a foreground app, not maximized
525− var dialerApp = startApplication("dialer-app");
526− var dialerAppDelegate = findChild(desktopStage, "appDelegate_dialer-app");
608+ var dialerAppDelegate = startApplication("dialer-app");
527609
528610 // verify the drop shadow becomes visible
529611 verify(PanelState.dropShadow == true);
@@ -532,7 +614,7 @@ Item {
532614 ApplicationManager.stopApplication("facebook-webapp");
533615
534616 // verify the drop shadow is gone
535− verify(PanelState.dropShadow == false);
617+ tryCompare(PanelState, "dropShadow", false);
536618 }
537619 }
538620}
tests/qmltests/Stages/tst_PhoneStage.qml+272−82
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2014-2015 Canonical Ltd.
2+ * Copyright 2014-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -22,8 +22,10 @@ import "../../../qml/Components"
2222import "../../../qml/Stages"
2323import Ubuntu.Components 1.3
2424import Unity.Application 0.1
25+import WindowManager 0.1
2526
2627Item {
28+ id: root
2729 width: units.gu(70)
2830 height: units.gu(70)
2931
@@ -38,63 +40,40 @@ Item {
3840 interactive: true
3941 shellOrientation: Qt.PortraitOrientation
4042 orientations: Orientations {}
43+ applicationManager: ApplicationManager
44+ topLevelSurfaceList: TopLevelSurfaceList {
45+ id: topLevelSurfaceList
46+ applicationsModel: ApplicationManager
47+ }
4148 }
4249
43− Rectangle {
44− anchors { fill: parent; leftMargin: phoneStage.width }
45−
46− Column {
47− id: buttons
48− anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
49− spacing: units.gu(1)
50− Button {
51− anchors { left: parent.left; right: parent.right }
52− text: "Add App"
53− activeFocusOnPress: false
54− onClicked: {
55− testCase.addApps();
56− }
57− }
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);
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)
57+ Rectangle {
58+ id: controlRect
59+ anchors { left: parent.left; right: parent.right }
60+ height: childrenRect.height + units.gu(2)
61+ color: "darkGrey"
62+ Column {
63+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
64+ spacing: units.gu(1)
65+ EdgeBarrierControls {
66+ id: edgeBarrierControls
67+ text: "Drag here to pull out spread"
68+ backgroundColor: "blue"
69+ onDragged: { phoneStage.pushRightEdge(amount); }
70+ Component.onCompleted: {
71+ edgeBarrierControls.target = testCase.findChild(phoneStage, "edgeBarrierController");
72+ }
7273 }
73− }
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
90− delegate: Rectangle {
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; }
74+ Repeater {
75+ model: ApplicationManager.availableApplications
76+ ApplicationCheckBox { appId: modelData }
9877 }
9978 }
10079 }
@@ -105,18 +84,41 @@ Item {
10584 name: "PhoneStage"
10685 when: windowShown
10786
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+
108108 function addApps(count) {
109109 if (count == undefined) count = 1;
110110 for (var i = 0; i < count; i++) {
111+ var appSurfaceId = topLevelSurfaceList.nextId;
111112 var app = ApplicationManager.startApplication(ApplicationManager.availableApplications[ApplicationManager.count])
112113 tryCompare(app, "state", ApplicationInfoInterface.Running)
113114 var spreadView = findChild(phoneStage, "spreadView");
114115 tryCompare(spreadView, "contentX", -spreadView.shift);
116+ waitUntilAppSurfaceShowsUp(appSurfaceId);
115117 waitForRendering(phoneStage)
116118 }
117119 }
118120
119− function goToSpread() {
121+ function performEdgeSwipeToShowAppSpread() {
120122 var spreadView = findChild(phoneStage, "spreadView");
121123
122124 // Keep it inside the PhoneStage otherwise the controls on the right side will
@@ -130,9 +132,46 @@ Item {
130132 true /* beginTouch */, true /* endTouch */, units.gu(10), 50);
131133
132134 tryCompare(spreadView, "phase", 2);
135+ tryCompare(spreadView, "flicking", false);
136+ tryCompare(spreadView, "moving", false);
133137 waitForRendering(phoneStage);
134138 }
135139
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+
136175 function test_shortFlick() {
137176 addApps(2)
138177 var startX = phoneStage.width - units.gu(1);
@@ -200,7 +239,7 @@ Item {
200239 tryCompare(spreadView, "phase", data.targetPhase)
201240
202241 if (data.targetPhase == 2) {
203− var app2 = findChild(spreadView, "appDelegate2");
242+ var app2 = findChild(spreadView, "spreadDelegate_" + topLevelSurfaceList.idAt(2));
204243 tryCompare(app2, "swipeToCloseEnabled", true);
205244 mouseClick(app2, units.gu(1), units.gu(1));
206245 }
@@ -226,11 +265,11 @@ Item {
226265
227266 var spreadView = findChild(phoneStage, "spreadView");
228267
229− goToSpread();
268+ performEdgeSwipeToShowAppSpread();
230269
231270 tryCompare(spreadView, "phase", 2);
232271
233− var tile = findChild(spreadView, "appDelegate" + data.index);
272+ var tile = findChild(spreadView, "spreadDelegate_" + topLevelSurfaceList.idAt(data.index));
234273 var appId = ApplicationManager.get(data.index).appId;
235274
236275 if (tile.mapToItem(spreadView).x > spreadView.width) {
@@ -266,7 +305,7 @@ Item {
266305 var spreadView = findChild(phoneStage, "spreadView");
267306 var selectedApp = ApplicationManager.get(data.index);
268307
269− goToSpread();
308+ performEdgeSwipeToShowAppSpread();
270309
271310 phoneStage.select(selectedApp.appId);
272311
@@ -280,7 +319,7 @@ Item {
280319
281320 var focusedAppId = ApplicationManager.focusedApplicationId;
282321
283− goToSpread();
322+ performEdgeSwipeToShowAppSpread();
284323
285324 mouseClick(phoneStage, units.gu(1), units.gu(1));
286325
@@ -292,15 +331,26 @@ Item {
292331 compare(focusedAppId, ApplicationManager.focusedApplicationId);
293332 }
294333
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+
295343 function cleanup() {
296− while (ApplicationManager.count > 1) {
297− var oldCount = ApplicationManager.count;
298− var closingIndex = ApplicationManager.focusedApplicationId == "unity8-dash" ? 1 : 0
299− ApplicationManager.stopApplication(ApplicationManager.get(closingIndex).appId)
300− tryCompare(ApplicationManager, "count", oldCount - 1)
301− }
344+ killApps();
345+
302346 phoneStage.shellOrientationAngle = 0;
303347 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+ }
304354 }
305355
306356 function test_focusNewTopMostAppAfterFocusedOneClosesItself() {
@@ -323,16 +373,16 @@ Item {
323373 function test_cantCloseWhileSnapping() {
324374 addApps(2);
325375
326− goToSpread();
376+ performEdgeSwipeToShowAppSpread();
327377
328378 var spreadView = findChild(phoneStage, "spreadView");
329379 var selectedApp = ApplicationManager.get(2);
330380
331− goToSpread();
381+ performEdgeSwipeToShowAppSpread();
332382
333− var app0 = findChild(spreadView, "appDelegate0");
334− var app1 = findChild(spreadView, "appDelegate1");
335− var app2 = findChild(spreadView, "appDelegate2");
383+ var app0 = findChild(spreadView, "spreadDelegate_" + topLevelSurfaceList.idAt(0));
384+ var app1 = findChild(spreadView, "spreadDelegate_" + topLevelSurfaceList.idAt(1));
385+ var app2 = findChild(spreadView, "spreadDelegate_" + topLevelSurfaceList.idAt(2));
336386
337387 var dragArea0 = findChild(app0, "dragArea");
338388 var dragArea1 = findChild(app1, "dragArea");
@@ -382,10 +432,10 @@ Item {
382432 addApps(2);
383433
384434 if (data.inSpread) {
385− goToSpread();
435+ performEdgeSwipeToShowAppSpread();
386436 }
387437
388− var focusedDelegate = findChild(phoneStage, "appDelegate0");
438+ var focusedDelegate = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(0));
389439 phoneStage.inverseProgress = data.leftEdgeDragWidth;
390440
391441 tryCompare(focusedDelegate, "x", data.shouldMoveApp ? data.leftEdgeDragWidth : 0);
@@ -398,9 +448,9 @@ Item {
398448 function test_focusedAppIsTheOnlyRunningApp() {
399449 addApps(2);
400450
401− var delegateA = findChild(phoneStage, "appDelegate0");
451+ var delegateA = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(0));
402452 verify(delegateA);
403− var delegateB = findChild(phoneStage, "appDelegate1");
453+ var delegateB = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(1));
404454 verify(delegateB);
405455
406456 // A is focused and running, B is unfocused and suspended
@@ -410,7 +460,7 @@ Item {
410460 compare(delegateB.application.requestedState, ApplicationInfoInterface.RequestedSuspended);
411461
412462 // Switch foreground/focused appp from A to B
413− goToSpread();
463+ performEdgeSwipeToShowAppSpread();
414464 phoneStage.select(delegateB.application.appId);
415465
416466 // Now it's the other way round
@@ -424,14 +474,14 @@ Item {
424474 function test_dashRemainsRunningIfStageIsToldSo() {
425475 addApps(1);
426476
427− var delegateDash = findChild(phoneStage, "appDelegate1");
477+ var delegateDash = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(1));
428478 verify(delegateDash);
429479 compare(delegateDash.application.appId, "unity8-dash");
430480
431− var delegateOther = findChild(phoneStage, "appDelegate0");
481+ var delegateOther = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(0));
432482 verify(delegateOther);
433483
434− goToSpread();
484+ performEdgeSwipeToShowAppSpread();
435485 phoneStage.select("unity8-dash");
436486
437487 tryCompare(delegateDash, "focus", true);
@@ -439,7 +489,7 @@ Item {
439489 compare(delegateOther.focus, false);
440490 compare(delegateOther.application.requestedState, ApplicationInfoInterface.RequestedSuspended);
441491
442− goToSpread();
492+ performEdgeSwipeToShowAppSpread();
443493 phoneStage.select(delegateOther.application.appId);
444494
445495 // The other app gets focused and running but dash is kept running despite being unfocused
@@ -452,7 +502,7 @@ Item {
452502 function test_foregroundAppIsSuspendedWhenStageIsSuspended() {
453503 addApps(1);
454504
455− var delegate = findChild(phoneStage, "appDelegate0");
505+ var delegate = findChild(phoneStage, "spreadDelegate_" + topLevelSurfaceList.idAt(0));
456506 verify(delegate);
457507
458508 compare(delegate.focus, true);
@@ -476,5 +526,145 @@ Item {
476526 }
477527 tryCompare(spreadView, "phase", 2);
478528 }
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+ }
479669 }
480670}
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

This diff is too big to show here.

tests/qmltests/Stages/tst_SurfaceContainer.qml+242−46

This diff is too big to show here.

tests/qmltests/Stages/tst_TabletStage.qml+252−89

This diff is too big to show here.

tests/qmltests/Tutorial/tst_Tutorial.qml+4−8

This diff is too big to show here.

tests/qmltests/tst_OrientedShell.qml+124−87

This diff is too big to show here.

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+21−3

This diff is too big to show here.