on xenial help sign in
merged with trunk
commit95419ae2246f365b528566676709bc87447257c6 authorNick Dedekind <nick.dedekind@canonical.com> dateThu 27 Oct 2016, 17:16 (10 years ago) parent8a50eb4bc584a7
45 files changed+944−869
CMakeLists.txt+1−1 debian/changelog+43−5 debian/control+3−2 include/paths.h.in+34−25 plugins/Unity/Launcher/CMakeLists.txt+8−3 plugins/Unity/Launcher/desktopfilehandler.cpp−155 plugins/Unity/Launcher/desktopfilehandler.h−56 plugins/Unity/Launcher/launchermodel.cpp+53−26 plugins/Unity/Launcher/launchermodel.h+17−8 po/de.po+34−34 po/fa.po+17−15 po/fr.po+5−5 po/nl.po+111−97 po/oc.po+115−110 po/unity8.pot+14−14 qml/Components/InputMethod.qml+1−1 qml/Components/UbuntuShapeForItem.qml−47 qml/Dash/Previews/PreviewProgress.qml+1−2 qml/Launcher/LauncherPanel.qml+5−2 qml/Panel/Indicators/MenuItemFactory.qml+98−146 qml/Shell.qml+10 qml/Stage/DecoratedWindow.qml+33−16 qml/Stage/MoveHandler.qml+2−1 qml/Stage/Spread/SpreadDelegateInputArea.qml+2−2 qml/Stage/Stage.qml+17−8 tests/mocks/Cursor/Cursor.qml+2 tests/mocks/Unity/Indicators/IndicatorsModel.qml+1−1 tests/mocks/Unity/Indicators/fakeindicatorsmodeldata.js+220−32 tests/plugins/Greeter/Unity/Launcher/CMakeLists.txt−1 tests/plugins/Unity/Launcher/CMakeLists.txt+12−20 tests/plugins/Unity/Launcher/abs-icon.desktop → tests/plugins/Unity/Launcher/applications/abs-icon.desktop+1 tests/plugins/Unity/Launcher/click-icon.desktop → tests/plugins/Unity/Launcher/applications/click-icon.desktop+1 tests/plugins/Unity/Launcher/click-icon.svg → tests/plugins/Unity/Launcher/applications/click-icon.svg tests/plugins/Unity/Launcher/no-name.desktop → tests/plugins/Unity/Launcher/applications/no-name.desktop+1 tests/plugins/Unity/Launcher/rel-icon.desktop → tests/plugins/Unity/Launcher/applications/rel-icon.desktop+1 tests/plugins/Unity/Launcher/rel-icon.svg → tests/plugins/Unity/Launcher/applications/rel-icon.svg tests/plugins/Unity/Launcher/launchermodeltest.cpp+19−22 tests/plugins/Unity/Launcher/no-icon.desktop−2 tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+5 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+1−6 tests/qmltests/Panel/tst_IndicatorPage.qml+1−1 tests/qmltests/Stage/tst_DesktopStage.qml+16 tests/qmltests/Stage/tst_PhoneStage.qml+5 tests/qmltests/Stage/tst_TabletStage.qml+6−3 tests/qmltests/tst_Shell.qml+28
CMakeLists.txt+1−1
@@ -63,7 +63,7 @@ pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
6363pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
6464pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
6565pkg_check_modules(GD3 REQUIRED gnome-desktop-3.0)
66−
66+pkg_check_modules(UAL REQUIRED ubuntu-app-launch-2)
6767pkg_check_modules(UBUNTUGESTURES REQUIRED UbuntuGestures)
6868
6969### Check UbuntuGestures private headers. No pkg-config (.pc) file is provided for them
debian/changelog+43−5
@@ -1,4 +1,44 @@
1−unity8 (8.14+16.10.20160914-0ubuntu1) yakkety; urgency=medium
1+unity8 (8.14+17.04.20161024-0ubuntu1) zesty; urgency=medium
2+
3+ [ Albert Astals Cid ]
4+ * Make PreviewProgress be thicker again (LP: #1629382)
5+ * tst_PreviewZoomableImage: Wait for LazyImage transitions on init()
6+ (LP: #1630136)
7+
8+ [ Andrea Azzarone ]
9+ * Remove UbuntuShapeForItem and replace its use with the more standard
10+ Ubuntu.Components.UbuntuShape.
11+
12+ [ Lukáš Tinkl ]
13+ * Restore the double tap decoration to maximize feature (LP: #1627281)
14+ * Hide the cursor for fullscreen apps after 3 seconds of inactivity
15+ * Implement moving windows by Alt + left mouse button
16+
17+ [ Marco Trevisan (Treviño) ]
18+ * MenuItemFactory: use more features from SlotsLayout based settings
19+ components
20+
21+ [ Michael Terry ]
22+ * Grab launcher icon information from ubuntu-app-launch, not directly
23+ from desktop files.
24+ * Adjust root paths if we're running inside a snap. (LP: #1629009)
25+
26+ [ Michael Zanetti ]
27+ * Merge all Stages into one single codebase. Apply new spread visuals.
28+ (LP: #1489517, #1603914, #1635800)
29+
30+ -- Michael Zanetti <michael.zanetti@canonical.com> Mon, 24 Oct 2016 11:37:28 +0000
31+
32+unity8 (8.14+16.10.20160922-0ubuntu2) yakkety; urgency=medium
33+
34+ * debian/control:
35+ - Drop unity-scope-mediascanner2 to a Suggests rather than a Recommends,
36+ to ease our transition to main. It's already seeded directly in
37+ Touch, so this will only affect the Desktop variant of unity8.
38+
39+ -- Michael Terry <mterry@ubuntu.com> Mon, 03 Oct 2016 10:43:25 -0400
40+
41+unity8 (8.14+16.10.20160922-0ubuntu1) yakkety; urgency=medium
242
343 [ Albert Astals Cid ]
444 * LVWPH: update clipItem height when list height changes (LP:
@@ -46,14 +86,12 @@ unity8 (8.14+16.10.20160914-0ubuntu1) yakkety; urgency=medium
4686 the greeter.
4787
4888 [ Lukáš Tinkl ]
89+ * Implement edge maximizing (aka window snapping) (LP: #1602628)
4990 * On the PC platform (as opposed to running on $devices), use the
5091 "mute" action instead of silent mode
5192 * Respect Fitt's law wrt the window control buttons in panel (LP:
5293 #1611959)
5394 * Fix 2 failing color-related tests
54− * Implement edge maximizing (aka window snapping) (LP: #1602628,
55− #1611859)
56− * Implement moving windows by Alt + left mouse button
5795
5896 [ Marco Trevisan (Treviño) ]
5997 * Indicators, mocks: add fake indicators menuitem to populate mocks
@@ -75,7 +113,7 @@ unity8 (8.14+16.10.20160914-0ubuntu1) yakkety; urgency=medium
75113 * Update look of infographic a bit
76114 * Make infographic bubbles white even on the default wallpaper.
77115
78− -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 14 Sep 2016 00:46:45 +0000
116+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 22 Sep 2016 07:46:57 +0000
79117
80118unity8 (8.14+16.10.20160831.3-0ubuntu1) yakkety; urgency=medium
81119
debian/control+3−2
@@ -32,6 +32,7 @@ Build-Depends: cmake,
3232 libqt5svg5-dev,
3333 libqt5xmlpatterns5-dev,
3434 libsystemsettings-dev,
35+ libubuntu-app-launch2-dev,
3536 libubuntu-download-manager-common-dev,
3637 libubuntugestures5-dev (>= 1.3.2030),
3738 libubuntugestures5-private-dev (>= 1.3.2030),
@@ -64,7 +65,7 @@ Build-Depends: cmake,
6465 qtdeclarative5-dev-tools,
6566 qtdeclarative5-private-dev (>= 5.4),
6667 qtdeclarative5-ubuntu-content1,
67− qtdeclarative5-ubuntu-settings-components (>= 0.7),
68+ qtdeclarative5-ubuntu-settings-components (>= 0.10),
6869 ttf-ubuntu-font-family,
6970Standards-Version: 3.9.4
7071Homepage: http://launchpad.net/unity
@@ -137,7 +138,7 @@ Recommends: indicator-keyboard,
137138 indicator-session,
138139 unity-greeter-session-broadcast,
139140 unity-scope-click,
140− unity-scope-mediascanner2,
141+Suggests: unity-scope-mediascanner2,
141142Breaks: indicator-network (<< 0.5.1+14.10.20141014),
142143 ubuntu-touch-session (<< 0.107),
143144 unity8-greeter (<< 7.89),
include/paths.h.in+34−25
@@ -1,8 +1,5 @@
11/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * Authors:
5− * Ugo Riboni <ugo.riboni@canonical.com>
2+ * Copyright (C) 2012-2016 Canonical, Ltd.
63 *
74 * This program is free software; you can redistribute it and/or modify
85 * it under the terms of the GNU General Public License as published by
@@ -17,8 +14,7 @@
1714 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1815 */
1916
20−#ifndef PATHS_H
21−#define PATHS_H
17+#pragma once
2218
2319// Qt
2420#include <QtCore/QCoreApplication>
@@ -27,10 +23,25 @@
2723#include <QtQml/QQmlEngine>
2824#include <QStandardPaths>
2925
26+inline QString installRoot() {
27+ static QString installRoot;
28+ static bool installRootSet = false;
29+ if (!installRootSet) {
30+ QString snapRoot = QFile::decodeName(qgetenv("SNAP"));
31+ if (!snapRoot.isEmpty() && QCoreApplication::applicationDirPath() ==
32+ QDir(snapRoot + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@")).canonicalPath()) {
33+ installRoot = snapRoot;
34+ } else if (QCoreApplication::applicationDirPath() ==
35+ QDir(QStringLiteral("@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@")).canonicalPath()) {
36+ installRoot = QStringLiteral("");
37+ }
38+ installRootSet = true;
39+ }
40+ return installRoot;
41+}
42+
3043inline bool isRunningInstalled() {
31− static bool installed = (QCoreApplication::applicationDirPath() ==
32− QDir(QStringLiteral("@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@")).canonicalPath());
33− return installed;
44+ return !installRoot().isNull();
3445}
3546
3647inline QString buildDirectory() {
@@ -45,24 +56,24 @@ inline QString sourceDirectory() {
4556
4657inline QString translationDirectory() {
4758 if (isRunningInstalled()) {
48− return QStringLiteral("@CMAKE_INSTALL_PREFIX@/share/locale");
59+ return installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/share/locale");
4960 } else {
50− return QString(buildDirectory() + "/po/locale");
61+ return buildDirectory() + QStringLiteral("/po/locale");
5162 }
5263}
5364
5465inline QString qmlDirectory() {
5566 if (isRunningInstalled()) {
56− return QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/");
67+ return installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/");
5768 } else {
58− return QString(sourceDirectory() + "/qml");
69+ return sourceDirectory() + QStringLiteral("/qml");
5970 }
6071}
6172
6273inline QStringList overrideImportPaths() {
6374 QStringList paths;
6475 if (!isRunningInstalled()) {
65− paths << QString(buildDirectory() + "/plugins");
76+ paths << buildDirectory() + QStringLiteral("/plugins");
6677 }
6778 return paths;
6879}
@@ -70,9 +81,9 @@ inline QStringList overrideImportPaths() {
7081inline QStringList nonMirImportPaths() {
7182 QStringList paths;
7283 if (isRunningInstalled()) {
73− paths << QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/nonmirplugins");
84+ paths << installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/nonmirplugins");
7485 } else {
75− paths << QString(buildDirectory() + "/nonmirplugins");
86+ paths << buildDirectory() + QStringLiteral("/nonmirplugins");
7687 }
7788 return paths;
7889}
@@ -80,23 +91,23 @@ inline QStringList nonMirImportPaths() {
8091inline QStringList fallbackImportPaths() {
8192 QStringList paths;
8293 if (isRunningInstalled()) {
83− paths << QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@");
84− paths << QStringLiteral("@USS_PRIVATE_PLUGINDIR@");
85− paths << QStringLiteral("@SHELL_PLUGINDIR@");
86− paths << QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/mocks");
94+ paths << installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@");
95+ paths << installRoot() + QStringLiteral("@USS_PRIVATE_PLUGINDIR@");
96+ paths << installRoot() + QStringLiteral("@SHELL_PLUGINDIR@");
97+ paths << installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/mocks");
8798 } else {
8899 paths << QStringLiteral("@USS_PRIVATE_PLUGINDIR@");
89100 paths << QStringLiteral("@SHELL_PLUGINDIR@");
90− paths << QString(buildDirectory() + "/tests/mocks");
101+ paths << buildDirectory() + QStringLiteral("/tests/mocks");
91102 }
92103 return paths;
93104}
94105
95106inline QString mockPluginsDir() {
96107 if (isRunningInstalled()) {
97− return QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/mocks");
108+ return installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/mocks");
98109 } else {
99− return QString(buildDirectory() + "/tests/mocks");
110+ return buildDirectory() + QStringLiteral("/tests/mocks");
100111 }
101112}
102113
@@ -137,5 +148,3 @@ inline void appendImportPaths(QQmlEngine *engine, const QStringList &paths)
137148 }
138149 engine->setImportPathList(importPathList);
139150}
140−
141−#endif
plugins/Unity/Launcher/CMakeLists.txt+8−3
@@ -6,11 +6,16 @@ add_definitions(-DSM_BUSNAME=systemBus)
66include_directories(
77 ${CMAKE_CURRENT_SOURCE_DIR}
88 ${CMAKE_SOURCE_DIR}/plugins/AccountsService
9− ${GSETTINGS_QT_INCLUDE_DIRS}
10− ${GLIB_INCLUDE_DIRS}
119 ${libunity8-private_SOURCE_DIR}
1210)
1311
12+include_directories(
13+ SYSTEM
14+ ${GSETTINGS_QT_INCLUDE_DIRS}
15+ ${GLIB_INCLUDE_DIRS}
16+ ${UAL_INCLUDE_DIRS}
17+ )
18+
1419set(QMLLAUNCHERPLUGIN_SRC
1520 plugin.cpp
1621 launchermodel.cpp
@@ -19,7 +24,6 @@ set(QMLLAUNCHERPLUGIN_SRC
1924 quicklistentry.cpp
2025 dbusinterface.cpp
2126 gsettings.cpp
22− desktopfilehandler.cpp
2327 asadapter.cpp
2428 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
2529 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
@@ -38,6 +42,7 @@ target_link_libraries(UnityLauncher-qml
3842 unity8-private
3943 ${GSETTINGS_QT_LDFLAGS}
4044 ${GLIB_LIBRARIES}
45+ ${UAL_LIBRARIES}
4146 )
4247
4348qt5_use_modules(UnityLauncher-qml DBus Qml Gui)
plugins/Unity/Launcher/desktopfilehandler.cppdeleted−155
@@ -1,155 +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 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− * Authors:
17− * Michael Zanetti <michael.zanetti@canonical.com>
18− */
19−
20−#include "desktopfilehandler.h"
21−
22−#include <QStringList>
23−#include <QStandardPaths>
24−#include <QDir>
25−#include <QSettings>
26−#include <QLocale>
27−
28−#include <libintl.h>
29−
30−DesktopFileHandler::DesktopFileHandler(const QString &appId, QObject *parent):
31− QObject(parent),
32− m_appId(appId)
33−{
34− load();
35−}
36−
37−QString DesktopFileHandler::appId() const
38−{
39− return m_appId;
40−}
41−
42−void DesktopFileHandler::setAppId(const QString &appId)
43−{
44− if (m_appId != appId) {
45− m_appId = appId;
46− load();
47− }
48−}
49−
50−QString DesktopFileHandler::filename() const
51−{
52− return m_filename;
53−}
54−
55−bool DesktopFileHandler::isValid() const
56−{
57− return !m_filename.isEmpty();
58−}
59−
60−void DesktopFileHandler::load()
61−{
62− m_filename.clear();
63−
64− if (m_appId.isEmpty()) {
65− return;
66− }
67−
68− int dashPos = -1;
69− QString helper = m_appId;
70−
71− QStringList searchDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
72−#ifdef LAUNCHER_TESTING
73− searchDirs << QStringLiteral(".");
74−#endif
75−
76− QString path;
77− do {
78− if (dashPos != -1) {
79− helper.replace(dashPos, 1, '/');
80− }
81−
82− if (helper.contains('/')) {
83− path += helper.split('/').at(0) + '/';
84− helper.remove(QRegExp("^" + path));
85− }
86−
87− Q_FOREACH(const QString &searchDirName, searchDirs) {
88− QDir searchDir(searchDirName + "/" + path);
89− const QString desktop = QStringLiteral("*.desktop");
90− Q_FOREACH(const QString &desktopFile, searchDir.entryList(QStringList() << desktop)) {
91− if (desktopFile.startsWith(helper)) {
92− QFileInfo fileInfo(searchDir, desktopFile);
93− m_filename = fileInfo.absoluteFilePath();
94− return;
95− }
96− }
97− }
98−
99− dashPos = helper.indexOf('-');
100− } while (dashPos != -1);
101−}
102−
103−QString DesktopFileHandler::displayName() const
104−{
105− if (!isValid()) {
106− return QString();
107− }
108−
109− QSettings settings(m_filename, QSettings::IniFormat);
110− settings.setIniCodec("UTF-8");
111− settings.beginGroup(QStringLiteral("Desktop Entry"));
112−
113− // First try to find Name[xx_YY] and Name[xx] in .desktop file
114− const QString locale = QLocale().name();
115− const QStringList splitLocale = locale.split(QLatin1Char('_'));
116− const QString shortLocale = splitLocale.first();
117−
118− if (locale != shortLocale && settings.contains(QStringLiteral("Name[%1]").arg(locale))) {
119− return settings.value(QStringLiteral("Name[%1]").arg(locale)).toString();
120− }
121−
122− if (settings.contains(QStringLiteral("Name[%1]").arg(shortLocale))) {
123− return settings.value(QStringLiteral("Name[%1]").arg(shortLocale)).toString();
124− }
125−
126− // No translation found in desktop file. Get the untranslated one and have a go with gettext.
127− QString displayName = settings.value(QStringLiteral("Name")).toString();
128−
129− if (settings.contains(QStringLiteral("X-Ubuntu-Gettext-Domain"))) {
130− const QString domain = settings.value(QStringLiteral("X-Ubuntu-Gettext-Domain")).toString();
131− return dgettext(domain.toUtf8().constData(), displayName.toUtf8().constData());
132− }
133−
134− return displayName;
135−}
136−
137−QString DesktopFileHandler::icon() const
138−{
139− if (!isValid()) {
140− return QString();
141− }
142−
143− QSettings settings(m_filename, QSettings::IniFormat);
144− settings.setIniCodec("UTF-8");
145− settings.beginGroup(QStringLiteral("Desktop Entry"));
146− QString iconString = settings.value(QStringLiteral("Icon")).toString();
147− QString pathString = settings.value(QStringLiteral("Path")).toString();
148−
149− if (QFileInfo::exists(iconString)) {
150− return QFileInfo(iconString).absoluteFilePath();
151− } else if (QFileInfo::exists(pathString + '/' + iconString)) {
152− return pathString + '/' + iconString;
153− }
154− return "image://theme/" + iconString;
155−}
plugins/Unity/Launcher/desktopfilehandler.hdeleted−56
@@ -1,56 +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 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− * Authors:
17− * Michael Zanetti <michael.zanetti@canonical.com>
18− */
19−
20−#ifndef DESKTOPFILEHANDLER_H
21−#define DESKTOPFILEHANDLER_H
22−
23−#include <QObject>
24−
25−/**
26− * When an object of this class is created or whenever setAppId(appId) is called,
27− * this will search for a .desktop file matching the give appId. If a file is
28− * found, isValid() will return true and the other methods return the contents
29− * of the .desktop file.
30− *
31− * Note that this class will consider the user's locale and do a best effort
32− * to return localized values.
33− */
34−
35−class DesktopFileHandler: public QObject
36−{
37− Q_OBJECT
38−public:
39− DesktopFileHandler(const QString &appId = QString(), QObject *parent = nullptr);
40−
41− QString appId() const;
42− void setAppId(const QString &appId);
43−
44− bool isValid() const;
45− QString filename() const;
46− QString displayName() const;
47− QString icon() const;
48−
49−private:
50− void load();
51−
52− QString m_appId;
53− QString m_filename;
54−};
55−
56−#endif
plugins/Unity/Launcher/launchermodel.cpp+53−26
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2013-2014 Canonical Ltd.
2+ * Copyright 2013-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -12,24 +12,25 @@
1212 *
1313 * You should have received a copy of the GNU Lesser General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Michael Zanetti <michael.zanetti@canonical.com>
1815 */
1916
2017#include "launchermodel.h"
2118#include "launcheritem.h"
2219#include "gsettings.h"
23−#include "desktopfilehandler.h"
2420#include "dbusinterface.h"
2521#include "asadapter.h"
2622
23+#include <ubuntu-app-launch/appid.h>
24+#include <ubuntu-app-launch/application.h>
25+#include <ubuntu-app-launch/registry.h>
2726#include <unity/shell/application/ApplicationInfoInterface.h>
2827#include <unity/shell/application/MirSurfaceListInterface.h>
2928
3029#include <QDesktopServices>
3130#include <QDebug>
3231
32+namespace ual = ubuntu::app_launch;
33+
3334using namespace unity::shell::application;
3435
3536LauncherModel::LauncherModel(QObject *parent):
@@ -37,7 +38,8 @@ LauncherModel::LauncherModel(QObject *parent):
3738 m_settings(new GSettings(this)),
3839 m_dbusIface(new DBusInterface(this)),
3940 m_asAdapter(new ASAdapter()),
40− m_appManager(nullptr)
41+ m_appManager(nullptr),
42+ m_ualRegistry(std::make_shared<ual::Registry>())
4143{
4244 connect(m_dbusIface, &DBusInterface::countChanged, this, &LauncherModel::countChanged);
4345 connect(m_dbusIface, &DBusInterface::countVisibleChanged, this, &LauncherModel::countVisibleChanged);
@@ -157,16 +159,16 @@ void LauncherModel::pin(const QString &appId, int index)
157159 index = m_list.count();
158160 }
159161
160− DesktopFileHandler desktopFile(appId);
161− if (!desktopFile.isValid()) {
162− qWarning() << "Can't pin this application, there is no .desktop file available.";
162+ auto appInfo = getApplicationInfo(appId);
163+ if (!appInfo.valid) {
164+ qWarning() << "Can't pin application, appId not found:" << appId;
163165 return;
164166 }
165167
166168 beginInsertRows(QModelIndex(), index, index);
167169 LauncherItem *item = new LauncherItem(appId,
168− desktopFile.displayName(),
169− desktopFile.icon(),
170+ appInfo.name,
171+ appInfo.icon,
170172 this);
171173 item->setPinned(true);
172174 m_list.insert(index, item);
@@ -333,6 +335,32 @@ int LauncherModel::findApplication(const QString &appId)
333335 return -1;
334336}
335337
338+LauncherModel::AppInfo LauncherModel::getApplicationInfo(const QString &appId)
339+{
340+ AppInfo info;
341+
342+ ual::AppID ualAppId = ual::AppID::find(m_ualRegistry, appId.toStdString());
343+ if (ualAppId.empty()) {
344+ return info;
345+ }
346+
347+ std::shared_ptr<ual::Application> ualApp;
348+ try
349+ {
350+ ualApp = ual::Application::create(ualAppId, m_ualRegistry);
351+ }
352+ catch (std::runtime_error &e)
353+ {
354+ qWarning() << "Couldn't find application info for" << appId << "-" << e.what();
355+ return info;
356+ }
357+
358+ info.valid = true;
359+ info.name = QString::fromStdString(ualApp->info()->name());
360+ info.icon = QString::fromStdString(ualApp->info()->iconPath());
361+ return info;
362+}
363+
336364void LauncherModel::progressChanged(const QString &appId, int progress)
337365{
338366 const int idx = findApplication(appId);
@@ -380,11 +408,11 @@ void LauncherModel::countVisibleChanged(const QString &appId, bool countVisible)
380408 }
381409 } else {
382410 // Need to create a new LauncherItem and show the highlight
383− DesktopFileHandler desktopFile(appId);
384− if (countVisible && desktopFile.isValid()) {
411+ auto appInfo = getApplicationInfo(appId);
412+ if (countVisible && appInfo.valid) {
385413 LauncherItem *item = new LauncherItem(appId,
386− desktopFile.displayName(),
387− desktopFile.icon(),
414+ appInfo.name,
415+ appInfo.icon,
388416 this);
389417 item->setCountVisible(true);
390418 beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
@@ -400,28 +428,28 @@ void LauncherModel::refresh()
400428 // First walk through all the existing items and see if we need to remove something
401429 QList<LauncherItem*> toBeRemoved;
402430 Q_FOREACH (LauncherItem* item, m_list) {
403− DesktopFileHandler desktopFile(item->appId());
404− if (!desktopFile.isValid()) {
405− // Desktop file not available for this app => drop it!
431+ auto appInfo = getApplicationInfo(item->appId());
432+ if (!appInfo.valid) {
433+ // Application no longer available => drop it!
406434 toBeRemoved << item;
407435 } else if (!m_settings->storedApplications().contains(item->appId())) {
408436 // Item not in settings any more => drop it!
409437 toBeRemoved << item;
410438 } else {
411439 int idx = m_list.indexOf(item);
412− item->setName(desktopFile.displayName());
440+ item->setName(appInfo.name);
413441 item->setPinned(item->pinned()); // update pinned text if needed
414442 item->setRunning(item->running());
415443 Q_EMIT dataChanged(index(idx), index(idx), {RoleName, RoleRunning});
416444
417445 const QString oldIcon = item->icon();
418− if (oldIcon == desktopFile.icon()) { // same icon file, perhaps different contents, simulate changing the icon name to force reload
446+ if (oldIcon == appInfo.icon) { // same icon file, perhaps different contents, simulate changing the icon name to force reload
419447 item->setIcon(QString());
420448 Q_EMIT dataChanged(index(idx), index(idx), {RoleIcon});
421449 }
422450
423451 // now set the icon for real
424− item->setIcon(desktopFile.icon());
452+ item->setIcon(appInfo.icon);
425453 Q_EMIT dataChanged(index(idx), index(idx), {RoleIcon});
426454 }
427455 }
@@ -452,15 +480,14 @@ void LauncherModel::refresh()
452480 if (itemIndex == -1) {
453481 // Need to add it. Just add it into the addedIndex to keep same ordering as the list
454482 // in the settings.
455− DesktopFileHandler desktopFile(entry);
456− if (!desktopFile.isValid()) {
457− qWarning() << "Couldn't find a .desktop file for" << entry << ". Skipping...";
483+ auto appInfo = getApplicationInfo(entry);
484+ if (!appInfo.valid) {
458485 continue;
459486 }
460487
461488 LauncherItem *item = new LauncherItem(entry,
462− desktopFile.displayName(),
463− desktopFile.icon(),
489+ appInfo.name,
490+ appInfo.icon,
464491 this);
465492 item->setPinned(true);
466493 beginInsertRows(QModelIndex(), addedIndex, addedIndex);
plugins/Unity/Launcher/launchermodel.h+17−8
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2013-2014 Canonical Ltd.
2+ * Copyright 2013-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -12,14 +12,11 @@
1212 *
1313 * You should have received a copy of the GNU Lesser General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Michael Zanetti <michael.zanetti@canonical.com>
1815 */
1916
20−#ifndef LAUNCHERMODEL_H
21−#define LAUNCHERMODEL_H
17+#pragma once
2218
19+#include <memory>
2320#include <unity/shell/launcher/LauncherModelInterface.h>
2421#include <unity/shell/application/ApplicationManagerInterface.h>
2522
@@ -30,6 +27,12 @@ class GSettings;
3027class DBusInterface;
3128class ASAdapter;
3229
30+namespace ubuntu {
31+ namespace app_launch {
32+ class Registry;
33+ }
34+}
35+
3336using namespace unity::shell::launcher;
3437using namespace unity::shell::application;
3538
@@ -70,6 +73,13 @@ private:
7073
7174 void unpin(const QString &appId);
7275
76+ struct AppInfo {
77+ bool valid = false;
78+ QString name;
79+ QString icon;
80+ };
81+ AppInfo getApplicationInfo(const QString &appId);
82+
7383private Q_SLOTS:
7484 void countChanged(const QString &appId, int count);
7585 void countVisibleChanged(const QString &appId, bool count);
@@ -88,8 +98,7 @@ private:
8898 ASAdapter *m_asAdapter;
8999
90100 ApplicationManagerInterface *m_appManager;
101+ std::shared_ptr<ubuntu::app_launch::Registry> m_ualRegistry;
91102
92103 friend class LauncherModelTest;
93104};
94−
95−#endif // LAUNCHERMODEL_H
po/de.po+34−34
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2016-09-22 07:46+0000\n"
11−"PO-Revision-Date: 2016-08-28 08:35+0000\n"
12−"Last-Translator: Torsten Franz <Unknown>\n"
11+"PO-Revision-Date: 2016-09-29 12:06+0000\n"
12+"Last-Translator: Matthias Seidel <matthias.seidel@hamburg.de>\n"
1313"Language-Team: German <de@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-09-27 07:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-09-30 06:18+0000\n"
1919"X-Generator: Launchpad (build 18204)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:123
@@ -131,7 +131,7 @@ msgstr "Super + Leertaste"
131131
132132#: qml/Components/KeyboardShortcutsOverlay.qml:93
133133msgid "Switches to next keyboard layout."
134−msgstr "Zum nächsten Tastaturlayout umschalten"
134+msgstr "Wechselt zur nächsten Tastaturbelegung."
135135
136136#: qml/Components/KeyboardShortcutsOverlay.qml:101
137137msgid "Super + Shift + Space"
@@ -139,7 +139,7 @@ msgstr "Super + Hochstell + Leertaste"
139139
140140#: qml/Components/KeyboardShortcutsOverlay.qml:106
141141msgid "Switches to previous keyboard layout."
142−msgstr "Zum vorherigen Tastaturlayout umschalten"
142+msgstr "Wechselt zur vorherigen Tastaturbelegung."
143143
144144#: qml/Components/KeyboardShortcutsOverlay.qml:118
145145msgid "Launcher"
@@ -469,11 +469,11 @@ msgstr "Anmelden"
469469
470470#: qml/Greeter/NarrowView.qml:252
471471msgid "Emergency"
472−msgstr ""
472+msgstr "Notruf"
473473
474474#: qml/Greeter/SessionsList.qml:122
475475msgid "Select desktop environment"
476−msgstr ""
476+msgstr "Arbeitsumgebung auswählen"
477477
478478#: qml/Notifications/NotificationMenuItemFactory.qml:124
479479msgid "Show password"
@@ -532,7 +532,7 @@ msgstr "Wird heruntergeladen"
532532
533533#: qml/Panel/Indicators/MenuItemFactory.qml:917
534534msgid "Paused, tap to resume"
535−msgstr "Pausiert, tippen Sie zum fortsetzen"
535+msgstr "Pausiert, tippen zum Fortsetzen"
536536
537537#: qml/Panel/Indicators/MenuItemFactory.qml:919
538538msgid "Canceled"
@@ -544,7 +544,7 @@ msgstr "Erledigt"
544544
545545#: qml/Panel/Indicators/MenuItemFactory.qml:923
546546msgid "Failed, tap to retry"
547−msgstr "Fehlgeschlagen, tippen Sie zum Wiederholen"
547+msgstr "Fehlgeschlagen, tippen zum Wiederholen"
548548
549549#: qml/Panel/Indicators/MessageMenuItemFactory.qml:151
550550#: qml/Panel/Indicators/MessageMenuItemFactory.qml:210
@@ -620,7 +620,7 @@ msgstr "Tastatursprache"
620620
621621#: qml/Wizard/Pages/20-keyboard.qml:93
622622msgid "Keyboard layout"
623−msgstr "Tastaturlayout"
623+msgstr "Tastaturbelegung"
624624
625625#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
626626#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
@@ -659,7 +659,7 @@ msgstr ""
659659#: qml/Wizard/Pages/40-location.qml:105
660660#, qt-format
661661msgid "By selecting this option you agree to the Nokia HERE %1."
662−msgstr "Mit dem Auswählen dieser Option akzeptieren Sie die Nokia HERE %1."
662+msgstr "Durch Auswahl dieser Option akzeptieren Sie die Nokia-HERE-%1."
663663
664664#: qml/Wizard/Pages/40-location.qml:106
665665msgctxt "part of: Nokia HERE terms and conditions"
@@ -676,7 +676,7 @@ msgstr "Meinen Standort nicht verwenden"
676676
677677#: qml/Wizard/Pages/40-location.qml:260
678678msgid "You can change it later in System Settings."
679−msgstr "Dies kann später in den Systemeinstellungen geändert werden."
679+msgstr "Sie können das später in den Systemeinstellungen ändern."
680680
681681#: qml/Wizard/Pages/50-timezone.qml:30
682682msgid "Time Zone"
@@ -746,7 +746,7 @@ msgstr ""
746746#: qml/Wizard/Pages/77-system-update.qml:76
747747msgctxt "string identifying name of the update"
748748msgid "Ubuntu system"
749−msgstr "Ubuntu System"
749+msgstr "Ubuntu-System"
750750
751751#: qml/Wizard/Pages/77-system-update.qml:83
752752#, qt-format
@@ -756,7 +756,7 @@ msgstr "Version %1"
756756
757757#: qml/Wizard/Pages/77-system-update.qml:102
758758msgid "This could take a few minutes..."
759−msgstr "Dies kann ein paar Minuten dauern …"
759+msgstr "Das kann ein paar Minuten dauern …"
760760
761761#: qml/Wizard/Pages/77-system-update.qml:116
762762msgid "Install and restart now"
@@ -790,9 +790,9 @@ msgid ""
790790"collects information about nearby cell towers and Wi-Fi hotspots around your "
791791"current location whenever your position is being found."
792792msgstr ""
793−"Um die Standortbestimmung zu ermöglichen und zu verbessern, sammelt HERE "
794−"Informationen über nahegelegene Netzwerkstationen und WLAN-Hotspots in der "
795−"Umgebung, sobald eine Position erfasst wurde."
793+"Zur Standortbestimmung und Verbesserung der Qualität dieser, sammelt HERE "
794+"Informationen über Netzwerkstationen und WLAN-Zugangspunkte in der Umgebung, "
795+"sobald eine Position erfasst wurde."
796796
797797#: qml/Wizard/Pages/here-terms.qml:93
798798msgid ""
@@ -805,7 +805,7 @@ msgstr ""
805805#: qml/Wizard/Pages/here-terms.qml:106
806806#, qt-format
807807msgid "By continuing, you agree to the HERE platform %1 and %2."
808−msgstr "Wenn Sie fortfahren, stimmen Sie mit den HERE %1 und %2 überein."
808+msgstr "Wenn Sie fortfahren, stimmen Sie den HERE-%1 und -%2 zu."
809809
810810#: qml/Wizard/Pages/here-terms.qml:107
811811msgid "Service Terms"
@@ -856,15 +856,15 @@ msgstr "PIN muss 4 Ziffern lang sein"
856856
857857#: qml/Wizard/Pages/password-set.qml:31
858858msgid "Lock Screen Password"
859−msgstr "Sperrbildschirm-Passwort"
859+msgstr "Sperrbildschirmpasswort"
860860
861861#: qml/Wizard/Pages/password-set.qml:62
862862msgid "Enter at least 8 characters"
863−msgstr "Geben Sie mindestens 8 Zeichen ein"
863+msgstr "Bitte mindestens 8 Zeichen eingeben"
864864
865865#: qml/Wizard/Pages/password-set.qml:74
866866msgid "Choose password"
867−msgstr "Wählen Sie ein Passwort"
867+msgstr "Passwort auswählen"
868868
869869#: qml/Wizard/Pages/password-set.qml:104
870870msgid "Confirm password"
@@ -1025,9 +1025,6 @@ msgstr "Sehr schwaches Passwort"
10251025#~ msgid "Sorry, incorrect passcode."
10261026#~ msgstr "Falsche PIN"
10271027
1028−#~ msgid "Sorry, incorrect passphrase"
1029−#~ msgstr "Das Passwort ist nicht korrekt"
1030−
10311028#, qt-format
10321029#~ msgid "Sorry, incorrect %1"
10331030#~ msgstr "%1 falsch"
@@ -1059,9 +1056,6 @@ msgstr "Sehr schwaches Passwort"
10591056#~ msgid "Manage Scopes"
10601057#~ msgstr "Filter verwalten"
10611058
1062−#~ msgid "Sorry, incorrect passphrase."
1063−#~ msgstr "Entschuldigung, falsches Passwort."
1064−
10651059#~ msgid "Please re-enter"
10661060#~ msgstr "Bitte erneut eingeben"
10671061
@@ -1103,13 +1097,6 @@ msgstr "Sehr schwaches Passwort"
11031097#~ msgstr ""
11041098#~ "Sie können Ihre Meinung später in den <b>Systemeinstellungen</b> ändern."
11051099
1106−#~ msgid ""
1107−#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1108−#~ "conditions</a>."
1109−#~ msgstr ""
1110−#~ "Mit dem Auswählen dieser Option stimmen Sie den Nokia HERE <a "
1111−#~ "href='#'>allgemeinen Geschäftsbedingungen</a> zu."
1112−
11131100#~ msgid "Not at all"
11141101#~ msgstr "Gar nicht"
11151102
@@ -1331,3 +1318,16 @@ msgstr "Sehr schwaches Passwort"
13311318#~ msgid "Swipe from the top edge to open the notification bar"
13321319#~ msgstr ""
13331320#~ "Vom oberen Rand her wischen, um die Benachrichtigungsleiste zu öffnen"
1321+
1322+#~ msgid "Sorry, incorrect passphrase"
1323+#~ msgstr "Falsche Passphrase."
1324+
1325+#~ msgid "Sorry, incorrect passphrase."
1326+#~ msgstr "Falsche Passphrase."
1327+
1328+#~ msgid ""
1329+#~ "By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
1330+#~ "conditions</a>."
1331+#~ msgstr ""
1332+#~ "Mit dem Auswählen dieser Option stimmen Sie den <a href='#'>allgemeinen "
1333+#~ "Geschäftsbedingungen</a> von HERE zu."
po/fa.po+17−15
@@ -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: 2016-09-22 07:46+0000\n"
11−"PO-Revision-Date: 2016-07-09 07:27+0000\n"
11+"PO-Revision-Date: 2016-10-18 07:03+0000\n"
1212"Last-Translator: Danial Behzadi <dani.behzi@gmail.com>\n"
1313"Language-Team: Persian <fa@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2016-09-27 07:04+0000\n"
19−"X-Generator: Launchpad (build 18204)\n"
18+"X-Launchpad-Export-Date: 2016-10-19 06:33+0000\n"
19+"X-Generator: Launchpad (build 18232)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:123
2222msgid "Password: "
@@ -448,11 +448,11 @@ msgstr "تلاش دوباره"
448448
449449#: qml/Greeter/LoginList.qml:70
450450msgid "Passphrase"
451−msgstr ""
451+msgstr "عبارت‌عبور"
452452
453453#: qml/Greeter/LoginList.qml:71
454454msgid "Passcode"
455−msgstr ""
455+msgstr "رمزعبور"
456456
457457#: qml/Greeter/LoginList.qml:98
458458msgid "Retry"
@@ -464,11 +464,11 @@ msgstr "ورود"
464464
465465#: qml/Greeter/NarrowView.qml:252
466466msgid "Emergency"
467−msgstr ""
467+msgstr "اضطراری"
468468
469469#: qml/Greeter/SessionsList.qml:122
470470msgid "Select desktop environment"
471−msgstr ""
471+msgstr "گزینش محیط میزکار"
472472
473473#: qml/Notifications/NotificationMenuItemFactory.qml:124
474474msgid "Show password"
@@ -600,15 +600,15 @@ msgstr "بعدی"
600600
601601#: qml/Wizard/Pages/20-keyboard.qml:31
602602msgid "Select Keyboard"
603−msgstr ""
603+msgstr "گزینش صفحه‌کلید"
604604
605605#: qml/Wizard/Pages/20-keyboard.qml:71
606606msgid "Keyboard language"
607−msgstr ""
607+msgstr "زبان صفحه‌کلید"
608608
609609#: qml/Wizard/Pages/20-keyboard.qml:93
610610msgid "Keyboard layout"
611−msgstr ""
611+msgstr "چینش صفحه‌کلید"
612612
613613#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
614614#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
@@ -719,32 +719,34 @@ msgstr "سیاست محرمانگی"
719719
720720#: qml/Wizard/Pages/77-system-update.qml:28
721721msgid "Update Device"
722−msgstr ""
722+msgstr "به‌روز رسانی افزاره"
723723
724724#: qml/Wizard/Pages/77-system-update.qml:55
725725msgid ""
726726"There is a system update available and ready to install. Afterwards, the "
727727"device will automatically restart."
728728msgstr ""
729+"یک به‌روز رسانی سامانه‌ای موجود و آمادهٔ نصب است. پس از آن، دستگاه به صورت "
730+"خودکار خاموش و روشن می‌شود."
729731
730732#: qml/Wizard/Pages/77-system-update.qml:76
731733msgctxt "string identifying name of the update"
732734msgid "Ubuntu system"
733−msgstr ""
735+msgstr "سامانهٔ اوبونتو"
734736
735737#: qml/Wizard/Pages/77-system-update.qml:83
736738#, qt-format
737739msgctxt "version of the system update"
738740msgid "Version %1"
739−msgstr ""
741+msgstr "نگارش %1"
740742
741743#: qml/Wizard/Pages/77-system-update.qml:102
742744msgid "This could take a few minutes..."
743−msgstr ""
745+msgstr "ممکن است چند دقیقه طول بکشد"
744746
745747#: qml/Wizard/Pages/77-system-update.qml:116
746748msgid "Install and restart now"
747−msgstr ""
749+msgstr "هم‌اکنون نصب و خاموش و روشن شود"
748750
749751#: qml/Wizard/Pages/80-finished.qml:89
750752msgid "Welcome to Ubuntu"
po/fr.po+5−5
@@ -8,14 +8,14 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2016-09-22 07:46+0000\n"
11−"PO-Revision-Date: 2016-08-30 15:06+0000\n"
12−"Last-Translator: Jean-Marc <Unknown>\n"
11+"PO-Revision-Date: 2016-10-02 08:06+0000\n"
12+"Last-Translator: Olivier Febwin <febwin@free.fr>\n"
1313"Language-Team: French <fr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-09-27 07:03+0000\n"
18+"X-Launchpad-Export-Date: 2016-10-03 06:18+0000\n"
1919"X-Generator: Launchpad (build 18204)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:123
@@ -471,11 +471,11 @@ msgstr "Connexion"
471471
472472#: qml/Greeter/NarrowView.qml:252
473473msgid "Emergency"
474−msgstr ""
474+msgstr "Urgence"
475475
476476#: qml/Greeter/SessionsList.qml:122
477477msgid "Select desktop environment"
478−msgstr ""
478+msgstr "Sélectionner l'environnement de bureau"
479479
480480#: qml/Notifications/NotificationMenuItemFactory.qml:124
481481msgid "Show password"
po/nl.po+111−97
@@ -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: 2016-09-22 07:46+0000\n"
11−"PO-Revision-Date: 2015-07-07 07:14+0000\n"
12−"Last-Translator: Hannie Dumoleyn <Unknown>\n"
11+"PO-Revision-Date: 2016-10-17 15:59+0000\n"
12+"Last-Translator: Martijn Grootenboer <martijn.1987@live.nl>\n"
1313"Language-Team: Dutch <nl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2016-09-27 07:03+0000\n"
19−"X-Generator: Launchpad (build 18204)\n"
18+"X-Launchpad-Export-Date: 2016-10-18 06:47+0000\n"
19+"X-Generator: Launchpad (build 18232)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:123
2222msgid "Password: "
@@ -103,163 +103,163 @@ msgstr "Herstarten"
103103
104104#: qml/Components/KeyboardShortcutsOverlay.qml:41
105105msgid "Keyboard Shortcuts"
106−msgstr ""
106+msgstr "Sneltoetsen"
107107
108108#: qml/Components/KeyboardShortcutsOverlay.qml:55
109109msgid "Unity 8"
110−msgstr ""
110+msgstr "Unity 8"
111111
112112#: qml/Components/KeyboardShortcutsOverlay.qml:62
113113msgid "PrtScr"
114−msgstr ""
114+msgstr "PrtScr"
115115
116116#: qml/Components/KeyboardShortcutsOverlay.qml:67
117117msgid "Takes a screenshot."
118−msgstr ""
118+msgstr "Maakt een schermafdruk."
119119
120120#: qml/Components/KeyboardShortcutsOverlay.qml:75
121121msgid "Alt + PrtScr"
122−msgstr ""
122+msgstr "Alt + PrtScr"
123123
124124#: qml/Components/KeyboardShortcutsOverlay.qml:80
125125msgid "Takes a screenshot of a window."
126−msgstr ""
126+msgstr "Maakt een schermafdruk van een venster."
127127
128128#: qml/Components/KeyboardShortcutsOverlay.qml:88
129129msgid "Super + Space"
130−msgstr ""
130+msgstr "Super + Spatiebalk"
131131
132132#: qml/Components/KeyboardShortcutsOverlay.qml:93
133133msgid "Switches to next keyboard layout."
134−msgstr ""
134+msgstr "Schakelt naar volgende toetsenbordindeling."
135135
136136#: qml/Components/KeyboardShortcutsOverlay.qml:101
137137msgid "Super + Shift + Space"
138−msgstr ""
138+msgstr "Super + Shift + Spatiebalk"
139139
140140#: qml/Components/KeyboardShortcutsOverlay.qml:106
141141msgid "Switches to previous keyboard layout."
142−msgstr ""
142+msgstr "Schakelt naar vorige toetsenbordindeling."
143143
144144#: qml/Components/KeyboardShortcutsOverlay.qml:118
145145msgid "Launcher"
146−msgstr ""
146+msgstr "De Starter"
147147
148148#: qml/Components/KeyboardShortcutsOverlay.qml:125
149149msgid "Super (Hold)"
150−msgstr ""
150+msgstr "Super (Vasthouden)"
151151
152152#: qml/Components/KeyboardShortcutsOverlay.qml:130
153153msgid "Opens the launcher, displays shortcuts."
154−msgstr ""
154+msgstr "Opent de Starter; toont sneltoetsnen."
155155
156156#: qml/Components/KeyboardShortcutsOverlay.qml:138
157157msgid "Alt + F1"
158−msgstr ""
158+msgstr "Alt + F1"
159159
160160#: qml/Components/KeyboardShortcutsOverlay.qml:143
161161msgid "Opens launcher keyboard navigation mode."
162−msgstr ""
162+msgstr "Opent toetsenbordnavigatiemodus van Starter."
163163
164164#: qml/Components/KeyboardShortcutsOverlay.qml:151
165165msgid "Super + Tab"
166−msgstr ""
166+msgstr "Super + Tab"
167167
168168#: qml/Components/KeyboardShortcutsOverlay.qml:156
169169msgid "Switches applications via the launcher."
170−msgstr ""
170+msgstr "Wisselt toepassingen via de Starter."
171171
172172#: qml/Components/KeyboardShortcutsOverlay.qml:164
173173msgid "Super + 0 to 9"
174−msgstr ""
174+msgstr "Super + 0 tot 9"
175175
176176#: qml/Components/KeyboardShortcutsOverlay.qml:169
177177msgid "Same as clicking on a launcher icon."
178−msgstr ""
178+msgstr "Hetzelfde als klikken op een pictogram in de Starter."
179179
180180#: qml/Components/KeyboardShortcutsOverlay.qml:181
181181msgid "Scopes"
182−msgstr ""
182+msgstr "Scopes"
183183
184184#: qml/Components/KeyboardShortcutsOverlay.qml:188
185185msgid "Super (Tap)"
186−msgstr ""
186+msgstr "Super (Tikken)"
187187
188188#: qml/Components/KeyboardShortcutsOverlay.qml:193
189189msgid "Opens the Scopes home."
190−msgstr ""
190+msgstr "Opent Scopes-startpagina."
191191
192192#: qml/Components/KeyboardShortcutsOverlay.qml:209
193193msgid "Switching"
194−msgstr ""
194+msgstr "Wisselen"
195195
196196#: qml/Components/KeyboardShortcutsOverlay.qml:216
197197msgid "Alt + Tab"
198−msgstr ""
198+msgstr "Alt + Tab"
199199
200200#: qml/Components/KeyboardShortcutsOverlay.qml:221
201201msgid "Switches between applications."
202−msgstr ""
202+msgstr "Wisselt tussen toepassingen."
203203
204204#: qml/Components/KeyboardShortcutsOverlay.qml:229
205205msgid "Super + W"
206−msgstr ""
206+msgstr "Super + W"
207207
208208#: qml/Components/KeyboardShortcutsOverlay.qml:234
209209msgid "Opens the desktop spread."
210−msgstr ""
210+msgstr "Opent bureaubladspreiding."
211211
212212#: qml/Components/KeyboardShortcutsOverlay.qml:242
213213msgid "Cursor Left or Right"
214−msgstr ""
214+msgstr "Pijltoets links of rechts"
215215
216216#: qml/Components/KeyboardShortcutsOverlay.qml:247
217217msgid "Moves the focus."
218−msgstr ""
218+msgstr "Verplaatst de focus."
219219
220220#: qml/Components/KeyboardShortcutsOverlay.qml:259
221221msgid "Windows"
222−msgstr ""
222+msgstr "Vensters"
223223
224224#: qml/Components/KeyboardShortcutsOverlay.qml:266
225225msgid "Ctrl + Super + D"
226−msgstr ""
226+msgstr "Ctrl + Super + D"
227227
228228#: qml/Components/KeyboardShortcutsOverlay.qml:271
229229msgid "Minimizes all windows."
230−msgstr ""
230+msgstr "Minimaliseert alle vensters."
231231
232232#: qml/Components/KeyboardShortcutsOverlay.qml:279
233233msgid "Ctrl + Super + Up"
234−msgstr ""
234+msgstr "Ctrl + Super + Pijl omhoog"
235235
236236#: qml/Components/KeyboardShortcutsOverlay.qml:284
237237msgid "Maximizes the current window."
238−msgstr ""
238+msgstr "Maximaliseert het huidige venster."
239239
240240#: qml/Components/KeyboardShortcutsOverlay.qml:292
241241msgid "Ctrl + Super + Down"
242−msgstr ""
242+msgstr "Ctrl + Super + Pijl omlaag"
243243
244244#: qml/Components/KeyboardShortcutsOverlay.qml:297
245245msgid "Minimizes or restores the current window."
246−msgstr ""
246+msgstr "Maximaliseert of herstelt het huidige venster."
247247
248248#: qml/Components/KeyboardShortcutsOverlay.qml:305
249249msgid "Ctrl + Super + Left or Right"
250−msgstr ""
250+msgstr "Ctrl + Super + Pijl links of rechts"
251251
252252#: qml/Components/KeyboardShortcutsOverlay.qml:310
253253msgid "Semi-maximizes the current window."
254−msgstr ""
254+msgstr "Plaatst het venster links of rechts."
255255
256256#: qml/Components/KeyboardShortcutsOverlay.qml:318
257257msgid "Alt + F4"
258−msgstr ""
258+msgstr "Alt + F4"
259259
260260#: qml/Components/KeyboardShortcutsOverlay.qml:323
261261msgid "Closes the current window."
262−msgstr ""
262+msgstr "Sluit het huidige venster."
263263
264264#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
265265msgid "Return to Call"
@@ -276,12 +276,12 @@ msgstr "Ok"
276276#: qml/Components/MediaServices/VideoPlayerControls.qml:44
277277#, qt-format
278278msgid "%1:%2:%3"
279−msgstr ""
279+msgstr "%1:%2:%3"
280280
281281#: qml/Components/MediaServices/VideoPlayerControls.qml:49
282282#, qt-format
283283msgid "%1:%2"
284−msgstr ""
284+msgstr "%1:%2"
285285
286286#: qml/Components/ModeSwitchWarningDialog.qml:32
287287msgid "Apps may have unsaved data:"
@@ -349,11 +349,11 @@ msgstr "Herstellen"
349349
350350#: qml/Dash/GenericScopeView.qml:586 qml/Dash/GenericScopeView.qml:782
351351msgid "Show less"
352−msgstr ""
352+msgstr "Minder weergeven"
353353
354354#: qml/Dash/GenericScopeView.qml:586
355355msgid "Show all"
356−msgstr ""
356+msgstr "Alles weergeven"
357357
358358#: qml/Dash/GenericScopeView.qml:643
359359msgctxt "Label: Hint for dash search line edit"
@@ -450,15 +450,15 @@ msgstr[1] "Wacht a.u.b. %1 minuten en probeer het dan opnieuw…"
450450
451451#: qml/Greeter/Greeter.qml:596
452452msgid "Try again"
453−msgstr ""
453+msgstr "Probeer het opnieuw"
454454
455455#: qml/Greeter/LoginList.qml:70
456456msgid "Passphrase"
457−msgstr ""
457+msgstr "Wachtwoordzin"
458458
459459#: qml/Greeter/LoginList.qml:71
460460msgid "Passcode"
461−msgstr ""
461+msgstr "Toegangscode"
462462
463463#: qml/Greeter/LoginList.qml:98
464464msgid "Retry"
@@ -466,15 +466,15 @@ msgstr "Opnieuw proberen"
466466
467467#: qml/Greeter/LoginList.qml:99
468468msgid "Log In"
469−msgstr ""
469+msgstr "Aanmelden"
470470
471471#: qml/Greeter/NarrowView.qml:252
472472msgid "Emergency"
473−msgstr ""
473+msgstr "Noodgeval"
474474
475475#: qml/Greeter/SessionsList.qml:122
476476msgid "Select desktop environment"
477−msgstr ""
477+msgstr "Bureaubladomgeving selecteren"
478478
479479#: qml/Notifications/NotificationMenuItemFactory.qml:124
480480msgid "Show password"
@@ -574,19 +574,21 @@ msgstr "Lang vanaf de linkerkant vegen om de Vandaag-scope te openen"
574574
575575#: qml/Tutorial/TutorialLeft.qml:47
576576msgid "Short swipe from the left edge to open the launcher"
577−msgstr ""
577+msgstr "Veeg kort vanaf de linkerrand om de Starter te openen"
578578
579579#: qml/Tutorial/TutorialRight.qml:55
580580msgid "Push your mouse against the right edge to view your open apps"
581−msgstr ""
581+msgstr "Duw uw muis tegen de rechterrand om geopende apps te zien"
582582
583583#: qml/Tutorial/TutorialRight.qml:56
584584msgid "Swipe from the right edge to view your open apps"
585−msgstr ""
585+msgstr "Veeg vanaf de rechterrand om geopende apps te zien"
586586
587587#: qml/Tutorial/TutorialTop.qml:53
588588msgid "Swipe from the top edge to access notifications and quick settings"
589589msgstr ""
590+"Veeg van de bovenrand om toegang te krijgen tot notificaties en snelle "
591+"instellingen"
590592
591593#: qml/Wizard/Page.qml:54
592594msgctxt "Button: Go back one page in the Wizard"
@@ -595,7 +597,7 @@ msgstr "Terug"
595597
596598#: qml/Wizard/Pages/10-welcome.qml:28
597599msgid "Language"
598−msgstr ""
600+msgstr "Taal"
599601
600602#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
601603#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
@@ -605,19 +607,19 @@ msgstr ""
605607#: qml/Wizard/Pages/passcode-desktop.qml:142
606608#: qml/Wizard/Pages/password-set.qml:142
607609msgid "Next"
608−msgstr ""
610+msgstr "Volgende"
609611
610612#: qml/Wizard/Pages/20-keyboard.qml:31
611613msgid "Select Keyboard"
612−msgstr ""
614+msgstr "Toetsenbord selecteren"
613615
614616#: qml/Wizard/Pages/20-keyboard.qml:71
615617msgid "Keyboard language"
616−msgstr ""
618+msgstr "Taal toetsenbord"
617619
618620#: qml/Wizard/Pages/20-keyboard.qml:93
619621msgid "Keyboard layout"
620−msgstr ""
622+msgstr "Toetsenbordindeling"
621623
622624#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
623625#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
@@ -631,139 +633,144 @@ msgstr "Verbinden met Wifi"
631633
632634#: qml/Wizard/Pages/30-wifi.qml:132
633635msgid "Connected"
634−msgstr ""
636+msgstr "Verbonden"
635637
636638#: qml/Wizard/Pages/30-wifi.qml:165
637639msgid "Available Wi-Fi networks"
638−msgstr ""
640+msgstr "Beschikbare wifi-netwerken"
639641
640642#: qml/Wizard/Pages/30-wifi.qml:166
641643msgid "No available Wi-Fi networks"
642−msgstr ""
644+msgstr "Geen wifi-netwerken beschikbaar"
643645
644646#: qml/Wizard/Pages/40-location.qml:27
645647msgid "Location Services"
646−msgstr ""
648+msgstr "Locatie Diensten"
647649
648650#: qml/Wizard/Pages/40-location.qml:83
649651msgid ""
650652"Use GPS, Wi-Fi hotspots and mobile network anonymously to detect location "
651653"(recommended)"
652654msgstr ""
655+"Maak anoniem gebruik van GPS, wifi-hotspots en het mobiele netwerk om uw "
656+"locatie te bepalen (aanbevolen)"
653657
654658#: qml/Wizard/Pages/40-location.qml:105
655659#, qt-format
656660msgid "By selecting this option you agree to the Nokia HERE %1."
657−msgstr ""
661+msgstr "Door deze optie te selecteren gaat u akkoord met de Nokia HERE %1."
658662
659663#: qml/Wizard/Pages/40-location.qml:106
660664msgctxt "part of: Nokia HERE terms and conditions"
661665msgid "terms and conditions"
662−msgstr ""
666+msgstr "voorwaarden voor gebruik"
663667
664668#: qml/Wizard/Pages/40-location.qml:160
665669msgid "GPS only"
666−msgstr ""
670+msgstr "Alleen GPS"
667671
668672#: qml/Wizard/Pages/40-location.qml:214
669673msgid "Don't use my location"
670−msgstr ""
674+msgstr "Mijn locatie niet gebruiken"
671675
672676#: qml/Wizard/Pages/40-location.qml:260
673677msgid "You can change it later in System Settings."
674−msgstr ""
678+msgstr "U kunt het later aanpassen in Systeeminstellingen"
675679
676680#: qml/Wizard/Pages/50-timezone.qml:30
677681msgid "Time Zone"
678−msgstr ""
682+msgstr "Tijdzone"
679683
680684#: qml/Wizard/Pages/50-timezone.qml:182
681685msgid "Enter your city"
682−msgstr ""
686+msgstr "Uw stad invoeren"
683687
684688#: qml/Wizard/Pages/60-account.qml:24
685689msgid "Personalize Your Device"
686−msgstr ""
690+msgstr "Uw apparaat personaliseren"
687691
688692#: qml/Wizard/Pages/60-account.qml:48
689693msgid "Preferred Name"
690−msgstr ""
694+msgstr "Gebruikersnaam"
691695
692696#: qml/Wizard/Pages/70-passwd-type.qml:40
693697msgid "Lock Screen"
694−msgstr ""
698+msgstr "Schermvergrendeling"
695699
696700#: qml/Wizard/Pages/70-passwd-type.qml:102
697701msgctxt "Label: Type of security method"
698702msgid "Create new password"
699−msgstr ""
703+msgstr "Een nieuw wachtwoord aanmaken"
700704
701705#: qml/Wizard/Pages/70-passwd-type.qml:104
702706msgctxt "Label: Type of security method"
703707msgid "Create passcode (numbers only)"
704−msgstr ""
708+msgstr "PIN-code (alleen nummers) aanmaken"
705709
706710#: qml/Wizard/Pages/70-passwd-type.qml:106
707711msgctxt "Label: Type of security method"
708712msgid "No lock code"
709−msgstr ""
713+msgstr "Geen vergrendelcode"
710714
711715#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
712716msgid "Privacy Policy"
713−msgstr ""
717+msgstr "Privacybeleid"
714718
715719#: qml/Wizard/Pages/75-report-check.qml:26
716720msgid "Help Us Improve"
717−msgstr ""
721+msgstr "Help ons verbeteren"
718722
719723#: qml/Wizard/Pages/75-report-check.qml:59
720724msgid "Improve system performance by sending us crashes and error reports."
721725msgstr ""
726+"Verbeteren van systeemprestaties door ons crash- en foutrapportages te sturen"
722727
723728#: qml/Wizard/Pages/75-report-check.qml:60
724729msgid "Privacy policy"
725−msgstr ""
730+msgstr "Privacybeleid"
726731
727732#: qml/Wizard/Pages/77-system-update.qml:28
728733msgid "Update Device"
729−msgstr ""
734+msgstr "Apparaat bijwerken"
730735
731736#: qml/Wizard/Pages/77-system-update.qml:55
732737msgid ""
733738"There is a system update available and ready to install. Afterwards, the "
734739"device will automatically restart."
735740msgstr ""
741+"Er is een systeemupdate beschikbaar en klaar om geïnstalleerd te worden. "
742+"Daarna zal het apparaat automatisch opnieuw starten."
736743
737744#: qml/Wizard/Pages/77-system-update.qml:76
738745msgctxt "string identifying name of the update"
739746msgid "Ubuntu system"
740−msgstr ""
747+msgstr "Ubuntu-systeem"
741748
742749#: qml/Wizard/Pages/77-system-update.qml:83
743750#, qt-format
744751msgctxt "version of the system update"
745752msgid "Version %1"
746−msgstr ""
753+msgstr "Versie %1"
747754
748755#: qml/Wizard/Pages/77-system-update.qml:102
749756msgid "This could take a few minutes..."
750−msgstr ""
757+msgstr "Dit kan enkele minuten duren…"
751758
752759#: qml/Wizard/Pages/77-system-update.qml:116
753760msgid "Install and restart now"
754−msgstr ""
761+msgstr "Nu installeren en herstarten"
755762
756763#: qml/Wizard/Pages/80-finished.qml:89
757764msgid "Welcome to Ubuntu"
758−msgstr ""
765+msgstr "Welkom bij Ubuntu"
759766
760767#: qml/Wizard/Pages/80-finished.qml:104
761768msgid "You are ready to use your device now"
762−msgstr ""
769+msgstr "U bent klaar om uw apparaat te gebruiken"
763770
764771#: qml/Wizard/Pages/80-finished.qml:124
765772msgid "Get Started"
766−msgstr ""
773+msgstr "Aan de slag"
767774
768775#: qml/Wizard/Pages/here-terms.qml:25
769776msgid "Terms & Conditions"
@@ -772,6 +779,7 @@ msgstr "Algemene voorwaarden"
772779#: qml/Wizard/Pages/here-terms.qml:69
773780msgid "Your device uses positioning technologies provided by HERE."
774781msgstr ""
782+"Uw apparaat maakt gebruik van technologieën voor plaatsbepaling van HERE."
775783
776784#: qml/Wizard/Pages/here-terms.qml:81
777785msgid ""
@@ -779,21 +787,27 @@ msgid ""
779787"collects information about nearby cell towers and Wi-Fi hotspots around your "
780788"current location whenever your position is being found."
781789msgstr ""
790+"Om u plaatsbepalingsdiensten te leveren en deze te verbeteren, zal HERE "
791+"informatie verzamelen over GSM-masten in de buurt en wifi-hotspots rond uw "
792+"huidige locatie wanneer uw huidige positie gevonden is."
782793
783794#: qml/Wizard/Pages/here-terms.qml:93
784795msgid ""
785796"The information collected is used to analyze the service and to improve the "
786797"use of service, but not to identify you personally."
787798msgstr ""
799+"De informatie die wordt verzameld zal gebruikt worden om de dienst te "
800+"analyseren en om het gebruik van de dienst te verbeteren, maar niet om u "
801+"persoonlijk te identificeren."
788802
789803#: qml/Wizard/Pages/here-terms.qml:106
790804#, qt-format
791805msgid "By continuing, you agree to the HERE platform %1 and %2."
792−msgstr ""
806+msgstr "Als u doorgaat, gaat u akkoord met het HERE platform %1 en %2"
793807
794808#: qml/Wizard/Pages/here-terms.qml:107
795809msgid "Service Terms"
796−msgstr ""
810+msgstr "Dienstvoorwaarden"
797811
798812#: qml/Wizard/Pages/passcode-confirm.qml:43
799813#: qml/Wizard/Pages/passcode-desktop.qml:97
@@ -802,25 +816,25 @@ msgstr "Toegangscode bevestigen"
802816
803817#: qml/Wizard/Pages/passcode-confirm.qml:45
804818msgid "Incorrect passcode."
805−msgstr ""
819+msgstr "Onjuiste PIN-code"
806820
807821#: qml/Wizard/Pages/passcode-confirm.qml:45
808822msgctxt "Enter the passcode again"
809823msgid "Please re-enter."
810−msgstr ""
824+msgstr "Voer uw PIN opnieuw in."
811825
812826#: qml/Wizard/Pages/passcode-desktop.qml:31
813827msgid "Lock Screen Passcode"
814−msgstr ""
828+msgstr "PIN-code schermvergrendeling"
815829
816830#: qml/Wizard/Pages/passcode-desktop.qml:61
817831msgid "Enter 4 numbers to setup your passcode"
818−msgstr ""
832+msgstr "Voer 4 cijfers is om uw PIN-code in te stellen"
819833
820834#: qml/Wizard/Pages/passcode-desktop.qml:77
821835#: qml/Wizard/Pages/passcode-set.qml:54
822836msgid "Choose passcode"
823−msgstr ""
837+msgstr "Kies uw PIN-code"
824838
825839#: qml/Wizard/Pages/passcode-desktop.qml:127
826840msgid "Passcode too short"
po/oc.po+115−110
@@ -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: 2016-09-22 07:46+0000\n"
11−"PO-Revision-Date: 2015-02-05 20:35+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
11+"PO-Revision-Date: 2016-10-07 15:21+0000\n"
12+"Last-Translator: Cédric VALMARY (Tot en òc) <cvalmary@yahoo.fr>\n"
1313"Language-Team: Occitan (post 1500) <oc@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2016-09-27 07:04+0000\n"
19−"X-Generator: Launchpad (build 18204)\n"
18+"X-Launchpad-Export-Date: 2016-10-08 06:48+0000\n"
19+"X-Generator: Launchpad (build 18227)\n"
2020
2121#: plugins/LightDM/Greeter.cpp:123
2222msgid "Password: "
@@ -42,7 +42,7 @@ msgstr "Tampar la session"
4242
4343#: qml/Components/Dialogs.qml:150
4444msgid "Are you sure you want to log out?"
45−msgstr "Sètz segur que volètz vous déconnecter ?"
45+msgstr "Sètz segur que vos volètz desconnectar ?"
4646
4747#: qml/Components/Dialogs.qml:152
4848msgctxt "Button: Lock the system"
@@ -103,163 +103,163 @@ msgstr "Reaviar"
103103
104104#: qml/Components/KeyboardShortcutsOverlay.qml:41
105105msgid "Keyboard Shortcuts"
106−msgstr ""
106+msgstr "Acorchis de clavièr"
107107
108108#: qml/Components/KeyboardShortcutsOverlay.qml:55
109109msgid "Unity 8"
110−msgstr ""
110+msgstr "Unity 8"
111111
112112#: qml/Components/KeyboardShortcutsOverlay.qml:62
113113msgid "PrtScr"
114−msgstr ""
114+msgstr "Imprecr"
115115
116116#: qml/Components/KeyboardShortcutsOverlay.qml:67
117117msgid "Takes a screenshot."
118−msgstr ""
118+msgstr "Pren una captura d'ecran."
119119
120120#: qml/Components/KeyboardShortcutsOverlay.qml:75
121121msgid "Alt + PrtScr"
122−msgstr ""
122+msgstr "Alt + Imprecr"
123123
124124#: qml/Components/KeyboardShortcutsOverlay.qml:80
125125msgid "Takes a screenshot of a window."
126−msgstr ""
126+msgstr "Prend una captura d'ecran d'una fenèstra."
127127
128128#: qml/Components/KeyboardShortcutsOverlay.qml:88
129129msgid "Super + Space"
130−msgstr ""
130+msgstr "Super + Espaci"
131131
132132#: qml/Components/KeyboardShortcutsOverlay.qml:93
133133msgid "Switches to next keyboard layout."
134−msgstr ""
134+msgstr "Passa a l'agençament de clavièr seguent."
135135
136136#: qml/Components/KeyboardShortcutsOverlay.qml:101
137137msgid "Super + Shift + Space"
138−msgstr ""
138+msgstr "Super + Maj + Espaci"
139139
140140#: qml/Components/KeyboardShortcutsOverlay.qml:106
141141msgid "Switches to previous keyboard layout."
142−msgstr ""
142+msgstr "Passa a l'agençament de clavièr precedent."
143143
144144#: qml/Components/KeyboardShortcutsOverlay.qml:118
145145msgid "Launcher"
146−msgstr ""
146+msgstr "Aviador"
147147
148148#: qml/Components/KeyboardShortcutsOverlay.qml:125
149149msgid "Super (Hold)"
150−msgstr ""
150+msgstr "Super (mantengut)"
151151
152152#: qml/Components/KeyboardShortcutsOverlay.qml:130
153153msgid "Opens the launcher, displays shortcuts."
154−msgstr ""
154+msgstr "Dobís l'aviador, aficha los acorchis."
155155
156156#: qml/Components/KeyboardShortcutsOverlay.qml:138
157157msgid "Alt + F1"
158−msgstr ""
158+msgstr "Alt + F1"
159159
160160#: qml/Components/KeyboardShortcutsOverlay.qml:143
161161msgid "Opens launcher keyboard navigation mode."
162−msgstr ""
162+msgstr "Dobrís lo mòde navigacion amb lo clavièr de l'aviador."
163163
164164#: qml/Components/KeyboardShortcutsOverlay.qml:151
165165msgid "Super + Tab"
166−msgstr ""
166+msgstr "Super + Tab"
167167
168168#: qml/Components/KeyboardShortcutsOverlay.qml:156
169169msgid "Switches applications via the launcher."
170−msgstr ""
170+msgstr "Bascula las aplicacions via l'aviador."
171171
172172#: qml/Components/KeyboardShortcutsOverlay.qml:164
173173msgid "Super + 0 to 9"
174−msgstr ""
174+msgstr "Super + 0 a 9"
175175
176176#: qml/Components/KeyboardShortcutsOverlay.qml:169
177177msgid "Same as clicking on a launcher icon."
178−msgstr ""
178+msgstr "Meteis efièit qu'un clic sus una icòna de l'aviador."
179179
180180#: qml/Components/KeyboardShortcutsOverlay.qml:181
181181msgid "Scopes"
182−msgstr ""
182+msgstr "Motors de recèrca"
183183
184184#: qml/Components/KeyboardShortcutsOverlay.qml:188
185185msgid "Super (Tap)"
186−msgstr ""
186+msgstr "Super (quichada corta)"
187187
188188#: qml/Components/KeyboardShortcutsOverlay.qml:193
189189msgid "Opens the Scopes home."
190−msgstr ""
190+msgstr "Dobrís la pagina d'acuèlh dels motors de recèrca."
191191
192192#: qml/Components/KeyboardShortcutsOverlay.qml:209
193193msgid "Switching"
194−msgstr ""
194+msgstr "Cambiament de burèu"
195195
196196#: qml/Components/KeyboardShortcutsOverlay.qml:216
197197msgid "Alt + Tab"
198−msgstr ""
198+msgstr "Alt + Tab"
199199
200200#: qml/Components/KeyboardShortcutsOverlay.qml:221
201201msgid "Switches between applications."
202−msgstr ""
202+msgstr "Bascula entre aplicacions."
203203
204204#: qml/Components/KeyboardShortcutsOverlay.qml:229
205205msgid "Super + W"
206−msgstr ""
206+msgstr "Super + W"
207207
208208#: qml/Components/KeyboardShortcutsOverlay.qml:234
209209msgid "Opens the desktop spread."
210−msgstr ""
210+msgstr "Dobrís lo mòde expausat."
211211
212212#: qml/Components/KeyboardShortcutsOverlay.qml:242
213213msgid "Cursor Left or Right"
214−msgstr ""
214+msgstr "Sagetas esquèrra o dreita"
215215
216216#: qml/Components/KeyboardShortcutsOverlay.qml:247
217217msgid "Moves the focus."
218−msgstr ""
218+msgstr "Desplaça lo focus."
219219
220220#: qml/Components/KeyboardShortcutsOverlay.qml:259
221221msgid "Windows"
222−msgstr ""
222+msgstr "Fenèstras"
223223
224224#: qml/Components/KeyboardShortcutsOverlay.qml:266
225225msgid "Ctrl + Super + D"
226−msgstr ""
226+msgstr "Ctrl + Super + D"
227227
228228#: qml/Components/KeyboardShortcutsOverlay.qml:271
229229msgid "Minimizes all windows."
230−msgstr ""
230+msgstr "Minimiza totas las fenèstras."
231231
232232#: qml/Components/KeyboardShortcutsOverlay.qml:279
233233msgid "Ctrl + Super + Up"
234−msgstr ""
234+msgstr "Ctrl + Super + Naut"
235235
236236#: qml/Components/KeyboardShortcutsOverlay.qml:284
237237msgid "Maximizes the current window."
238−msgstr ""
238+msgstr "Maximiza la fenèstra actuala."
239239
240240#: qml/Components/KeyboardShortcutsOverlay.qml:292
241241msgid "Ctrl + Super + Down"
242−msgstr ""
242+msgstr "Ctrl + Super + Down"
243243
244244#: qml/Components/KeyboardShortcutsOverlay.qml:297
245245msgid "Minimizes or restores the current window."
246−msgstr ""
246+msgstr "Minimiza o restablís la fenèstra actuala."
247247
248248#: qml/Components/KeyboardShortcutsOverlay.qml:305
249249msgid "Ctrl + Super + Left or Right"
250−msgstr ""
250+msgstr "Ctrl + Super + Esquèrra o dreita"
251251
252252#: qml/Components/KeyboardShortcutsOverlay.qml:310
253253msgid "Semi-maximizes the current window."
254−msgstr ""
254+msgstr "Maximiza la fenèstra actuala sus un semi-ecran."
255255
256256#: qml/Components/KeyboardShortcutsOverlay.qml:318
257257msgid "Alt + F4"
258−msgstr ""
258+msgstr "Alt + F4"
259259
260260#: qml/Components/KeyboardShortcutsOverlay.qml:323
261261msgid "Closes the current window."
262−msgstr ""
262+msgstr "Tampa la fenèstra actuala."
263263
264264#: qml/Components/Lockscreen.qml:212 qml/Greeter/NarrowView.qml:252
265265msgid "Return to Call"
@@ -276,12 +276,12 @@ msgstr "D'acòrdi"
276276#: qml/Components/MediaServices/VideoPlayerControls.qml:44
277277#, qt-format
278278msgid "%1:%2:%3"
279−msgstr ""
279+msgstr "%1 : %2 : %3"
280280
281281#: qml/Components/MediaServices/VideoPlayerControls.qml:49
282282#, qt-format
283283msgid "%1:%2"
284−msgstr ""
284+msgstr "%1 : %2"
285285
286286#: qml/Components/ModeSwitchWarningDialog.qml:32
287287msgid "Apps may have unsaved data:"
@@ -298,11 +298,11 @@ msgstr ""
298298#: qml/Components/ModeSwitchWarningDialog.qml:63
299299msgid "Or force close now (unsaved data will be lost)."
300300msgstr ""
301−"Ou forçar la tampadura ara (les donadas pas enregistradas seràn perdues)."
301+"O forçar la tampadura ara (las donadas pas enregistradas seràn perdudas)."
302302
303303#: qml/Components/ModeSwitchWarningDialog.qml:75
304304msgid "OK, I will reconnect"
305−msgstr "OK, me vau reconnectar"
305+msgstr "D'acòrdi, me vau reconnectar"
306306
307307#: qml/Components/ModeSwitchWarningDialog.qml:76
308308msgid "Reconnect now!"
@@ -349,11 +349,11 @@ msgstr "Reïnicializar"
349349
350350#: qml/Dash/GenericScopeView.qml:586 qml/Dash/GenericScopeView.qml:782
351351msgid "Show less"
352−msgstr ""
352+msgstr "Afichar mai"
353353
354354#: qml/Dash/GenericScopeView.qml:586
355355msgid "Show all"
356−msgstr ""
356+msgstr "Afichar tot"
357357
358358#: qml/Dash/GenericScopeView.qml:643
359359msgctxt "Label: Hint for dash search line edit"
@@ -374,7 +374,7 @@ msgstr "Mai..."
374374
375375#: qml/Dash/Previews/PreviewActionCombo.qml:35
376376msgid "Less..."
377−msgstr "Moins..."
377+msgstr "Mens..."
378378
379379#: qml/Dash/Previews/PreviewCommentInput.qml:83
380380#: qml/Dash/Previews/PreviewRatingInput.qml:201
@@ -391,7 +391,7 @@ msgstr "Apondre un avís"
391391
392392#: qml/Dash/PullToRefreshScopeStyle.qml:56
393393msgid "Pull to refresh…"
394−msgstr "Tirer per actualizar..."
394+msgstr "Tirar per actualizar..."
395395
396396#: qml/Dash/PullToRefreshScopeStyle.qml:61
397397msgid "Release to refresh…"
@@ -450,15 +450,15 @@ msgstr[1] "Pacientatz %1 minutas e reensajatz..."
450450
451451#: qml/Greeter/Greeter.qml:596
452452msgid "Try again"
453−msgstr ""
453+msgstr "Tornar ensajar"
454454
455455#: qml/Greeter/LoginList.qml:70
456456msgid "Passphrase"
457−msgstr ""
457+msgstr "Frasa secreta"
458458
459459#: qml/Greeter/LoginList.qml:71
460460msgid "Passcode"
461−msgstr ""
461+msgstr "Còdi"
462462
463463#: qml/Greeter/LoginList.qml:98
464464msgid "Retry"
@@ -466,15 +466,15 @@ msgstr "Ensajar tornamai"
466466
467467#: qml/Greeter/LoginList.qml:99
468468msgid "Log In"
469−msgstr ""
469+msgstr "Se connectar"
470470
471471#: qml/Greeter/NarrowView.qml:252
472472msgid "Emergency"
473−msgstr ""
473+msgstr "Urgéncia"
474474
475475#: qml/Greeter/SessionsList.qml:122
476476msgid "Select desktop environment"
477−msgstr ""
477+msgstr "Seleccionar l'environament de burèu"
478478
479479#: qml/Notifications/NotificationMenuItemFactory.qml:124
480480msgid "Show password"
@@ -515,7 +515,7 @@ msgstr[1] "%1 segondas"
515515
516516#: qml/Panel/Indicators/MenuItemFactory.qml:903
517517msgid "0 seconds"
518−msgstr "0 segonda"
518+msgstr "0 segonda"
519519
520520#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
521521#: qml/Panel/Indicators/MenuItemFactory.qml:905
@@ -525,7 +525,7 @@ msgstr "Demòra %1"
525525
526526#: qml/Panel/Indicators/MenuItemFactory.qml:911
527527msgid "In queue…"
528−msgstr "Dins la fia d'espèra..."
528+msgstr "Dins la fila d'espèra..."
529529
530530#: qml/Panel/Indicators/MenuItemFactory.qml:915
531531msgid "Downloading"
@@ -571,10 +571,12 @@ msgstr ""
571571#: qml/Tutorial/TutorialLeftLong.qml:49
572572msgid "Long swipe from the left edge to open the Today scope"
573573msgstr ""
574+"Fasètz lisar a partir del bòrd esquèrre fins al bòrd dreit per dobrir lo "
575+"motor de recèrca Uèi"
574576
575577#: qml/Tutorial/TutorialLeft.qml:47
576578msgid "Short swipe from the left edge to open the launcher"
577−msgstr ""
579+msgstr "Fasètz lisar a partir del bòrd esquèrre per dobrir l'aviador"
578580
579581#: qml/Tutorial/TutorialRight.qml:55
580582msgid "Push your mouse against the right edge to view your open apps"
@@ -583,10 +585,13 @@ msgstr ""
583585#: qml/Tutorial/TutorialRight.qml:56
584586msgid "Swipe from the right edge to view your open apps"
585587msgstr ""
588+"Fasètz lisar a partir del bòrd dreit per veire las aplicacions dobèrtas"
586589
587590#: qml/Tutorial/TutorialTop.qml:53
588591msgid "Swipe from the top edge to access notifications and quick settings"
589592msgstr ""
593+"Fasètz lisar a partir del bòrd superior per accedir a las notificacions e "
594+"als reglatges rapids"
590595
591596#: qml/Wizard/Page.qml:54
592597msgctxt "Button: Go back one page in the Wizard"
@@ -595,7 +600,7 @@ msgstr "Precedent"
595600
596601#: qml/Wizard/Pages/10-welcome.qml:28
597602msgid "Language"
598−msgstr ""
603+msgstr "Lenga"
599604
600605#: qml/Wizard/Pages/10-welcome.qml:173 qml/Wizard/Pages/20-keyboard.qml:152
601606#: qml/Wizard/Pages/30-wifi.qml:207 qml/Wizard/Pages/40-location.qml:271
@@ -609,15 +614,15 @@ msgstr "Seguent"
609614
610615#: qml/Wizard/Pages/20-keyboard.qml:31
611616msgid "Select Keyboard"
612−msgstr ""
617+msgstr "Seleccionar lo clavièr"
613618
614619#: qml/Wizard/Pages/20-keyboard.qml:71
615620msgid "Keyboard language"
616−msgstr ""
621+msgstr "Lenga del clavièr"
617622
618623#: qml/Wizard/Pages/20-keyboard.qml:93
619624msgid "Keyboard layout"
620−msgstr ""
625+msgstr "Disposicion del clavièr"
621626
622627#: qml/Wizard/Pages/20-keyboard.qml:152 qml/Wizard/Pages/30-wifi.qml:207
623628#: qml/Wizard/Pages/60-account.qml:65 qml/Wizard/Pages/77-system-update.qml:152
@@ -663,11 +668,11 @@ msgstr "condicions generalas d'utilizacion"
663668
664669#: qml/Wizard/Pages/40-location.qml:160
665670msgid "GPS only"
666−msgstr ""
671+msgstr "GPS unicament"
667672
668673#: qml/Wizard/Pages/40-location.qml:214
669674msgid "Don't use my location"
670−msgstr "Ne pas utilizar ma position"
675+msgstr "Utilizar pas ma posicion"
671676
672677#: qml/Wizard/Pages/40-location.qml:260
673678msgid "You can change it later in System Settings."
@@ -679,42 +684,42 @@ msgstr "Fus orari"
679684
680685#: qml/Wizard/Pages/50-timezone.qml:182
681686msgid "Enter your city"
682−msgstr ""
687+msgstr "Sasir vòstra vila"
683688
684689#: qml/Wizard/Pages/60-account.qml:24
685690msgid "Personalize Your Device"
686−msgstr ""
691+msgstr "Personalizar vòstre aparelh"
687692
688693#: qml/Wizard/Pages/60-account.qml:48
689694msgid "Preferred Name"
690−msgstr ""
695+msgstr "Nom preferit"
691696
692697#: qml/Wizard/Pages/70-passwd-type.qml:40
693698msgid "Lock Screen"
694−msgstr ""
699+msgstr "Verrolhar l'ecran"
695700
696701#: qml/Wizard/Pages/70-passwd-type.qml:102
697702msgctxt "Label: Type of security method"
698703msgid "Create new password"
699−msgstr ""
704+msgstr "Crear un novèl senhal"
700705
701706#: qml/Wizard/Pages/70-passwd-type.qml:104
702707msgctxt "Label: Type of security method"
703708msgid "Create passcode (numbers only)"
704−msgstr ""
709+msgstr "Crear un còdi (chifras unicament)"
705710
706711#: qml/Wizard/Pages/70-passwd-type.qml:106
707712msgctxt "Label: Type of security method"
708713msgid "No lock code"
709−msgstr ""
714+msgstr "Pas cap de còdi de verrolhatge"
710715
711716#: qml/Wizard/Pages/75-report-check.qml:26 qml/Wizard/Pages/here-terms.qml:108
712717msgid "Privacy Policy"
713−msgstr "Politica de confidentialité"
718+msgstr "Politica de confidencialitat"
714719
715720#: qml/Wizard/Pages/75-report-check.qml:26
716721msgid "Help Us Improve"
717−msgstr ""
722+msgstr "Ajudatz-nos a nos melhorar"
718723
719724#: qml/Wizard/Pages/75-report-check.qml:59
720725msgid "Improve system performance by sending us crashes and error reports."
@@ -722,11 +727,11 @@ msgstr ""
722727
723728#: qml/Wizard/Pages/75-report-check.qml:60
724729msgid "Privacy policy"
725−msgstr ""
730+msgstr "Politica de confidencialitat"
726731
727732#: qml/Wizard/Pages/77-system-update.qml:28
728733msgid "Update Device"
729−msgstr ""
734+msgstr "Metre a jorn l'aparelh"
730735
731736#: qml/Wizard/Pages/77-system-update.qml:55
732737msgid ""
@@ -737,25 +742,25 @@ msgstr ""
737742#: qml/Wizard/Pages/77-system-update.qml:76
738743msgctxt "string identifying name of the update"
739744msgid "Ubuntu system"
740−msgstr ""
745+msgstr "Sistèma Ubuntu"
741746
742747#: qml/Wizard/Pages/77-system-update.qml:83
743748#, qt-format
744749msgctxt "version of the system update"
745750msgid "Version %1"
746−msgstr ""
751+msgstr "Version %1"
747752
748753#: qml/Wizard/Pages/77-system-update.qml:102
749754msgid "This could take a few minutes..."
750−msgstr ""
755+msgstr "Aquò poirà prene qualques minutas…"
751756
752757#: qml/Wizard/Pages/77-system-update.qml:116
753758msgid "Install and restart now"
754−msgstr ""
759+msgstr "Installar e reaviar ara"
755760
756761#: qml/Wizard/Pages/80-finished.qml:89
757762msgid "Welcome to Ubuntu"
758−msgstr ""
763+msgstr "Benvenguda sus Ubuntu"
759764
760765#: qml/Wizard/Pages/80-finished.qml:104
761766msgid "You are ready to use your device now"
@@ -763,7 +768,7 @@ msgstr ""
763768
764769#: qml/Wizard/Pages/80-finished.qml:124
765770msgid "Get Started"
766−msgstr ""
771+msgstr "Començar"
767772
768773#: qml/Wizard/Pages/here-terms.qml:25
769774msgid "Terms & Conditions"
@@ -793,78 +798,78 @@ msgstr ""
793798
794799#: qml/Wizard/Pages/here-terms.qml:107
795800msgid "Service Terms"
796−msgstr ""
801+msgstr "Condicions de servici"
797802
798803#: qml/Wizard/Pages/passcode-confirm.qml:43
799804#: qml/Wizard/Pages/passcode-desktop.qml:97
800805msgid "Confirm passcode"
801−msgstr "Confirmatz vòstre còde"
806+msgstr "Confirmatz vòstre còdi"
802807
803808#: qml/Wizard/Pages/passcode-confirm.qml:45
804809msgid "Incorrect passcode."
805−msgstr ""
810+msgstr "Còdi incorrècte."
806811
807812#: qml/Wizard/Pages/passcode-confirm.qml:45
808813msgctxt "Enter the passcode again"
809814msgid "Please re-enter."
810−msgstr ""
815+msgstr "Sasissètz un còp de mai"
811816
812817#: qml/Wizard/Pages/passcode-desktop.qml:31
813818msgid "Lock Screen Passcode"
814−msgstr ""
819+msgstr "Còdi de verrolhatge d'ecran"
815820
816821#: qml/Wizard/Pages/passcode-desktop.qml:61
817822msgid "Enter 4 numbers to setup your passcode"
818−msgstr ""
823+msgstr "Sasissètz 4 chifras per definir vòstre còdi"
819824
820825#: qml/Wizard/Pages/passcode-desktop.qml:77
821826#: qml/Wizard/Pages/passcode-set.qml:54
822827msgid "Choose passcode"
823−msgstr ""
828+msgstr "Causissètz un còdi"
824829
825830#: qml/Wizard/Pages/passcode-desktop.qml:127
826831msgid "Passcode too short"
827−msgstr ""
832+msgstr "Còdi tròp cort"
828833
829834#: qml/Wizard/Pages/passcode-desktop.qml:129
830835msgid "Passcodes match"
831−msgstr ""
836+msgstr "Los còdis correspondon"
832837
833838#: qml/Wizard/Pages/passcode-desktop.qml:131
834839msgid "Passcodes do not match"
835−msgstr ""
840+msgstr "Los còdis correspondon pas"
836841
837842#: qml/Wizard/Pages/passcode-set.qml:62
838843msgid "Passcode must be 4 characters long"
839−msgstr ""
844+msgstr "Lo còde deu conténer al mens 4 caractèrs"
840845
841846#: qml/Wizard/Pages/password-set.qml:31
842847msgid "Lock Screen Password"
843−msgstr ""
848+msgstr "Senhal de verrolhatge de l'ecran"
844849
845850#: qml/Wizard/Pages/password-set.qml:62
846851msgid "Enter at least 8 characters"
847−msgstr ""
852+msgstr "Sasissètz al mens 8 caractèrs"
848853
849854#: qml/Wizard/Pages/password-set.qml:74
850855msgid "Choose password"
851−msgstr ""
856+msgstr "Causissètz un senhal"
852857
853858#: qml/Wizard/Pages/password-set.qml:104
854859msgid "Confirm password"
855−msgstr ""
860+msgstr "Confirmatz lo senhal"
856861
857862#: qml/Wizard/Pages/sim.qml:27
858863msgid "No SIM card installed"
859−msgstr ""
864+msgstr "Cap de carta SIM pas installada"
860865
861866#: qml/Wizard/Pages/sim.qml:54
862867msgid "SIM card added"
863−msgstr ""
868+msgstr "Carta SIM aponduda"
864869
865870#: qml/Wizard/Pages/sim.qml:55
866871msgid "You must restart the device to access the mobile network."
867−msgstr ""
872+msgstr "Vos cal reaviar l'aparelh per accedir a la ret mobila."
868873
869874#: qml/Wizard/Pages/sim.qml:59
870875msgid "Restart"
@@ -880,31 +885,31 @@ msgstr ""
880885
881886#: qml/Wizard/PasswordMeter.qml:87
882887msgid "Password too short"
883−msgstr ""
888+msgstr "Senhal tròp cort"
884889
885890#: qml/Wizard/PasswordMeter.qml:89
886891msgid "Passwords match"
887−msgstr ""
892+msgstr "Los senhals correspondon"
888893
889894#: qml/Wizard/PasswordMeter.qml:91
890895msgid "Passwords do not match"
891−msgstr ""
896+msgstr "Los senhals correspondon pas"
892897
893898#: qml/Wizard/PasswordMeter.qml:95
894899msgid "Strong password"
895−msgstr ""
900+msgstr "Senhal fòrt"
896901
897902#: qml/Wizard/PasswordMeter.qml:97
898903msgid "Fair password"
899−msgstr ""
904+msgstr "Senhal acceptable"
900905
901906#: qml/Wizard/PasswordMeter.qml:99
902907msgid "Weak password"
903−msgstr ""
908+msgstr "Senhal feble"
904909
905910#: qml/Wizard/PasswordMeter.qml:101
906911msgid "Very weak password"
907−msgstr ""
912+msgstr "Senhal fòrça feble"
908913
909914#~ msgid "See less"
910915#~ msgstr "Veire mens"
po/unity8.pot+14−14
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2016-09-22 07:46+0000\n"
11+"POT-Creation-Date: 2016-10-24 11:37+0000\n"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -477,62 +477,62 @@ msgstr ""
477477msgid "Conference"
478478msgstr ""
479479
480−#: qml/Panel/Indicators/MenuItemFactory.qml:762
480+#: qml/Panel/Indicators/MenuItemFactory.qml:788
481481msgid "Nothing is playing"
482482msgstr ""
483483
484−#: qml/Panel/Indicators/MenuItemFactory.qml:891
484+#: qml/Panel/Indicators/MenuItemFactory.qml:916
485485#, qt-format
486486msgid "%1 hour"
487487msgid_plural "%1 hours"
488488msgstr[0] ""
489489msgstr[1] ""
490490
491−#: qml/Panel/Indicators/MenuItemFactory.qml:895
491+#: qml/Panel/Indicators/MenuItemFactory.qml:920
492492#, qt-format
493493msgid "%1 minute"
494494msgid_plural "%1 minutes"
495495msgstr[0] ""
496496msgstr[1] ""
497497
498−#: qml/Panel/Indicators/MenuItemFactory.qml:900
498+#: qml/Panel/Indicators/MenuItemFactory.qml:925
499499#, qt-format
500500msgid "%1 second"
501501msgid_plural "%1 seconds"
502502msgstr[0] ""
503503msgstr[1] ""
504504
505−#: qml/Panel/Indicators/MenuItemFactory.qml:903
505+#: qml/Panel/Indicators/MenuItemFactory.qml:928
506506msgid "0 seconds"
507507msgstr ""
508508
509509#. Translators: String like "1 hour, 2 minutes, 3 seconds remaining"
510−#: qml/Panel/Indicators/MenuItemFactory.qml:905
510+#: qml/Panel/Indicators/MenuItemFactory.qml:930
511511#, qt-format
512512msgid "%1 remaining"
513513msgstr ""
514514
515−#: qml/Panel/Indicators/MenuItemFactory.qml:911
515+#: qml/Panel/Indicators/MenuItemFactory.qml:936
516516msgid "In queue…"
517517msgstr ""
518518
519−#: qml/Panel/Indicators/MenuItemFactory.qml:915
519+#: qml/Panel/Indicators/MenuItemFactory.qml:940
520520msgid "Downloading"
521521msgstr ""
522522
523−#: qml/Panel/Indicators/MenuItemFactory.qml:917
523+#: qml/Panel/Indicators/MenuItemFactory.qml:942
524524msgid "Paused, tap to resume"
525525msgstr ""
526526
527−#: qml/Panel/Indicators/MenuItemFactory.qml:919
527+#: qml/Panel/Indicators/MenuItemFactory.qml:944
528528msgid "Canceled"
529529msgstr ""
530530
531−#: qml/Panel/Indicators/MenuItemFactory.qml:921
531+#: qml/Panel/Indicators/MenuItemFactory.qml:946
532532msgid "Finished"
533533msgstr ""
534534
535−#: qml/Panel/Indicators/MenuItemFactory.qml:923
535+#: qml/Panel/Indicators/MenuItemFactory.qml:948
536536msgid "Failed, tap to retry"
537537msgstr ""
538538
@@ -552,7 +552,7 @@ msgctxt "Button: Call back on phone"
552552msgid "Call back"
553553msgstr ""
554554
555−#: qml/Stages/SideStage.qml:76
555+#: qml/Stage/SideStage.qml:76
556556msgid "Drag using 3 fingers any application from one window to the other"
557557msgstr ""
558558
qml/Components/InputMethod.qml+1−1
@@ -21,7 +21,7 @@ import Ubuntu.Gestures 0.1
2121Item {
2222 id: root
2323
24− readonly property rect visibleRect: surfaceItem.surface ? surfaceItem.surface.inputBounds : Qt.rect(0, 0, 0, 0)
24+ readonly property rect visibleRect: surfaceItem.surface && visible ? surfaceItem.surface.inputBounds : Qt.rect(0, 0, 0, 0)
2525
2626 MirSurfaceItem {
2727 id: surfaceItem
qml/Components/UbuntuShapeForItem.qmldeleted−47
@@ -1,47 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.4
18−import Ubuntu.Components 1.3
19−
20−/* FIXME: This component is duplicating the UbuntuShape from the SDK, but shapes more
21− * general (Item-based) components. This ability should be incorporated into the SDK's
22− * UbuntuShape so this file can be removed.
23− * Bug: https://bugs.launchpad.net/tavastia/+bug/1089595
24− */
25−
26−Item {
27− id: root
28−
29− property alias radius: shape.radius
30− property alias image: source.sourceItem
31− property alias aspect: shape.aspect
32−
33− ShaderEffectSource {
34− id: source
35− anchors.centerIn: parent // Placed under shape, so it's hidden
36− width: 1
37− height: 1
38− hideSource: true
39− }
40−
41− Shape {
42− id: shape
43− image: source
44−
45− anchors.fill: parent
46− }
47−}
qml/Dash/Previews/PreviewProgress.qml+1−2
@@ -37,8 +37,7 @@ PreviewWidget {
3737 anchors.right: parent.right
3838 value: 0
3939 maximumValue: 100
40− implicitHeight: units.gu(4)
41− height: parent.height
40+ height: units.gu(4)
4241 width: (root.width - units.gu(1)) / 2
4342
4443 property var source: widgetData["source"]
qml/Launcher/LauncherPanel.qml+5−2
@@ -632,7 +632,7 @@ Rectangle {
632632 }
633633 }
634634
635− UbuntuShapeForItem {
635+ UbuntuShape {
636636 id: quickListShape
637637 objectName: "quickListShape"
638638 anchors.fill: quickList
@@ -645,7 +645,10 @@ Rectangle {
645645 UbuntuNumberAnimation {}
646646 }
647647
648− image: quickList
648+ source: ShaderEffectSource {
649+ sourceItem: quickList
650+ hideSource: true
651+ }
649652
650653 Image {
651654 anchors {
qml/Panel/Indicators/MenuItemFactory.qml+98−146
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2013,2015 Canonical Ltd.
2+ * Copyright 2013-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -31,7 +31,8 @@ Item {
3131 property var rootModel: null
3232 property var menuModel: null
3333
34− property var _map: {
34+ property var _userMap: null
35+ readonly property var _typeToComponent: {
3536 "default": {
3637 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
3738 "unity.widgets.systemsettings.tablet.switch" : switchMenu,
@@ -69,11 +70,62 @@ Item {
6970 "indicator.guest-menu-item": Platform.isPC ? userMenuItem : null,
7071 "com.canonical.indicator.switch": Math.min(Screen.width, Screen.height) > units.gu(60) ? switchMenu : null // Desktop mode switch
7172 },
72− "indicator-messages" : {
73− "com.canonical.indicator.button" : messagesButtonMenu
73+ "indicator-messages": {
74+ "com.canonical.indicator.button": messagesButtonMenu
7475 }
7576 }
7677
78+ readonly property var _action_filter_map: {
79+ "indicator-session": {
80+ "indicator.logout": Platform.isPC ? undefined : null,
81+ "indicator.suspend": Platform.isPC ? undefined : null,
82+ "indicator.hibernate": Platform.isPC ? undefined : null,
83+ "indicator.reboot": Platform.isPC ? undefined : null
84+ },
85+ "indicator-keyboard": {
86+ "indicator.map": null,
87+ "indicator.chart": null
88+ }
89+ }
90+
91+ function getComponentForIndicatorEntryType(indicator, type) {
92+ var component = undefined;
93+ var map = _userMap || _typeToComponent
94+ var indicatorComponents = map[indicator];
95+
96+ if (type === undefined || type === "") {
97+ return component
98+ }
99+
100+ if (indicatorComponents !== undefined) {
101+ component = indicatorComponents[type];
102+ }
103+
104+ if (component === undefined) {
105+ component = map["default"][type];
106+ }
107+
108+ if (component === undefined) {
109+ console.debug("Don't know how to make " + modelData.type + " for " + indicator);
110+ }
111+
112+ return component
113+ }
114+
115+ function getComponentForIndicatorEntryAction(indicator, action) {
116+ var component = undefined;
117+ var indicatorFilter = _action_filter_map[indicator]
118+
119+ if (action === undefined || action === "") {
120+ return component
121+ }
122+
123+ if (indicatorFilter !== undefined) {
124+ component = indicatorFilter[action];
125+ }
126+ return component
127+ }
128+
77129 function getExtendedProperty(object, propertyName, defaultValue) {
78130 if (object && object.hasOwnProperty(propertyName)) {
79131 return object[propertyName];
@@ -102,7 +154,6 @@ Item {
102154 property var serverValue: getExtendedProperty(menuData, "actionState", undefined)
103155
104156 text: menuData && menuData.label || ""
105− iconSource: menuData && menuData.icon || ""
106157 minIcon: getExtendedProperty(extendedData, "minIcon", "")
107158 maxIcon: getExtendedProperty(extendedData, "maxIcon", "")
108159
@@ -182,29 +233,20 @@ Item {
182233 Component {
183234 id: messagesButtonMenu;
184235
185− Item {
236+ Menus.BaseLayoutMenu {
186237 objectName: "messagesButtonMenu"
187238 property QtObject menuData: null
188239 property var menuModel: menuFactory.menuModel
189240 property int menuIndex: -1
190241
191− implicitHeight: units.gu(5)
242+ highlightWhenPressed: false
192243 enabled: menuData && menuData.sensitive || false
244+ text: menuData && menuData.label || ""
245+ title.color: theme.palette.selected.backgroundText
246+ title.horizontalAlignment: Text.AlignHCenter
247+ title.font.bold: true
193248
194− Label {
195− id: buttonMenuLabel
196− text: menuData && menuData.label || ""
197− anchors.centerIn: parent
198− font.bold: true
199− }
200−
201− MouseArea {
202− anchors {
203− fill: buttonMenuLabel
204− margins: units.gu(-1)
205− }
206− onClicked: menuModel.activate(menuIndex);
207− }
249+ onClicked: menuModel.activate(menuIndex);
208250 }
209251 }
210252
@@ -233,11 +275,6 @@ Item {
233275 iconSource: menuData && menuData.icon || ""
234276 value : menuData && menuData.actionState || 0.0
235277 enabled: menuData && menuData.sensitive || false
236− // FIXME: Because of this bug, setting it to the theme foreground color (white)
237− // currently doesn't work. Let's hack it to be "close enough"
238− // https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1555784
239− foregroundColor: "#fffffe"
240− highlightWhenPressed: false
241278 }
242279 }
243280
@@ -257,52 +294,41 @@ Item {
257294 onTriggered: {
258295 menuModel.activate(menuIndex);
259296 }
260−
261− // FIXME : At the moment, the indicators aren't using
262− // com.canonical.indicators.link for settings menu. Need to fudge it.
263− property bool settingsMenu: menuData && menuData.action.indexOf("settings") > -1 || false
264− backColor: settingsMenu ? Qt.rgba(1,1,1,0.07) : "transparent"
265− component: settingsMenu ? buttonForSettings : undefined
266− Component {
267− id: buttonForSettings
268− Icon {
269− name: "settings"
270− height: units.gu(3)
271− width: height
272− color: theme.palette.normal.backgroundText
273− }
274− }
275297 }
276298 }
277299
278300 Component {
279301 id: linkMenu;
280302
281− Menus.StandardMenu {
303+ Menus.BaseLayoutMenu {
282304 objectName: "linkMenu"
283305 property QtObject menuData: null
284306 property int menuIndex: -1
285307
286308 text: menuData && menuData.label || ""
287− iconSource: menuData && menuData.icon || ""
288309 enabled: menuData && menuData.sensitive || false
310+ backColor: Qt.rgba(1,1,1,0.07)
289311 highlightWhenPressed: false
290312
291313 onTriggered: {
292314 menuModel.activate(menuIndex);
293315 }
294316
295− backColor: Qt.rgba(1,1,1,0.07)
296−
297− component: menuData.icon ? icon : undefined
298− Component {
299− id: icon
300− Icon {
301− source: menuData.icon
302− height: units.gu(3)
303− width: height
304− color: theme.palette.normal.backgroundText
317+ slots: Icon {
318+ source: {
319+ if (menuData) {
320+ if (menuData.icon && menuData.icon != "") {
321+ return menuData.icon
322+ } else if (menuData.action.indexOf("settings") > -1) {
323+ return "image://theme/settings"
324+ }
325+ }
326+ return ""
305327 }
328+ height: units.gu(3)
329+ width: height
330+ color: theme.palette.normal.backgroundText
331+ SlotsLayout.position: SlotsLayout.Trailing
306332 }
307333 }
308334 }
@@ -769,7 +795,6 @@ Item {
769795 state: getExtendedProperty(actionState, "state", "")
770796 enabled: menuData && menuData.sensitive || false
771797 highlightWhenPressed: false
772− showDivider: false
773798
774799 onTriggered: {
775800 model.activate(modelIndex);
@@ -972,116 +997,43 @@ Item {
972997 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-extra-label': 'string'});
973998 }
974999
975− component: Component {
976− Button {
977− objectName: "buttonSectionMenuControl"
978− text: getExtendedProperty(extendedData, "xCanonicalExtraLabel", "")
1000+ slots: Button {
1001+ objectName: "buttonSectionMenuControl"
1002+ text: getExtendedProperty(extendedData, "xCanonicalExtraLabel", "")
9791003
980− onClicked: {
981− menuModel.activate(menuIndex);
982− }
1004+ onClicked: {
1005+ menuModel.activate(menuIndex);
9831006 }
9841007 }
9851008 }
9861009 }
9871010
988− Component {
989− id: keymapMenu;
990−
991− // FIXME this should use a "radio button" menu, once we have it in the SDK
992− ListItems.Empty {
993− id: checkItem
994− objectName: "keymapMenu"
995− property QtObject menuData: null
996− property int menuIndex: -1
997− readonly property bool serverChecked: menuData && menuData.isToggled || false
998−
999− enabled: menuData && menuData.sensitive || false
1000− highlightWhenPressed: false
1001− __acceptEvents: !serverChecked
1002−
1003− CheckBox {
1004− id: checkbox
1005− __acceptEvents: !checkItem.serverChecked
1006− anchors {
1007− left: parent.left
1008− leftMargin: checkItem.__contentsMargins
1009− verticalCenter: parent.verticalCenter
1010− }
1011− }
1012−
1013− ServerPropertySynchroniser {
1014− objectName: "sync"
1015− syncTimeout: Utils.Constants.indicatorValueTimeout
1016−
1017− serverTarget: checkItem
1018− serverProperty: "serverChecked"
1019− userTarget: checkbox
1020− userProperty: "checked"
1021−
1022− onSyncTriggered: {
1023− menuModel.activate(checkItem.menuIndex);
1024− }
1025− }
1026−
1027− Label {
1028− id: label
1029− anchors {
1030− left: checkbox.right
1031− leftMargin: checkItem.__contentsMargins
1032− right: parent.right
1033− rightMargin: checkItem.__contentsMargins
1034− verticalCenter: parent.verticalCenter
1035− }
1036− elide: Text.ElideRight
1037− text: checkItem.menuData && checkItem.menuData.label || ""
1038− }
1039−
1040− onClicked: menuModel.activate(menuIndex);
1041− }
1042− }
1043−
10441011 function load(modelData, context) {
1045− // tweak indicator-session items
1046− if (context === "indicator-session") {
1047− if ((modelData.action === "indicator.logout" || modelData.action === "indicator.suspend" || modelData.action === "indicator.hibernate" ||
1048− modelData.action === "indicator.reboot")
1049− && !Platform.isPC) {
1050− return null; // logout, suspend and hibernate hidden on devices
1051− }
1012+ if (context && context.indexOf("fake-") == 0) {
1013+ context = context.substring("fake-".length)
10521014 }
10531015
1054− // specialize for indicator-keyboard
1055− if (context === "indicator-keyboard") {
1056− if (modelData.isRadio) {
1057− return keymapMenu;
1058− } else if (modelData.action === "indicator.map" || modelData.action === "indicator.chart") {
1059− return null; // map and chart not available
1060− }
1016+ var component = getComponentForIndicatorEntryAction(context, modelData.action)
1017+ if (component !== undefined) {
1018+ return component
10611019 }
10621020
1063− if (modelData.type !== undefined && modelData.type !== "") {
1064− var component = undefined;
1065−
1066− var contextComponents = _map[context];
1067− if (contextComponents !== undefined) {
1068− component = contextComponents[modelData.type];
1069− }
1070−
1071− if (component === undefined) {
1072− component = _map["default"][modelData.type];
1073− }
1074− if (component !== undefined) {
1075− return component;
1076− }
1077− console.debug("Don't know how to make " + modelData.type + " for " + context);
1021+ component = getComponentForIndicatorEntryType(context, modelData.type)
1022+ if (component !== undefined) {
1023+ return component;
10781024 }
1025+
10791026 if (modelData.isCheck || modelData.isRadio) {
10801027 return checkableMenu;
10811028 }
10821029 if (modelData.isSeparator) {
10831030 return separatorMenu;
10841031 }
1032+ if (modelData.action !== undefined && modelData.action.indexOf("settings") > -1) {
1033+ // FIXME : At the moment, the indicators aren't using
1034+ // com.canonical.indicators.link for settings menu. Need to fudge it.
1035+ return linkMenu;
1036+ }
10851037 return standardMenu;
10861038 }
10871039}
qml/Shell.qml+10
@@ -697,8 +697,16 @@ StyledItem {
697697 }
698698 }
699699
700+ Timer {
701+ id: cursorHidingTimer
702+ interval: 3000
703+ running: panel.focusedSurfaceIsFullscreen && cursor.opacity > 0
704+ onTriggered: cursor.opacity = 0;
705+ }
706+
700707 Cursor {
701708 id: cursor
709+ objectName: "cursor"
702710 visible: shell.hasMouse
703711 z: itemGrabber.z + 1
704712 topBoundaryOffset: panel.panelHeight
@@ -772,6 +780,8 @@ StyledItem {
772780 mouseNeverMoved = false;
773781 cursor.opacity = 1;
774782 }
783+
784+ Behavior on opacity { UbuntuNumberAnimation {} }
775785 }
776786
777787 // non-visual object
qml/Stage/DecoratedWindow.qml+33−16
@@ -99,16 +99,15 @@ FocusScope {
9999 },
100100 State {
101101 name: "normalSuspended"; when: root.scaleToPreviewProgress <= 0 && root.application.state !== ApplicationInfoInterface.Running
102+ extend: "normal"
102103 PropertyChanges {
103104 target: root
104105 implicitWidth: counterRotate ? applicationWindow.requestedHeight : applicationWindow.requestedWidth
105106 implicitHeight: root.decorationHeight + (counterRotate ? applicationWindow.requestedWidth: applicationWindow.requestedHeight)
106107 }
107−// PropertyChanges { target: applicationWindow; anchors.topMargin: (root.height - applicationWindow.implicitHeight) / 2 }
108−// PropertyChanges { target: dropShadow; anchors.topMargin: (root.height - applicationWindow.implicitHeight) / 2 }
109108 },
110109 State {
111− name: "preview"; when: root.scaleToPreviewProgress > 0 && root.application.state === ApplicationInfoInterface.Running
110+ name: "preview"; when: root.scaleToPreviewProgress > 0
112111 PropertyChanges {
113112 target: root
114113 implicitWidth: MathUtils.linearAnimation(0, 1, applicationWindow.oldRequestedWidth, root.scaleToPreviewSize, root.scaleToPreviewProgress)
@@ -122,16 +121,6 @@ FocusScope {
122121 height: MathUtils.linearAnimation(0, 1, applicationWindow.oldRequestedHeight, applicationWindow.minSize, root.scaleToPreviewProgress)
123122 itemScale: root.implicitWidth / width
124123 }
125− },
126− State {
127− name: "previewSuspended"; when: root.scaleToPreviewProgress > 0 && root.application.state !== ApplicationInfoInterface.Running
128− extend: "preview"
129− PropertyChanges { target: applicationWindow;
130− anchors.verticalCenterOffset: applicationWindow.implicitHeight < applicationWindow.height ?
131− (root.height / applicationWindow.itemScale - applicationWindow.implicitHeight) / 2
132− : (root.height / applicationWindow.itemScale - applicationWindow.height) / 2
133− }
134−// PropertyChanges { target: dropShadow; anchors.topMargin: (root.height - root.implicitHeight) / 2 * (1 - root.scaleToPreviewProgress) }
135124 }
136125 ]
137126 }
@@ -195,9 +184,9 @@ FocusScope {
195184 ApplicationWindow {
196185 id: applicationWindow
197186 objectName: "appWindow"
198− anchors.verticalCenter: parent.verticalCenter
199− anchors.verticalCenterOffset: (root.decorationHeight * Math.min(1, root.showDecoration)) / 2
200187 anchors.left: parent.left
188+ anchors.top: parent.top
189+ anchors.topMargin: root.decorationHeight * Math.min(1, root.showDecoration)
201190 width: implicitWidth
202191 height: implicitHeight
203192 requestedHeight: !counterRotate ? root.requestedHeight - d.requestedDecorationHeight : root.requestedWidth
@@ -232,12 +221,40 @@ FocusScope {
232221 angle: rotationAngle
233222 },
234223 Scale {
235− origin.y: (applicationWindow.implicitHeight < applicationWindow.height ? applicationWindow.implicitHeight : applicationWindow.height) / 2
236224 xScale: applicationWindow.itemScale
237225 yScale: applicationWindow.itemScale
238226 }
239227 ]
228+ }
240229
230+ MouseArea {
231+ anchors.fill: applicationWindow
232+ acceptedButtons: Qt.LeftButton
233+ property bool dragging: false
234+ cursorShape: undefined // don't interfere with the cursor shape set by the underlying MirSurfaceItem
235+ onPressed: {
236+ if (mouse.button == Qt.LeftButton && mouse.modifiers == Qt.AltModifier) {
237+ root.decorationPressed(); // to raise it
238+ moveHandler.handlePressedChanged(true, Qt.LeftButton, mouse.x, mouse.y);
239+ dragging = true;
240+ mouse.accepted = true;
241+ } else {
242+ mouse.accepted = false;
243+ }
244+ }
245+ onPositionChanged: {
246+ if (dragging) {
247+ moveHandler.handlePositionChanged(mouse);
248+ }
249+ }
250+ onReleased: {
251+ if (dragging) {
252+ moveHandler.handlePressedChanged(false, Qt.LeftButton);
253+ root.decorationReleased(); // commits the fake preview max rectangle
254+ moveHandler.handleReleased();
255+ dragging = false;
256+ }
257+ }
241258 }
242259
243260 Rectangle {
qml/Stage/MoveHandler.qml+2−1
@@ -103,7 +103,8 @@ QtObject {
103103 if (priv.dragging) {
104104 Mir.cursorName = "grabbing";
105105
106− if (target.anyMaximized) { // restore from maximized when dragging away from edges/corners
106+ // restore from maximized when dragging away from edges/corners; guard against inadvertent changes when going into maximized state
107+ if (target.anyMaximized && !target.windowedTransitionRunning) {
107108 priv.progress = 0;
108109 target.restore(false, WindowStateStorage.WindowStateNormal);
109110 }
qml/Stage/Spread/SpreadDelegateInputArea.qml+2−2
@@ -47,7 +47,7 @@ Item {
4747
4848 function pushDragEvent(event) {
4949 var currentTime = __dateTime.getCurrentTimeMs()
50− dragEvents.push([currentTime, event.x, event.y, getEventSpeed(currentTime, event)])
50+ dragEvents.push([currentTime, event.x - event.startX, event.y - event.startY, getEventSpeed(currentTime, event)])
5151 cullOldDragEvents(currentTime)
5252 updateSpeed()
5353 }
@@ -77,7 +77,7 @@ Item {
7777 if (dragEvents.length != 0) {
7878 var lastDrag = dragEvents[dragEvents.length-1]
7979 var duration = Math.max(1, currentTime - lastDrag[0])
80− return (event.y - lastDrag[2]) / duration
80+ return (event.y - event.startY - lastDrag[2]) / duration
8181 } else {
8282 return 0
8383 }
qml/Stage/Stage.qml+17−8
@@ -228,8 +228,9 @@ FocusScope {
228228 }
229229 }
230230
231− readonly property bool sideStageEnabled: root.shellOrientation == Qt.LandscapeOrientation ||
232− root.shellOrientation == Qt.InvertedLandscapeOrientation
231+ readonly property bool sideStageEnabled: root.mode === "stagedWithSideStage" &&
232+ (root.shellOrientation == Qt.LandscapeOrientation ||
233+ root.shellOrientation == Qt.InvertedLandscapeOrientation)
233234
234235 property var mainStageDelegate: null
235236 property var sideStageDelegate: null
@@ -263,6 +264,12 @@ FocusScope {
263264
264265 for (var i = 0; i < appRepeater.count && (!choseMainStage || !choseSideStage); ++i) {
265266 var appDelegate = appRepeater.itemAt(i);
267+ if (!appDelegate) {
268+ // This might happen during startup phase... If the delegate appears and claims focus
269+ // things are updated and appRepeater.itemAt(x) still returns null while appRepeater.count >= x
270+ // Lets just skip it, on startup it will be generated at a later point too...
271+ continue;
272+ }
266273 if (sideStage.shown && appDelegate.stage == ApplicationInfoInterface.SideStage
267274 && !choseSideStage) {
268275 priv.sideStageDelegate = appDelegate
@@ -715,6 +722,7 @@ FocusScope {
715722 readonly property string appName: model.application ? model.application.name : ""
716723 property bool visuallyMaximized: false
717724 property bool visuallyMinimized: false
725+ readonly property alias windowedTransitionRunning: windowedTransition.running
718726
719727 property int stage: ApplicationInfoInterface.MainStage
720728 function saveStage(newStage) {
@@ -913,7 +921,7 @@ FocusScope {
913921 rightEdgeFocusAnimation.targetX = appDelegate.stage == ApplicationInfoInterface.SideStage ? sideStage.x : 0
914922 rightEdgeFocusAnimation.start()
915923 }
916− } else if (state == "windowedRightEdge") {
924+ } else if (state == "windowedRightEdge" || state == "windowed") {
917925 claimFocus();
918926 } else {
919927 focusAnimation.start()
@@ -1166,7 +1174,7 @@ FocusScope {
11661174 }
11671175 },
11681176 State {
1169− name: "maximized"; when: appDelegate.windowState == WindowStateStorage.WindowStateMaximized
1177+ name: "maximized"; when: appDelegate.maximized && !appDelegate.minimized
11701178 PropertyChanges {
11711179 target: appDelegate;
11721180 requestedX: root.leftMargin;
@@ -1306,7 +1314,7 @@ FocusScope {
13061314 UbuntuNumberAnimation { target: appDelegate; properties: "x,y,requestedX,requestedY,opacity,requestedWidth,requestedHeight,scale"; duration: priv.animationDuration }
13071315 },
13081316 Transition {
1309− from: "normal,maximized,maximizedHorizontally,maximizedVertically,maximizedLeft,maximizedRight,maximizedTopLeft,maximizedBottomLeft,maximizedTopRight,maximizedBottomRight";
1317+ from: "normal,restored,maximized,maximizedHorizontally,maximizedVertically,maximizedLeft,maximizedRight,maximizedTopLeft,maximizedBottomLeft,maximizedTopRight,maximizedBottomRight";
13101318 to: "staged,stagedWithSideStage"
13111319 UbuntuNumberAnimation { target: appDelegate; properties: "x,y,requestedX,requestedY,requestedWidth,requestedHeight"; duration: priv.animationDuration}
13121320 },
@@ -1383,8 +1391,9 @@ FocusScope {
13831391 }
13841392 },
13851393 Transition {
1386− from: "normal,maximized,maximizedLeft,maximizedRight,maximizedTop,maximizedBottom,maximizedTopLeft,maximizedTopRight,maximizedBottomLeft,maximizedBottomRight,maximizedHorizontally,maximizedVertically,fullscreen"
1387− to: "normal,maximized,maximizedLeft,maximizedRight,maximizedTop,maximizedBottom,maximizedTopLeft,maximizedTopRight,maximizedBottomLeft,maximizedBottomRight,maximizedHorizontally,maximizedVertically,fullscreen"
1394+ id: windowedTransition
1395+ from: "normal,restored,maximized,maximizedLeft,maximizedRight,maximizedTop,maximizedBottom,maximizedTopLeft,maximizedTopRight,maximizedBottomLeft,maximizedBottomRight,maximizedHorizontally,maximizedVertically,fullscreen"
1396+ to: "normal,restored,maximized,maximizedLeft,maximizedRight,maximizedTop,maximizedBottom,maximizedTopLeft,maximizedTopRight,maximizedBottomLeft,maximizedBottomRight,maximizedHorizontally,maximizedVertically,fullscreen"
13881397 enabled: appDelegate.animationsEnabled
13891398 SequentialAnimation {
13901399 PropertyAction { target: appDelegate; property: "visuallyMinimized" }
@@ -1569,7 +1578,7 @@ FocusScope {
15691578 anchors { left: parent.left; top: parent.top; leftMargin: -height / 2; topMargin: -height / 2 + spreadMaths.closeIconOffset }
15701579 source: "graphics/window-close.svg"
15711580 readonly property var mousePos: hoverMouseArea.mapToItem(appDelegate, hoverMouseArea.mouseX, hoverMouseArea.mouseY)
1572− visible: !appDelegate.isDash
1581+ visible: !appDelegate.isDash && dragArea.distance == 0
15731582 && index == spreadItem.highlightedIndex
15741583 && mousePos.y < (decoratedWindow.height / 3)
15751584 && mousePos.y > -units.gu(4)
tests/mocks/Cursor/Cursor.qml+2
@@ -29,4 +29,6 @@ Item {
2929 signal pushedBottomRightCorner(real amount, int buttons)
3030 signal pushStopped()
3131 signal mouseMoved()
32+
33+ onMouseMoved: opacity = 1;
3234}
tests/mocks/Unity/Indicators/IndicatorsModel.qml+1−1
@@ -124,7 +124,7 @@ Indicators.FakeIndicatorsModel {
124124
125125 Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake0",
126126 getUnityMenuModelData("indicator-keyboard",
127− "Czech (F)",
127+ "English (F)",
128128 "",
129129 [ "image://theme/input-keyboard-symbolic" ]));
130130 Indicators.UnityMenuModelCache.setCachedModelData("/com/canonical/indicators/fake1",
tests/mocks/Unity/Indicators/fakeindicatorsmodeldata.js+220−32
@@ -30,7 +30,7 @@ var fakeMenuData = {
3030 "type": "com.canonical.indicator.messages.messageitem",
3131 "ext": {
3232 "icon": "file:///usr/share/ubuntu/settings/system/icons/settings-system-update.svg",
33− "xCanonicalAppIcon": "file:///usr/share/ubuntu/settings/system/system-settings.png",
33+ "xCanonicalAppIcon": "image://theme/system-settings",
3434 "xCanonicalMessageActions": null,
3535 "xCanonicalText": "Tap to open the system updater.",
3636 "xCanonicalTime": ((new Date).getTime() - 350 * 1000) * 1000,
@@ -47,12 +47,12 @@ var fakeMenuData = {
4747 "action": "indicator.telephony-service-sms.msg.MSG_ID",
4848 "actionState": {},
4949 "ext": {},
50− "icon": "file:///usr/share/telephony-service/assets/avatar-default@18.png",
50+ "icon": Qt.resolvedUrl("../../../../../tests/graphics/avatars/funky@12.png"),
5151 "type": "com.canonical.indicator.messages.messageitem",
5252 "ext": {
53− "icon": "file:///usr/share/telephony-service/assets/avatar-default@18.png",
54− "xCanonicalAppIcon": "image://theme/telephony-service-message",
55− "xCanonicalMessageActions": "",
53+ "icon": Qt.resolvedUrl("../../../../../tests/graphics/avatars/funky@12.png"),
54+ "xCanonicalAppIcon": Qt.resolvedUrl("../../../../../tests/graphics/applicationIcons/messages-app@18.png"),
55+ "xCanonicalMessageActions": [ { "parameter-type": "s" } ],
5656 "xCanonicalText": "This is a message sent to an awesome Ubuntu phone.",
5757 "xCanonicalTime": ((new Date).getTime() - 35 * 1000) * 1000
5858 },
@@ -64,6 +64,25 @@ var fakeMenuData = {
6464 "sensitive": true
6565 }
6666 },
67+ {
68+ "rowData": {
69+ "label": "+39441234567 - [SIM 2]",
70+ "sensitive": true,
71+ "isSeparator": false,
72+ "icon": "image://theme/missed-call",
73+ "type": "com.canonical.indicator.messages.messageitem",
74+ "ext": {
75+ "xCanonicalMessageActions": [ { "parameter-type": "_s" } ],
76+ "xCanonicalText": "1 Missed call.",
77+ "xCanonicalTime": ((new Date).getTime() - 350 * 1000) * 1000,
78+ },
79+ "action": "indicator.telephony-service-missed-call.call.CALL_ID",
80+ "actionState": {},
81+ "isCheck": false,
82+ "isRadio": false,
83+ "isToggled": false,
84+ }
85+ },
6786 {
6887 "rowData": {
6988 "action": "indicator.remove-all",
@@ -337,34 +356,72 @@ var fakeMenuData = {
337356 "type": "com.canonical.indicator.root"
338357 },
339358 "submenu": [
340− {
359+ {
360+ "rowData": {
361+ "label": "Charge Level",
362+ "sensitive": false,
363+ "isSeparator": false,
364+ "icon": "",
365+ "type": "com.canonical.indicator.progress",
366+ "ext": {},
367+ "action": "indicator.battery-level",
368+ "actionState": "100",
369+ "isCheck": false,
370+ "isRadio": false,
371+ "isToggled": false
372+ }
373+ },
374+ {
375+
376+ "rowData": {
377+ "label": "",
378+ "sensitive": true,
379+ "isSeparator": true,
380+ "icon": "",
381+ "type": "",
382+ "ext": {},
383+ "action": "",
384+ "actionState": "",
385+ "isCheck": false,
386+ "isRadio": false,
387+ "isToggled": false
388+ }
389+ },
390+ {
391+
392+ "rowData": {
393+ "label": "",
394+ "sensitive": true,
395+ "isSeparator": false,
396+ "icon": "",
397+ "type": "com.canonical.unity.slider",
398+ "ext": {
399+ "maxIcon": "image://theme/display-brightness-max",
400+ "maxValue": "1",
401+ "minIcon": "image://theme/display-brightness-min",
402+ "minValue": "0",
403+ },
404+ "action": "indicator.brightness",
405+ "actionState": "0.212244897959184",
406+ "isCheck": false,
407+ "isRadio": false,
408+ "isToggled": false
409+ }
410+ },
411+ {
412+
341413 "rowData": {
342− "action": "indicator.activate-statistics",
343− "actionState": {},
344− "ext": {},
345− "icon": "image://theme/battery-full-charged-symbolic",
346− "isCheck": false,
347− "isRadio": false,
348− "isSeparator": false,
349− "isToggled": false,
350− "label": "Battery (full charged)",
414+ "label": "Auto-brightness",
351415 "sensitive": true,
352− "type": "com.canonical.indicator.basic"
353− }
354− },
355− {
356− "rowData": {
357− "action": "indicator.activate-statistics",
358− "actionState": {},
416+ "isSeparator": false,
417+ "icon": "",
418+ "type": "com.canonical.indicator.switch",
359419 "ext": {},
360− "icon": "image://theme/battery-100",
361− "isCheck": false,
420+ "action": "indicator.auto-brightness",
421+ "actionState": false,
422+ "isCheck": true,
362423 "isRadio": false,
363− "isSeparator": false,
364− "isToggled": false,
365− "label": "Battery",
366− "sensitive": true,
367− "type": "com.canonical.indicator.basic"
424+ "isToggled": false
368425 }
369426 },
370427 {
@@ -555,7 +612,6 @@ var fakeMenuData = {
555612 }
556613 ],
557614
558−
559615 "fake-indicator-datetime": [
560616 {
561617 "rowData": {
@@ -591,6 +647,25 @@ var fakeMenuData = {
591647 "type": ""
592648 }
593649 },
650+ {
651+ "rowData": {
652+ "action": "indicator.calendar",
653+ "actionState": {
654+ "appointment-days": "",
655+ "calendar-day": (new Date).getTime() / 1000,
656+ "show-week-numbers": false,
657+ },
658+ "ext": {},
659+ "icon": "image://theme/calendar",
660+ "isCheck": false,
661+ "isRadio": true,
662+ "isSeparator": false,
663+ "isToggled": false,
664+ "label": "[calendar]",
665+ "sensitive": true,
666+ "type": "com.canonical.indicator.calendar"
667+ }
668+ },
594669 {
595670 "rowData": {
596671 "action": "",
@@ -727,7 +802,6 @@ var fakeMenuData = {
727802 }
728803 ],
729804
730−
731805 "fake-indicator-files": [
732806 {
733807 "rowData": {
@@ -1102,5 +1176,119 @@ var fakeMenuData = {
11021176 }
11031177 ]
11041178 }
1105− ]
1179+ ],
1180+
1181+ "indicator-keyboard": [
1182+ {
1183+ "rowData": {
1184+ "action": "indicator.indicator",
1185+ "actionState": {
1186+ "icons": [],
1187+ "label": "",
1188+ "title": "English (USA, QWERTY)",
1189+ "visible": true
1190+ },
1191+ "icon": "",
1192+ "isCheck": false,
1193+ "isRadio": false,
1194+ "isSeparator": false,
1195+ "isToggled": false,
1196+ "label": "",
1197+ "sensitive": true,
1198+ "type": "com.canonical.indicator.root"
1199+ },
1200+ "submenu": [
1201+ {
1202+ "rowData": {
1203+ "label": "České (QWERTY)",
1204+ "sensitive": true,
1205+ "isSeparator": false,
1206+ "icon": "image://theme/indicator-keyboard-Cs",
1207+ "type": "",
1208+ "ext": {},
1209+ "action": "indicator.current",
1210+ "actionState": 0,
1211+ "isCheck": false,
1212+ "isRadio": true,
1213+ "isToggled": false
1214+ }
1215+ },
1216+ {
1217+ "rowData": {
1218+ "label": "Italiana (QWERTY)",
1219+ "sensitive": true,
1220+ "isSeparator": false,
1221+ "icon": "image://theme/indicator-keyboard-It",
1222+ "type": "",
1223+ "ext": {},
1224+ "action": "indicator.current",
1225+ "actionState": 0,
1226+ "isCheck": false,
1227+ "isRadio": true,
1228+ "isToggled": false
1229+ }
1230+ },
1231+ {
1232+ "rowData": {
1233+ "label": "English (USA)",
1234+ "sensitive": true,
1235+ "isSeparator": false,
1236+ "icon": "image://theme/indicator-keyboard-En",
1237+ "type": "",
1238+ "ext": {},
1239+ "action": "indicator.current",
1240+ "actionState": 0,
1241+ "isCheck": false,
1242+ "isRadio": true,
1243+ "isToggled": true
1244+ }
1245+ },
1246+ {
1247+ "rowData": {
1248+ "label": "",
1249+ "sensitive": true,
1250+ "isSeparator": true,
1251+ "icon": "",
1252+ "type": "",
1253+ "ext": {},
1254+ "action": "",
1255+ "actionState": "",
1256+ "isCheck": false,
1257+ "isRadio": false,
1258+ "isToggled": false
1259+ }
1260+ },
1261+ {
1262+ "rowData": {
1263+ "label": "Character Map",
1264+ "sensitive": true,
1265+ "isSeparator": false,
1266+ "icon": "",
1267+ "type": "",
1268+ "ext": {},
1269+ "action": "indicator.map",
1270+ "actionState": "",
1271+ "isCheck": false,
1272+ "isRadio": false,
1273+ "isToggled": false
1274+ }
1275+ },
1276+ {
1277+ "rowData": {
1278+ "label": "Keyboard layout",
1279+ "sensitive": true,
1280+ "isSeparator": false,
1281+ "icon": "",
1282+ "type": "",
1283+ "ext": {},
1284+ "action": "indicator.key-map.settings",
1285+ "actionState": "",
1286+ "isCheck": false,
1287+ "isRadio": false,
1288+ "isToggled": false
1289+ }
1290+ }
1291+ ]
1292+ }
1293+ ],
11061294}
tests/plugins/Greeter/Unity/Launcher/CMakeLists.txt−1
@@ -10,7 +10,6 @@ include_directories(
1010
1111add_definitions(-DSM_BUSNAME=sessionBus)
1212add_definitions(-DSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}")
13−add_definitions(-DLAUNCHER_TESTING)
1413
1514### LauncherModelASTest
1615add_executable(launchermodelastestExec
tests/plugins/Unity/Launcher/CMakeLists.txt+12−20
@@ -6,14 +6,18 @@ include_directories(
66 ${CMAKE_CURRENT_BINARY_DIR}
77 ${CMAKE_SOURCE_DIR}/plugins/AccountsService
88 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher
9+ ${libunity8-private_SOURCE_DIR}
10+ )
11+
12+include_directories(
13+ SYSTEM
914 ${GSETTINGS_QT_INCLUDE_DIRS}
1015 ${GLIB_INCLUDE_DIRS}
11− ${libunity8-private_SOURCE_DIR}
16+ ${UAL_INCLUDE_DIRS}
1217 )
1318
1419add_definitions(-DSM_BUSNAME=sessionBus)
1520add_definitions(-DSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}")
16−add_definitions(-DLAUNCHER_TESTING)
1721
1822### LauncherModelTest
1923add_executable(launchermodeltestExec
@@ -25,7 +29,6 @@ add_executable(launchermodeltestExec
2529 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/launcheritem.cpp
2630 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/quicklistmodel.cpp
2731 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/dbusinterface.cpp
28− ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/desktopfilehandler.cpp
2932 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/quicklistentry.cpp
3033 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherItemInterface.h
3134 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherModelInterface.h
@@ -37,11 +40,13 @@ target_link_libraries(launchermodeltestExec
3740 unity8-private
3841 ${GSETTINGS_QT_LDFLAGS}
3942 ${GLIB_LIBRARIES}
43+ ${UAL_LIBRARIES}
4044 )
4145add_dependencies(launchermodeltestExec mock-server)
4246qt5_use_modules(launchermodeltestExec Test Core DBus Xml Gui)
4347
4448add_unity8_unittest(LauncherModel dbus-test-runner
49+ ENVIRONMENT "XDG_DATA_HOME=${CMAKE_CURRENT_BINARY_DIR}"
4550 ARG_PREFIX "--parameter"
4651 ARGS
4752 --task $<TARGET_FILE:mock-server>
@@ -50,20 +55,7 @@ add_unity8_unittest(LauncherModel dbus-test-runner
5055 --wait-for org.freedesktop.Accounts
5156)
5257
53−# copy .desktop files into build directory for shadow builds
54−file(GLOB DESKTOP_FILES *.desktop)
55−
56−foreach(DESKTOP_FILE ${DESKTOP_FILES})
57− file(COPY "${DESKTOP_FILE}"
58− DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
59− )
60−endforeach()
61−
62−# copy .svg files into build directory for shadow builds
63−file(GLOB DESKTOP_FILES *.svg)
64−
65−foreach(DESKTOP_FILE ${DESKTOP_FILES})
66− file(COPY "${DESKTOP_FILE}"
67− DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
68− )
69−endforeach()
58+# copy sample application files into build directory for shadow builds
59+file(COPY applications
60+ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
61+ )
tests/plugins/Unity/Launcher/abs-icon.desktop → tests/plugins/Unity/Launcher/applications/abs-icon.desktoprenamed+1
@@ -1,3 +1,4 @@
11[Desktop Entry]
2+Type=Application
23Name=Absolute Icon
34Icon=/path/to/icon.png
tests/plugins/Unity/Launcher/click-icon.desktop → tests/plugins/Unity/Launcher/applications/click-icon.desktoprenamed+1
@@ -1,4 +1,5 @@
11[Desktop Entry]
2+Type=Application
23Name=Click Package Icon
34Icon=click-icon.svg
45Path=/path/to/some/click/app
tests/plugins/Unity/Launcher/click-icon.svg → tests/plugins/Unity/Launcher/applications/click-icon.svgrenamed

The content is the same.

tests/plugins/Unity/Launcher/no-name.desktop → tests/plugins/Unity/Launcher/applications/no-name.desktoprenamed+1
@@ -1,2 +1,3 @@
11[Desktop Entry]
2+Type=Application
23Icon=no-name
tests/plugins/Unity/Launcher/rel-icon.desktop → tests/plugins/Unity/Launcher/applications/rel-icon.desktoprenamed+1
@@ -1,3 +1,4 @@
11[Desktop Entry]
2+Type=Application
23Name=Relative Icon
34Icon=rel-icon.svg
tests/plugins/Unity/Launcher/rel-icon.svg → tests/plugins/Unity/Launcher/applications/rel-icon.svgrenamed

The content is the same.

tests/plugins/Unity/Launcher/launchermodeltest.cpp+19−22
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2013-2015 Canonical Ltd.
2+ * Copyright 2013-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -12,9 +12,6 @@
1212 *
1313 * You should have received a copy of the GNU Lesser General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors:
17− * Michael Zanetti <michael.zanetti@canonical.com>
1815 */
1916
2017// unity-api
@@ -177,7 +174,7 @@ private Q_SLOTS:
177174 appManager->addApplication(new MockApp("abs-icon"));
178175 QCOMPARE(launcherModel->rowCount(QModelIndex()), 1);
179176
180− appManager->addApplication(new MockApp("no-icon"));
177+ appManager->addApplication(new MockApp("rel-icon"));
181178 QCOMPARE(launcherModel->rowCount(QModelIndex()), 2);
182179
183180 launcherModel->m_settings->setStoredApplications(QStringList());
@@ -199,6 +196,10 @@ private Q_SLOTS:
199196 QString::fromUtf8(g_get_user_name()));
200197 QVERIFY(removeReply.isValid());
201198 QCOMPARE(removeReply.value(), true);
199+
200+ // Some tests move the directory, so lets move it back if so.
201+ // But this will usually fail.
202+ QFile::rename("applications.old", "applications");
202203 }
203204
204205 void testMove() {
@@ -331,7 +332,7 @@ private Q_SLOTS:
331332
332333 void testApplicationRunning() {
333334 launcherModel->pin("abs-icon");
334− launcherModel->pin("no-icon");
335+ launcherModel->pin("rel-icon");
335336
336337 QCOMPARE(launcherModel->get(0)->running(), true);
337338 QCOMPARE(launcherModel->get(1)->running(), true);
@@ -340,7 +341,7 @@ private Q_SLOTS:
340341 QCOMPARE(launcherModel->get(0)->running(), false);
341342 QCOMPARE(launcherModel->get(1)->running(), true);
342343
343− appManager->stopApplication("no-icon");
344+ appManager->stopApplication("rel-icon");
344345 QCOMPARE(launcherModel->get(0)->running(), false);
345346 QCOMPARE(launcherModel->get(1)->running(), false);
346347 }
@@ -355,7 +356,7 @@ private Q_SLOTS:
355356 QCOMPARE(launcherModel->get(0)->focused(), true);
356357 QCOMPARE(launcherModel->get(1)->focused(), false);
357358
358− appManager->focusApplication("no-icon");
359+ appManager->focusApplication("rel-icon");
359360 QCOMPARE(launcherModel->rowCount(QModelIndex()), 2);
360361 QCOMPARE(launcherModel->get(0)->focused(), false);
361362 QCOMPARE(launcherModel->get(1)->focused(), true);
@@ -377,8 +378,8 @@ private Q_SLOTS:
377378 QCOMPARE(launcherModel->rowCount(), 2);
378379
379380 // stop the second one keeping it pinned so that it doesn't go away
380− launcherModel->pin("no-icon");
381− appManager->stopApplication("no-icon");
381+ launcherModel->pin("rel-icon");
382+ appManager->stopApplication("rel-icon");
382383
383384 // find the first Quit item, should be there
384385 QuickListModel *model = qobject_cast<QuickListModel*>(launcherModel->get(0)->quickList());
@@ -407,7 +408,7 @@ private Q_SLOTS:
407408 // first app should be gone...
408409 QCOMPARE(launcherModel->rowCount(QModelIndex()), 1);
409410 // ... the second app (now at index 0) should still be there, pinned and stopped
410− QCOMPARE(launcherModel->get(0)->appId(), QStringLiteral("no-icon"));
411+ QCOMPARE(launcherModel->get(0)->appId(), QStringLiteral("rel-icon"));
411412 QCOMPARE(launcherModel->get(0)->pinned(), true);
412413 QCOMPARE(launcherModel->get(0)->running(), false);
413414 }
@@ -602,17 +603,16 @@ private Q_SLOTS:
602603
603604 // pin both apps
604605 launcherModel->pin("abs-icon");
605− launcherModel->pin("no-icon");
606+ launcherModel->pin("rel-icon");
606607 // close both apps
607608 appManager->removeApplication(0);
608609 appManager->removeApplication(0);
609610
610611 // "delete" the .desktop files
611− QString oldCurrent = QDir::currentPath();
612612 if (deleted) {
613613 // In testing mode, the launcher searches the current dir for the sample .desktop file
614− // We can make that fail by changing the current dir
615− QDir::setCurrent("..");
614+ // We can make that fail by moving the applications dir
615+ QFile::rename("applications", "applications.old");
616616 }
617617
618618 // Call refresh
@@ -623,9 +623,6 @@ private Q_SLOTS:
623623 QCOMPARE(reply.isValid(), true);
624624
625625 QCOMPARE(launcherModel->rowCount(), deleted ? 0 : 2);
626−
627− // Restoring current dir
628− QDir::setCurrent(oldCurrent);
629626 }
630627
631628 void testSettings() {
@@ -637,7 +634,7 @@ private Q_SLOTS:
637634
638635 // pin both apps
639636 launcherModel->pin("abs-icon");
640− launcherModel->pin("no-icon");
637+ launcherModel->pin("rel-icon");
641638 QCOMPARE(spy.count(), 0);
642639
643640 // Now settings should have 2 apps
@@ -659,9 +656,9 @@ private Q_SLOTS:
659656 QCOMPARE(launcherModel->rowCount(), 1);
660657
661658 // Add them back but in reverse order
662− settings->simulateDConfChanged(QStringList() << "no-icon" << "abs-icon");
659+ settings->simulateDConfChanged(QStringList() << "rel-icon" << "abs-icon");
663660 QCOMPARE(launcherModel->rowCount(), 2);
664− QCOMPARE(launcherModel->get(0)->appId(), QString("no-icon"));
661+ QCOMPARE(launcherModel->get(0)->appId(), QString("rel-icon"));
665662 QCOMPARE(launcherModel->get(1)->appId(), QString("abs-icon"));
666663 QCOMPARE(spy.count(), 2);
667664 }
@@ -671,7 +668,7 @@ private Q_SLOTS:
671668 QCOMPARE(launcherModel->rowCount(), getASConfig().count());
672669
673670 int oldCount = launcherModel->rowCount();
674− appManager->addApplication(new MockApp("rel-icon"));
671+ appManager->addApplication(new MockApp("click-icon"));
675672 QCOMPARE(launcherModel->rowCount(), oldCount + 1);
676673 QCOMPARE(launcherModel->rowCount(), getASConfig().count());
677674 }
tests/plugins/Unity/Launcher/no-icon.desktopdeleted−2
@@ -1,2 +0,0 @@
1−[Desktop Entry]
2−Name=No Icon
tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+5
@@ -74,6 +74,11 @@ Rectangle {
7474 waitForRendering(zoomableImage);
7575 overlay = findChild(zoomableImage.rootItem, "overlay");
7676 waitForRendering(overlay);
77+
78+ // Make sure all the lazyImage transitions have finished
79+ for (var i in lazyImage.transitions) {
80+ tryCompare(lazyImage.transitions[i], "running", false);
81+ }
7782 }
7883
7984 function cleanup() {
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+1−6
@@ -396,7 +396,7 @@ Item {
396396
397397 function test_create_appointmentMenu_data() {
398398 return [
399− {label: "testLabel1", enabled: true, icon: "file:///testIcon1", color: Qt.rgba(0, 0, 0, 0),
399+ {label: "testLabel1", enabled: true, icon: "file:///testIcon1", color: Qt.rgba(1, 2, 3, 0),
400400 time: new Date(2014, 04, 14), timeFormat: "%a %d %b %l:%M %p"},
401401 {label: "testLabel2", enabled: false, icon: "file:///testIcon2", color: Qt.rgba(1, 0, 0, 0),
402402 time: new Date(2015, 11, 31), timeFormat: "%A" },
@@ -594,9 +594,7 @@ Item {
594594 // ModemInfoItem gets all it's data through the actions.
595595 return [
596596 {
597− label: "",
598597 enabled: true,
599− checked: false,
600598 statusLabelAction: "action::statusLabel",
601599 statusIconAction: "action::statusIcon",
602600 connectivityIconAction: "action::connectivityIcon",
@@ -609,9 +607,7 @@ Item {
609607
610608 function test_create_modemInfoItem(data) {
611609 menuData.type = "com.canonical.indicator.network.modeminfoitem";
612− menuData.label = data.label;
613610 menuData.sensitive = data.enabled;
614− menuData.isToggled = data.checked;
615611 menuData.ext = {
616612 'xCanonicalModemStatusLabelAction': data.statusLabelAction,
617613 'xCanonicalModemStatusIconAction': data.statusIconAction,
@@ -625,7 +621,6 @@ Item {
625621 loader.sourceComponent = factory.load(menuData);
626622 tryCompareFunction(function() { return loader.item != undefined; }, true);
627623 compare(loader.item.objectName, "modemInfoItem", "Should have created a modem info item.");
628− compare(loader.item.text, data.label, "Label does not match data");
629624
630625 compare(loader.item.statusLabelAction.name, data.statusLabelAction, "StatusLabel action incorrect");
631626 compare(loader.item.statusIconAction.name, data.statusIconAction, "StatusIcon action incorrect");
tests/qmltests/Panel/tst_IndicatorPage.qml+1−1
@@ -36,7 +36,7 @@ Item {
3636 menuObjectPath: "/com/canonical/indicator/test"
3737
3838 factory {
39− _map: {
39+ _userMap: {
4040 "default": {
4141 "com.canonical.indicator.test" : testMenu
4242 }
tests/qmltests/Stage/tst_DesktopStage.qml+16
@@ -772,5 +772,21 @@ Item {
772772
773773 tryCompare(mouseEaterSpy, "count", 0);
774774 }
775+
776+ // regression test for https://bugs.launchpad.net/ubuntu/+source/unity8/+bug/1627281
777+ function test_doubleTapToMaximizeWindow() {
778+ var dialerAppDelegate = startApplication("dialer-app");
779+ verify(dialerAppDelegate);
780+ var decoration = findChild(dialerAppDelegate, "appWindowDecoration");
781+ verify(decoration);
782+
783+ // simulate a double tap, with a slight erroneous move in between those 2 taps
784+ tap(decoration);
785+ touchPress(decoration);
786+ touchMove(decoration, decoration.width/2, decoration.height/2 - 10)
787+ touchRelease(decoration);
788+
789+ tryCompare(dialerAppDelegate, "state", "maximized");
790+ }
775791 }
776792}
tests/qmltests/Stage/tst_PhoneStage.qml+5
@@ -156,6 +156,11 @@ Item {
156156 true /* beginTouch */, true /* endTouch */, units.gu(10), 50);
157157
158158 tryCompare(stage, "state", "spread");
159+ // Make sure all the transitions have finished
160+ var appRepeater = findChild(stage, "appRepeater");
161+ for (var i = 0; i < appRepeater.count; i++) {
162+ waitUntilTransitionsEnd(appRepeater.itemAt(i));
163+ }
159164 waitForRendering(stage);
160165 }
161166
tests/qmltests/Stage/tst_TabletStage.qml+6−3
@@ -581,7 +581,6 @@ Rectangle {
581581
582582 function test_loadSideStageByDraggingFromMainStage() {
583583 sideStage.showNow();
584− print("sidestage now shown. launching browser")
585584 var webbrowserSurfaceId = topSurfaceList.nextId;
586585 webbrowserCheckBox.checked = true;
587586 waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
@@ -589,7 +588,7 @@ Rectangle {
589588 var appDelegate = findChild(stage, "appDelegate_" + webbrowserSurfaceId);
590589 verify(appDelegate);
591590 waitForRendering(stage);
592− compare(appDelegate.stage, ApplicationInfoInterface.MainStage);
591+ tryCompare(appDelegate, "stage", ApplicationInfoInterface.MainStage);
593592
594593 dragToSideStage(webbrowserSurfaceId);
595594
@@ -599,6 +598,10 @@ Rectangle {
599598 function test_unloadSideStageByDraggingFromSideStage() {
600599 sideStage.showNow();
601600 WindowStateStorage.saveStage(webbrowserCheckBox.appId, ApplicationInfoInterface.SideStage)
601+ // WindowStateStorage is async... Lets wait for it to be fully processed...
602+ tryCompareFunction(function() {
603+ return WindowStateStorage.getStage(webbrowserCheckBox.appId, ApplicationInfoInterface.MainStage) === ApplicationInfoInterface.SideStage
604+ }, true);
602605 var webbrowserSurfaceId = topSurfaceList.nextId;
603606 webbrowserCheckBox.checked = true;
604607 waitUntilAppSurfaceShowsUp(webbrowserSurfaceId);
@@ -606,7 +609,7 @@ Rectangle {
606609 var appDelegate = findChild(stage, "appDelegate_" + webbrowserSurfaceId);
607610 verify(appDelegate);
608611 waitForRendering(stage);
609− compare(appDelegate.stage, ApplicationInfoInterface.SideStage);
612+ tryCompare(appDelegate, "stage", ApplicationInfoInterface.SideStage);
610613
611614 dragToMainStage(webbrowserSurfaceId);
612615
tests/qmltests/tst_Shell.qml+28
@@ -2733,5 +2733,33 @@ Rectangle {
27332733 tryCompare(dashAppDelegate, "y", initialY);
27342734 SurfaceManager.inputMethodSurface.state = oldOSKState;
27352735 }
2736+
2737+ function test_cursorHidingWithFullscreenApp() {
2738+ loadShell("desktop");
2739+ shell.usageScenario = "desktop";
2740+ waitForRendering(shell);
2741+ swipeAwayGreeter();
2742+
2743+ // load some fullscreen app
2744+ var cameraSurfaceId = topLevelSurfaceList.nextId;
2745+ var cameraApp = ApplicationManager.startApplication("camera-app");
2746+ waitUntilAppWindowIsFullyLoaded(cameraSurfaceId);
2747+
2748+ var cursor = findChild(shell, "cursor");
2749+ verify(cursor);
2750+ tryCompare(cursor, "opacity", 1);
2751+
2752+ // let the timer kick in and verify the cursor got hidden
2753+ wait(3000);
2754+ tryCompare(cursor, "opacity", 0);
2755+
2756+ // simulate moving the mouse, check the cursor is visible again
2757+ cursor.mouseMoved();
2758+ tryCompare(cursor, "opacity", 1);
2759+
2760+ // let the timer kick in again and verify the cursor got hidden
2761+ wait(3000);
2762+ tryCompare(cursor, "opacity", 0);
2763+ }
27362764 }
27372765}