on xenial help sign in
merge trunk
commit33d7ebac9a82f8bd029d57a9c16ee16162fd9c1b authorMichael Zanetti <michael.zanetti@canonical.com> dateMon 26 Oct 2015, 12:08 (11 years ago) parent00d1a1ec2dc0bb
160 files changed+1472−1363
CMakeLists.txt+3 data/CMakeLists.txt+3 data/unity8.conf+10 debian/changelog+55 debian/control+3−3 debian/unity8.install+2 plugins/IntegratedLightDM/UsersModel.cpp+7−6 plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp+2−1 plugins/ScreenGrabber/screengrabber.cpp+2−2 plugins/ScreenGrabber/screengrabber.h+1−1 plugins/Unity/CMakeLists.txt+1 plugins/Unity/Launcher/desktopfilehandler.cpp+3−2 plugins/Unity/Platform/CMakeLists.txt+9 plugins/Unity/Platform/platform.cpp+43 plugins/Unity/Platform/platform.h+58 plugins/Unity/Platform/plugin.cpp+27 plugins/Utils/relativetimeformatter.h → plugins/Unity/Platform/plugin.h+10−12 plugins/Unity/Platform/qmldir+2 plugins/Unity/Session/dbusunitysessionservice.cpp+2−1 plugins/Utils/CMakeLists.txt−2 plugins/Utils/plugin.cpp−5 plugins/Utils/relativetimeformatter.cpp−260 plugins/Utils/timeformatter.cpp−206 plugins/Utils/timeformatter.h−68 plugins/Utils/timezoneFormatter.cpp+1−1 po/am.po+2−2 po/ar.po+2−2 po/ast.po+26−26 po/az.po+2−2 po/be.po+2−2 po/bg.po+2−2 po/br.po+5−5 po/bs.po+2−2 po/ca.po+2−2 po/ca@valencia.po+2−2 po/ce.po+2−2 po/ckb.po+2−2 po/cs.po+2−2 po/cy.po+2−2 po/da.po+2−2 po/de.po+2−2 po/el.po+2−2 po/en_AU.po+2−2 po/en_GB.po+2−2 po/eo.po+2−2 po/es.po+2−2 po/eu.po+2−2 po/fa.po+2−2 po/fi.po+2−2 po/fo.po+2−2 po/fr.po+2−2 po/ga.po+2−2 po/gd.po+2−2 po/gl.po+2−2 po/gv.po+2−2 po/he.po+2−2 po/hi.po+2−2 po/hr.po+124−116 po/hu.po+2−2 po/hy.po+2−2 po/ia.po+2−2 po/id.po+2−2 po/is.po+2−2 po/it.po+2−2 po/ja.po+4−4 po/km.po+2−2 po/kn.po+2−2 po/ko.po+2−2 po/ku.po+2−2 po/ky.po+2−2 po/lo.po+2−2 po/lt.po+2−2 po/lv.po+2−2 po/ml.po+2−2 po/mr.po+2−2 po/ms.po+2−2 po/my.po+2−2 po/nb.po+2−2 po/nl.po+2−2 po/nn.po+2−2 po/oc.po+2−2 po/or.po+2−2 po/pa.po+2−2 po/pl.po+5−5 po/pt.po+2−2 po/pt_BR.po+2−2 po/ro.po+2−2 po/ru.po+2−2 po/shn.po+2−2 po/si.po+2−2 po/sk.po+2−2 po/sl.po+2−2 po/sq.po+2−2 po/sr.po+2−2 po/sv.po+2−2 po/sw.po+2−2 po/ta.po+2−2 po/te.po+2−2 po/th.po+2−2 po/tr.po+4−4 po/ug.po+9−9 po/uk.po+2−2 po/ur.po+2−2 po/uz.po+2−2 po/vi.po+2−2 po/xh.po+2−2 po/zh_CN.po+2−2 po/zh_HK.po+2−2 po/zh_TW.po+2−2 qml/Components/Dialogs.qml+3−2 qml/Components/ScreenGrabber.qml+4−1 qml/Components/WallpaperResolver.qml+63 qml/DeviceConfiguration.qml+1 qml/DisabledScreenNotice.qml+49 qml/Notifications/Notification.qml+4−2 qml/Notifications/NotificationMenuItemFactory.qml+2−1 qml/Notifications/Notifications.qml+2 qml/OrientedShell.qml+10−1 qml/Panel/Indicators/MenuItemFactory.qml+19−15 qml/Panel/Indicators/MessageMenuItemFactory.qml+35−26 qml/Rotation/RotationStates.qml+2−2 qml/Shell.qml+10−33 qml/Stages/ApplicationWindow.qml+2 qml/Stages/DecoratedWindow.qml+1−1 qml/Stages/SurfaceContainer.qml+1 src/ApplicationArguments.h+10−2 src/CMakeLists.txt+3 src/SecondaryWindow.cpp+31 src/SecondaryWindow.h+30 src/ShellApplication.cpp+197 src/ShellApplication.h+55 src/ShellView.cpp+59 src/ShellView.h+34 src/main.cpp+4−101 tests/autopilot/unity8/fixture_setup.py+1−1 tests/autopilot/unity8/greeter/tests/__init__.py+1−1 tests/autopilot/unity8/launcher.py+1−1 tests/autopilot/unity8/settings_wizard/__init__.py+7−2 tests/autopilot/unity8/settings_wizard/tests/test_settings_wizard.py+10−5 tests/autopilot/unity8/shell/__init__.py+1−1 tests/autopilot/unity8/shell/tests/__init__.py+1−1 tests/mocks/Unity/Launcher/MockQuickListModel.cpp+1−1 tests/mocks/Unity/fake_resultsmodel.cpp+1−1 tests/mocks/Unity/fake_scopesoverview.cpp+1−1 tests/mocks/Utils/CMakeLists.txt−2 tests/mocks/Utils/Utils.qmltypes+31−28 tests/mocks/Utils/plugin.cpp−13 tests/plugins/ScreenGrabber/ScreenGrabberTest.cpp+11 tests/plugins/ScreenGrabber/grabber.qml+1−1 tests/plugins/Unity/Indicators/UnityMenuModelStackTest.cpp+2−9 tests/plugins/Utils/CMakeLists.txt−1 tests/plugins/Utils/TimeFormatterTest.cpp−155 tests/plugins/Wizard/tst_pagelist.cpp+5−5 tests/qmltests/CMakeLists.txt+2 tests/qmltests/Components/tst_WallpaperResolver.qml+89 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+6−16 tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+6−13 tests/qmltests/tst_DisabledScreenNotice.qml+37 tests/qmltests/tst_OrientedShell.qml+51−1 tests/qmltests/tst_Shell.qml−24
CMakeLists.txt+3
@@ -101,6 +101,9 @@ add_definitions(-DQT_NO_KEYWORDS)
101101# Save a few container detach and conversions
102102add_definitions(-DQT_STRICT_ITERATORS)
103103
104+# Use the fast string builder
105+add_definitions(-DQT_USE_QSTRINGBUILDER)
106+
104107# Autopilot tests
105108include(autopilot)
106109declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
data/CMakeLists.txt+3
@@ -11,5 +11,8 @@ install(FILES
1111 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
1212 )
1313
14+add_custom_target(pkgversion ALL COMMAND dpkg-parsechangelog -l${CMAKE_SOURCE_DIR}/debian/changelog --show-field version > ${CMAKE_CURRENT_BINARY_DIR}/version)
15+
1416install(FILES com.canonical.Unity8.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
1517install(FILES unity8-dash.url-dispatcher DESTINATION ${CMAKE_INSTALL_DATADIR}/url-dispatcher/urls)
18+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/version DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/unity8)
data/unity8.conf+10
@@ -46,6 +46,16 @@ pre-start script
4646 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
4747
4848 initctl emit --no-wait indicator-services-start
49+
50+ # Disable Qt's stuttering 'touch compression' to fix scrolling smoothness
51+ # issues (LP: #1486341). As a bonus, this eliminates most of the
52+ # lag seen in the indicator panel pull-down (LP: #1488327) and also
53+ # reduces lag seen in apps:
54+ initctl set-env --global QML_NO_TOUCH_COMPRESSION=1
55+
56+ # For twice the fun and half the latency, try this (Warning: not all
57+ # devices are fast enough to keep up smoothly yet)...
58+ # initctl set-env MIR_SERVER_NBUFFERS=2
4959end script
5060
5161exec ${BINARY:-unity8} $ARGS
debian/changelog+55
@@ -1,3 +1,58 @@
1+unity8 (8.11+15.10.20151021-0ubuntu1) wily; urgency=medium
2+
3+ [ Albert Astals Cid ]
4+ * Clazy fixes
5+ * Enable Efficient String Construction by default
6+
7+ [ CI Train Bot ]
8+ * New rebuild forced.
9+
10+ [ Daniel d'Andrada ]
11+ * Have unity8 drawing its own cursor (LP: #1488417)
12+ * Initial multi-monitor support
13+
14+ [ Daniel van Vugt ]
15+ * Disable Qt's stuttering 'touch compression' to fix scrolling
16+ smoothness (LP: #1486341, #1488327)
17+
18+ [ Lukáš Tinkl ]
19+ * Fix autopilot wizard test skipping the reporting page
20+ * Implement Unity.Platform plugin wrapping org.freedesktop.hostname1
21+ (LP: #1504318)
22+ * React to window title (aka surface name) changes (LP: #1497092)
23+ * Rotate the screenshots according to the actual orientation
24+
25+ [ Michał Sawicz ]
26+ * Fix application API dependency
27+ * Have unity8 drawing its own cursor (LP: #1488417)
28+ * Initial multi-monitor support
29+ * Rotate the screenshots according to the actual orientation
30+
31+ [ Nick Dedekind ]
32+ * Fixed leak in UnityMenuModelStackTest
33+ * Moved time translation to SDK (LP: #1372061)
34+
35+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 21 Oct 2015 11:51:53 +0000
36+
37+unity8 (8.11+15.10.20151009-0ubuntu1) wily; urgency=medium
38+
39+ [ CI Train Bot ]
40+ * New rebuild forced.
41+
42+ [ Pawel Stolowski ]
43+ * Store unity8 package version in /var/lib/.../version file for fast
44+ retrieval from the shell plugin.
45+
46+ -- Pawel Stolowski <ci-train-bot@canonical.com> Fri, 09 Oct 2015 09:13:03 +0000
47+
48+unity8 (8.11+15.10.20151008-0ubuntu1) wily; urgency=medium
49+
50+ [ Lukáš Tinkl ]
51+ * Revert to using plaintext instead of HTML-like markup for the
52+ notifications (LP: #1504256)
53+
54+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 08 Oct 2015 20:46:26 +0000
55+
156unity8 (8.11+15.10.20151002-0ubuntu1) wily; urgency=medium
257
358 [ CI Train Bot ]
debian/control+3−3
@@ -50,7 +50,7 @@ Build-Depends: cmake,
5050 qtdeclarative5-private-dev (>= 5.2.1),
5151 qtdeclarative5-qtmultimedia-plugin,
5252 qtdeclarative5-ubuntu-settings-components (>= 0.6),
53− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.1.1239) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.1.1239),
53+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1627) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1627),
5454 qtdeclarative5-ubuntu-web-plugin,
5555 ttf-ubuntu-font-family,
5656Standards-Version: 3.9.4
@@ -65,7 +65,7 @@ X-Ubuntu-Use-Langpack: yes
6565Package: indicators-client
6666Architecture: amd64 armhf i386
6767Depends: qmenumodel-qml (>= 0.2.9),
68− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.1.1239) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.1.1239),
68+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1627) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1627),
6969 unity8 (= ${binary:Version}),
7070 ${misc:Depends},
7171 ${shlibs:Depends},
@@ -124,7 +124,7 @@ Architecture: all
124124Depends: qml-module-qtquick-layouts,
125125 qtdeclarative5-ubuntu-settings-components (>= 0.6),
126126 qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
127− qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.1.1239) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.1.1239),
127+ qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 1.3.1627) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 1.3.1627),
128128 qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
129129 ubuntu-thumbnailer-impl-0,
130130 unity-application-impl-9,
debian/unity8.install+2
@@ -1,3 +1,4 @@
1+var/lib/unity8/version
12data/unity8-dash.conf usr/share/upstart/sessions/
23data/unity8-filewatcher.conf usr/share/upstart/sessions/
34data/unity8.conf usr/share/upstart/sessions/
@@ -11,6 +12,7 @@ usr/share/unity8/Panel
1112usr/share/unity8/Rotation
1213usr/share/unity8/DeviceConfiguration.qml
1314usr/share/unity8/OrientedShell.qml
15+usr/share/unity8/DisabledScreenNotice.qml
1416usr/share/unity8/Shell.qml
1517usr/share/unity8/Stages
1618usr/share/unity8/Tutorial
plugins/IntegratedLightDM/UsersModel.cpp+7−6
@@ -43,16 +43,17 @@ MangleModel::MangleModel(QObject* parent)
4343
4444QVariant MangleModel::data(const QModelIndex &index, int role) const
4545{
46− QVariant data = QSortFilterProxyModel::data(index, role);
46+ QVariant variantData = QSortFilterProxyModel::data(index, role);
4747
4848 // If user's real name is empty, switch to unix name
49− if (role == QLightDM::UsersModel::RealNameRole && data.toString().isEmpty()) {
50− data = QSortFilterProxyModel::data(index, QLightDM::UsersModel::NameRole);
51− } else if (role == QLightDM::UsersModel::BackgroundPathRole && data.toString().startsWith('#')) {
52− data = "data:image/svg+xml,<svg><rect width='100%' height='100%' fill='" + data.toString() + "'/></svg>";
49+ if (role == QLightDM::UsersModel::RealNameRole && variantData.toString().isEmpty()) {
50+ variantData = QSortFilterProxyModel::data(index, QLightDM::UsersModel::NameRole);
51+ } else if (role == QLightDM::UsersModel::BackgroundPathRole && variantData.toString().startsWith('#')) {
52+ const QString stringData = "data:image/svg+xml,<svg><rect width='100%' height='100%' fill='" + variantData.toString() + "'/></svg>";
53+ variantData = stringData;
5354 }
5455
55− return data;
56+ return variantData;
5657}
5758
5859// **** Now we continue with actual UsersModel class ****
plugins/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp+2−1
@@ -34,7 +34,8 @@ UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
3434 entries.reserve(users.count());
3535 Q_FOREACH(const QString &user, users)
3636 {
37− QString name = settings.value(user + "/name", user[0].toUpper() + user.mid(1)).toString();
37+ QVariant defaultValue = QString(user[0].toUpper() + user.mid(1));
38+ QString name = settings.value(user + "/name", defaultValue).toString();
3839 entries.append({user, name, 0, 0, false, false, 0, 0});
3940 }
4041}
plugins/ScreenGrabber/screengrabber.cpp+2−2
@@ -60,7 +60,7 @@ ScreenGrabber::ScreenGrabber(QObject *parent)
6060 }
6161}
6262
63−void ScreenGrabber::captureAndSave()
63+void ScreenGrabber::captureAndSave(int angle)
6464{
6565 if (fileNamePrefix.isEmpty())
6666 {
@@ -82,7 +82,7 @@ void ScreenGrabber::captureAndSave()
8282 return;
8383 }
8484
85− const QImage screenshot = main_window->grabWindow();
85+ const QImage screenshot = main_window->grabWindow().transformed(QTransform().rotate(angle));
8686 const QString filename = makeFileName();
8787 qDebug() << "Saving screenshot to" << filename;
8888 auto saveOp = QtConcurrent::run(saveScreenshot, screenshot, filename, getFormat(), screenshotQuality);
plugins/ScreenGrabber/screengrabber.h+1−1
@@ -29,7 +29,7 @@ public:
2929 ~ScreenGrabber() = default;
3030
3131public Q_SLOTS:
32− void captureAndSave();
32+ void captureAndSave(int angle = 0);
3333
3434Q_SIGNALS:
3535 void screenshotSaved(const QString &filename);
plugins/Unity/CMakeLists.txt+1
@@ -4,3 +4,4 @@ add_subdirectory(Launcher)
44add_subdirectory(Session)
55add_subdirectory(DashCommunicator)
66add_subdirectory(InputInfo)
7+add_subdirectory(Platform)
plugins/Unity/Launcher/desktopfilehandler.cpp+3−2
@@ -111,8 +111,9 @@ QString DesktopFileHandler::displayName() const
111111 settings.beginGroup(QStringLiteral("Desktop Entry"));
112112
113113 // First try to find Name[xx_YY] and Name[xx] in .desktop file
114− QString locale = QLocale().name();
115− QString shortLocale = locale.split('_').first();
114+ const QString locale = QLocale().name();
115+ const QStringList splitLocale = locale.split(QLatin1Char('_'));
116+ const QString shortLocale = splitLocale.first();
116117
117118 if (locale != shortLocale && settings.contains(QStringLiteral("Name[%1]").arg(locale))) {
118119 return settings.value(QStringLiteral("Name[%1]").arg(locale)).toString();
plugins/Unity/Platform/CMakeLists.txtnew file+9
@@ -0,0 +1,9 @@
1+set(platformplugin_SRCS
2+ platform.cpp
3+ plugin.cpp)
4+
5+add_library(Platform-qml SHARED ${platformplugin_SRCS})
6+
7+qt5_use_modules(Platform-qml DBus Qml)
8+
9+add_unity8_plugin(Unity.Platform 1.0 Unity/Platform TARGETS Platform-qml)
plugins/Unity/Platform/platform.cppnew file+43
@@ -0,0 +1,43 @@
1+/*
2+ * Copyright (C) 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 "platform.h"
18+
19+#include <QDBusConnection>
20+
21+Platform::Platform(QObject *parent)
22+ : QObject(parent)
23+ , m_iface("org.freedesktop.hostname1", "/org/freedesktop/hostname1", "org.freedesktop.hostname1",
24+ QDBusConnection::systemBus(), this)
25+{
26+ QMetaObject::invokeMethod(this, "init");
27+}
28+
29+void Platform::init()
30+{
31+ m_chassis = m_iface.property("Chassis").toString();
32+ m_isPC = (m_chassis == "desktop" || m_chassis == "laptop" || m_chassis == "server");
33+}
34+
35+QString Platform::chassis() const
36+{
37+ return m_chassis;
38+}
39+
40+bool Platform::isPC() const
41+{
42+ return m_isPC;
43+}
plugins/Unity/Platform/platform.hnew file+58
@@ -0,0 +1,58 @@
1+/*
2+ * Copyright (C) 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 PLATFORM_H
18+#define PLATFORM_H
19+
20+#include <QDBusInterface>
21+
22+/**
23+ * @brief The Platform class
24+ *
25+ * Wrapper around platform detection support (org.freedesktop.hostname1)
26+ */
27+class Platform: public QObject
28+{
29+ Q_OBJECT
30+ /**
31+ * The chassis property
32+ *
33+ * Supported values include: "laptop", "computer", "handset" or "tablet"
34+ * For full list see: http://www.freedesktop.org/wiki/Software/systemd/hostnamed/
35+ */
36+ Q_PROPERTY(QString chassis READ chassis CONSTANT)
37+ /**
38+ * Whether the machine is an ordinary PC (desktop, laptop or server)
39+ */
40+ Q_PROPERTY(bool isPC READ isPC CONSTANT)
41+
42+public:
43+ Platform(QObject *parent = nullptr);
44+ ~Platform() = default;
45+
46+ QString chassis() const;
47+ bool isPC() const;
48+
49+private Q_SLOTS:
50+ void init();
51+
52+private:
53+ QDBusInterface m_iface;
54+ QString m_chassis;
55+ bool m_isPC;
56+};
57+
58+#endif // PLATFORM_H
plugins/Unity/Platform/plugin.cppnew file+27
@@ -0,0 +1,27 @@
1+/*
2+ * Copyright (C) 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 "plugin.h"
18+#include "platform.h"
19+
20+#include <QtQml>
21+
22+void GlobalShortcutPlugin::registerTypes(const char *uri)
23+{
24+ Q_ASSERT(uri == QLatin1String("Unity.Platform"));
25+
26+ qmlRegisterSingletonType<Platform>(uri, 1, 0, "Platform", [](QQmlEngine*, QJSEngine*) -> QObject* { return new Platform; });
27+}
plugins/Utils/relativetimeformatter.h → plugins/Unity/Platform/plugin.hrenamed+10−12
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2014 Canonical Ltd.
2+ * Copyright (C) 2015 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
@@ -12,23 +12,21 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
1615 */
1716
18−#ifndef RELATIVETIMEFORMATTER_H
19−#define RELATIVETIMEFORMATTER_H
17+#ifndef PLATFORMPLUGIN_H
18+#define PLATFORMPLUGIN_H
2019
21−#include "timeformatter.h"
20+#include <QQmlExtensionPlugin>
2221
23−// TODO - move this to the sdk
24−// https://blueprints.launchpad.net/ubuntu-ui-toolkit/+spec/time-formatter
25−class RelativeTimeFormatter : public GDateTimeFormatter
22+class GlobalShortcutPlugin: public QQmlExtensionPlugin
2623{
2724 Q_OBJECT
28−public:
29− RelativeTimeFormatter(QObject *parent = 0);
25+ Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
3026
31− QString format() const override;
27+public:
28+ void registerTypes(const char *uri) override;
3229};
3330
34−#endif // RELATIVETIMEFORMATTER_H
31+
32+#endif // PLATFORMPLUGIN_H
plugins/Unity/Platform/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module Unity.Platform
2+plugin Platform-qml
plugins/Unity/Session/dbusunitysessionservice.cpp+2−1
@@ -292,7 +292,8 @@ QString DBusUnitySessionService::RealName() const
292292 if (p) {
293293 const QString gecos = QString::fromLocal8Bit(p->pw_gecos);
294294 if (!gecos.isEmpty()) {
295− return gecos.split(QLatin1Char(',')).first();
295+ const QStringList splitGecos = gecos.split(QLatin1Char(','));
296+ return splitGecos.first();
296297 }
297298 }
298299
plugins/Utils/CMakeLists.txt−2
@@ -15,8 +15,6 @@ set(QMLPLUGIN_SRC
1515 inputwatcher.cpp
1616 qlimitproxymodelqml.cpp
1717 unitysortfilterproxymodelqml.cpp
18− relativetimeformatter.cpp
19− timeformatter.cpp
2018 Timer.cpp
2119 unitymenumodelpaths.cpp
2220 windowkeysfilter.cpp
plugins/Utils/plugin.cpp−5
@@ -29,8 +29,6 @@
2929#include "inputwatcher.h"
3030#include "qlimitproxymodelqml.h"
3131#include "unitysortfilterproxymodelqml.h"
32−#include "relativetimeformatter.h"
33−#include "timeformatter.h"
3432#include "unitymenumodelpaths.h"
3533#include "windowkeysfilter.h"
3634#include "windowscreenshotprovider.h"
@@ -60,11 +58,8 @@ void UtilsPlugin::registerTypes(const char *uri)
6058 qmlRegisterType<QLimitProxyModelQML>(uri, 0, 1, "LimitProxyModel");
6159 qmlRegisterType<UnitySortFilterProxyModelQML>(uri, 0, 1, "UnitySortFilterProxyModel");
6260 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
63− qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
6461 qmlRegisterType<WindowKeysFilter>(uri, 0, 1, "WindowKeysFilter");
65− qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
6662 qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
67− qmlRegisterType<RelativeTimeFormatter>(uri, 0, 1, "RelativeTimeFormatter");
6863 qmlRegisterSingletonType<WindowStateStorage>(uri, 0, 1, "WindowStateStorage", createWindowStateStorage);
6964 qmlRegisterType<InputWatcher>(uri, 0, 1, "InputWatcher");
7065 qmlRegisterSingletonType<Constants>(uri, 0, 1, "Constants", createConstants);
plugins/Utils/relativetimeformatter.cppdeleted−260
@@ -1,260 +0,0 @@
1−/*
2− * Copyright 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−
18−// Local
19−#include "relativetimeformatter.h"
20−
21−// Qt
22−#include <QDateTime>
23−
24−// Other
25−#include <glib.h>
26−#include <glib/gi18n.h>
27−#include <locale.h>
28−#include <langinfo.h>
29−#include <string.h>
30−
31−RelativeTimeFormatter::RelativeTimeFormatter(QObject *parent)
32− : GDateTimeFormatter(parent)
33−{
34−}
35−
36− /* Check the system locale setting to see if the format is 24-hour
37− time or 12-hour time */
38−gboolean
39−is_locale_12h(void)
40−{
41− int i;
42− static const char *formats_24h[] = {"%H", "%R", "%T", "%OH", "%k", nullptr};
43− const char* t_fmt = nl_langinfo(T_FMT);
44−
45− for (i=0; formats_24h[i]!=nullptr; i++)
46− if (strstr(t_fmt, formats_24h[i]) != nullptr)
47− return FALSE;
48−
49− return TRUE;
50−}
51−
52−typedef enum
53−{
54− DATE_PROXIMITY_YESTERDAY,
55− DATE_PROXIMITY_TODAY,
56− DATE_PROXIMITY_TOMORROW,
57− DATE_PROXIMITY_LAST_WEEK,
58− DATE_PROXIMITY_NEXT_WEEK,
59− DATE_PROXIMITY_FAR
60−} date_proximity_t;
61−
62−static date_proximity_t
63−getDateProximity(GDateTime* now, GDateTime* time)
64−{
65− date_proximity_t prox = DATE_PROXIMITY_FAR;
66− gint now_year, now_month, now_day;
67− gint time_year, time_month, time_day;
68−
69− // does it happen today?
70− g_date_time_get_ymd(now, &now_year, &now_month, &now_day);
71− g_date_time_get_ymd(time, &time_year, &time_month, &time_day);
72− if ((now_year == time_year) && (now_month == time_month) && (now_day == time_day)) {
73− return DATE_PROXIMITY_TODAY;
74− }
75−
76− // did it happen yesterday?
77− GDateTime* yesterday = g_date_time_add_days(now, -1);
78− gint tom_year, tom_month, tom_day;
79− g_date_time_get_ymd(yesterday, &tom_year, &tom_month, &tom_day);
80− g_date_time_unref(yesterday);
81− if ((tom_year == time_year) && (tom_month == time_month) && (tom_day == time_day)) {
82− return DATE_PROXIMITY_YESTERDAY;
83− }
84−
85− // does it happen tomorrow?
86− GDateTime* tomorrow = g_date_time_add_days(now, 1);
87− g_date_time_get_ymd(tomorrow, &tom_year, &tom_month, &tom_day);
88− g_date_time_unref(tomorrow);
89− if ((tom_year == time_year) && (tom_month == time_month) && (tom_day == time_day)) {
90− return DATE_PROXIMITY_TOMORROW;
91− }
92−
93− // does it happen this week?
94− if (g_date_time_compare(time, now) < 0) {
95− GDateTime* last_week = g_date_time_add_days(now, -6);
96− GDateTime* last_week_bound = g_date_time_new_local(g_date_time_get_year(last_week),
97− g_date_time_get_month(last_week),
98− g_date_time_get_day_of_month(last_week),
99− 0, 0, 0);
100− if (g_date_time_compare(time, last_week_bound) >= 0)
101− prox = DATE_PROXIMITY_LAST_WEEK;
102−
103− g_date_time_unref(last_week);
104− g_date_time_unref(last_week_bound);
105− } else {
106− GDateTime* next_week = g_date_time_add_days(now, 6);
107− GDateTime* next_week_bound = g_date_time_new_local(g_date_time_get_year(next_week),
108− g_date_time_get_month(next_week),
109− g_date_time_get_day_of_month(next_week),
110− 23, 59, 59.9);
111− if (g_date_time_compare(time, next_week_bound) <= 0)
112− prox = DATE_PROXIMITY_NEXT_WEEK;
113−
114− g_date_time_unref(next_week);
115− g_date_time_unref(next_week_bound);
116− }
117−
118− return prox;
119−}
120−
121−const char*
122−dgettext_datetime(const char *text)
123−{
124− return dgettext("unity8", text);
125−}
126−
127−/**
128− * _ a time yesterday should be shown as (e.g. “Yesterday 3:55 PM”)
129− * _ a time today should be shown as just the time (e.g. “3:55 PM”)
130− * _ a time tomorrow should be shown as(e.g. “Tomorrow 3:55 PM”)
131− * _ a time any other day this week should be shown as the short version of the
132− * day and time (e.g. “Wed 3:55 PM”)
133− * weekday (e.g. “Friday”)
134− * _ a time after this week should be shown as the short version of the day,
135− * date, and time (e.g. “Wed 21 Apr 3:55 PM”)
136− * _ in addition, when presenting the times of upcoming events, the time should
137− * be followed by the timezone if it is different from the one the computer
138− * is currently set to. For example, “Wed 3:55 PM UTC−5”.
139− *
140− * TODO - keep inline with indicator-datetime
141− */
142−char* generate_full_format_string_at_time (GDateTime* now,
143− GDateTime* then)
144−{
145− GString* ret = g_string_new (nullptr);
146−
147− if (then != nullptr) {
148− const date_proximity_t prox = getDateProximity(now, then);
149−
150− if (is_locale_12h()) {
151− switch (prox) {
152− case DATE_PROXIMITY_YESTERDAY:
153− /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
154− This format string is used for showing, on a 12-hour clock, times that happen yesterday.
155− (\u2003 is a unicode em space which is slightly wider than a normal space.)
156− en_US example: "Yesterday\u2003%l:%M %p" --> "Yesterday 1:00 PM" */
157− g_string_assign (ret, dgettext_datetime("Yesterday\u2003%l:%M %p"));
158− break;
159−
160− case DATE_PROXIMITY_TODAY:
161− /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
162− This format string is used for showing, on a 12-hour clock, times that happened today.
163− en_US example: "%l:%M %p" --> "1:00 PM" */
164− g_string_assign (ret, dgettext_datetime("%l:%M %p"));
165− break;
166−
167− case DATE_PROXIMITY_TOMORROW:
168− /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
169− This format string is used for showing, on a 12-hour clock, events/appointments that happen tomorrow.
170− (\u2003 is a unicode em space which is slightly wider than a normal space.)
171− en_US example: "Tomorrow\u2003%l:%M %p" --> "Tomorrow 1:00 PM" */
172− g_string_assign (ret, dgettext_datetime("Tomorrow\u2003%l:%M %p"));
173− break;
174−
175− case DATE_PROXIMITY_LAST_WEEK:
176− case DATE_PROXIMITY_NEXT_WEEK:
177− /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
178− This format string is used for showing, on a 12-hour clock, times that happened in the last week.
179− (\u2003 is a unicode em space which is slightly wider than a normal space.)
180− en_US example: "%a\u2003%l:%M %p" --> "Fri 1:00 PM" */
181− g_string_assign (ret, dgettext_datetime("%a\u2003%l:%M %p"));
182− break;
183−
184− case DATE_PROXIMITY_FAR:
185− /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
186− This format string is used for showing, on a 12-hour clock, times that happened before a week from now.
187− (\u2003 is a unicode em space which is slightly wider than a normal space.)
188− en_US example: "%a %b %d\u2003%l:%M %p" --> "Fri Oct 31 1:00 PM"
189− en_GB example: "%a %d %b\u2003%l:%M %p" --> "Fri 31 Oct 1:00 PM" */
190− g_string_assign (ret, dgettext_datetime("%a %d %b\u2003%l:%M %p"));
191− break;
192− }
193− } else {
194− switch (prox) {
195−
196− case DATE_PROXIMITY_YESTERDAY:
197− /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
198− This format string is used for showing, on a 24-hour clock, times that happen yesterday.
199− (\u2003 is a unicode em space which is slightly wider than a normal space.)
200− en_US example: "Yesterday\u2003%l:%M %p" --> "Yesterday 13:00" */
201− g_string_assign (ret, dgettext_datetime("Yesterday\u2003%H:%M"));
202− break;
203−
204− case DATE_PROXIMITY_TODAY:
205− /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
206− This format string is used for showing, on a 24-hour clock, times that happened today.
207− en_US example: "%H:%M" --> "13:00" */
208− g_string_assign (ret, dgettext_datetime("%H:%M"));
209− break;
210−
211− case DATE_PROXIMITY_TOMORROW:
212− /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
213− This format string is used for showing, on a 24-hour clock, events/appointments that happen tomorrow.
214− (\u2003 is a unicode em space which is slightly wider than a normal space.)
215− en_US example: "Tomorrow\u2003%l:%M %p" --> "Tomorrow 13:00" */
216− g_string_assign (ret, dgettext_datetime("Tomorrow\u2003%H:%M"));
217− break;
218−
219− case DATE_PROXIMITY_LAST_WEEK:
220− case DATE_PROXIMITY_NEXT_WEEK:
221− /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
222− This format string is used for showing, on a 24-hour clock, times that happened in the last week.
223− (\u2003 is a unicode em space which is slightly wider than a normal space.)
224− en_US example: "%a\u2003%H:%M" --> "Fri 13:00" */
225− g_string_assign (ret, dgettext_datetime("%a\u2003%H:%M"));
226− break;
227−
228− case DATE_PROXIMITY_FAR:
229− /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
230− This format string is used for showing, on a 24-hour clock, times that happened before a week from now.
231− (\u2003 is a unicode em space which is slightly wider than a normal space.)
232− en_US example: "%a %b %d\u2003%H:%M" --> "Fri Oct 31 13:00"
233− en_GB example: "%a %d %b\u2003%H:%M" --> "Fri 31 Oct 13:00" */
234− g_string_assign (ret, dgettext_datetime("%a %d %b\u2003%H:%M"));
235− break;
236− }
237− }
238− }
239−
240− return g_string_free (ret, FALSE);
241−}
242−
243−QString RelativeTimeFormatter::format() const
244−{
245− GDateTime* now = g_date_time_new_now_local();
246− if (!now) { return QString(); }
247−
248− GDateTime* then = g_date_time_new_from_unix_local(time());
249− if (!then) { return QString(); }
250−
251− char* time_format = generate_full_format_string_at_time(now, then);
252−
253− QString str(QString::fromUtf8(time_format));
254− g_free(time_format);
255−
256− g_date_time_unref(now);
257− g_date_time_unref(then);
258−
259− return str;
260−}
plugins/Utils/timeformatter.cppdeleted−206
@@ -1,206 +0,0 @@
1−/*
2− * Copyright 2013 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− * Author: Lars Uebernickel <lars.uebernickel@canonical.com>
17− */
18−
19−#include "timeformatter.h"
20−
21−#include <gio/gio.h>
22−#include <QDateTime>
23−
24−struct TimeFormatterPrivate
25−{
26− TimeFormatter *formatter;
27−
28− QString format;
29− QString timeString;
30− qint64 time;
31−
32− GDBusConnection *system_bus;
33− guint subscription_id;
34− GCancellable *cancellable;
35−};
36−
37−static void
38−timedate1_properties_changed (GDBusConnection *connection,
39− const gchar *sender_name,
40− const gchar *object_path,
41− const gchar *interface_name,
42− const gchar *signal_name,
43− GVariant *parameters,
44− gpointer user_data)
45−{
46− Q_UNUSED(connection);
47− Q_UNUSED(sender_name);
48− Q_UNUSED(object_path);
49− Q_UNUSED(interface_name);
50− Q_UNUSED(signal_name);
51−
52− TimeFormatterPrivate *priv = (TimeFormatterPrivate *)user_data;
53− GVariant *changed;
54− GVariantIter *iter;
55− const gchar *name;
56−
57− if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(sa{sv}as)")))
58− return;
59−
60− g_variant_get (parameters, "(s@a{sv}as)", nullptr, &changed, &iter);
61−
62− if (g_variant_lookup (changed, "Timezone", "s", nullptr)) {
63− priv->formatter->update();
64− }
65− else {
66− while (g_variant_iter_next (iter, "&s", &name)) {
67− if (g_str_equal (name, "Timezone")) {
68− priv->formatter->update();
69− break;
70− }
71− }
72− }
73−
74− g_variant_unref (changed);
75− g_variant_iter_free (iter);
76−}
77−
78−static void
79−got_bus(GObject *object, GAsyncResult *result, gpointer user_data)
80−{
81− Q_UNUSED(object);
82−
83− TimeFormatterPrivate *priv = (TimeFormatterPrivate *)user_data;
84− GError *error = nullptr;
85−
86− priv->system_bus = g_bus_get_finish (result, &error);
87− if (priv->system_bus == nullptr) {
88− if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
89− qWarning("TimeFormatter: cannot connect to the system bus: %s", error->message);
90− g_error_free (error);
91− return;
92− }
93−
94− /* Listen to the PropertiesChanged on the org.freedesktop.timedate1
95− * interface from any sender. In practice, this signal will only be sent
96− * from timedated (we can trust other processes on the system bus to behave
97− * nicely). That way, we don't have to watch timedated's well-known name
98− * and keep the process alive.
99− */
100− priv->subscription_id = g_dbus_connection_signal_subscribe (priv->system_bus,
101− nullptr, /* sender */
102− "org.freedesktop.DBus.Properties",
103− "PropertiesChanged",
104− nullptr,
105− "org.freedesktop.timedate1",
106− G_DBUS_SIGNAL_FLAGS_NONE,
107− timedate1_properties_changed,
108− priv, nullptr);
109−}
110−
111−TimeFormatter::TimeFormatter(QObject *parent): QObject(parent)
112−{
113− priv = new TimeFormatterPrivate;
114− priv->formatter = this;
115− priv->time = 0;
116− priv->format = QStringLiteral("yyyy-MM-dd hh:mm");
117− priv->system_bus = nullptr;
118− priv->subscription_id = 0;
119− priv->cancellable = g_cancellable_new ();
120−
121− g_bus_get (G_BUS_TYPE_SYSTEM, priv->cancellable, got_bus, priv);
122−}
123−
124−TimeFormatter::TimeFormatter(const QString &initialFormat, QObject *parent): TimeFormatter(parent)
125−{
126− priv->format = initialFormat;
127−}
128−
129−TimeFormatter::~TimeFormatter()
130−{
131− if (priv->system_bus) {
132− g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->subscription_id);
133− g_object_unref (priv->system_bus);
134− }
135−
136− g_cancellable_cancel (priv->cancellable);
137− g_object_unref (priv->cancellable);
138−}
139−
140−QString TimeFormatter::format() const
141−{
142− return priv->format;
143−}
144−
145−QString TimeFormatter::timeString() const
146−{
147− return priv->timeString;
148−}
149−
150−qint64 TimeFormatter::time() const
151−{
152− return priv->time;
153−}
154−
155−void TimeFormatter::setFormat(const QString &format)
156−{
157− if (priv->format != format) {
158− priv->format = format;
159− Q_EMIT formatChanged(priv->format);
160− update();
161− }
162−}
163−
164−void TimeFormatter::setTime(qint64 time)
165−{
166− if (priv->time != time) {
167− priv->time = time;
168− Q_EMIT timeChanged(priv->time);
169− update();
170− }
171−}
172−
173−void TimeFormatter::update()
174−{
175− priv->timeString = formatTime();
176− Q_EMIT timeStringChanged(priv->timeString);
177−}
178−
179−QString TimeFormatter::formatTime() const
180−{
181− return QDateTime::fromMSecsSinceEpoch(time() / 1000).toString(format());
182−}
183−
184−GDateTimeFormatter::GDateTimeFormatter(QObject* parent)
185−: TimeFormatter(QStringLiteral("%d-%m-%Y %I:%M%p"), parent)
186−{
187−}
188−
189−QString GDateTimeFormatter::formatTime() const
190−{
191− gchar* time_string;
192− GDateTime* datetime;
193− QByteArray formatBytes = format().toUtf8();
194−
195− datetime = g_date_time_new_from_unix_local(time());
196− if (!datetime) {
197− return QLatin1String("");
198− }
199−
200− time_string = g_date_time_format(datetime, formatBytes.constData());
201− QString formattedTime(QString::fromUtf8(time_string));
202−
203− g_free(time_string);
204− g_date_time_unref(datetime);
205− return formattedTime;
206−}
plugins/Utils/timeformatter.hdeleted−68
@@ -1,68 +0,0 @@
1−/*
2− * Copyright 2013 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− * Author: Lars Uebernickel <lars.uebernickel@canonical.com>
17− */
18−
19−#ifndef TIME_FORMATTER_H
20−#define TIME_FORMATTER_H
21−
22−#include <QObject>
23−
24−// TODO - bug #1260728
25−class TimeFormatter : public QObject
26−{
27− Q_OBJECT
28− Q_PROPERTY(QString format READ format WRITE setFormat NOTIFY formatChanged)
29− Q_PROPERTY(QString timeString READ timeString NOTIFY timeStringChanged)
30− Q_PROPERTY(qint64 time READ time WRITE setTime NOTIFY timeChanged)
31−
32−public:
33− TimeFormatter(QObject *parent = 0);
34− virtual ~TimeFormatter();
35−
36− virtual QString format() const;
37− QString timeString() const;
38− qint64 time() const;
39−
40− void setFormat(const QString &format);
41− void setTime(qint64 time);
42−
43− void update();
44−
45−Q_SIGNALS:
46− void formatChanged(const QString &format);
47− void timeStringChanged(const QString &timeString);
48− void timeChanged(qint64 time);
49−
50−protected:
51− TimeFormatter(const QString &initialFormat, QObject *parent = 0);
52−
53− virtual QString formatTime() const;
54−
55−private:
56− struct TimeFormatterPrivate *priv;
57−};
58−
59−class GDateTimeFormatter : public TimeFormatter
60−{
61−public:
62− GDateTimeFormatter(QObject *parent = 0);
63−
64−protected:
65− QString formatTime() const override;
66−};
67−
68−#endif
plugins/Utils/timezoneFormatter.cpp+1−1
@@ -29,7 +29,7 @@ QString TimezoneFormatter::currentTimeInTimezone(const QVariant &tzId) const
2929 if (tz.isValid()) {
3030 const QDateTime now = QDateTime::currentDateTime().toTimeZone(tz);
3131 // return locale-aware string in the form "day, hh:mm", e.g. "Mon 14:30" or "Mon 1:30 pm"
32− return QStringLiteral("%1 %2").arg(now.toString("ddd")).arg(now.time().toString(Qt::DefaultLocaleShortDate));
32+ return QStringLiteral("%1 %2").arg(now.toString(QStringLiteral("ddd"))).arg(now.time().toString(Qt::DefaultLocaleShortDate));
3333 }
3434 return QString();
3535}
po/am.po+2−2
@@ -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: 2015-09-30 05:42+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ar.po+2−2
@@ -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: 2015-09-30 05:42+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
po/ast.po+26−26
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-09-16 00:49+0200\n"
11−"PO-Revision-Date: 2015-06-11 23:39+0000\n"
12−"Last-Translator: enolp <enolp@softastur.org>\n"
11+"PO-Revision-Date: 2015-10-06 12:07+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: 2015-09-30 05:42+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -29,7 +29,7 @@ msgstr "Anclar atayu"
2929
3030#: plugins/Unity/Launcher/launcheritem.cpp:52
3131msgid "Quit"
32−msgstr ""
32+msgstr "Colar"
3333
3434#: plugins/Unity/Launcher/launcheritem.cpp:106
3535msgid "Unpin shortcut"
@@ -41,14 +41,14 @@ msgstr "Desanclar atayu"
4141#. en_US example: "Yesterday\u2003%l:%M %p" --> "Yesterday 1:00 PM"
4242#: plugins/Utils/relativetimeformatter.cpp:157
4343msgid "Yesterday %l:%M %p"
44−msgstr ""
44+msgstr "Ayeri %l:%M %p"
4545
4646#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
4747#. This format string is used for showing, on a 12-hour clock, times that happened today.
4848#. en_US example: "%l:%M %p" --> "1:00 PM"
4949#: plugins/Utils/relativetimeformatter.cpp:164
5050msgid "%l:%M %p"
51−msgstr ""
51+msgstr "%l:%M %p"
5252
5353#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
5454#. This format string is used for showing, on a 12-hour clock, events/appointments that happen tomorrow.
@@ -56,7 +56,7 @@ msgstr ""
5656#. en_US example: "Tomorrow\u2003%l:%M %p" --> "Tomorrow 1:00 PM"
5757#: plugins/Utils/relativetimeformatter.cpp:172
5858msgid "Tomorrow %l:%M %p"
59−msgstr ""
59+msgstr "Mañana %l:%M %p"
6060
6161#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
6262#. This format string is used for showing, on a 12-hour clock, times that happened in the last week.
@@ -64,7 +64,7 @@ msgstr ""
6464#. en_US example: "%a\u2003%l:%M %p" --> "Fri 1:00 PM"
6565#: plugins/Utils/relativetimeformatter.cpp:181
6666msgid "%a %l:%M %p"
67−msgstr ""
67+msgstr "%a %l:%M %p"
6868
6969#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
7070#. This format string is used for showing, on a 12-hour clock, times that happened before a week from now.
@@ -73,7 +73,7 @@ msgstr ""
7373#. en_GB example: "%a %b %d\u2003%l:%M %p" --> "Fri 31 Oct 1:00 PM"
7474#: plugins/Utils/relativetimeformatter.cpp:190
7575msgid "%a %d %b %l:%M %p"
76−msgstr ""
76+msgstr "%a %b %d %l:%M %p"
7777
7878#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
7979#. This format string is used for showing, on a 24-hour clock, times that happen yesterday.
@@ -81,14 +81,14 @@ msgstr ""
8181#. en_US example: "Yesterday\u2003%l:%M %p" --> "Yesterday 13:00"
8282#: plugins/Utils/relativetimeformatter.cpp:201
8383msgid "Yesterday %H:%M"
84−msgstr ""
84+msgstr "Ayeri %H:%M"
8585
8686#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
8787#. This format string is used for showing, on a 24-hour clock, times that happened today.
8888#. en_US example: "%H:%M" --> "13:00"
8989#: plugins/Utils/relativetimeformatter.cpp:208
9090msgid "%H:%M"
91−msgstr ""
91+msgstr "%H:%M"
9292
9393#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
9494#. This format string is used for showing, on a 24-hour clock, events/appointments that happen tomorrow.
@@ -96,7 +96,7 @@ msgstr ""
9696#. en_US example: "Tomorrow\u2003%l:%M %p" --> "Tomorrow 13:00"
9797#: plugins/Utils/relativetimeformatter.cpp:216
9898msgid "Tomorrow %H:%M"
99−msgstr ""
99+msgstr "Mañana %H:%M"
100100
101101#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
102102#. This format string is used for showing, on a 24-hour clock, times that happened in the last week.
@@ -104,7 +104,7 @@ msgstr ""
104104#. en_US example: "%a\u2003%H:%M" --> "Fri 13:00"
105105#: plugins/Utils/relativetimeformatter.cpp:225
106106msgid "%a %H:%M"
107−msgstr ""
107+msgstr "%a %H:%M"
108108
109109#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
110110#. This format string is used for showing, on a 24-hour clock, times that happened before a week from now.
@@ -113,7 +113,7 @@ msgstr ""
113113#. en_GB example: "%a %b %d\u2003%H:%M" --> "Fri 31 Oct 13:00"
114114#: plugins/Utils/relativetimeformatter.cpp:234
115115msgid "%a %d %b %H:%M"
116−msgstr ""
116+msgstr "%a %b %d %H:%M"
117117
118118#: qml/Components/DelayedLockscreen.qml:49
119119msgid "Device Locked"
@@ -198,7 +198,7 @@ msgstr "Sí"
198198#: qml/Components/Dialogs.qml:203
199199msgctxt "Title: Power off/Restart dialog"
200200msgid "Power"
201−msgstr ""
201+msgstr "Apagáu"
202202
203203#: qml/Components/Dialogs.qml:204
204204msgid ""
@@ -378,7 +378,7 @@ msgstr "Sentímoslo, contraseña incorreuta"
378378#: qml/Greeter/NarrowView.qml:121
379379msgctxt "passphrase"
380380msgid "Please re-enter"
381−msgstr ""
381+msgstr "Vuelve a escribila"
382382
383383#: qml/Greeter/NarrowView.qml:122
384384msgid "Sorry, incorrect passcode"
@@ -404,32 +404,32 @@ msgstr "Nun ta reproduciéndose nada"
404404#, qt-format
405405msgid "%1 hour"
406406msgid_plural "%1 hours"
407−msgstr[0] ""
408−msgstr[1] ""
407+msgstr[0] "%1 hora"
408+msgstr[1] "%1 hores"
409409
410410#: qml/Panel/Indicators/MenuItemFactory.qml:851
411411#, qt-format
412412msgid "%1 minute"
413413msgid_plural "%1 minutes"
414−msgstr[0] ""
415−msgstr[1] ""
414+msgstr[0] "%1 minutu"
415+msgstr[1] "%1 minutos"
416416
417417#: qml/Panel/Indicators/MenuItemFactory.qml:856
418418#, qt-format
419419msgid "%1 second"
420420msgid_plural "%1 seconds"
421−msgstr[0] ""
422−msgstr[1] ""
421+msgstr[0] "%1 segundu"
422+msgstr[1] "%1 segundos"
423423
424424#: qml/Panel/Indicators/MenuItemFactory.qml:859
425425msgid "0 seconds"
426−msgstr ""
426+msgstr "0 segundos"
427427
428428#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
429429#: qml/Panel/Indicators/MenuItemFactory.qml:861
430430#, qt-format
431431msgid "%1 remaining"
432−msgstr ""
432+msgstr "Queden %1"
433433
434434#: qml/Panel/Indicators/MenuItemFactory.qml:867
435435msgid "In queue…"
@@ -462,7 +462,7 @@ msgstr "Responder"
462462
463463#: qml/Panel/Indicators/MessageMenuItemFactory.qml:204
464464msgid "Call back"
465−msgstr ""
465+msgstr "Devolver llamada"
466466
467467#: qml/Panel/Indicators/ModemInfoItem.qml:105
468468msgid "Unlock SIM"
po/az.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/be.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
po/bg.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/br.po+5−5
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-09-16 00:49+0200\n"
11−"PO-Revision-Date: 2015-08-25 14:12+0000\n"
11+"PO-Revision-Date: 2015-10-05 06:47+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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -29,7 +29,7 @@ msgstr "Spilhennañ ar verradenn"
2929
3030#: plugins/Unity/Launcher/launcheritem.cpp:52
3131msgid "Quit"
32−msgstr ""
32+msgstr "Mont kuit"
3333
3434#: plugins/Unity/Launcher/launcheritem.cpp:106
3535msgid "Unpin shortcut"
@@ -465,7 +465,7 @@ msgstr "Respont"
465465
466466#: qml/Panel/Indicators/MessageMenuItemFactory.qml:204
467467msgid "Call back"
468−msgstr ""
468+msgstr "Gervel en-dro"
469469
470470#: qml/Panel/Indicators/ModemInfoItem.qml:105
471471msgid "Unlock SIM"
po/bs.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
po/ca.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ca@valencia.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ce.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ckb.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/cs.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020"Language: cs\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/cy.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
po/da.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
po/de.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/el.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/en_AU.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/en_GB.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/eo.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/es.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/eu.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/fa.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/fi.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/fo.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/fr.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ga.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/gd.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121"Language: gd\n"
2222
2323#: plugins/IntegratedLightDM/Greeter.cpp:112
po/gl.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/gv.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/he.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/hi.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/hr.po+124−116
@@ -16,25 +16,25 @@ 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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
24−msgstr ""
24+msgstr "Lozinka: "
2525
2626#: plugins/Unity/Launcher/launcheritem.cpp:47
2727#: plugins/Unity/Launcher/launcheritem.cpp:106
2828msgid "Pin shortcut"
29−msgstr ""
29+msgstr "Pričvrsti kraticu"
3030
3131#: plugins/Unity/Launcher/launcheritem.cpp:52
3232msgid "Quit"
33−msgstr ""
33+msgstr "Zatvori"
3434
3535#: plugins/Unity/Launcher/launcheritem.cpp:106
3636msgid "Unpin shortcut"
37−msgstr ""
37+msgstr "Ukloni kraticu"
3838
3939#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
4040#. This format string is used for showing, on a 12-hour clock, times that happen yesterday.
@@ -42,14 +42,14 @@ msgstr ""
4242#. en_US example: "Yesterday\u2003%l:%M %p" --> "Yesterday 1:00 PM"
4343#: plugins/Utils/relativetimeformatter.cpp:157
4444msgid "Yesterday %l:%M %p"
45−msgstr ""
45+msgstr "Jučer %l:%M %p"
4646
4747#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
4848#. This format string is used for showing, on a 12-hour clock, times that happened today.
4949#. en_US example: "%l:%M %p" --> "1:00 PM"
5050#: plugins/Utils/relativetimeformatter.cpp:164
5151msgid "%l:%M %p"
52−msgstr ""
52+msgstr "%l:%M %p"
5353
5454#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
5555#. This format string is used for showing, on a 12-hour clock, events/appointments that happen tomorrow.
@@ -57,7 +57,7 @@ msgstr ""
5757#. en_US example: "Tomorrow\u2003%l:%M %p" --> "Tomorrow 1:00 PM"
5858#: plugins/Utils/relativetimeformatter.cpp:172
5959msgid "Tomorrow %l:%M %p"
60−msgstr ""
60+msgstr "Sutra %l:%M %p"
6161
6262#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
6363#. This format string is used for showing, on a 12-hour clock, times that happened in the last week.
@@ -65,7 +65,7 @@ msgstr ""
6565#. en_US example: "%a\u2003%l:%M %p" --> "Fri 1:00 PM"
6666#: plugins/Utils/relativetimeformatter.cpp:181
6767msgid "%a %l:%M %p"
68−msgstr ""
68+msgstr "%a %l:%M %p"
6969
7070#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
7171#. This format string is used for showing, on a 12-hour clock, times that happened before a week from now.
@@ -74,7 +74,7 @@ msgstr ""
7474#. en_GB example: "%a %b %d\u2003%l:%M %p" --> "Fri 31 Oct 1:00 PM"
7575#: plugins/Utils/relativetimeformatter.cpp:190
7676msgid "%a %d %b %l:%M %p"
77−msgstr ""
77+msgstr "%a %d %b %l:%M %p"
7878
7979#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
8080#. This format string is used for showing, on a 24-hour clock, times that happen yesterday.
@@ -82,14 +82,14 @@ msgstr ""
8282#. en_US example: "Yesterday\u2003%l:%M %p" --> "Yesterday 13:00"
8383#: plugins/Utils/relativetimeformatter.cpp:201
8484msgid "Yesterday %H:%M"
85−msgstr ""
85+msgstr "Jučer %H:%M"
8686
8787#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
8888#. This format string is used for showing, on a 24-hour clock, times that happened today.
8989#. en_US example: "%H:%M" --> "13:00"
9090#: plugins/Utils/relativetimeformatter.cpp:208
9191msgid "%H:%M"
92−msgstr ""
92+msgstr "%H:%M"
9393
9494#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
9595#. This format string is used for showing, on a 24-hour clock, events/appointments that happen tomorrow.
@@ -97,7 +97,7 @@ msgstr ""
9797#. en_US example: "Tomorrow\u2003%l:%M %p" --> "Tomorrow 13:00"
9898#: plugins/Utils/relativetimeformatter.cpp:216
9999msgid "Tomorrow %H:%M"
100−msgstr ""
100+msgstr "Sutra %H:%M"
101101
102102#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
103103#. This format string is used for showing, on a 24-hour clock, times that happened in the last week.
@@ -105,7 +105,7 @@ msgstr ""
105105#. en_US example: "%a\u2003%H:%M" --> "Fri 13:00"
106106#: plugins/Utils/relativetimeformatter.cpp:225
107107msgid "%a %H:%M"
108−msgstr ""
108+msgstr "%a %H:%M"
109109
110110#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
111111#. This format string is used for showing, on a 24-hour clock, times that happened before a week from now.
@@ -114,218 +114,221 @@ msgstr ""
114114#. en_GB example: "%a %b %d\u2003%H:%M" --> "Fri 31 Oct 13:00"
115115#: plugins/Utils/relativetimeformatter.cpp:234
116116msgid "%a %d %b %H:%M"
117−msgstr ""
117+msgstr "%a %d %b %H:%M"
118118
119119#: qml/Components/DelayedLockscreen.qml:49
120120msgid "Device Locked"
121−msgstr ""
121+msgstr "Uređaj zaključan"
122122
123123#: qml/Components/DelayedLockscreen.qml:64
124124msgid "You have been locked out due to too many failed passphrase attempts."
125−msgstr ""
125+msgstr "Previše pogrešnih pokušaja otključavanja."
126126
127127#: qml/Components/DelayedLockscreen.qml:65
128128msgid "You have been locked out due to too many failed passcode attempts."
129−msgstr ""
129+msgstr "Previše pogrešnih pokušaja otključavanja."
130130
131131#: qml/Components/DelayedLockscreen.qml:74
132132#, qt-format
133133msgid "Please wait %1 minute and then try again…"
134134msgid_plural "Please wait %1 minutes and then try again…"
135−msgstr[0] ""
136−msgstr[1] ""
135+msgstr[0] "Pričekajte %1 minutu a zatim ponovno pokušajte…"
136+msgstr[1] "Pričekajte %1 minute a zatim ponovno pokušajte…"
137+msgstr[2] "Pričekajte %1 minutua a zatim ponovno pokušajte…"
137138
138139#: qml/Components/Dialogs.qml:115
139140msgctxt "Title: Lock/Log out dialog"
140141msgid "Log out"
141−msgstr ""
142+msgstr "Odjava"
142143
143144#: qml/Components/Dialogs.qml:116
144145msgid "Are you sure you want to log out?"
145−msgstr ""
146+msgstr "Sigurno se želite odjaviti?"
146147
147148#: qml/Components/Dialogs.qml:118
148149msgctxt "Button: Lock the system"
149150msgid "Lock"
150−msgstr ""
151+msgstr "Zaključaj"
151152
152153#: qml/Components/Dialogs.qml:125
153154msgctxt "Button: Log out from the system"
154155msgid "Log Out"
155−msgstr ""
156+msgstr "Odjava"
156157
157158#: qml/Components/Dialogs.qml:132 qml/Components/Dialogs.qml:165
158159#: qml/Components/Dialogs.qml:224
159160msgid "Cancel"
160−msgstr ""
161+msgstr "Odustani"
161162
162163#: qml/Components/Dialogs.qml:144
163164msgctxt "Title: Reboot/Shut down dialog"
164165msgid "Shut down"
165−msgstr ""
166+msgstr "Isključi"
166167
167168#: qml/Components/Dialogs.qml:145
168169msgid "Are you sure you want to shut down?"
169−msgstr ""
170+msgstr "Sigurno želite isključiti?"
170171
171172#: qml/Components/Dialogs.qml:147
172173msgctxt "Button: Reboot the system"
173174msgid "Reboot"
174−msgstr ""
175+msgstr "Ponovno pokreni"
175176
176177#: qml/Components/Dialogs.qml:156
177178msgctxt "Button: Shut down the system"
178179msgid "Shut down"
179−msgstr ""
180+msgstr "Isključi"
180181
181182#: qml/Components/Dialogs.qml:178
182183msgctxt "Title: Reboot dialog"
183184msgid "Reboot"
184−msgstr ""
185+msgstr "Ponovno pokreni"
185186
186187#: qml/Components/Dialogs.qml:179
187188msgid "Are you sure you want to reboot?"
188−msgstr ""
189+msgstr "Sigurno želite ponovno pokrenuti?"
189190
190191#: qml/Components/Dialogs.qml:181
191192msgid "No"
192−msgstr ""
193+msgstr "Ne"
193194
194195#: qml/Components/Dialogs.qml:188
195196msgid "Yes"
196−msgstr ""
197+msgstr "Da"
197198
198199#: qml/Components/Dialogs.qml:203
199200msgctxt "Title: Power off/Restart dialog"
200201msgid "Power"
201−msgstr ""
202+msgstr "Isključivanje"
202203
203204#: qml/Components/Dialogs.qml:204
204205msgid ""
205206"Are you sure you would like\n"
206207"to power off?"
207208msgstr ""
209+"Sigurno želite\n"
210+"isključiti?"
208211
209212#: qml/Components/Dialogs.qml:206
210213msgctxt "Button: Power off the system"
211214msgid "Power off"
212−msgstr ""
215+msgstr "Isključi"
213216
214217#: qml/Components/Dialogs.qml:215
215218msgctxt "Button: Restart the system"
216219msgid "Restart"
217−msgstr ""
220+msgstr "Ponovo pokreni"
218221
219222#: qml/Components/Lockscreen.qml:245
220223msgid "Return to Call"
221−msgstr ""
224+msgstr "Vrati na poziv"
222225
223226#: qml/Components/Lockscreen.qml:245
224227msgid "Emergency Call"
225−msgstr ""
228+msgstr "Hitni poziv"
226229
227230#: qml/Components/Lockscreen.qml:277
228231msgid "OK"
229−msgstr ""
232+msgstr "U redu"
230233
231234#: qml/Dash/GenericScopeView.qml:569 qml/Dash/GenericScopeView.qml:727
232235msgid "See less"
233−msgstr ""
236+msgstr "Prikaži manje"
234237
235238#: qml/Dash/GenericScopeView.qml:569
236239msgid "See all"
237−msgstr ""
240+msgstr "Prikaži sve"
238241
239242#: qml/Dash/GenericScopeView.qml:631
240243msgctxt "Label: Hint for dash search line edit"
241244msgid "Search"
242−msgstr ""
245+msgstr "Pretraži"
243246
244247#: qml/Dash/PageHeader.qml:269
245248msgctxt "Button: Open the Ubuntu Store"
246249msgid "Store"
247−msgstr ""
250+msgstr "Trgovina"
248251
249252#: qml/Dash/PageHeader.qml:276
250253msgctxt "Button: Start a search in the current dash scope"
251254msgid "Search"
252−msgstr ""
255+msgstr "Pretraži"
253256
254257#: qml/Dash/PageHeader.qml:286
255258msgctxt "Button: Show the current dash scope settings"
256259msgid "Settings"
257−msgstr ""
260+msgstr "Postavke"
258261
259262#: qml/Dash/PageHeader.qml:293
260263msgid "Remove from Favorites"
261−msgstr ""
264+msgstr "Ukloni iz omiljenih"
262265
263266#: qml/Dash/PageHeader.qml:293
264267msgid "Add to Favorites"
265−msgstr ""
268+msgstr "Dodaj u omiljene"
266269
267270#: qml/Dash/Previews/PreviewActionCombo.qml:35
268271msgid "More..."
269−msgstr ""
272+msgstr "Više..."
270273
271274#: qml/Dash/Previews/PreviewActionCombo.qml:35
272275msgid "Less..."
273−msgstr ""
276+msgstr "Manje..."
274277
275278#: qml/Dash/Previews/PreviewCommentInput.qml:68
276279#: qml/Dash/Previews/PreviewRatingInput.qml:174
277280#: qml/Panel/Indicators/MessageMenuItemFactory.qml:148
278281#: qml/Panel/Indicators/MessageMenuItemFactory.qml:205
279282msgid "Send"
280−msgstr ""
283+msgstr "Pošalji"
281284
282285#: qml/Dash/Previews/PreviewRatingInput.qml:84
283286msgid "Rate this"
284−msgstr ""
287+msgstr "Ocijeni ovo"
285288
286289#: qml/Dash/Previews/PreviewRatingInput.qml:129
287290msgid "Add a review"
288−msgstr ""
291+msgstr "Dodaj recenziju"
289292
290293#: qml/Dash/PullToRefreshScopeStyle.qml:55
291294msgid "Pull to refresh…"
292−msgstr ""
295+msgstr "Povuci za osvježavanje..."
293296
294297#: qml/Dash/PullToRefreshScopeStyle.qml:60
295298msgid "Release to refresh…"
296−msgstr ""
299+msgstr "Otpusti za osvježavanje..."
297300
298301#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
299302msgid "Enable location data"
300−msgstr ""
303+msgstr "Omogući podatke lokacije"
301304
302305#: qml/Dash/ScopesList.qml:67
303306msgid "Manage"
304−msgstr ""
307+msgstr "Upravljaj"
305308
306309#: qml/Dash/ScopesList.qml:113
307310msgid "Home"
308−msgstr ""
311+msgstr "Naslovnica"
309312
310313#: qml/Dash/ScopesList.qml:114
311314msgid "Also installed"
312−msgstr ""
315+msgstr "Također instalirano"
313316
314317#: qml/Greeter/CoverPage.qml:107
315318msgid "Unlock"
316−msgstr ""
319+msgstr "Otključaj"
317320
318321#: qml/Greeter/LoginList.qml:236
319322msgid "Retry"
320−msgstr ""
323+msgstr "Pokušaj ponovno"
321324
322325#: qml/Greeter/LoginList.qml:237
323326msgid "Tap to unlock"
324−msgstr ""
327+msgstr "Dodirni za otključavanje"
325328
326329#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:53
327330msgid "Sorry, incorrect passphrase."
328−msgstr ""
331+msgstr "Isprika, netočna lozinka."
329332
330333#: qml/Greeter/NarrowView.qml:55 qml/Wizard/Pages/passwd-confirm.qml:54
331334msgid "Sorry, incorrect passcode."
@@ -333,13 +336,15 @@ msgstr ""
333336
334337#: qml/Greeter/NarrowView.qml:56
335338msgid "This will be your last attempt."
336−msgstr ""
339+msgstr "Ovo je vaš posljednji pokušaj."
337340
338341#: qml/Greeter/NarrowView.qml:58
339342msgid ""
340343"If passphrase is entered incorrectly, your phone will conduct a factory "
341344"reset and all personal data will be deleted."
342345msgstr ""
346+"Ako netočno upišete lozinku, vaš telefon će pokrenuti vraćanje na tvorničke "
347+"postavke i svi osobni podaci će biti obrisani."
343348
344349#: qml/Greeter/NarrowView.qml:59
345350msgid ""
@@ -350,11 +355,11 @@ msgstr ""
350355#: qml/Greeter/NarrowView.qml:116
351356#, qt-format
352357msgid "Enter %1"
353−msgstr ""
358+msgstr "Upišite %1"
354359
355360#: qml/Greeter/NarrowView.qml:117 qml/Wizard/Pages/passwd-set.qml:60
356361msgid "Enter passphrase"
357−msgstr ""
362+msgstr "Upišite lozinku"
358363
359364#: qml/Greeter/NarrowView.qml:118
360365msgid "Enter passcode"
@@ -363,149 +368,152 @@ msgstr ""
363368#: qml/Greeter/NarrowView.qml:119
364369#, qt-format
365370msgid "Sorry, incorrect %1"
366−msgstr ""
371+msgstr "Isprika, netočna %1"
367372
368373#: qml/Greeter/NarrowView.qml:120
369374msgid "Sorry, incorrect passphrase"
370−msgstr ""
375+msgstr "Isprika, netočna lozinka"
371376
372377#: qml/Greeter/NarrowView.qml:121
373378msgctxt "passphrase"
374379msgid "Please re-enter"
375−msgstr ""
380+msgstr "Ponovno upišite"
376381
377382#: qml/Greeter/NarrowView.qml:122
378383msgid "Sorry, incorrect passcode"
379−msgstr ""
384+msgstr "Isprika, netočna lozinka"
380385
381386#: qml/Notifications/NotificationMenuItemFactory.qml:128
382387msgid "Show password"
383−msgstr ""
388+msgstr "Prikaži lozinku"
384389
385390#: qml/Panel/ActiveCallHint.qml:79
386391msgid "Tap to return to call..."
387−msgstr ""
392+msgstr "Dodirni za povratak pozivu..."
388393
389394#: qml/Panel/ActiveCallHint.qml:92
390395msgid "Conference"
391−msgstr ""
396+msgstr "Konferencija"
392397
393398#: qml/Panel/Indicators/MenuItemFactory.qml:718
394399msgid "Nothing is playing"
395−msgstr ""
400+msgstr "Ništa se ne reproducira"
396401
397402#: qml/Panel/Indicators/MenuItemFactory.qml:847
398403#, qt-format
399404msgid "%1 hour"
400405msgid_plural "%1 hours"
401−msgstr[0] ""
402−msgstr[1] ""
406+msgstr[0] "%1 sat"
407+msgstr[1] "%1 sata"
408+msgstr[2] "%1 sati"
403409
404410#: qml/Panel/Indicators/MenuItemFactory.qml:851
405411#, qt-format
406412msgid "%1 minute"
407413msgid_plural "%1 minutes"
408−msgstr[0] ""
409−msgstr[1] ""
414+msgstr[0] "%1 minuta"
415+msgstr[1] "%1 minute"
416+msgstr[2] "%1 minuta"
410417
411418#: qml/Panel/Indicators/MenuItemFactory.qml:856
412419#, qt-format
413420msgid "%1 second"
414421msgid_plural "%1 seconds"
415−msgstr[0] ""
416−msgstr[1] ""
422+msgstr[0] "%1 sekunda"
423+msgstr[1] "%1 sekunde"
424+msgstr[2] "%1 sekundi"
417425
418426#: qml/Panel/Indicators/MenuItemFactory.qml:859
419427msgid "0 seconds"
420−msgstr ""
428+msgstr "0 sekundi"
421429
422430#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
423431#: qml/Panel/Indicators/MenuItemFactory.qml:861
424432#, qt-format
425433msgid "%1 remaining"
426−msgstr ""
434+msgstr "%1 preostalo"
427435
428436#: qml/Panel/Indicators/MenuItemFactory.qml:867
429437msgid "In queue…"
430−msgstr ""
438+msgstr "Na čekanju..."
431439
432440#: qml/Panel/Indicators/MenuItemFactory.qml:871
433441msgid "Downloading"
434−msgstr ""
442+msgstr "Preuzimanje"
435443
436444#: qml/Panel/Indicators/MenuItemFactory.qml:873
437445msgid "Paused, tap to resume"
438−msgstr ""
446+msgstr "Pauzirano, dodirni za nastavak"
439447
440448#: qml/Panel/Indicators/MenuItemFactory.qml:875
441449msgid "Canceled"
442−msgstr ""
450+msgstr "Prekinuto"
443451
444452#: qml/Panel/Indicators/MenuItemFactory.qml:877
445453msgid "Finished"
446−msgstr ""
454+msgstr "Završeno"
447455
448456#: qml/Panel/Indicators/MenuItemFactory.qml:879
449457msgid "Failed, tap to retry"
450−msgstr ""
458+msgstr "Neuspjelo, dodirni za ponovni pokušaj"
451459
452460#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
453461msgctxt "Label: Hint in message indicator line edit"
454462msgid "Reply"
455−msgstr ""
463+msgstr "Odgovori"
456464
457465#: qml/Panel/Indicators/MessageMenuItemFactory.qml:204
458466msgid "Call back"
459−msgstr ""
467+msgstr "Uzvrati poziv"
460468
461469#: qml/Panel/Indicators/ModemInfoItem.qml:105
462470msgid "Unlock SIM"
463−msgstr ""
471+msgstr "Otključaj SIM"
464472
465473#: qml/Panel/Indicators/RoamingIndication.qml:27
466474msgid "Roaming"
467−msgstr ""
475+msgstr "Roaming"
468476
469477#: qml/Tutorial/TutorialBottomFinish.qml:24
470478msgid "This action does different things for different apps"
471−msgstr ""
479+msgstr "Ova radnja izvršava različite stvari za različite aplikacije"
472480
473481#: qml/Tutorial/TutorialBottomFinish.qml:25
474482msgid "Tap here to finish."
475−msgstr ""
483+msgstr "Dodirni za završetak."
476484
477485#: qml/Tutorial/TutorialBottom.qml:28
478486msgid "Open special menus"
479−msgstr ""
487+msgstr "Otvori posebne izbornike"
480488
481489#: qml/Tutorial/TutorialBottom.qml:29
482490msgid "Swipe up from the bottom edge."
483−msgstr ""
491+msgstr "Povuci s donjeg ruba."
484492
485493#: qml/Tutorial/TutorialContent.qml:80 qml/Tutorial/TutorialLeftFinish.qml:25
486494#: qml/Tutorial/TutorialRight.qml:144
487495msgid "Tap here to continue."
488−msgstr ""
496+msgstr "Dodirni ovdje za nastavak."
489497
490498#: qml/Tutorial/TutorialLeftFinish.qml:24
491499msgid "These are the shortcuts to favorite apps"
492−msgstr ""
500+msgstr "Ovo su prečaci do omiljenih aplikacija"
493501
494502#: qml/Tutorial/TutorialLeft.qml:26
495503msgid "Open the launcher"
496−msgstr ""
504+msgstr "Otvori pokretač"
497505
498506#: qml/Tutorial/TutorialLeft.qml:27
499507msgid "Short swipe from the left edge."
500−msgstr ""
508+msgstr "Povuci kratko s lijevog ruba"
501509
502510#: qml/Tutorial/TutorialPage.qml:178
503511msgid "You almost got it!"
504−msgstr ""
512+msgstr "Još malo i završili ste!"
505513
506514#: qml/Tutorial/TutorialPage.qml:195
507515msgid "Try again."
508−msgstr ""
516+msgstr "Pokušaj ponovno."
509517
510518#: qml/Tutorial/TutorialRight.qml:31
511519msgid "To view open apps"
@@ -522,63 +530,63 @@ msgstr ""
522530#: qml/Wizard/Page.qml:89
523531msgctxt "Button: Go back one page in the Wizard"
524532msgid "Back"
525−msgstr ""
533+msgstr "Natrag"
526534
527535#: qml/Wizard/Pages/here-terms.qml:27
528536msgid "Terms & Conditions"
529−msgstr ""
537+msgstr "Uvjeti i odredbe"
530538
531539#: qml/Wizard/Pages/passwd-confirm.qml:49
532540msgid "Confirm passphrase"
533−msgstr ""
541+msgstr "Potvrdi lozinku"
534542
535543#: qml/Wizard/Pages/passwd-confirm.qml:50
536544msgid "Confirm passcode"
537−msgstr ""
545+msgstr "Potvrdi lozinku"
538546
539547#: qml/Wizard/Pages/passwd-confirm.qml:53
540548#: qml/Wizard/Pages/passwd-confirm.qml:54
541549msgid "Please try again."
542−msgstr ""
550+msgstr "Pokušajte ponovno."
543551
544552#: qml/Wizard/Pages/passwd-confirm.qml:82 qml/Wizard/Pages/passwd-set.qml:90
545553#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
546554#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
547555#: qml/Wizard/Pages/60-reporting.qml:50
548556msgid "Continue"
549−msgstr ""
557+msgstr "Nastavi"
550558
551559#: qml/Wizard/Pages/passwd-set.qml:61
552560msgid "Choose your passcode"
553−msgstr ""
561+msgstr "Odaberite vašu lozinku"
554562
555563#: qml/Wizard/Pages/passwd-set.qml:68
556564msgid "Passphrase must be 4 characters long"
557−msgstr ""
565+msgstr "Lozinka mora biti dugačka 4 znamenke"
558566
559567#: qml/Wizard/Pages/10-welcome.qml:27
560568msgid "Hi!"
561−msgstr ""
569+msgstr "Bok!"
562570
563571#: qml/Wizard/Pages/10-welcome.qml:44
564572msgid "Welcome to your Ubuntu phone."
565−msgstr ""
573+msgstr "Dobrodošli u vaš Ubuntu telefon."
566574
567575#: qml/Wizard/Pages/10-welcome.qml:52
568576msgid "Let’s get started."
569−msgstr ""
577+msgstr "Započnimo."
570578
571579#: qml/Wizard/Pages/20-sim.qml:25
572580msgid "Add a SIM card and restart your device"
573−msgstr ""
581+msgstr "Dodajte SIM karticu i ponovno pokrenite svoj uređaj"
574582
575583#: qml/Wizard/Pages/20-sim.qml:59
576584msgid "Without it, you won’t be able to make calls or use text messaging."
577−msgstr ""
585+msgstr "Bez nje, nećete moći pozivati i slati tekstovne poruke."
578586
579587#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
580588msgid "Skip"
581−msgstr ""
589+msgstr "Preskoči"
582590
583591#: qml/Wizard/Pages/30-passwd-type.qml:39
584592msgid "Lock security"
po/hu.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/hy.po+2−2
@@ -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: 2015-09-30 05:42+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ia.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/id.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/is.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
21−"X-Generator: Launchpad (build 17768)\n"
20+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
21+"X-Generator: Launchpad (build 17812)\n"
2222"Language: is\n"
2323
2424#: plugins/IntegratedLightDM/Greeter.cpp:112
po/it.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ja.po+4−4
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-09-16 00:49+0200\n"
11−"PO-Revision-Date: 2014-11-20 05:08+0000\n"
11+"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"
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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -390,7 +390,7 @@ msgstr "グループ通話"
390390
391391#: qml/Panel/Indicators/MenuItemFactory.qml:718
392392msgid "Nothing is playing"
393−msgstr ""
393+msgstr "再生するものがありません"
394394
395395#: qml/Panel/Indicators/MenuItemFactory.qml:847
396396#, qt-format
po/km.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/kn.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ko.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ku.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ky.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/lo.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/lt.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
po/lv.po+2−2
@@ -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%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ml.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/mr.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ms.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/my.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/nb.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/nl.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/nn.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/oc.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/or.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/pa.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/pl.po+5−5
@@ -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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
@@ -30,7 +30,7 @@ msgstr "Przypnij skrót"
3030
3131#: plugins/Unity/Launcher/launcheritem.cpp:52
3232msgid "Quit"
33−msgstr ""
33+msgstr "Zakończ"
3434
3535#: plugins/Unity/Launcher/launcheritem.cpp:106
3636msgid "Unpin shortcut"
@@ -377,7 +377,7 @@ msgstr "Niestety, błędne hasło"
377377#: qml/Greeter/NarrowView.qml:121
378378msgctxt "passphrase"
379379msgid "Please re-enter"
380−msgstr ""
380+msgstr "Wprowadź ponownie"
381381
382382#: qml/Greeter/NarrowView.qml:122
383383msgid "Sorry, incorrect passcode"
@@ -464,7 +464,7 @@ msgstr "Odpowiedz"
464464
465465#: qml/Panel/Indicators/MessageMenuItemFactory.qml:204
466466msgid "Call back"
467−msgstr ""
467+msgstr "Oddzwoń"
468468
469469#: qml/Panel/Indicators/ModemInfoItem.qml:105
470470msgid "Unlock SIM"
po/pt.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/pt_BR.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ro.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
po/ru.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
po/shn.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/si.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/sk.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/sl.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
po/sq.po+2−2
@@ -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: 2015-09-30 05:42+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/sr.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
21−"X-Generator: Launchpad (build 17768)\n"
20+"X-Launchpad-Export-Date: 2015-10-16 05:57+0000\n"
21+"X-Generator: Launchpad (build 17812)\n"
2222"Language: sr\n"
2323
2424#: plugins/IntegratedLightDM/Greeter.cpp:112
po/sv.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020"Language: sv\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/sw.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/ta.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020"Language: ta\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
po/te.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/th.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/tr.po+4−4
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -29,7 +29,7 @@ msgstr "Kısayolu iğnele"
2929
3030#: plugins/Unity/Launcher/launcheritem.cpp:52
3131msgid "Quit"
32−msgstr ""
32+msgstr "Çıkış"
3333
3434#: plugins/Unity/Launcher/launcheritem.cpp:106
3535msgid "Unpin shortcut"
@@ -459,7 +459,7 @@ msgstr "Yanıtla"
459459
460460#: qml/Panel/Indicators/MessageMenuItemFactory.qml:204
461461msgid "Call back"
462−msgstr ""
462+msgstr "Geri ara"
463463
464464#: qml/Panel/Indicators/ModemInfoItem.qml:105
465465msgid "Unlock SIM"
po/ug.po+9−9
@@ -9,14 +9,14 @@ msgstr ""
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2015-09-16 00:49+0200\n"
1111"PO-Revision-Date: 2015-10-02 03:54+0000\n"
12−"Last-Translator: eltikin <eltikinuyghur@hotmail.com>\n"
12+"Last-Translator: Eltikin <eltikinuyghur@hotmail.com>\n"
1313"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\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: 2015-10-03 05:40+0000\n"
19−"X-Generator: Launchpad (build 17783)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
@@ -48,7 +48,7 @@ msgstr ""
4848#. en_US example: "%l:%M %p" --> "1:00 PM"
4949#: plugins/Utils/relativetimeformatter.cpp:164
5050msgid "%l:%M %p"
51−msgstr ""
51+msgstr "%l:%M %p"
5252
5353#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
5454#. This format string is used for showing, on a 12-hour clock, events/appointments that happen tomorrow.
@@ -64,7 +64,7 @@ msgstr "ئەتە %l:%M %p"
6464#. en_US example: "%a\u2003%l:%M %p" --> "Fri 1:00 PM"
6565#: plugins/Utils/relativetimeformatter.cpp:181
6666msgid "%a %l:%M %p"
67−msgstr ""
67+msgstr "%a %l:%M %p"
6868
6969#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
7070#. This format string is used for showing, on a 12-hour clock, times that happened before a week from now.
@@ -73,7 +73,7 @@ msgstr ""
7373#. en_GB example: "%a %b %d\u2003%l:%M %p" --> "Fri 31 Oct 1:00 PM"
7474#: plugins/Utils/relativetimeformatter.cpp:190
7575msgid "%a %d %b %l:%M %p"
76−msgstr ""
76+msgstr "%a %d %b %l:%M %p"
7777
7878#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
7979#. This format string is used for showing, on a 24-hour clock, times that happen yesterday.
@@ -88,7 +88,7 @@ msgstr ""
8888#. en_US example: "%H:%M" --> "13:00"
8989#: plugins/Utils/relativetimeformatter.cpp:208
9090msgid "%H:%M"
91−msgstr ""
91+msgstr "%H:%M"
9292
9393#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
9494#. This format string is used for showing, on a 24-hour clock, events/appointments that happen tomorrow.
@@ -104,7 +104,7 @@ msgstr "ئەتە %H:%M"
104104#. en_US example: "%a\u2003%H:%M" --> "Fri 13:00"
105105#: plugins/Utils/relativetimeformatter.cpp:225
106106msgid "%a %H:%M"
107−msgstr ""
107+msgstr "%a %H:%M"
108108
109109#. Translators, please edit/rearrange these strftime(3) tokens to suit your locale!
110110#. This format string is used for showing, on a 24-hour clock, times that happened before a week from now.
@@ -113,7 +113,7 @@ msgstr ""
113113#. en_GB example: "%a %b %d\u2003%H:%M" --> "Fri 31 Oct 13:00"
114114#: plugins/Utils/relativetimeformatter.cpp:234
115115msgid "%a %d %b %H:%M"
116−msgstr ""
116+msgstr "%a %d %b %H:%M"
117117
118118#: qml/Components/DelayedLockscreen.qml:49
119119msgid "Device Locked"
po/uk.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
20−"X-Generator: Launchpad (build 17768)\n"
19+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
20+"X-Generator: Launchpad (build 17812)\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
2323msgid "Password: "
po/ur.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/uz.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/vi.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/xh.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/zh_CN.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/zh_HK.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020
2121#: plugins/IntegratedLightDM/Greeter.cpp:112
2222msgid "Password: "
po/zh_TW.po+2−2
@@ -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: 2015-09-30 05:43+0000\n"
19−"X-Generator: Launchpad (build 17768)\n"
18+"X-Launchpad-Export-Date: 2015-10-16 05:58+0000\n"
19+"X-Generator: Launchpad (build 17812)\n"
2020"Language: zh_TW\n"
2121
2222#: plugins/IntegratedLightDM/Greeter.cpp:112
qml/Components/Dialogs.qml+3−2
@@ -20,6 +20,7 @@ import Unity.Application 0.1
2020import Unity.Session 0.1
2121import Ubuntu.Components 1.1
2222import GlobalShortcut 1.0
23+import Unity.Platform 1.0
2324import "../Greeter"
2425
2526Item {
@@ -46,13 +47,13 @@ Item {
4647
4748 GlobalShortcut { // reboot/shutdown dialog
4849 shortcut: Qt.Key_PowerDown
49− active: root.usageScenario === "desktop"
50+ active: Platform.isPC
5051 onTriggered: root.unitySessionService.RequestShutdown()
5152 }
5253
5354 GlobalShortcut { // reboot/shutdown dialog
5455 shortcut: Qt.Key_PowerOff
55− active: root.usageScenario === "desktop"
56+ active: Platform.isPC
5657 onTriggered: root.unitySessionService.RequestShutdown()
5758 }
5859
qml/Components/ScreenGrabber.qml+4−1
@@ -26,6 +26,9 @@ Rectangle {
2626 anchors.fill: parent
2727 opacity: 0.0
2828
29+ // to be set from outside
30+ property int rotationAngle: 0
31+
2932 ScreenGrabber {
3033 id: screenGrabber
3134 objectName: "screenGrabber"
@@ -67,7 +70,7 @@ Rectangle {
6770 to: 0.0
6871 onStopped: {
6972 if (visible) {
70− screenGrabber.captureAndSave();
73+ screenGrabber.captureAndSave(root.rotationAngle);
7174 visible = false;
7275 }
7376 }
qml/Components/WallpaperResolver.qmlnew file+63
@@ -0,0 +1,63 @@
1+/*
2+ * Copyright (C) 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 AccountsService 0.1
19+import GSettings 1.0
20+import Ubuntu.Components 1.3
21+
22+/*
23+ Defines the background URL based on several factors, such as:
24+ - default, fallback, background
25+ - Background set in AccountSettings, if any
26+ - Background set in GSettings, if any
27+ */
28+QtObject {
29+ // Users should set their UI width here.
30+ property real width
31+
32+ property url defaultBackground: Qt.resolvedUrl(width >= units.gu(60) ? "../graphics/tablet_background.jpg"
33+ : "../graphics/phone_background.jpg")
34+
35+ // That's the property users of this component are going to consume.
36+ readonly property url background: asImageTester.status == Image.Ready ? asImageTester.source
37+ : gsImageTester.status == Image.Ready ? gsImageTester.source : defaultBackground
38+
39+ // This is a dummy image to detect if the custom AS set wallpaper loads successfully.
40+ property var _asImageTester: Image {
41+ id: asImageTester
42+ source: AccountsService.backgroundFile != undefined && AccountsService.backgroundFile.length > 0 ? AccountsService.backgroundFile : ""
43+ height: 0
44+ width: 0
45+ sourceSize.height: 0
46+ sourceSize.width: 0
47+ }
48+
49+ // This is a dummy image to detect if the custom GSettings set wallpaper loads successfully.
50+ property var _gsImageTester: Image {
51+ id: gsImageTester
52+ source: backgroundSettings.pictureUri && backgroundSettings.pictureUri.length > 0 ? backgroundSettings.pictureUri : ""
53+ height: 0
54+ width: 0
55+ sourceSize.height: 0
56+ sourceSize.width: 0
57+ }
58+
59+ property var _gsettings: GSettings {
60+ id: backgroundSettings
61+ schema.id: "org.gnome.desktop.background"
62+ }
63+}
qml/DeviceConfiguration.qml+1
@@ -86,6 +86,7 @@ StateGroup {
8686 PropertyChanges {
8787 target: root
8888 category: "desktop"
89+ supportedOrientations: root.useNativeOrientation
8990 }
9091 }
9192 ]
qml/DisabledScreenNotice.qmlnew file+49
@@ -0,0 +1,49 @@
1+/*
2+ * Copyright (C) 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 Ubuntu.Components 1.3
19+import "Components"
20+
21+Image {
22+ id: root
23+
24+ WallpaperResolver {
25+ width: root.width
26+ id: wallpaperResolver
27+ }
28+
29+ source: wallpaperResolver.background
30+
31+ UbuntuShape {
32+ anchors.fill: text
33+ anchors.margins: -units.gu(2)
34+ backgroundColor: "black"
35+ opacity: 0.4
36+ }
37+
38+ Label {
39+ id: text
40+ anchors.centerIn: parent
41+ width: parent.width / 2
42+ text: i18n.tr("Your device is now connected to an external display.")
43+ color: "white"
44+ horizontalAlignment: Text.AlignHCenter
45+ verticalAlignment: Text.AlignVCenter
46+ fontSize: "x-large"
47+ wrapMode: Text.Wrap
48+ }
49+}
qml/Notifications/Notification.qml+4−2
@@ -50,6 +50,7 @@ Item {
5050 readonly property real contentSpacing: units.gu(2)
5151 readonly property bool canBeClosed: type === Notification.Ephemeral
5252 property bool hasMouse
53+ property url background: ""
5354
5455 objectName: "background"
5556 implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : outterColumn.height - shapedBack.anchors.topMargin + contentSpacing * 2) : 0
@@ -283,7 +284,7 @@ Item {
283284 fontSize: "medium"
284285 color: darkOnBright ? sdFontColor : Theme.palette.selected.backgroundText
285286 elide: Text.ElideRight
286− textFormat: Text.StyledText
287+ textFormat: Text.PlainText
287288 }
288289
289290 Label {
@@ -300,7 +301,7 @@ Item {
300301 wrapMode: Text.WordWrap
301302 maximumLineCount: type == Notification.SnapDecision ? 12 : 2
302303 elide: Text.ElideRight
303− textFormat: Text.StyledText
304+ textFormat: Text.PlainText
304305 }
305306 }
306307
@@ -401,6 +402,7 @@ Item {
401402 menuData: model
402403 menuIndex: index
403404 maxHeight: notification.maxHeight
405+ background: notification.background
404406
405407 onLoaded: {
406408 notification.fullscreen = Qt.binding(function() { return fullscreen; });
qml/Notifications/NotificationMenuItemFactory.qml+2−1
@@ -30,6 +30,7 @@ Loader {
3030 property int menuIndex : -1
3131 property int maxHeight
3232 readonly property bool fullscreen: menuData.type === "com.canonical.snapdecision.pinlock"
33+ property url background: ""
3334
3435 signal accepted()
3536
@@ -149,7 +150,7 @@ Loader {
149150 infoText: notification.summary
150151 errorText: errorAction.valid ? errorAction.state : ""
151152 retryText: notification.body
152− background: shell.background
153+ background: menuFactory.background
153154 darkenBackground: 0.4
154155
155156 onEntered: {
qml/Notifications/Notifications.qml+2
@@ -29,6 +29,7 @@ ListView {
2929 property real margin
3030 property bool useModal: snapDecisionProxyModel.count > 0
3131 property bool hasMouse
32+ property url background: ""
3233
3334 UnitySortFilterProxyModel {
3435 id: snapDecisionProxyModel
@@ -60,6 +61,7 @@ ListView {
6061 maxHeight: notificationList.height
6162 margins: notificationList.margin
6263 hasMouse: notificationList.hasMouse
64+ background: notificationList.background
6365
6466 // make sure there's no opacity-difference between the several
6567 // elements in a notification
qml/OrientedShell.qml+10−1
@@ -76,6 +76,12 @@ Rectangle {
7676 oskSettings.disableHeight = shell.usageScenario == "desktop"
7777 }
7878
79+ // we must rotate to a supported orientation regardless of shell's preference
80+ property bool orientationChangesEnabled:
81+ (orientation & supportedOrientations) === 0 ? true
82+ : shell.orientationChangesEnabled
83+
84+
7985 Binding {
8086 target: oskSettings
8187 property: "stayHidden"
@@ -89,7 +95,10 @@ Rectangle {
8995 }
9096
9197 readonly property int supportedOrientations: shell.supportedOrientations
92− & deviceConfiguration.supportedOrientations
98+ & (deviceConfiguration.supportedOrientations == deviceConfiguration.useNativeOrientation
99+ ? nativeOrientation
100+ : deviceConfiguration.supportedOrientations)
101+
93102 property int acceptedOrientationAngle: {
94103 if (orientation & supportedOrientations) {
95104 return Screen.angleBetween(nativeOrientation, orientation);
qml/Panel/Indicators/MenuItemFactory.qml+19−15
@@ -20,7 +20,7 @@ import Ubuntu.Settings.Components 0.1
2020import QMenuModel 0.1
2121import Utils 0.1 as Utils
2222import Ubuntu.Components.ListItems 0.1 as ListItems
23−import Ubuntu.Components 1.2
23+import Ubuntu.Components 1.3
2424import Unity.Session 0.1
2525
2626Item {
@@ -350,20 +350,23 @@ Item {
350350 id: alarmMenu;
351351
352352 Menus.EventMenu {
353+ id: alarmItem
353354 objectName: "alarmMenu"
354355 property QtObject menuData: null
355356 property var menuModel: menuFactory.menuModel
356357 property int menuIndex: -1
357358 property var extendedData: menuData && menuData.ext || undefined
358− // TODO - bug #1260728
359− property var timeFormatter: Utils.GDateTimeFormatter {
360− time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
361− format: getExtendedProperty(extendedData, "xCanonicalTimeFormat", "")
359+
360+ property date serverTime: new Date(getExtendedProperty(extendedData, "xCanonicalTime", 0) * 1000)
361+ LiveTimer {
362+ frequency: LiveTimer.Relative
363+ relativeTime: alarmItem.serverTime
364+ onTrigger: alarmItem.serverTime = new Date(getExtendedProperty(extendedData, "xCanonicalTime", 0) * 1000)
362365 }
363366
364367 text: menuData && menuData.label || ""
365368 iconSource: menuData && menuData.icon || "image://theme/alarm-clock"
366− time: timeFormatter.timeString
369+ time: i18n.relativeDateTime(serverTime)
367370 enabled: menuData && menuData.sensitive || false
368371 highlightWhenPressed: false
369372
@@ -379,8 +382,7 @@ Item {
379382
380383 function loadAttributes() {
381384 if (!menuModel || menuIndex == -1) return;
382− menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-time': 'int64',
383− 'x-canonical-time-format': 'string'});
385+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-time': 'int64'});
384386 }
385387 }
386388 }
@@ -389,20 +391,23 @@ Item {
389391 id: appointmentMenu;
390392
391393 Menus.EventMenu {
394+ id: appointmentItem
392395 objectName: "appointmentMenu"
393396 property QtObject menuData: null
394397 property var menuModel: menuFactory.menuModel
395398 property int menuIndex: -1
396399 property var extendedData: menuData && menuData.ext || undefined
397− // TODO - bug #1260728
398− property var timeFormatter: Utils.GDateTimeFormatter {
399− time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
400− format: getExtendedProperty(extendedData, "xCanonicalTimeFormat", "")
400+
401+ property date serverTime: new Date(getExtendedProperty(extendedData, "xCanonicalTime", 0) * 1000)
402+ LiveTimer {
403+ frequency: LiveTimer.Relative
404+ relativeTime: appointmentItem.serverTime
405+ onTrigger: appointmentItem.serverTime = new Date(getExtendedProperty(extendedData, "xCanonicalTime", 0) * 1000)
401406 }
402407
403408 text: menuData && menuData.label || ""
404409 iconSource: menuData && menuData.icon || "image://theme/calendar"
405− time: timeFormatter.timeString
410+ time: i18n.relativeDateTime(serverTime)
406411 eventColor: getExtendedProperty(extendedData, "xCanonicalColor", Qt.rgba(0.0, 0.0, 0.0, 0.0))
407412 enabled: menuData && menuData.sensitive || false
408413 highlightWhenPressed: false
@@ -420,8 +425,7 @@ Item {
420425 function loadAttributes() {
421426 if (!menuModel || menuIndex == -1) return;
422427 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-color': 'string',
423− 'x-canonical-time': 'int64',
424− 'x-canonical-time-format': 'string'});
428+ 'x-canonical-time': 'int64'});
425429 }
426430 }
427431 }
qml/Panel/Indicators/MessageMenuItemFactory.qml+35−26
@@ -19,7 +19,7 @@
1919 */
2020
2121import QtQuick 2.0
22−import Ubuntu.Components 0.1
22+import Ubuntu.Components 1.3
2323import Ubuntu.Settings.Menus 0.1 as Menus
2424import QMenuModel 0.1 as QMenuModel
2525import Utils 0.1 as Utils
@@ -35,12 +35,17 @@ Loader {
3535 signal menuSelected
3636 signal menuDeselected
3737
38− property var extendedData: menuData && menuData.ext || undefined
39− property var actionsDescription: getExtendedProperty(extendedData, "xCanonicalMessageActions", undefined)
40−
41− // TODO - bug #1260728
42− property var timeFormatter: Utils.RelativeTimeFormatter {
43− time: getExtendedProperty(extendedData, "xCanonicalTime", 0) / 1000000
38+ QtObject {
39+ id: priv
40+ property var extendedData: menuData && menuData.ext || undefined
41+ property var actionsDescription: getExtendedProperty(extendedData, "xCanonicalMessageActions", undefined)
42+ property date time: new Date(getExtendedProperty(extendedData, "xCanonicalTime", 0) / 1000)
43+ property string timeString: i18n.relativeDateTime(time)
44+ }
45+ LiveTimer {
46+ frequency: LiveTimer.Relative
47+ relativeTime: priv.time
48+ onTrigger: priv.timeString = Qt.binding(function() { return i18n.relativeDateTime(priv.time); })
4449 }
4550
4651 onMenuModelChanged: {
@@ -50,7 +55,7 @@ Loader {
5055 loadAttributes();
5156 }
5257
53− sourceComponent: loadMessage(actionsDescription)
58+ sourceComponent: loadMessage(priv.actionsDescription)
5459
5560 function loadMessage(actions)
5661 {
@@ -100,11 +105,11 @@ Loader {
100105 objectName: "simpleTextMessage"
101106 // text
102107 title: menuData && menuData.label || ""
103− time: timeFormatter.timeString
104− body: getExtendedProperty(extendedData, "xCanonicalText", "")
108+ time: priv.timeString
109+ body: getExtendedProperty(priv.extendedData, "xCanonicalText", "")
105110 // icons
106− avatar: getExtendedProperty(extendedData, "icon", "image://theme/contact")
107− icon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "image://theme/message")
111+ avatar: getExtendedProperty(priv.extendedData, "icon", "image://theme/contact")
112+ icon: getExtendedProperty(priv.extendedData, "xCanonicalAppIcon", "image://theme/message")
108113 // actions
109114 enabled: menuData && menuData.sensitive || false
110115 removable: !selected
@@ -133,7 +138,9 @@ Loader {
133138 Menus.TextMessageMenu {
134139 id: message
135140 objectName: "textMessage"
136− property var replyActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
141+ property var replyActionDescription: priv.actionsDescription && priv.actionsDescription.length > 0 ?
142+ priv.actionsDescription[0] :
143+ undefined
137144
138145 property var replyAction: QMenuModel.UnityMenuAction {
139146 model: menuModel
@@ -143,13 +150,13 @@ Loader {
143150
144151 // text
145152 title: menuData && menuData.label || ""
146− time: timeFormatter.timeString
147− body: getExtendedProperty(extendedData, "xCanonicalText", "")
148− replyButtonText: getExtendedProperty(replyActionDescription, "label", i18n.tr("Send"))
153+ time: priv.timeString
154+ body: getExtendedProperty(priv.extendedData, "xCanonicalText", "")
155+ replyButtonText: getExtendedProperty(replyActionDescription, "label", i18n.ctr("Button: Send a reply message", "Send"))
149156 replyHintText: i18n.ctr("Label: Hint in message indicator line edit", "Reply")
150157 // icons
151− avatar: getExtendedProperty(extendedData, "icon", "image://theme/contact")
152− icon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "image://theme/message")
158+ avatar: getExtendedProperty(priv.extendedData, "icon", "image://theme/contact")
159+ icon: getExtendedProperty(priv.extendedData, "xCanonicalAppIcon", "image://theme/message")
153160 // actions
154161 replyEnabled: replyAction.valid && replyAction.enabled
155162 enabled: menuData && menuData.sensitive || false
@@ -183,8 +190,10 @@ Loader {
183190 Menus.SnapDecisionMenu {
184191 id: message
185192 objectName: "snapDecision"
186− property var activateActionDescription: actionsDescription && actionsDescription.length > 0 ? actionsDescription[0] : undefined
187− property var replyActionDescription: actionsDescription && actionsDescription.length > 1 ? actionsDescription[1] : undefined
193+ property var activateActionDescription: priv.actionsDescription && priv.actionsDescription.length > 0 ?
194+ priv.actionsDescription[0] : undefined
195+ property var replyActionDescription: priv.actionsDescription && priv.actionsDescription.length > 1 ?
196+ priv.actionsDescription[1] : undefined
188197
189198 property var activateAction: QMenuModel.UnityMenuAction {
190199 model: menuModel
@@ -199,13 +208,13 @@ Loader {
199208
200209 // text
201210 title: menuData && menuData.label || ""
202− time: timeFormatter.timeString
203− body: getExtendedProperty(extendedData, "xCanonicalText", "")
204− actionButtonText: getExtendedProperty(activateActionDescription, "label", i18n.tr("Call back"))
205− replyButtonText: getExtendedProperty(replyActionDescription, "label", i18n.tr("Send"))
211+ time: priv.timeString
212+ body: getExtendedProperty(priv.extendedData, "xCanonicalText", "")
213+ actionButtonText: getExtendedProperty(activateActionDescription, "label", i18n.ctr("Button: Call back on phone", "Call back"))
214+ replyButtonText: getExtendedProperty(replyActionDescription, "label", i18n.ctr("Button: Send a reply message", "Send"))
206215 // icons
207− avatar: getExtendedProperty(extendedData, "icon", "image://theme/contact")
208− icon: getExtendedProperty(extendedData, "xCanonicalAppIcon", "image://theme/missed-call")
216+ avatar: getExtendedProperty(priv.extendedData, "icon", "image://theme/contact")
217+ icon: getExtendedProperty(priv.extendedData, "xCanonicalAppIcon", "image://theme/missed-call")
209218 // actions
210219 actionEnabled: activateAction.valid && activateAction.enabled
211220 replyEnabled: replyAction.valid && replyAction.enabled
qml/Rotation/RotationStates.qml+2−2
@@ -83,7 +83,7 @@ StateGroup {
8383 }
8484
8585 function tryUpdateState() {
86− if (d.transitioning || (!d.startingUp && !root.shell.orientationChangesEnabled)) {
86+ if (d.transitioning || (!d.startingUp && !root.orientedShell.orientationChangesEnabled)) {
8787 return;
8888 }
8989
@@ -95,7 +95,7 @@ StateGroup {
9595 }
9696
9797 property Connections shellConnections: Connections {
98− target: root.shell
98+ target: root.orientedShell
9999 onOrientationChangesEnabledChanged: {
100100 d.tryUpdateState();
101101 }
qml/Shell.qml+10−33
@@ -17,7 +17,6 @@
1717import QtQuick 2.0
1818import QtQuick.Window 2.0
1919import AccountsService 0.1
20−import GSettings 1.0
2120import Unity.Application 0.1
2221import Ubuntu.Components 0.1
2322import Ubuntu.Components.Popups 1.0
@@ -109,9 +108,11 @@ Item {
109108 enabled: greeter && !greeter.waiting
110109
111110 property real edgeSize: units.gu(2)
112− property url defaultBackground: Qt.resolvedUrl(shell.width >= units.gu(60) ? "graphics/tablet_background.jpg" : "graphics/phone_background.jpg")
113− property url background: asImageTester.status == Image.Ready ? asImageTester.source
114− : gsImageTester.status == Image.Ready ? gsImageTester.source : defaultBackground
111+
112+ WallpaperResolver {
113+ id: wallpaperResolver
114+ width: shell.width
115+ }
115116
116117 readonly property alias greeter: greeterLoader.item
117118
@@ -132,31 +133,6 @@ Item {
132133 shell.activateApplication(app);
133134 }
134135
135− // This is a dummy image to detect if the custom AS set wallpaper loads successfully.
136− Image {
137− id: asImageTester
138− source: AccountsService.backgroundFile != undefined && AccountsService.backgroundFile.length > 0 ? AccountsService.backgroundFile : ""
139− height: 0
140− width: 0
141− sourceSize.height: 0
142− sourceSize.width: 0
143− }
144−
145− GSettings {
146− id: backgroundSettings
147− schema.id: "org.gnome.desktop.background"
148− }
149−
150− // This is a dummy image to detect if the custom GSettings set wallpaper loads successfully.
151− Image {
152− id: gsImageTester
153− source: backgroundSettings.pictureUri && backgroundSettings.pictureUri.length > 0 ? backgroundSettings.pictureUri : ""
154− height: 0
155− width: 0
156− sourceSize.height: 0
157− sourceSize.width: 0
158− }
159−
160136 Binding {
161137 target: LauncherModel
162138 property: "applicationManager"
@@ -324,7 +300,7 @@ Item {
324300 Binding {
325301 target: applicationsDisplayLoader.item
326302 property: "background"
327− value: shell.background
303+ value: wallpaperResolver.background
328304 }
329305 Binding {
330306 target: applicationsDisplayLoader.item
@@ -429,7 +405,7 @@ Item {
429405 tabletMode: shell.usageScenario != "phone"
430406 launcherOffset: launcher.progress
431407 forcedUnlock: tutorial.running
432− background: shell.background
408+ background: wallpaperResolver.background
433409
434410 // avoid overlapping with Launcher's edge drag area
435411 // FIXME: Fix TouchRegistry & friends and remove this workaround
@@ -605,7 +581,7 @@ Item {
605581 id: wizard
606582 objectName: "wizard"
607583 anchors.fill: parent
608− background: shell.background
584+ background: wallpaperResolver.background
609585
610586 function unlockWhenDoneWithWizard() {
611587 if (!active) {
@@ -636,6 +612,7 @@ Item {
636612 model: NotificationBackend.Model
637613 margin: units.gu(1)
638614 hasMouse: shell.hasMouse
615+ background: wallpaperResolver.background
639616
640617 y: topmostIsFullscreen ? 0 : panel.panelHeight
641618 height: parent.height - (topmostIsFullscreen ? 0 : panel.panelHeight)
@@ -684,6 +661,7 @@ Item {
684661
685662 ScreenGrabber {
686663 id: screenGrabber
664+ rotationAngle: -shell.orientationAngle
687665 z: dialogs.z + 10
688666 }
689667
@@ -712,5 +690,4 @@ Item {
712690 }
713691 }
714692 }
715−
716693}
qml/Stages/ApplicationWindow.qml+2
@@ -27,6 +27,8 @@ FocusScope {
2727 readonly property bool fullscreen: application ? application.fullscreen : false
2828 property alias interactive: sessionContainer.interactive
2929 property bool orientationChangesEnabled: d.supportsSurfaceResize ? d.surfaceOldEnoughToBeResized : true
30+ readonly property string title: sessionContainer.surface && sessionContainer.surface.name !== "" ?
31+ sessionContainer.surface.name : d.name
3032
3133 // to be set from outside
3234 property QtObject application
qml/Stages/DecoratedWindow.qml+1−1
@@ -66,7 +66,7 @@ FocusScope {
6666 objectName: application ? "appWindowDecoration_" + application.appId : "appWindowDecoration_null"
6767 anchors { left: parent.left; top: parent.top; right: parent.right }
6868 height: units.gu(3)
69− title: model.name
69+ title: window.title !== "" ? window.title : model.name
7070 onClose: root.close();
7171 onMaximize: root.maximize();
7272 onMinimize: root.minimize();
qml/Stages/SurfaceContainer.qml+1
@@ -28,6 +28,7 @@ FocusScope {
2828 property bool hadSurface: false
2929 property bool interactive
3030 property int surfaceOrientationAngle: 0
31+ property string name: surface ? surface.name : ""
3132 property bool resizeSurface: true
3233
3334 onSurfaceChanged: {
src/ApplicationArguments.h+10−2
@@ -26,17 +26,25 @@
2626class ApplicationArguments : public QObject
2727{
2828 Q_OBJECT
29− Q_PROPERTY(QString deviceName READ deviceName CONSTANT)
29+ Q_PROPERTY(QString deviceName READ deviceName NOTIFY deviceNameChanged)
3030 Q_PROPERTY(QString mode READ mode CONSTANT)
3131public:
3232 ApplicationArguments(QObject *parent = nullptr);
3333
34− void setDeviceName(const QString &deviceName) { m_deviceName = deviceName; }
34+ void setDeviceName(const QString &deviceName) {
35+ if (deviceName != m_deviceName) {
36+ m_deviceName = deviceName;
37+ Q_EMIT deviceNameChanged(m_deviceName);
38+ }
39+ }
3540 QString deviceName() const { return m_deviceName; }
3641
3742 void setMode(const QString &mode) { m_mode = mode; }
3843 QString mode() const { return m_mode; }
3944
45+Q_SIGNALS:
46+ void deviceNameChanged(const QString&);
47+
4048private:
4149 QString m_deviceName;
4250 QString m_mode;
src/CMakeLists.txt+3
@@ -21,6 +21,9 @@ add_executable(${SHELL_APP}
2121 main.cpp
2222 MouseTouchAdaptor.cpp
2323 CachingNetworkManagerFactory.cpp
24+ SecondaryWindow.cpp
25+ ShellApplication.cpp
26+ ShellView.cpp
2427 UnityCommandLineParser.cpp
2528 ${QML_FILES} # This is to make qml and image files appear in the IDE's project tree
2629)
src/SecondaryWindow.cppnew file+31
@@ -0,0 +1,31 @@
1+/*
2+ * Copyright (C) 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 "SecondaryWindow.h"
18+
19+// local
20+#include <paths.h>
21+
22+SecondaryWindow::SecondaryWindow(QQmlEngine *engine)
23+ : QQuickView(engine, nullptr)
24+{
25+ setResizeMode(QQuickView::SizeRootObjectToView);
26+ setColor("black");
27+ setTitle(QStringLiteral("Unity8 Shell - Secondary Screen"));
28+
29+ QUrl source(::qmlDirectory() + "/DisabledScreenNotice.qml");
30+ setSource(source);
31+}
src/SecondaryWindow.hnew file+30
@@ -0,0 +1,30 @@
1+/*
2+ * Copyright (C) 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 UNITY_SECONDARY_WINDOW_H
18+#define UNITY_SECONDARY_WINDOW_H
19+
20+#include <QQuickView>
21+
22+class SecondaryWindow : public QQuickView
23+{
24+ Q_OBJECT
25+
26+public:
27+ SecondaryWindow(QQmlEngine *engine);
28+};
29+
30+#endif // UNITY_SECONDARY_WINDOW_H
src/ShellApplication.cppnew file+197
@@ -0,0 +1,197 @@
1+/*
2+ * Copyright (C) 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 "ShellApplication.h"
18+
19+// Qt
20+#include <QLibrary>
21+#include <QScreen>
22+
23+#include <libintl.h>
24+
25+// libandroid-properties
26+#include <hybris/properties/properties.h>
27+
28+// local
29+#include <paths.h>
30+#include "CachingNetworkManagerFactory.h"
31+#include "MouseTouchAdaptor.h"
32+#include "UnityCommandLineParser.h"
33+
34+ShellApplication::ShellApplication(int & argc, char ** argv, bool isMirServer)
35+ : QGuiApplication(argc, argv)
36+ , m_shellView(nullptr)
37+ , m_secondaryWindow(nullptr)
38+ , m_mouseTouchAdaptor(nullptr)
39+ , m_qmlEngine(nullptr)
40+{
41+
42+ setApplicationName(QStringLiteral("unity8"));
43+
44+ connect(this, &QGuiApplication::screenAdded, this, &ShellApplication::onScreenAdded);
45+
46+ setupQmlEngine(isMirServer);
47+
48+ UnityCommandLineParser parser(*this);
49+
50+ if (!parser.deviceName().isEmpty()) {
51+ m_deviceName = parser.deviceName();
52+ } else {
53+ char buffer[200];
54+ property_get("ro.product.device", buffer /* value */, "desktop" /* default_value*/);
55+ m_deviceName = QString(buffer);
56+ }
57+ m_qmlArgs.setDeviceName(m_deviceName);
58+
59+ m_qmlArgs.setMode(parser.mode());
60+
61+ // The testability driver is only loaded by QApplication but not by QGuiApplication.
62+ // However, QApplication depends on QWidget which would add some unneeded overhead => Let's load the testability driver on our own.
63+ if (parser.hasTestability() || getenv("QT_LOAD_TESTABILITY")) {
64+ QLibrary testLib(QStringLiteral("qttestability"));
65+ if (testLib.load()) {
66+ typedef void (*TasInitialize)(void);
67+ TasInitialize initFunction = (TasInitialize)testLib.resolve("qt_testability_init");
68+ if (initFunction) {
69+ initFunction();
70+ } else {
71+ qCritical("Library qttestability resolve failed!");
72+ }
73+ } else {
74+ qCritical("Library qttestability load failed!");
75+ }
76+ }
77+
78+ bindtextdomain("unity8", translationDirectory().toUtf8().data());
79+ textdomain("unity8");
80+
81+ m_shellView = new ShellView(m_qmlEngine, &m_qmlArgs);
82+
83+ if (parser.windowGeometry().isValid()) {
84+ m_shellView->setWidth(parser.windowGeometry().width());
85+ m_shellView->setHeight(parser.windowGeometry().height());
86+ }
87+
88+ if (parser.hasFrameless()) {
89+ m_shellView->setFlags(Qt::FramelessWindowHint);
90+ }
91+
92+ // You will need this if you want to interact with touch-only components using a mouse
93+ // Needed only when manually testing on a desktop.
94+ if (parser.hasMouseToTouch()) {
95+ m_mouseTouchAdaptor = MouseTouchAdaptor::instance();
96+ }
97+
98+
99+ // Some hard-coded policy for now.
100+ // NB: We don't support more than two screens at the moment
101+ //
102+ // TODO: Support an arbitrary number of screens and different policies
103+ // (eg cloned desktop, several desktops, etc)
104+ if (isMirServer && screens().count() == 2) {
105+ m_shellView->setScreen(screens().at(1));
106+ m_qmlArgs.setDeviceName("desktop");
107+
108+ m_secondaryWindow = new SecondaryWindow(m_qmlEngine);
109+ m_secondaryWindow->setScreen(screens().at(0));
110+ // QWindow::showFullScreen() also calls QWindow::requestActivate() and we don't want that!
111+ m_secondaryWindow->setWindowState(Qt::WindowFullScreen);
112+ m_secondaryWindow->setVisible(true);
113+ }
114+
115+ if (isMirServer || parser.hasFullscreen()) {
116+ m_shellView->showFullScreen();
117+ } else {
118+ m_shellView->show();
119+ }
120+}
121+
122+ShellApplication::~ShellApplication()
123+{
124+ destroyResources();
125+}
126+
127+void ShellApplication::destroyResources()
128+{
129+ // Deletion order is important. Don't use QScopedPointers and the like
130+ // Otherwise the process will hang on shutdown (bug somewhere I guess).
131+ delete m_shellView;
132+ m_shellView = nullptr;
133+
134+ delete m_secondaryWindow;
135+ m_secondaryWindow = nullptr;
136+
137+ delete m_mouseTouchAdaptor;
138+ m_mouseTouchAdaptor = nullptr;
139+
140+ delete m_qmlEngine;
141+ m_qmlEngine = nullptr;
142+}
143+
144+void ShellApplication::setupQmlEngine(bool isMirServer)
145+{
146+ m_qmlEngine = new QQmlEngine(this);
147+
148+ m_qmlEngine->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()));
149+
150+ prependImportPaths(m_qmlEngine, ::overrideImportPaths());
151+ if (!isMirServer) {
152+ prependImportPaths(m_qmlEngine, ::nonMirImportPaths());
153+ }
154+ appendImportPaths(m_qmlEngine, ::fallbackImportPaths());
155+
156+ m_qmlEngine->setNetworkAccessManagerFactory(new CachingNetworkManagerFactory);
157+
158+ QObject::connect(m_qmlEngine, &QQmlEngine::quit, this, &QGuiApplication::quit);
159+}
160+
161+void ShellApplication::onScreenAdded(QScreen * /*screen*/)
162+{
163+ // TODO: Support an arbitrary number of screens and different policies
164+ // (eg cloned desktop, several desktops, etc)
165+ if (screens().count() == 2) {
166+ m_shellView->setScreen(screens().at(1));
167+ m_qmlArgs.setDeviceName("desktop");
168+ // Changing the QScreen where a QWindow is drawn makes it also lose focus (besides having
169+ // its backing QPlatformWindow recreated). So lets refocus it.
170+ m_shellView->requestActivate();
171+
172+ m_secondaryWindow = new SecondaryWindow(m_qmlEngine);
173+ m_secondaryWindow->setScreen(screens().at(0));
174+
175+ // QWindow::showFullScreen() also calls QWindow::requestActivate() and we don't want that!
176+ m_secondaryWindow->setWindowState(Qt::WindowFullScreen);
177+ m_secondaryWindow->setVisible(true);
178+ }
179+}
180+
181+void ShellApplication::onScreenAboutToBeRemoved(QScreen *screen)
182+{
183+ // TODO: Support an arbitrary number of screens and different policies
184+ // (eg cloned desktop, several desktops, etc)
185+ if (screen == m_shellView->screen()) {
186+ Q_ASSERT(screens().count() > 1);
187+ Q_ASSERT(screens().at(0) != screen);
188+ Q_ASSERT(m_secondaryWindow);
189+ delete m_secondaryWindow;
190+ m_secondaryWindow = nullptr;
191+ m_shellView->setScreen(screens().first());
192+ m_qmlArgs.setDeviceName(m_deviceName);
193+ // Changing the QScreen where a QWindow is drawn makes it also lose focus (besides having
194+ // its backing QPlatformWindow recreated). So lets refocus it.
195+ m_shellView->requestActivate();
196+ }
197+}
src/ShellApplication.hnew file+55
@@ -0,0 +1,55 @@
1+/*
2+ * Copyright (C) 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 SHELLAPPLICATION_H
18+#define SHELLAPPLICATION_H
19+
20+#include <QGuiApplication>
21+#include <QQmlEngine>
22+#include <QQuickView>
23+#include <QScopedPointer>
24+
25+#include "ApplicationArguments.h"
26+#include "MouseTouchAdaptor.h"
27+#include "SecondaryWindow.h"
28+#include "ShellView.h"
29+
30+class ShellApplication : public QGuiApplication
31+{
32+ Q_OBJECT
33+public:
34+ ShellApplication(int & argc, char ** argv, bool isMirServer);
35+ virtual ~ShellApplication();
36+
37+ void destroyResources();
38+public Q_SLOTS:
39+ // called by qtmir
40+ void onScreenAboutToBeRemoved(QScreen *screen);
41+
42+private Q_SLOTS:
43+ void onScreenAdded(QScreen*);
44+
45+private:
46+ void setupQmlEngine(bool isMirServer);
47+ QString m_deviceName;
48+ ApplicationArguments m_qmlArgs;
49+ ShellView *m_shellView;
50+ SecondaryWindow *m_secondaryWindow;
51+ MouseTouchAdaptor *m_mouseTouchAdaptor;
52+ QQmlEngine *m_qmlEngine;
53+};
54+
55+#endif // SHELLAPPLICATION_H
src/ShellView.cppnew file+59
@@ -0,0 +1,59 @@
1+/*
2+ * Copyright (C) 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 "ShellView.h"
18+
19+// Qt
20+#include <QQmlContext>
21+#include <QQuickItem>
22+
23+// local
24+#include <paths.h>
25+
26+ShellView::ShellView(QQmlEngine *engine, QObject *qmlArgs)
27+ : QQuickView(engine, nullptr)
28+{
29+ setResizeMode(QQuickView::SizeRootObjectToView);
30+ setColor("black");
31+ setTitle(QStringLiteral("Unity8"));
32+
33+ rootContext()->setContextProperty(QStringLiteral("applicationArguments"), qmlArgs);
34+
35+ QUrl source(::qmlDirectory() + "/OrientedShell.qml");
36+ setSource(source);
37+
38+ connect(this, &QWindow::widthChanged, this, &ShellView::onWidthChanged);
39+ connect(this, &QWindow::heightChanged, this, &ShellView::onHeightChanged);
40+}
41+
42+void ShellView::onWidthChanged(int w)
43+{
44+ // For good measure in case SizeRootObjectToView doesn't fulfill its promise.
45+ //
46+ // There's at least one situation that's know to leave the root object with an outdated size.
47+ // (really looks like Qt bug)
48+ // Happens when starting unity8 with an external monitor already connected.
49+ // The QResizeEvent we get still has the size of the first screen and since the resize move is triggered
50+ // from the resize event handler, the root item doesn't get resized.
51+ // TODO: Confirm the Qt bug and submit a patch upstream
52+ rootObject()->setWidth(w);
53+}
54+
55+void ShellView::onHeightChanged(int h)
56+{
57+ // See comment in ShellView::onWidthChanged()
58+ rootObject()->setHeight(h);
59+}
src/ShellView.hnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 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 UNITY_SHELL_VIEW_H
18+#define UNITY_SHELL_VIEW_H
19+
20+#include <QQuickView>
21+
22+class ShellView : public QQuickView
23+{
24+ Q_OBJECT
25+
26+public:
27+ ShellView(QQmlEngine *engine, QObject *qmlArgs);
28+
29+private Q_SLOTS:
30+ void onWidthChanged(int);
31+ void onHeightChanged(int);
32+};
33+
34+#endif // UNITY_SHELL_VIEW_H
src/main.cpp+4−101
@@ -14,26 +14,8 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−// Qt
18−#include <QCommandLineParser>
19−#include <QtQuick/QQuickView>
20−#include <QtGui/QGuiApplication>
21−#include <QtQml/QQmlEngine>
22−#include <QtQml/QQmlContext>
23−#include <QLibrary>
24−#include <QDebug>
25−#include <csignal>
26−#include <libintl.h>
27−
28−// libandroid-properties
29−#include <hybris/properties/properties.h>
30−
3117// local
32−#include <paths.h>
33−#include "MouseTouchAdaptor.h"
34−#include "ApplicationArguments.h"
35−#include "CachingNetworkManagerFactory.h"
36−#include "UnityCommandLineParser.h"
18+#include "ShellApplication.h"
3719
3820int main(int argc, const char *argv[])
3921{
@@ -43,91 +25,12 @@ int main(int argc, const char *argv[])
4325 isMirServer = true;
4426 }
4527
46− QGuiApplication::setApplicationName(QStringLiteral("unity8"));
47− QGuiApplication *application;
48−
49− application = new QGuiApplication(argc, (char**)argv);
50−
51− UnityCommandLineParser parser(*application);
52−
53− ApplicationArguments qmlArgs;
54−
55− if (!parser.deviceName().isEmpty()) {
56− qmlArgs.setDeviceName(parser.deviceName());
57− } else {
58− char buffer[200];
59− property_get("ro.product.device", buffer /* value */, "desktop" /* default_value*/);
60− qmlArgs.setDeviceName(QString(buffer));
61− }
62−
63− qmlArgs.setMode(parser.mode());
64−
65− // The testability driver is only loaded by QApplication but not by QGuiApplication.
66− // However, QApplication depends on QWidget which would add some unneeded overhead => Let's load the testability driver on our own.
67− if (parser.hasTestability() || getenv("QT_LOAD_TESTABILITY")) {
68− QLibrary testLib(QStringLiteral("qttestability"));
69− if (testLib.load()) {
70− typedef void (*TasInitialize)(void);
71− TasInitialize initFunction = (TasInitialize)testLib.resolve("qt_testability_init");
72− if (initFunction) {
73− initFunction();
74− } else {
75− qCritical("Library qttestability resolve failed!");
76− }
77− } else {
78− qCritical("Library qttestability load failed!");
79− }
80− }
81−
82− bindtextdomain("unity8", translationDirectory().toUtf8().data());
83− textdomain("unity8");
84−
85− QQuickView* view = new QQuickView();
86− view->setResizeMode(QQuickView::SizeRootObjectToView);
87− view->setColor("black");
88− view->setTitle(QStringLiteral("Unity8 Shell"));
89−
90− if (parser.windowGeometry().isValid()) {
91− view->setWidth(parser.windowGeometry().width());
92− view->setHeight(parser.windowGeometry().height());
93− }
94−
95− view->engine()->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()));
96− view->rootContext()->setContextProperty(QStringLiteral("applicationArguments"), &qmlArgs);
97− if (parser.hasFrameless()) {
98− view->setFlags(Qt::FramelessWindowHint);
99− }
100−
101− // You will need this if you want to interact with touch-only components using a mouse
102− // Needed only when manually testing on a desktop.
103− MouseTouchAdaptor *mouseTouchAdaptor = 0;
104− if (parser.hasMouseToTouch()) {
105− mouseTouchAdaptor = MouseTouchAdaptor::instance();
106− }
107−
108− QUrl source(::qmlDirectory() + "/OrientedShell.qml");
109− prependImportPaths(view->engine(), ::overrideImportPaths());
110− if (!isMirServer) {
111− prependImportPaths(view->engine(), ::nonMirImportPaths());
112− }
113− appendImportPaths(view->engine(), ::fallbackImportPaths());
114−
115− CachingNetworkManagerFactory *managerFactory = new CachingNetworkManagerFactory();
116− view->engine()->setNetworkAccessManagerFactory(managerFactory);
117−
118− view->setSource(source);
119− QObject::connect(view->engine(), &QQmlEngine::quit, application, &QGuiApplication::quit);
120−
121− if (isMirServer || parser.hasFullscreen()) {
122− view->showFullScreen();
123− } else {
124− view->show();
125− }
28+ ShellApplication *application = new ShellApplication(argc, (char**)argv, isMirServer);
12629
12730 int result = application->exec();
12831
129− delete view;
130− delete mouseTouchAdaptor;
32+ application->destroyResources();
33+
13134 delete application;
13235
13336 return result;
tests/autopilot/unity8/fixture_setup.py+1−1
@@ -133,7 +133,7 @@ class LaunchUnityWithFakeSensors(fixtures.Fixture):
133133 args = [binary_arg] + env_args
134134 self.unity_proxy = process_helpers.restart_unity_with_testability(
135135 *args)
136− self.main_win = self.unity_proxy.select_single(shell.QQuickView)
136+ self.main_win = self.unity_proxy.select_single(shell.ShellView)
137137
138138 def _create_sensors(self):
139139 # Wait for unity to start running.
tests/autopilot/unity8/greeter/tests/__init__.py+1−1
@@ -24,5 +24,5 @@ from unity8.shell.tests import UnityTestCase
2424class GreeterTestCase(UnityTestCase):
2525 def get_shell(self, unity_proxy):
2626 main_window = (
27− unity_proxy.select_single(shell.QQuickView))
27+ unity_proxy.select_single(shell.ShellView))
2828 return main_window.select_single('Shell')
tests/autopilot/unity8/launcher.py+1−1
@@ -42,7 +42,7 @@ class Launcher(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
4242 logger.debug('The launcher is already opened.')
4343
4444 def _swipe_to_show_launcher(self):
45− view = self.get_root_instance().select_single('QQuickView')
45+ view = self.get_root_instance().select_single('ShellView')
4646 start_y = stop_y = view.y + view.height // 2
4747
4848 start_x = view.x + 1
tests/autopilot/unity8/settings_wizard/__init__.py+7−2
@@ -375,12 +375,17 @@ class WifiConnectPage(UbuntuUIToolkitCustomProxyObjectBase):
375375 wizard = get_wizard(self)
376376 next_page = wizard.get_current_page()
377377 locationPageEnabled = True
378+ reportingPageEnabled = True
378379 if next_page.objectName == 'locationPage':
379380 next_page = wizard.get_location_page()
380381 else:
381382 locationPageEnabled = False
382− next_page = wizard.get_reporting_page()
383− return locationPageEnabled, next_page
383+ if next_page.objectName == 'reportingPage':
384+ next_page = wizard.get_reporting_page()
385+ else:
386+ reportingPageEnabled = False
387+ next_page = wizard.get_finished_page()
388+ return locationPageEnabled, reportingPageEnabled, next_page
384389
385390 def _get_notification(self, unity):
386391 logger.info('Waiting longer for notification object')
tests/autopilot/unity8/settings_wizard/tests/test_settings_wizard.py+10−5
@@ -80,14 +80,19 @@ class SkipThroughSettingsWizardTestCase(tests.UnityTestCase):
8080 password_page = next_page
8181 wifi_connect_page = self._test_password_page(password_page)
8282
83− locationPageEnabled, next_page = self._test_wifi_connect_page(
84− wifi_connect_page)
83+ reporting_page = None
84+ locationPageEnabled, reportingPageEnabled, next_page = self._test_wifi_connect_page(wifi_connect_page)
8585 if locationPageEnabled:
8686 location_page = next_page
87− reporting_page = self._test_location_page(location_page)
87+ if reportingPageEnabled:
88+ reporting_page = self._test_location_page(location_page)
89+ else:
90+ finish_page = next_page
91+
92+ if reporting_page is not None:
93+ finish_page = self._test_reporting_page(reporting_page)
8894 else:
89− reporting_page = next_page
90− finish_page = self._test_reporting_page(reporting_page)
95+ finish_page = next_page
9196
9297 finish_page.finish()
9398 self.assertFalse(
tests/autopilot/unity8/shell/__init__.py+1−1
@@ -93,7 +93,7 @@ def _get_urgency(urgency):
9393 return _urgency_enums.get(urgency.upper())
9494
9595
96−class QQuickView(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
96+class ShellView(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
9797 """An helper class that makes it easy to interact with the shell"""
9898
9999 def get_greeter(self):
tests/autopilot/unity8/shell/tests/__init__.py+1−1
@@ -297,7 +297,7 @@ class UnityTestCase(AutopilotTestCase):
297297
298298 @property
299299 def main_window(self):
300− return self._proxy.select_single(shell.QQuickView)
300+ return self._proxy.select_single(shell.ShellView)
301301
302302
303303class DashBaseTestCase(AutopilotTestCase):
tests/mocks/Unity/Launcher/MockQuickListModel.cpp+1−1
@@ -32,7 +32,7 @@ QVariant MockQuickListModel::data(const QModelIndex &index, int role) const
3232 switch (role)
3333 {
3434 case RoleLabel:
35− return QLatin1String("test menu entry ") + QString::number(index.row());
35+ return QString(QLatin1String("test menu entry ") + QString::number(index.row()));
3636 case RoleIcon:
3737 return QLatin1String("copy.png");
3838 case RoleClickable:
tests/mocks/Unity/fake_resultsmodel.cpp+1−1
@@ -78,7 +78,7 @@ ResultsModel::data(const QModelIndex& index, int role) const
7878 case RoleTitle:
7979 return QString("Title.%1.%2").arg(m_categoryId).arg(index.row());
8080 case RoleArt:
81− return qmlDirectory() + "/graphics/applicationIcons/dash.png";
81+ return QString(qmlDirectory() + "/graphics/applicationIcons/dash.png");
8282 case RoleSubtitle:
8383 return QString("Subtitle.%1.%2").arg(m_categoryId).arg(index.row());
8484 case RoleMascot:
tests/mocks/Unity/fake_scopesoverview.cpp+1−1
@@ -308,7 +308,7 @@ QVariant ScopesOverviewResultsModel::data(const QModelIndex& index, int role) co
308308 case RoleSubtitle:
309309 return scope && scope->name() == "Videos this is long ab cd ef gh ij kl" ? "tube, movies, cinema, pictures, art, moving images, magic in a box" : QString();
310310 case RoleArt:
311− return qmlDirectory() + "/graphics/applicationIcons/dash.png";
311+ return QString(qmlDirectory() + "/graphics/applicationIcons/dash.png");
312312 case RoleMascot:
313313 case RoleEmblem:
314314 case RoleSummary:
tests/mocks/Utils/CMakeLists.txt−2
@@ -13,8 +13,6 @@ set(QMLPLUGIN_SRC
1313 ${CMAKE_SOURCE_DIR}/plugins/Utils/activefocuslogger.cpp
1414 ${CMAKE_SOURCE_DIR}/plugins/Utils/qlimitproxymodelqml.cpp
1515 ${CMAKE_SOURCE_DIR}/plugins/Utils/unitysortfilterproxymodelqml.cpp
16− ${CMAKE_SOURCE_DIR}/plugins/Utils/relativetimeformatter.cpp
17− ${CMAKE_SOURCE_DIR}/plugins/Utils/timeformatter.cpp
1816 ${CMAKE_SOURCE_DIR}/plugins/Utils/unitymenumodelpaths.cpp
1917 ${CMAKE_SOURCE_DIR}/plugins/Utils/windowkeysfilter.cpp
2018 ${CMAKE_SOURCE_DIR}/plugins/Utils/windowscreenshotprovider.cpp
tests/mocks/Utils/Utils.qmltypes+31−28
@@ -4,9 +4,18 @@ import QtQuick.tooling 1.1
44// It is used for QML tooling purposes only.
55//
66// This file was auto-generated by:
7−// 'qmlplugindump -notrelocatable Utils 0.1 plugins'
7+// 'qmlplugindump -notrelocatable Utils 0.1 tests/mocks'
88
99Module {
10+ Component {
11+ name: "Constants"
12+ prototype: "QObject"
13+ exports: ["Utils/Constants 0.1"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Property { name: "indicatorValueTimeout"; type: "int"; isReadonly: true }
18+ }
1019 Component {
1120 name: "EasingCurve"
1221 prototype: "QObject"
@@ -17,6 +26,22 @@ Module {
1726 Property { name: "progress"; type: "double" }
1827 Property { name: "value"; type: "double"; isReadonly: true }
1928 }
29+ Component {
30+ name: "InputWatcher"
31+ prototype: "QObject"
32+ exports: ["Utils/InputWatcher 0.1"]
33+ exportMetaObjectRevisions: [0]
34+ Property { name: "target"; type: "QObject"; isPointer: true }
35+ Property { name: "targetPressed"; type: "bool"; isReadonly: true }
36+ Signal {
37+ name: "targetChanged"
38+ Parameter { name: "value"; type: "QObject"; isPointer: true }
39+ }
40+ Signal {
41+ name: "targetPressedChanged"
42+ Parameter { name: "value"; type: "bool" }
43+ }
44+ }
2045 Component {
2146 name: "QAbstractProxyModel"
2247 prototype: "QAbstractItemModel"
@@ -59,33 +84,6 @@ Module {
5984 Method { name: "clear" }
6085 Method { name: "invalidate" }
6186 }
62− Component {
63− name: "RelativeTimeFormatter"
64− prototype: "TimeFormatter"
65− exports: ["Utils/RelativeTimeFormatter 0.1"]
66− exportMetaObjectRevisions: [0]
67− }
68− Component {
69− name: "TimeFormatter"
70− prototype: "QObject"
71− exports: ["Utils/GDateTimeFormatter 0.1", "Utils/TimeFormatter 0.1"]
72− exportMetaObjectRevisions: [0, 0]
73− Property { name: "format"; type: "string" }
74− Property { name: "timeString"; type: "string"; isReadonly: true }
75− Property { name: "time"; type: "qlonglong" }
76− Signal {
77− name: "formatChanged"
78− Parameter { name: "format"; type: "string" }
79− }
80− Signal {
81− name: "timeStringChanged"
82− Parameter { name: "timeString"; type: "string" }
83− }
84− Signal {
85− name: "timeChanged"
86− Parameter { name: "time"; type: "qlonglong" }
87− }
88− }
8987 Component {
9088 name: "UnityMenuModelPaths"
9189 prototype: "QObject"
@@ -160,6 +158,11 @@ Module {
160158 isCreatable: false
161159 isSingleton: true
162160 exportMetaObjectRevisions: [0]
161+ Property { name: "geometry"; type: "QVariantMap" }
162+ Signal {
163+ name: "geometryChanged"
164+ Parameter { name: "geometry"; type: "QVariantMap" }
165+ }
163166 Method {
164167 name: "saveGeometry"
165168 Parameter { name: "windowId"; type: "string" }
tests/mocks/Utils/plugin.cpp−13
@@ -23,14 +23,6 @@
2323
2424// local
2525#include "plugin.h"
26−#include "inputwatcher.h"
27−#include "qlimitproxymodelqml.h"
28−#include "unitysortfilterproxymodelqml.h"
29−#include "relativetimeformatter.h"
30−#include "timeformatter.h"
31−#include "unitymenumodelpaths.h"
32−#include "windowkeysfilter.h"
33−#include "easingcurve.h"
3426#include "windowstatestorage.h"
3527#include "constants.h"
3628
@@ -39,8 +31,6 @@
3931#include <inputwatcher.h>
4032#include <qlimitproxymodelqml.h>
4133#include <unitysortfilterproxymodelqml.h>
42−#include <relativetimeformatter.h>
43−#include <timeformatter.h>
4434#include <unitymenumodelpaths.h>
4535#include <windowkeysfilter.h>
4636#include <windowscreenshotprovider.h>
@@ -67,11 +57,8 @@ void FakeUtilsPlugin::registerTypes(const char *uri)
6757 qmlRegisterType<QLimitProxyModelQML>(uri, 0, 1, "LimitProxyModel");
6858 qmlRegisterType<UnitySortFilterProxyModelQML>(uri, 0, 1, "UnitySortFilterProxyModel");
6959 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
70− qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
7160 qmlRegisterType<WindowKeysFilter>(uri, 0, 1, "WindowKeysFilter");
72− qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
7361 qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
74− qmlRegisterType<RelativeTimeFormatter>(uri, 0, 1, "RelativeTimeFormatter");
7562 qmlRegisterSingletonType<WindowStateStorage>(uri, 0, 1, "WindowStateStorage", createWindowStateStorage);
7663 qmlRegisterType<InputWatcher>(uri, 0, 1, "InputWatcher");
7764 qmlRegisterSingletonType<Constants>(uri, 0, 1, "Constants", createConstants);
tests/plugins/ScreenGrabber/ScreenGrabberTest.cpp+11
@@ -55,6 +55,17 @@ private Q_SLOTS:
5555 QVERIFY(!args.first().toString().isEmpty());
5656 }
5757
58+ void testRotatedScreenshot()
59+ {
60+ QSignalSpy grabberSpy(m_grabber, &ScreenGrabber::screenshotSaved);
61+ m_grabber->captureAndSave(90); // rotate by 90°
62+ const QVariantList args = grabberSpy.takeFirst();
63+ const QString filename = args.first().toString();
64+ QVERIFY(!filename.isEmpty());
65+ QImage img(filename);
66+ QVERIFY(img.height() > img.width()); // verify that the image got rotated by 90° (height > width)
67+ }
68+
5869private:
5970 QQuickView *m_view;
6071 ScreenGrabber *m_grabber = nullptr;
tests/plugins/ScreenGrabber/grabber.qml+1−1
@@ -20,7 +20,7 @@ import ScreenGrabber 0.1
2020Rectangle {
2121 property var grabber: screenGrabber
2222
23− width: 100
23+ width: 101 // width intentionally bigger than height to test rotation
2424 height: 100
2525 color: "green"
2626
tests/plugins/Unity/Indicators/UnityMenuModelStackTest.cpp+2−9
@@ -43,6 +43,8 @@ private Q_SLOTS:
4343 {
4444 delete m_model;
4545 m_model = nullptr;
46+ // send deleteLaters to avoid leaks.
47+ QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
4648 }
4749
4850 void testHeadOnSetHead()
@@ -146,19 +148,10 @@ private Q_SLOTS:
146148
147149 m_model->removeRow(removeIndex);
148150
149− waitFor([&stack, resultCount]() { return stack.count() == resultCount; }, 1000);
150151 QCOMPARE(stack.count(), resultCount);
151152 }
152153
153154private:
154− bool waitFor(std::function<bool()> functor, int ms) {
155−
156− QElapsedTimer timer;
157− timer.start();
158− while(!functor() && timer.elapsed() < ms) { QTest::qWait(10); }
159− return functor();
160− }
161−
162155 QVariant recuseAddMenu(int subMenuCount, int depth_remaining)
163156 {
164157 QVariantList rows;
tests/plugins/Utils/CMakeLists.txt−1
@@ -7,7 +7,6 @@ include_directories(
77foreach(util_test
88 QLimitProxyModel
99 UnitySortFilterProxyModel
10− TimeFormatter
1110 HomeKeyWatcher
1211)
1312 add_executable(${util_test}TestExec ${util_test}Test.cpp ModelTest.cpp)
tests/plugins/Utils/TimeFormatterTest.cppdeleted−155
@@ -1,155 +0,0 @@
1−/*
2− * Copyright 2013 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− * Author: Lars Uebernickel <lars.uebernickel@canonical.com>
17− */
18−
19−#include "timeformatter.h"
20−#include "relativetimeformatter.h"
21−
22−#include <locale.h>
23−
24−#include <QtTest>
25−#include <QDebug>
26−
27−class TimeFormatterTest : public QObject
28−{
29− Q_OBJECT
30−private:
31− void addTestData(QList<int> daysToAdd = QList<int>()) {
32− QTest::addColumn<QDateTime>("time");
33−
34− Q_FOREACH(int dayToAdd, daysToAdd) {
35− QDateTime time = QDateTime::currentDateTime().addDays(dayToAdd);
36− QDateTime am(time); am.setTime(QTime(1, 1, 1));
37− QDateTime midday(time); midday.setTime(QTime(12, 0, 0));
38− QDateTime pm(time); pm.setTime(QTime(17, 59, 59));
39−
40− QTest::newRow(QString("%1day-am").arg(dayToAdd).toLatin1()) << am;
41− QTest::newRow(QString("%1day-midday").arg(dayToAdd).toLatin1()) << midday;
42− QTest::newRow(QString("%1day-pm").arg(dayToAdd).toLatin1()) << pm;
43− }
44−
45− }
46−
47−private Q_SLOTS:
48− void testTimeFormatter_Format_data() { addTestData(QList<int>() << 0); }
49− void testTimeFormatter_Format()
50− {
51− QFETCH(QDateTime, time);
52− const QString format = "hh:mm dd.MM.yy";
53−
54− TimeFormatter formatter;
55− formatter.setTime(time.toMSecsSinceEpoch() * 1000);
56− formatter.setFormat(format);
57−
58− QCOMPARE(formatter.timeString(), time.toString(format));
59− }
60−
61− void tesGDatetTimeFormatter_Format_data() { addTestData(QList<int>() << 0); }
62− void tesGDatetTimeFormatter_Format()
63− {
64− QFETCH(QDateTime, time);
65− const QString format = "%d-%m-%Y %I:%M%p";
66−
67− GDateTimeFormatter formatter;
68− formatter.setTime(time.toMSecsSinceEpoch() / 1000); // strftime in seconds since epoc
69− formatter.setFormat(format);
70−
71− QCOMPARE(formatter.timeString(), time.toString("dd-MM-yyyy hh:mmAP"));
72− }
73−
74− void tesRelativeTimeFormatter_FarBack_data() { addTestData(QList<int>() << -200 << -20 << -7); }
75− void tesRelativeTimeFormatter_FarBack()
76− {
77− QFETCH(QDateTime, time);
78−
79− RelativeTimeFormatter formatter;
80− formatter.setTime(time.toMSecsSinceEpoch() / 1000); // strftime in seconds since epoc
81−
82− QCOMPARE(formatter.timeString(), time.toString("ddd dd MMM\u2003HH:mm"));
83− }
84−
85− void tesRelativeTimeFormatter_WeekBack_data() { addTestData(QList<int>() << -6 << -2); }
86− void tesRelativeTimeFormatter_WeekBack()
87− {
88− QFETCH(QDateTime, time);
89−
90− RelativeTimeFormatter formatter;
91− formatter.setTime(time.toMSecsSinceEpoch() / 1000); // strftime in seconds since epoc
92−
93− QCOMPARE(formatter.timeString(), time.toString("ddd\u2003HH:mm"));
94− }
95−
96− void tesRelativeTimeFormatter_Yesterday_data() { addTestData(QList<int>() << -1); }
97− void tesRelativeTimeFormatter_Yesterday()
98− {
99− QFETCH(QDateTime, time);
100−
101− RelativeTimeFormatter formatter;
102− formatter.setTime(time.toMSecsSinceEpoch() / 1000); // strftime in seconds since epoc
103−
104− QCOMPARE(formatter.timeString(), QString("Yesterday\u2003%1").arg(time.toString("HH:mm")));
105− }
106−
107− void tesRelativeTimeFormatter_Today_data() { addTestData(QList<int>() << 0); }
108− void tesRelativeTimeFormatter_Today()
109− {
110− QFETCH(QDateTime, time);
111−
112− RelativeTimeFormatter formatter;
113− formatter.setTime(time.toMSecsSinceEpoch() / 1000); // strftime in seconds since epoc
114−
115− QCOMPARE(formatter.timeString(), time.toString("HH:mm"));
116− }
117−
118− void tesRelativeTimeFormatter_Tomorrow_data() { addTestData(QList<int>() << 1); }
119− void tesRelativeTimeFormatter_Tomorrow()
120− {
121− QFETCH(QDateTime, time);
122−
123− RelativeTimeFormatter formatter;
124− formatter.setTime(time.toMSecsSinceEpoch() / 1000); // strftime in seconds since epoc
125−
126− QCOMPARE(formatter.timeString(), QString("Tomorrow\u2003%1").arg(time.toString("HH:mm")));
127− }
128−
129−
130− void tesRelativeTimeFormatter_WeekForward_data() { addTestData(QList<int>() << 2 << 6); }
131− void tesRelativeTimeFormatter_WeekForward()
132− {
133− QFETCH(QDateTime, time);
134−
135− RelativeTimeFormatter formatter;
136− formatter.setTime(time.toMSecsSinceEpoch() / 1000); // strftime in seconds since epoc
137−
138− QCOMPARE(formatter.timeString(), time.toString("ddd\u2003HH:mm"));
139− }
140−
141− void tesRelativeTimeFormatter_FarForward_data() { addTestData(QList<int>() << 7 << 20 << 200); }
142− void tesRelativeTimeFormatter_FarForward()
143− {
144− QFETCH(QDateTime, time);
145−
146− RelativeTimeFormatter formatter;
147− formatter.setTime(time.toMSecsSinceEpoch() / 1000); // strftime in seconds since epoc
148−
149− QCOMPARE(formatter.timeString(), time.toString("ddd dd MMM\u2003HH:mm"));
150− }
151−};
152−
153−QTEST_GUILESS_MAIN(TimeFormatterTest)
154−
155−#include "TimeFormatterTest.moc"
tests/plugins/Wizard/tst_pagelist.cpp+5−5
@@ -88,13 +88,13 @@ void PageListTest::testIterate()
8888
8989 PageList pageList;
9090 QCOMPARE(pageList.index(), -1);
91− QCOMPARE(pageList.next(), root.path() + "/a/" + PAGES_PATH + "/1.qml");
91+ QCOMPARE(pageList.next(), QString(root.path() + "/a/" + PAGES_PATH + "/1.qml"));
9292 QCOMPARE(pageList.prev(), QString());
93− QCOMPARE(pageList.next(), root.path() + "/a/" + PAGES_PATH + "/2.qml");
94− QCOMPARE(pageList.prev(), root.path() + "/a/" + PAGES_PATH + "/1.qml");
93+ QCOMPARE(pageList.next(), QString(root.path() + "/a/" + PAGES_PATH + "/2.qml"));
94+ QCOMPARE(pageList.prev(), QString(root.path() + "/a/" + PAGES_PATH + "/1.qml"));
9595 QCOMPARE(pageList.index(), 0);
96− QCOMPARE(pageList.next(), root.path() + "/a/" + PAGES_PATH + "/2.qml");
97− QCOMPARE(pageList.next(), root.path() + "/a/" + PAGES_PATH + "/3.qml");
96+ QCOMPARE(pageList.next(), QString(root.path() + "/a/" + PAGES_PATH + "/2.qml"));
97+ QCOMPARE(pageList.next(), QString(root.path() + "/a/" + PAGES_PATH + "/3.qml"));
9898 QCOMPARE(pageList.index(), 2);
9999 QCOMPARE(pageList.next(), QString());
100100 QCOMPARE(pageList.index(), 2);
tests/qmltests/CMakeLists.txt+2
@@ -2,6 +2,7 @@
22add_subdirectory(Components)
33
44add_unity8_qmltest(. OrientedShell LIGHTDM)
5+add_unity8_qmltest(. DisabledScreenNotice)
56add_unity8_qmltest(. Shell LIGHTDM)
67add_unity8_qmltest(. ShellWithPin LIGHTDM)
78add_unity8_qmltest(Components Background)
@@ -15,6 +16,7 @@ add_unity8_qmltest(Components Rating)
1516add_unity8_qmltest(Components ResponsiveGridView)
1617add_unity8_qmltest(Components ResponsiveVerticalJournal)
1718add_unity8_qmltest(Components Showable)
19+add_unity8_qmltest(Components WallpaperResolver)
1820add_unity8_qmltest(Components ZoomableImage)
1921add_unity8_qmltest(Dash Dash)
2022add_unity8_qmltest(Dash DashContent)
tests/qmltests/Components/tst_WallpaperResolver.qmlnew file+89
@@ -0,0 +1,89 @@
1+/*
2+ * Copyright (C) 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 QtTest 1.0
19+import Ubuntu.Components 1.3
20+import Unity.Test 0.1
21+import AccountsService 0.1
22+import GSettings 1.0
23+
24+import "../../../qml/Components"
25+
26+
27+Image {
28+ width: units.gu(70)
29+ height: units.gu(70)
30+
31+ source: wallpaperResolver.background
32+
33+ WallpaperResolver {
34+ id: wallpaperResolver
35+ width: units.gu(70)
36+ }
37+
38+ UnityTestCase {
39+ id: testCase
40+ name: "WallpaperResolver"
41+ when: windowShown
42+
43+ function test_background_data() {
44+ return [
45+ {tag: "color",
46+ accounts: Qt.resolvedUrl("data:image/svg+xml,<svg><rect width='100%' height='100%' fill='#dd4814'/></svg>"),
47+ gsettings: "",
48+ output: Qt.resolvedUrl("data:image/svg+xml,<svg><rect width='100%' height='100%' fill='#dd4814'/></svg>")},
49+
50+ {tag: "empty", accounts: "", gsettings: "", output: "defaultBackground"},
51+
52+ {tag: "as-specified",
53+ accounts: Qt.resolvedUrl("../../data/unity/backgrounds/blue.png"),
54+ gsettings: "",
55+ output: Qt.resolvedUrl("../../data/unity/backgrounds/blue.png")},
56+
57+ {tag: "gs-specified",
58+ accounts: "",
59+ gsettings: Qt.resolvedUrl("../../data/unity/backgrounds/red.png"),
60+ output: Qt.resolvedUrl("../../data/unity/backgrounds/red.png")},
61+
62+ {tag: "both-specified",
63+ accounts: Qt.resolvedUrl("../../data/unity/backgrounds/blue.png"),
64+ gsettings: Qt.resolvedUrl("../../data/unity/backgrounds/red.png"),
65+ output: Qt.resolvedUrl("../../data/unity/backgrounds/blue.png")},
66+
67+ {tag: "invalid-as",
68+ accounts: Qt.resolvedUrl("../../data/unity/backgrounds/nope.png"),
69+ gsettings: Qt.resolvedUrl("../../data/unity/backgrounds/red.png"),
70+ output: Qt.resolvedUrl("../../data/unity/backgrounds/red.png")},
71+
72+ {tag: "invalid-both",
73+ accounts: Qt.resolvedUrl("../../data/unity/backgrounds/nope.png"),
74+ gsettings: Qt.resolvedUrl("../../data/unity/backgrounds/stillnope.png"),
75+ output: "defaultBackground"},
76+ ]
77+ }
78+ function test_background(data) {
79+ AccountsService.backgroundFile = data.accounts;
80+ GSettingsController.setPictureUri(data.gsettings);
81+
82+ if (data.output === "defaultBackground") {
83+ tryCompare(wallpaperResolver, "background", wallpaperResolver.defaultBackground);
84+ } else {
85+ tryCompare(wallpaperResolver, "background", data.output);
86+ }
87+ }
88+ }
89+}
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+6−16
@@ -50,10 +50,6 @@ Item {
5050 }
5151 }
5252
53− Utils.GDateTimeFormatter {
54− id: timeFormatter
55− }
56−
5753 UT.UnityTestCase {
5854 name: "MenuItemFactory"
5955 when: windowShown
@@ -374,9 +370,9 @@ Item {
374370 function test_create_alarmMenu_data() {
375371 return [
376372 {label: "testLabel1", enabled: true, icon: "file:///testIcon1", color: Qt.rgba(0, 0, 0, 0),
377− time: new Date(2014, 04, 14), timeFormat: "%a %d %b %l:%M %p"},
373+ time: new Date(2014, 04, 14)},
378374 {label: "testLabel2", enabled: false, icon: "file:///testIcon2", color: Qt.rgba(1, 0, 0, 0),
379− time: new Date(2015, 11, 31), timeFormat: "%A" },
375+ time: new Date(2015, 11, 31) },
380376 ];
381377 }
382378
@@ -386,11 +382,8 @@ Item {
386382 menuData.sensitive = data.enabled;
387383 menuData.icon = data.icon;
388384 menuData.ext = {
389− 'xCanonicalTime': data.time.getTime() / 1000,
390− 'xCanonicalTimeFormat': data.timeFormat
385+ 'xCanonicalTime': data.time.getTime() / 1000 // expected in seconds
391386 };
392− timeFormatter.format = data.timeFormat;
393− timeFormatter.time = data.time.getTime() / 1000;
394387
395388 loader.data = menuData;
396389 loader.sourceComponent = factory.load(menuData);
@@ -399,7 +392,7 @@ Item {
399392
400393 compare(loader.item.text, data.label, "Label does not match data");
401394 compare(loader.item.iconSource, data.icon, "Icon does not match data");
402− compare(loader.item.time, timeFormatter.timeString, "Time does not match data");
395+ compare(loader.item.time, i18n.relativeDateTime(data.time), "Time does not match data");
403396 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
404397 }
405398
@@ -419,11 +412,8 @@ Item {
419412 menuData.icon = data.icon;
420413 menuData.ext = {
421414 'xCanonicalColor': data.colour,
422− 'xCanonicalTime': data.time.getTime() / 1000,
423− 'xCanonicalTimeFormat': data.timeFormat
415+ 'xCanonicalTime': data.time.getTime() / 1000 // expected in seconds
424416 };
425− timeFormatter.format = data.timeFormat;
426− timeFormatter.time = data.time.getTime() / 1000;
427417
428418 loader.data = menuData;
429419 loader.sourceComponent = factory.load(menuData);
@@ -432,7 +422,7 @@ Item {
432422
433423 compare(loader.item.text, data.label, "Label does not match data");
434424 compare(loader.item.iconSource, data.icon, "Icon does not match data");
435− compare(loader.item.time, timeFormatter.timeString, "Time does not match data");
425+ compare(loader.item.time, i18n.relativeDateTime(data.time), "Time does not match data");
436426 compare(loader.item.eventColor, data.color, "Colour does not match data");
437427 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
438428 }
tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+6−13
@@ -32,10 +32,6 @@ Item {
3232 menuIndex: 0
3333 }
3434
35− Utils.RelativeTimeFormatter {
36− id: timeFormatter
37− }
38−
3935 UT.UnityTestCase {
4036 name: "MessageMenuItemFactory"
4137 when: windowShown
@@ -82,17 +78,16 @@ Item {
8278 menuData.label = data.title;
8379 menuData.sensitive = data.enabled;
8480 menuData.ext = {
85− 'xCanonicalTime': data.time.getTime()*1000,
81+ 'xCanonicalTime': data.time.getTime()*1000, // expected in microseconds
8682 'xCanonicalText': data.body,
8783 'icon': data.avatar,
8884 'xCanonicalAppIcon': data.icon,
8985 };
9086 factory.menuData = menuData;
91− timeFormatter.time = data.time.getTime()/1000;
9287
9388 tryCompare(factory.item, "objectName", "simpleTextMessage");
9489 compare(factory.item.title, data.title, "Title does not match data");
95− compare(factory.item.time, timeFormatter.timeString, "Time does not match data");
90+ compare(factory.item.time, i18n.relativeDateTime(data.time), "Time does not match data");
9691 compare(factory.item.body, data.body, "Message does not match data");
9792 compare(factory.item.avatar, data.avatar, "Avatar does not match data");
9893 compare(factory.item.icon, data.icon, "App icon does not match data");
@@ -111,7 +106,7 @@ Item {
111106 menuData.label = data.title;
112107 menuData.sensitive = data.enabled;
113108 menuData.ext = {
114− 'xCanonicalTime': data.time.getTime()*1000,
109+ 'xCanonicalTime': data.time.getTime()*1000, // expected in microseconds
115110 'xCanonicalText': data.body,
116111 'icon': data.avatar,
117112 'xCanonicalAppIcon': data.icon,
@@ -123,11 +118,10 @@ Item {
123118 ]
124119 };
125120 factory.menuData = menuData;
126− timeFormatter.time = data.time.getTime()/1000;
127121
128122 tryCompare(factory.item, "objectName", "textMessage");
129123 compare(factory.item.title, data.title, "Title does not match data");
130− compare(factory.item.time, timeFormatter.timeString, "Time does not match data");
124+ compare(factory.item.time, i18n.relativeDateTime(data.time), "Time does not match data");
131125 compare(factory.item.body, data.body, "Message does not match data");
132126 compare(factory.item.avatar, data.avatar, "Avatar does not match data");
133127 compare(factory.item.icon, data.icon, "App icon does not match data");
@@ -147,7 +141,7 @@ Item {
147141 menuData.label = data.title;
148142 menuData.sensitive = data.enabled;
149143 menuData.ext = {
150− 'xCanonicalTime': data.time.getTime()*1000,
144+ 'xCanonicalTime': data.time.getTime()*1000, // expected in microseconds
151145 'xCanonicalText': data.body,
152146 'icon': data.avatar,
153147 'xCanonicalAppIcon': data.icon,
@@ -162,11 +156,10 @@ Item {
162156 ]
163157 };
164158 factory.menuData = menuData;
165− timeFormatter.time = data.time.getTime()/1000;
166159
167160 tryCompare(factory.item, "objectName", "snapDecision");
168161 compare(factory.item.title, data.title, "Title does not match data");
169− compare(factory.item.time, timeFormatter.timeString, "Time does not match data");
162+ compare(factory.item.time, i18n.relativeDateTime(data.time), "Time does not match data");
170163 compare(factory.item.body, data.body, "Message does not match data");
171164 compare(factory.item.avatar, data.avatar, "Avatar does not match data");
172165 compare(factory.item.icon, data.icon, "App icon does not match data");
tests/qmltests/tst_DisabledScreenNotice.qmlnew file+37
@@ -0,0 +1,37 @@
1+/*
2+ * Copyright (C) 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 QtTest 1.0
19+import Unity.Test 0.1
20+import "../../qml"
21+
22+
23+Item {
24+ id: root
25+ width: units.gu(70)
26+ height: units.gu(70)
27+
28+ DisabledScreenNotice {
29+ anchors.fill: parent
30+ }
31+
32+ UnityTestCase {
33+ id: testCase
34+ name: "DisabledScreenNotice"
35+ when: windowShown
36+ }
37+}
tests/qmltests/tst_OrientedShell.qml+51−1
@@ -110,6 +110,22 @@ Rectangle {
110110 physicalOrientation180: Qt.LandscapeOrientation
111111 primaryOrientationAngle: 90
112112 }
113+ },
114+ State {
115+ name: "desktop"
116+ PropertyChanges {
117+ target: orientedShellLoader
118+ width: units.gu(100)
119+ height: units.gu(56)
120+ }
121+ PropertyChanges {
122+ target: root
123+ physicalOrientation270: Qt.InvertedPortraitOrientation
124+ physicalOrientation0: Qt.LandscapeOrientation
125+ physicalOrientation90: Qt.PortraitOrientation
126+ physicalOrientation180: Qt.InvertedLandscapeOrientation
127+ primaryOrientationAngle: 0
128+ }
113129 }
114130 ]
115131
@@ -250,7 +266,7 @@ Rectangle {
250266 anchors { left: parent.left; right: parent.right }
251267 activeFocusOnPress: false
252268 text: "Device Name"
253− model: ["mako", "manta", "flo"]
269+ model: ["mako", "manta", "flo", "desktop"]
254270 onSelectedIndexChanged: {
255271 testCase.tearDown();
256272 applicationArguments.deviceName = model[selectedIndex];
@@ -310,12 +326,14 @@ Rectangle {
310326 Row {
311327 Button {
312328 text: "Add mouse"
329+ activeFocusOnPress: false
313330 onClicked: {
314331 UnityInputInfo.inputInfo.addMockMouse()
315332 }
316333 }
317334 Button {
318335 text: "Remove mouse"
336+ activeFocusOnPress: false
319337 onClicked: {
320338 UnityInputInfo.inputInfo.removeMockMouse()
321339 }
@@ -324,17 +342,37 @@ Rectangle {
324342 Row {
325343 Button {
326344 text: "Add kbd"
345+ activeFocusOnPress: false
327346 onClicked: {
328347 UnityInputInfo.inputInfo.addMockKeyboard()
329348 }
330349 }
331350 Button {
351+ activeFocusOnPress: false
332352 text: "Remove kbd"
333353 onClicked: {
334354 UnityInputInfo.inputInfo.removeMockKeyboard()
335355 }
336356 }
337357 }
358+
359+ // Simulates what happens when the shell is moved to an external monitor and back
360+ Button {
361+ id: moveToFromMonitorButton
362+ text: applicationArguments.deviceName === "desktop" ? "Move to " + prevDevName + " screen" : "Move to desktop screen"
363+ activeFocusOnPress: false
364+ property string prevDevName: "mako"
365+ onClicked: {
366+ usageModeSelector.selectedIndex = 2; // "Automatic"
367+
368+ if (applicationArguments.deviceName === "desktop") {
369+ applicationArguments.deviceName = prevDevName;
370+ } else {
371+ prevDevName = applicationArguments.deviceName;
372+ applicationArguments.deviceName = "desktop"
373+ }
374+ }
375+ }
338376 }
339377 }
340378
@@ -1054,6 +1092,18 @@ Rectangle {
10541092 compare(signalSpy.count, 0);
10551093 }
10561094
1095+ function test_moveToExternalMonitor() {
1096+ loadShell("flo");
1097+
1098+ compare(orientedShell.orientation, Qt.InvertedLandscapeOrientation);
1099+ compare(shell.transformRotationAngle, 90);
1100+
1101+ moveToFromMonitorButton.clicked();
1102+
1103+ tryCompare(orientedShell, "orientation", Qt.LandscapeOrientation);
1104+ tryCompare(shell, "transformRotationAngle" , 0);
1105+ }
1106+
10571107 // angle - rotation angle in degrees clockwise, relative to the primary orientation.
10581108 function rotateTo(angle) {
10591109 switch (angle) {
tests/qmltests/tst_Shell.qml−24
@@ -1241,30 +1241,6 @@ Rectangle {
12411241 tryCompare(launcherPanel, "x", -launcherPanel.width);
12421242 }
12431243
1244− function test_background_data() {
1245− return [
1246− {tag: "color", accounts: Qt.resolvedUrl("data:image/svg+xml,<svg><rect width='100%' height='100%' fill='#dd4814'/></svg>"), gsettings: "", output: Qt.resolvedUrl("data:image/svg+xml,<svg><rect width='100%' height='100%' fill='#dd4814'/></svg>")},
1247− {tag: "empty", accounts: "", gsettings: "", output: "defaultBackground"},
1248− {tag: "as-specified", accounts: Qt.resolvedUrl("../data/unity/backgrounds/blue.png"), gsettings: "", output: Qt.resolvedUrl("../data/unity/backgrounds/blue.png")},
1249− {tag: "gs-specified", accounts: "", gsettings: Qt.resolvedUrl("../data/unity/backgrounds/red.png"), output: Qt.resolvedUrl("../data/unity/backgrounds/red.png")},
1250− {tag: "both-specified", accounts: Qt.resolvedUrl("../data/unity/backgrounds/blue.png"), gsettings: Qt.resolvedUrl("../data/unity/backgrounds/red.png"), output: Qt.resolvedUrl("../data/unity/backgrounds/blue.png")},
1251− {tag: "invalid-as", accounts: Qt.resolvedUrl("../data/unity/backgrounds/nope.png"), gsettings: Qt.resolvedUrl("../data/unity/backgrounds/red.png"), output: Qt.resolvedUrl("../data/unity/backgrounds/red.png")},
1252− {tag: "invalid-both", accounts: Qt.resolvedUrl("../data/unity/backgrounds/nope.png"), gsettings: Qt.resolvedUrl("../data/unity/backgrounds/stillnope.png"), output: "defaultBackground"},
1253− ]
1254− }
1255− function test_background(data) {
1256− loadShell("phone");
1257− swipeAwayGreeter();
1258− AccountsService.backgroundFile = data.accounts;
1259− GSettingsController.setPictureUri(data.gsettings);
1260−
1261− if (data.output === "defaultBackground") {
1262− tryCompare(shell, "background", shell.defaultBackground);
1263− } else {
1264− tryCompare(shell, "background", data.output);
1265− }
1266− }
1267−
12681244 function test_tabletLogin_data() {
12691245 return [
12701246 {tag: "auth error", user: "auth-error", loggedIn: false, password: ""},