on xenial help sign in
Merge trunk

[ Michał Sawicz ] * Only generate .qmltypes files manually, no need to do it build-time. It didn't work when cross-compiling either, and required builders to have otherwise unnecessary environment. * Fix CardCreator test. It got broken with a merge that got landed along side of it. [ Ying-Chun Liu ] * Add reboot/shutdown (LP: #1234062) [ Albert Astals ] * Make the departments test more stable [ Mirco Müller ] * Fixes gap at top of sim-unlock/fullscreen notification (point 1.), fixes blocking overlay if underlying UnityMenuModel vanishes from DBus (point 2.). The third bullet-point of the bug-report, lockup of shell-UI, could not be reproduced. (LP: #1308011) [ Michael Terry ] * Expose a new greeter DBus property, IsActive, which tells apps and indicators when the integrated-greeter screen is active. Useful for switching UI modes when the screen is locked. * Allow the session to bring up the greeter/lockscreen over DBus. The emergency dialer will need this support in order to cancel bringing it up. [ Michael Zanetti ] * Fixes gap at top of sim-unlock/fullscreen notification (point 1.), fixes blocking overlay if underlying UnityMenuModel vanishes from DBus (point 2.). The third bullet-point of the bug-report, lockup of shell-UI, could not be reproduced. (LP: #1308011)

commit33a7f65b07238e79d86844a0999f960f25ee4af9 authorDaniel d'Andrada <daniel.dandrada@canonical.com> dateThu 17 Jul 2014, 16:43 (12 years ago) parent9bbb23e0508596
31 files changed+755−151
debian/changelog+37 debian/control+3−3 plugins/LightDM/CMakeLists.txt+1 plugins/LightDM/DBusGreeter.cpp+65 plugins/LightDM/DBusGreeter.h+55 plugins/LightDM/Greeter.cpp+17 plugins/LightDM/Greeter.h+5 plugins/LightDM/plugin.cpp+3 plugins/Lights/Lights.qmltypes+45 plugins/Powerd/Powerd.qmltypes+6−13 plugins/Ubuntu/Gestures/Gestures.qmltypes+1 plugins/Unity/Session/dbusunitysessionservice.cpp+33 plugins/Unity/Session/dbusunitysessionservice.h+61−4 po/eu.po+18−18 po/gd.po+18−17 po/km.po+2−2 po/ko.po+45−43 po/pt_BR.po+8−8 po/tr.po+14−14 qml/Notifications/Notification.qml+21−7 qml/Notifications/NotificationMenuItemFactory.qml+12−3 qml/Notifications/Notifications.qml+17−1 qml/Shell.qml+200−2 tests/mocks/LightDM/CMakeLists.txt+1 tests/mocks/Powerd/Powerd.qmltypes+6−13 tests/mocks/Unity/Unity.qmltypes+10−2 tests/plugins/Dash/cardcreator/6.res+1 tests/plugins/LightDM/CMakeLists.txt+1−1 tests/plugins/LightDM/dbus.cpp+40 tests/qmltests/Dash/tst_DashContent.qml+1 tests/qmltests/tst_Shell.qml+8
debian/changelog+37
@@ -12,6 +12,43 @@ unity8 (8.00) UNRELEASED; urgency=medium
1212
1313 -- Gerry Boland <gerry.boland@canonical.com> Thu, 10 Jul 2014 10:34:18 +0100
1414
15+unity8 (7.90+14.10.20140717.1-0ubuntu1) utopic; urgency=low
16+
17+ [ Michał Sawicz ]
18+ * Only generate .qmltypes files manually, no need to do it build-time.
19+ It didn't work when cross-compiling either, and required builders to
20+ have otherwise unnecessary environment.
21+ * Fix CardCreator test. It got broken with a merge that got landed
22+ along side of it.
23+
24+ [ Ying-Chun Liu ]
25+ * Add reboot/shutdown (LP: #1234062)
26+
27+ [ Albert Astals ]
28+ * Make the departments test more stable
29+
30+ [ Mirco Müller ]
31+ * Fixes gap at top of sim-unlock/fullscreen notification (point 1.),
32+ fixes blocking overlay if underlying UnityMenuModel vanishes from
33+ DBus (point 2.). The third bullet-point of the bug-report, lockup of
34+ shell-UI, could not be reproduced. (LP: #1308011)
35+
36+ [ Michael Terry ]
37+ * Expose a new greeter DBus property, IsActive, which tells apps and
38+ indicators when the integrated-greeter screen is active. Useful for
39+ switching UI modes when the screen is locked.
40+ * Allow the session to bring up the greeter/lockscreen over DBus. The
41+ emergency dialer will need this support in order to cancel bringing
42+ it up.
43+
44+ [ Michael Zanetti ]
45+ * Fixes gap at top of sim-unlock/fullscreen notification (point 1.),
46+ fixes blocking overlay if underlying UnityMenuModel vanishes from
47+ DBus (point 2.). The third bullet-point of the bug-report, lockup of
48+ shell-UI, could not be reproduced. (LP: #1308011)
49+
50+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 17 Jul 2014 09:38:20 +0000
51+
1552unity8 (7.90+14.10.20140714-0ubuntu1) utopic; urgency=low
1653
1754 [ Michał Sawicz ]
debian/control+3−3
@@ -17,7 +17,7 @@ Build-Depends: cmake,
1717 libhud-client2-dev,
1818 libpay1-dev,
1919 libpulse-dev,
20− libqmenumodel-dev (>= 0.2.7),
20+ libqmenumodel-dev (>= 0.2.8),
2121 libqt5xmlpatterns5-dev,
2222 libunity-api-dev (>= 7.85),
2323 libusermetricsoutput1-dev,
@@ -51,7 +51,7 @@ Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
5151
5252Package: indicators-client
5353Architecture: amd64 armhf i386
54−Depends: qmenumodel-qml (>= 0.2.7),
54+Depends: qmenumodel-qml (>= 0.2.8),
5555 qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.49) | qtdeclarative5-ubuntu-ui-toolkit-plugin-gles (>= 0.1.49),
5656 unity8 (= ${binary:Version}),
5757 ${misc:Depends},
@@ -75,7 +75,7 @@ Provides: indicator-renderer,
7575Depends: gsettings-desktop-schemas,
7676 libcap2-bin,
7777 libglib2.0-bin,
78− qmenumodel-qml (>= 0.2.7),
78+ qmenumodel-qml (>= 0.2.8),
7979 qml-module-qtquick-xmllistmodel,
8080 qtdeclarative5-gsettings1.0,
8181 qtdeclarative5-qtmir-plugin (>= 0.4),
plugins/LightDM/CMakeLists.txt+1
@@ -15,6 +15,7 @@ include_directories(
1515
1616set(QMLPLUGIN_SRC
1717 ../Utils/qsortfilterproxymodelqml.cpp # FIXME evaluate a more generic approach for using other plugins
18+ DBusGreeter.cpp
1819 DBusGreeterList.cpp
1920 Greeter.cpp
2021 plugin.cpp
plugins/LightDM/DBusGreeter.cppnew file+65
@@ -0,0 +1,65 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "DBusGreeter.h"
18+#include "Greeter.h"
19+
20+#include <QDBusMessage>
21+#include <QStringList>
22+
23+DBusGreeter::DBusGreeter(Greeter *greeter, const QDBusConnection &connection, const QString &path)
24+ : QObject(greeter),
25+ m_greeter(greeter),
26+ m_connection(connection),
27+ m_path(path)
28+{
29+ connect(m_greeter, SIGNAL(isActiveChanged()), this, SLOT(isActiveChangedHandler()));
30+}
31+
32+bool DBusGreeter::isActive() const
33+{
34+ return m_greeter->isActive();
35+}
36+
37+void DBusGreeter::ShowGreeter()
38+{
39+ return Q_EMIT m_greeter->showGreeter();
40+}
41+
42+void DBusGreeter::isActiveChangedHandler()
43+{
44+ notifyPropertyChanged("IsActive", isActive());
45+ Q_EMIT isActiveChanged();
46+}
47+
48+// Manually emit a PropertiesChanged signal over DBus, because QtDBus
49+// doesn't do it for us on Q_PROPERTIES, oddly enough.
50+void DBusGreeter::notifyPropertyChanged(const QString& propertyName, const QVariant &value)
51+{
52+ QDBusMessage message;
53+ QVariantMap changedProps;
54+
55+ changedProps.insert(propertyName, value);
56+
57+ message = QDBusMessage::createSignal(m_path,
58+ "org.freedesktop.DBus.Properties",
59+ "PropertiesChanged");
60+ message << "com.canonical.UnityGreeter";
61+ message << changedProps;
62+ message << QStringList();
63+
64+ m_connection.send(message);
65+}
plugins/LightDM/DBusGreeter.hnew file+55
@@ -0,0 +1,55 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UNITY_DBUSGREETER_H
18+#define UNITY_DBUSGREETER_H
19+
20+#include <QDBusConnection>
21+#include <QObject>
22+
23+class Greeter;
24+class QDBusInterface;
25+
26+/** This is an internal class used to talk with the indicators.
27+ */
28+
29+class DBusGreeter : public QObject
30+{
31+ Q_OBJECT
32+ Q_CLASSINFO("D-Bus Interface", "com.canonical.UnityGreeter")
33+
34+ Q_PROPERTY(bool IsActive READ isActive NOTIFY isActiveChanged) // since 14.10
35+
36+public:
37+ explicit DBusGreeter(Greeter *greeter, const QDBusConnection &connection, const QString &path);
38+
39+ bool isActive() const;
40+ Q_SCRIPTABLE void ShowGreeter(); // temporary, until we split the greeter again
41+
42+Q_SIGNALS:
43+ void isActiveChanged();
44+
45+private Q_SLOTS:
46+ void isActiveChangedHandler();
47+ void notifyPropertyChanged(const QString &propertyName, const QVariant &value);
48+
49+private:
50+ Greeter *m_greeter;
51+ QDBusConnection m_connection;
52+ QString m_path;
53+};
54+
55+#endif
plugins/LightDM/Greeter.cpp+17
@@ -25,6 +25,7 @@ public:
2525 explicit GreeterPrivate(Greeter *parent);
2626
2727 QLightDM::Greeter *m_greeter;
28+ bool m_active;
2829 bool wasPrompted;
2930 bool promptless;
3031
@@ -38,6 +39,7 @@ private:
3839
3940GreeterPrivate::GreeterPrivate(Greeter* parent)
4041 : m_greeter(new QLightDM::Greeter(parent)),
42+ m_active(false),
4143 wasPrompted(false),
4244 promptless(false),
4345 q_ptr(parent)
@@ -60,6 +62,21 @@ Greeter::Greeter(QObject* parent)
6062 d->m_greeter->connectSync();
6163}
6264
65+bool Greeter::isActive() const
66+{
67+ Q_D(const Greeter);
68+ return d->m_active;
69+}
70+
71+void Greeter::setIsActive(bool active)
72+{
73+ Q_D(Greeter);
74+ if (d->m_active != active) {
75+ d->m_active = active;
76+ Q_EMIT isActiveChanged();
77+ }
78+}
79+
6380bool Greeter::isAuthenticated() const
6481{
6582 Q_D(const Greeter);
plugins/LightDM/Greeter.h+5
@@ -34,6 +34,7 @@ class Greeter : public QObject
3434{
3535 Q_OBJECT
3636
37+ Q_PROPERTY(bool active READ isActive WRITE setIsActive NOTIFY isActiveChanged)
3738 Q_PROPERTY(bool authenticated READ isAuthenticated)
3839 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
3940 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
@@ -41,6 +42,7 @@ class Greeter : public QObject
4142public:
4243 explicit Greeter(QObject* parent=0);
4344
45+ bool isActive() const;
4446 bool isAuthenticated() const;
4547 QString authenticationUser() const;
4648 bool promptless() const;
@@ -49,13 +51,16 @@ public Q_SLOTS:
4951 void authenticate(const QString &username=QString());
5052 void respond(const QString &response);
5153 bool startSessionSync(const QString &session=QString());
54+ void setIsActive(bool isActive);
5255
5356Q_SIGNALS:
5457 void showMessage(const QString &text, bool isError);
5558 void showPrompt(const QString &text, bool isSecret);
5659 void authenticationComplete();
5760 void authenticationUserChanged(const QString &user);
61+ void isActiveChanged();
5862 void promptlessChanged();
63+ void showGreeter();
5964
6065 // This signal is emitted by external agents like indicators, and the UI
6166 // should switch to this user if possible.
plugins/LightDM/plugin.cpp+3
@@ -18,6 +18,7 @@
1818 */
1919
2020#include "plugin.h"
21+#include "DBusGreeter.h"
2122#include "DBusGreeterList.h"
2223#include "Greeter.h"
2324#include "UsersModel.h"
@@ -39,6 +40,8 @@ static QObject *greeter_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
3940
4041 Greeter *greeter = new Greeter();
4142 QDBusConnection connection = QDBusConnection::sessionBus();
43+ DBusGreeter *root = new DBusGreeter(greeter, connection, "/");
44+ connection.registerObject("/", root, QDBusConnection::ExportScriptableContents);
4245 DBusGreeterList *list = new DBusGreeterList(greeter, connection, GREETER_LIST_DBUS_PATH);
4346 connection.registerObject(GREETER_LIST_DBUS_PATH, list, QDBusConnection::ExportScriptableContents);
4447 connection.registerService(GREETER_DBUS_SERVICE);
plugins/Lights/Lights.qmltypesnew file+45
@@ -0,0 +1,45 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Lights 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "Lights"
12+ prototype: "QObject"
13+ exports: ["Lights/Lights 0.1"]
14+ isCreatable: false
15+ isSingleton: true
16+ exportMetaObjectRevisions: [0]
17+ Enum {
18+ name: "State"
19+ values: {
20+ "Off": 0,
21+ "On": 1
22+ }
23+ }
24+ Property { name: "state"; type: "State" }
25+ Property { name: "color"; type: "QColor" }
26+ Property { name: "onMillisec"; type: "int" }
27+ Property { name: "offMillisec"; type: "int" }
28+ Signal {
29+ name: "stateChanged"
30+ Parameter { name: "newState"; type: "State" }
31+ }
32+ Signal {
33+ name: "colorChanged"
34+ Parameter { name: "color"; type: "QColor" }
35+ }
36+ Signal {
37+ name: "onMillisecChanged"
38+ Parameter { name: "onMs"; type: "int" }
39+ }
40+ Signal {
41+ name: "offMillisecChanged"
42+ Parameter { name: "offMs"; type: "int" }
43+ }
44+ }
45+}
plugins/Powerd/Powerd.qmltypes+6−13
@@ -15,19 +15,12 @@ Module {
1515 isSingleton: true
1616 exportMetaObjectRevisions: [0]
1717 Enum {
18− name: "DisplayFlag"
18+ name: "DisplayStateChangeReason"
1919 values: {
20− "UseProximity": 1,
21− "DisableAutoBrightness": 2,
22− "Bright": 4
23− }
24− }
25− Enum {
26− name: "DisplayFlags"
27− values: {
28− "UseProximity": 1,
29− "DisableAutoBrightness": 2,
30− "Bright": 4
20+ "Unknown": 0,
21+ "Inactivity": 1,
22+ "PowerKey": 2,
23+ "Proximity": 3
3124 }
3225 }
3326 Enum {
@@ -40,7 +33,7 @@ Module {
4033 Signal {
4134 name: "displayPowerStateChange"
4235 Parameter { name: "status"; type: "int" }
43− Parameter { name: "flags"; type: "uint" }
36+ Parameter { name: "reason"; type: "int" }
4437 }
4538 }
4639}
plugins/Ubuntu/Gestures/Gestures.qmltypes+1
@@ -141,6 +141,7 @@ Module {
141141 name: "touchSceneYChanged"
142142 Parameter { name: "value"; type: "double" }
143143 }
144+ Signal { name: "tapped" }
144145 }
145146 Component {
146147 name: "PressedOutsideNotifier"
plugins/Unity/Session/dbusunitysessionservice.cpp+33
@@ -19,6 +19,7 @@
1919
2020// Qt
2121#include <QDBusConnection>
22+#include <QDBusInterface>
2223
2324DBusUnitySessionService::DBusUnitySessionService() : QObject()
2425{
@@ -44,3 +45,35 @@ void DBusUnitySessionService::RequestLogout()
4445{
4546 Q_EMIT logoutRequested(false);
4647}
48+
49+void DBusUnitySessionService::Reboot()
50+{
51+ QDBusConnection connection = QDBusConnection::systemBus();
52+ QDBusInterface iface1 ("org.freedesktop.login1",
53+ "/org/freedesktop/login1",
54+ "org.freedesktop.login1.Manager",
55+ connection);
56+
57+ iface1.call("Reboot", false);
58+}
59+
60+void DBusUnitySessionService::RequestReboot()
61+{
62+ Q_EMIT rebootRequested(false);
63+}
64+
65+void DBusUnitySessionService::Shutdown()
66+{
67+ QDBusConnection connection = QDBusConnection::systemBus();
68+ QDBusInterface iface1 ("org.freedesktop.login1",
69+ "/org/freedesktop/login1",
70+ "org.freedesktop.login1.Manager",
71+ connection);
72+
73+ iface1.call("PowerOff", false);
74+}
75+
76+void DBusUnitySessionService::RequestShutdown()
77+{
78+ Q_EMIT shutdownRequested(false);
79+}
plugins/Unity/Session/dbusunitysessionservice.h+61−4
@@ -46,6 +46,27 @@ Q_SIGNALS:
4646 */
4747 void logoutRequested(bool have_inhibitors);
4848
49+ /**
50+ * rebootRequested signal
51+ *
52+ * This signal is emitted when some applications request the system to
53+ * reboot.
54+ * @param have_inhibitors if there are any special running applications
55+ * which inhibit the reboot.
56+ */
57+ void rebootRequested(bool have_inhibitors);
58+
59+ /**
60+ * shutdownRequested signal
61+ *
62+ * This signal is emitted when some applications request the system to
63+ * shutdown.
64+ * @param have_inhibitors if there are any special running applications
65+ * which inhibit the shutdown.
66+ */
67+ void shutdownRequested(bool have_inhibitors);
68+
69+
4970 /**
5071 * logoutReady signal
5172 *
@@ -61,22 +82,58 @@ public Q_SLOTS:
6182 * This method directly logout the system without user's confirmation.
6283 * Ordinary applications should avoid calling this method. Please call
6384 * RequestLogout() to ask the user to decide logout or not.
64− * This method will stop all the running applications and then signal
65− * logoutReady when all the apps stopped.
6685 */
6786 Q_SCRIPTABLE void Logout();
6887
88+ /**
89+ * Reboot the system.
90+ *
91+ * This method directly reboot the system without user's confirmation.
92+ * Ordinary applications should avoid calling this method. Please call
93+ * RequestReboot() to ask the user to decide reboot or not.
94+ */
95+ Q_SCRIPTABLE void Reboot();
96+
97+ /**
98+ * Shutdown the system.
99+ *
100+ * This method directly shutdown the system without user's confirmation.
101+ * Ordinary applications should avoid calling this method. Please call
102+ * RequestShutdown() to ask the user to decide shutdown or not.
103+ */
104+ Q_SCRIPTABLE void Shutdown();
105+
69106 /**
70107 * Issue a logout request.
71108 *
72109 * This method emit the logoutRequested signal to the shell with a boolean
73110 * which indicates if there's any inhibitors. The shell should receive
74111 * this signal and display a dialog to ask the user to confirm the logout
75− * action. If confirmed, shell can call Logout() method to kill the apps
76− * and then logout
112+ * action. If confirmed, shell can call Logout() method to logout.
77113 */
78114 Q_SCRIPTABLE void RequestLogout();
79115
116+ /**
117+ * Issue a reboot request.
118+ *
119+ * This method emit the rebootRequested signal to the shell with a boolean
120+ * which indicates if there's any inhibitors. The shell should receive
121+ * this signal and display a dialog to ask the user to confirm the reboot
122+ * action. If confirmed, shell can call Reboot() method to reboot
123+ */
124+ Q_SCRIPTABLE void RequestReboot();
125+
126+ /**
127+ * Issue a shutdown request.
128+ *
129+ * This method emit the shutdownRequested signal to the shell with a
130+ * boolean which indicates if there's any inhibitors.
131+ * The shell should receive
132+ * this signal and display a dialog to ask the user to confirm the reboot
133+ * action. If confirmed, shell can call Shutdown() method to reboot
134+ */
135+ Q_SCRIPTABLE void RequestShutdown();
136+
80137};
81138
82139#endif // DBUSUNITYSESSIONSERVICE_H
po/eu.po+18−18
@@ -8,23 +8,23 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-03-30 12:44+0000\n"
11+"PO-Revision-Date: 2014-07-16 18:11+0000\n"
1212"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
1313"Language-Team: Basque <eu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
18+"X-Generator: Launchpad (build 17114)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Ainguratu lasterbidea"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Askatu lasterbidea"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -52,7 +52,7 @@ msgstr "Itxi"
5252
5353#: qml/Components/EdgeDemo.qml:172
5454msgid "Swipe up again to close the settings screen"
55−msgstr "Arrastatu gora berriro ezarpenen leihoa ixteko"
55+msgstr "Pasatu hatza gora berriro ezarpenen leihoa ixteko"
5656
5757#: qml/Components/EdgeDemo.qml:199
5858msgid "Left edge"
@@ -61,7 +61,7 @@ msgstr "Ezkerreko ertza"
6161#: qml/Components/EdgeDemo.qml:200
6262msgid "Swipe from the left to reveal the launcher for quick access to apps"
6363msgstr ""
64−"Arrastatu ezkerretik abiarazlea erakutsi eta aplikazioak eskura berehala "
64+"Pasatu hatza ezkerretik abiarazlea erakutsi eta aplikazioak eskura berehala "
6565"izateko"
6666
6767#: qml/Components/EdgeDemo.qml:227
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676"Jadanik ezagutzen dituzu ertzetako keinuak, eta mugikorra erabiltzen has "
77−"zaitezke<br><br>Ukitu pantaila hasteko"
77+"zaitezke<br><br>Sakatu pantailan hasteko"
7878
7979#: qml/Components/Lockscreen.qml:214
8080msgid "Emergency Call"
@@ -82,7 +82,7 @@ msgstr "Larrialdi-deia"
8282
8383#: qml/Components/Lockscreen.qml:231
8484msgid "OK"
85−msgstr ""
85+msgstr "Ados"
8686
8787#: qml/Components/PageHeader.qml:366
8888msgid "Recent searches"
@@ -99,11 +99,11 @@ msgstr "Kaixo"
9999
100100#: qml/Components/PinLockscreen.qml:198
101101msgid "CANCEL"
102−msgstr ""
102+msgstr "UTZI"
103103
104104#: qml/Components/PinLockscreen.qml:216
105105msgid "DONE"
106−msgstr ""
106+msgstr "EGINDA"
107107
108108#: qml/Components/SeeMore.qml:35
109109msgid "See more"
@@ -139,7 +139,7 @@ msgstr "Bidali"
139139
140140#: qml/Greeter/Greeter.qml:157
141141msgid "Swipe to unlock"
142−msgstr ""
142+msgstr "Pasatu hatza desblokeatzeko"
143143
144144#: qml/Hud/HudParametrizedActionsPage.qml:132
145145msgid "Confirm"
@@ -171,27 +171,27 @@ msgstr "Sartu SIMaren PINa"
171171
172172#: qml/Panel/Indicators/MenuItemFactory.qml:583
173173msgid "In queue…"
174−msgstr ""
174+msgstr "Ilaran..."
175175
176176#: qml/Panel/Indicators/MenuItemFactory.qml:587
177177msgid "Downloading"
178−msgstr ""
178+msgstr "Deskargatzen"
179179
180180#: qml/Panel/Indicators/MenuItemFactory.qml:589
181181msgid "Paused, tap to resume"
182−msgstr ""
182+msgstr "Pausatuta, sakatu jarraitzeko"
183183
184184#: qml/Panel/Indicators/MenuItemFactory.qml:591
185185msgid "Canceled"
186−msgstr ""
186+msgstr "Utzita"
187187
188188#: qml/Panel/Indicators/MenuItemFactory.qml:593
189189msgid "Finished"
190−msgstr ""
190+msgstr "Amaituta"
191191
192192#: qml/Panel/Indicators/MenuItemFactory.qml:595
193193msgid "Failed, tap to retry"
194−msgstr ""
194+msgstr "Huts egin du, sakatu berriro saiatzeko"
195195
196196#: qml/Panel/SearchIndicator.qml:27
197197msgid "Search"
po/gd.po+18−17
@@ -2,29 +2,30 @@
22# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
33# This file is distributed under the same license as the unity8 package.
44# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5−#
5+# GunChleoc <fios@foramnagaidhlig.net>, 2014.
66msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-05-17 21:08+0000\n"
12−"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
13−"Language-Team: Gaelic; Scottish <gd@li.org>\n"
11+"PO-Revision-Date: 2014-07-16 14:48+0000\n"
12+"Last-Translator: GunChleoc <Unknown>\n"
13+"Language-Team: Fòram na Gàidhlig http://www.foramnagaidhlig.net\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
18+"X-Generator: Launchpad (build 17114)\n"
19+"Language: gd\n"
1920
2021#: plugins/Unity/Launcher/launcheritem.cpp:43
2122#: plugins/Unity/Launcher/launcheritem.cpp:73
2223msgid "Pin shortcut"
23−msgstr ""
24+msgstr "Prìnich ath-ghoirid"
2425
2526#: plugins/Unity/Launcher/launcheritem.cpp:73
2627msgid "Unpin shortcut"
27−msgstr ""
28+msgstr "Neo-phrìnich an ath-ghoirid"
2829
2930#: qml/Components/EdgeDemoOverlay.qml:151
3031msgid "Skip intro"
@@ -86,7 +87,7 @@ msgstr "Gairm èiginn"
8687
8788#: qml/Components/Lockscreen.qml:231
8889msgid "OK"
89−msgstr ""
90+msgstr "Ceart ma-hà"
9091
9192#: qml/Components/PageHeader.qml:366
9293msgid "Recent searches"
@@ -103,11 +104,11 @@ msgstr "Shin thu"
103104
104105#: qml/Components/PinLockscreen.qml:198
105106msgid "CANCEL"
106−msgstr ""
107+msgstr "SGUIR DHETH"
107108
108109#: qml/Components/PinLockscreen.qml:216
109110msgid "DONE"
110−msgstr ""
111+msgstr "DÈANTA"
111112
112113#: qml/Components/SeeMore.qml:35
113114msgid "See more"
@@ -175,27 +176,27 @@ msgstr "Cuir a-steach SIM PIN"
175176
176177#: qml/Panel/Indicators/MenuItemFactory.qml:583
177178msgid "In queue…"
178−msgstr ""
179+msgstr "Air a' chiudha…"
179180
180181#: qml/Panel/Indicators/MenuItemFactory.qml:587
181182msgid "Downloading"
182−msgstr ""
183+msgstr "'Ga luchdadh a-nuas"
183184
184185#: qml/Panel/Indicators/MenuItemFactory.qml:589
185186msgid "Paused, tap to resume"
186−msgstr ""
187+msgstr "'Na stad, thoir gnogag gus leantainn air"
187188
188189#: qml/Panel/Indicators/MenuItemFactory.qml:591
189190msgid "Canceled"
190−msgstr ""
191+msgstr "Air a sgur dheth"
191192
192193#: qml/Panel/Indicators/MenuItemFactory.qml:593
193194msgid "Finished"
194−msgstr ""
195+msgstr "Coileanta"
195196
196197#: qml/Panel/Indicators/MenuItemFactory.qml:595
197198msgid "Failed, tap to retry"
198−msgstr ""
199+msgstr "Dh'fhàillig leis, thoir gnogag gus feuchainn a-rithist"
199200
200201#: qml/Panel/SearchIndicator.qml:27
201202msgid "Search"
po/km.po+2−2
@@ -14,8 +14,8 @@ msgstr ""
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-16 07:27+0000\n"
18−"X-Generator: Launchpad (build 17112)\n"
17+"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
18+"X-Generator: Launchpad (build 17114)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ko.po+45−43
@@ -8,23 +8,23 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2013-10-10 07:04+0000\n"
12−"Last-Translator: Kim Boram <boramism@gmail.com>\n"
11+"PO-Revision-Date: 2014-07-17 03:56+0000\n"
12+"Last-Translator: MinSik CHO <Unknown>\n"
1313"Language-Team: Korean <ko@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
18+"X-Generator: Launchpad (build 17114)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Pin shortcut"
23−msgstr ""
23+msgstr "바로가기를 고정하기"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "바로가기를 고정 해제하기"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -36,49 +36,51 @@ msgstr "오른쪽 끝"
3636
3737#: qml/Components/EdgeDemo.qml:114
3838msgid "Try swiping from the right edge to unlock the phone"
39−msgstr ""
39+msgstr "휴대 전화를 잠금 해제하려면 오른쪽에서부터 끌어보세요."
4040
4141#: qml/Components/EdgeDemo.qml:145
4242msgid "Top edge"
43−msgstr ""
43+msgstr "윗쪽 끝"
4444
4545#: qml/Components/EdgeDemo.qml:146
4646msgid "Try swiping from the top edge to access the indicators"
47−msgstr ""
47+msgstr "알림을 보려면 위쪽에서 끌어보세요."
4848
4949#: qml/Components/EdgeDemo.qml:171
5050msgid "Close"
51−msgstr ""
51+msgstr "닫기"
5252
5353#: qml/Components/EdgeDemo.qml:172
5454msgid "Swipe up again to close the settings screen"
55−msgstr ""
55+msgstr "환경설정 창을 닫으려면 위로 다시 끌어보세요."
5656
5757#: qml/Components/EdgeDemo.qml:199
5858msgid "Left edge"
59−msgstr ""
59+msgstr "왼쪽 끝"
6060
6161#: qml/Components/EdgeDemo.qml:200
6262msgid "Swipe from the left to reveal the launcher for quick access to apps"
63−msgstr ""
63+msgstr "애플리케이션을 빠르게 열기 위해 런처를 보려면 왼쪽에서 끌어보세요."
6464
6565#: qml/Components/EdgeDemo.qml:227
6666msgid "Well done"
67−msgstr ""
67+msgstr "잘하셨습니다."
6868
6969#: qml/Components/EdgeDemo.qml:228
7070msgid ""
7171"You have now mastered the edge gestures and can start using the "
7272"phone<br><br>Tap on the screen to start"
7373msgstr ""
74+"여러분은 끝에서 끌어오기 제스쳐를 완벽히 익히셨기 때문에 휴대 전화를 사용하기 시작할 수 있습니다. <br><br> 스크린을 터치해서 "
75+"시작하세요."
7476
7577#: qml/Components/Lockscreen.qml:214
7678msgid "Emergency Call"
77−msgstr ""
79+msgstr "긴급 통화"
7880
7981#: qml/Components/Lockscreen.qml:231
8082msgid "OK"
81−msgstr ""
83+msgstr "확인"
8284
8385#: qml/Components/PageHeader.qml:366
8486msgid "Recent searches"
@@ -87,107 +89,107 @@ msgstr "최근 검색"
8789#: qml/Components/PassphraseLockscreen.qml:60
8890#, qt-format
8991msgid "Hello %1"
90−msgstr ""
92+msgstr "안녕하세요 %1"
9193
9294#: qml/Components/PassphraseLockscreen.qml:60
9395msgid "Hello"
94−msgstr ""
96+msgstr "안녕하세요"
9597
9698#: qml/Components/PinLockscreen.qml:198
9799msgid "CANCEL"
98−msgstr ""
100+msgstr "취소"
99101
100102#: qml/Components/PinLockscreen.qml:216
101103msgid "DONE"
102−msgstr ""
104+msgstr "완료"
103105
104106#: qml/Components/SeeMore.qml:35
105107msgid "See more"
106−msgstr ""
108+msgstr "더 보기"
107109
108110#: qml/Components/SeeMore.qml:58
109111msgid "See less"
110−msgstr ""
112+msgstr "간단히 표시하기"
111113
112114#: qml/Dash/DashApps.qml:37
113115msgid "Recent"
114−msgstr ""
116+msgstr "최근"
115117
116118#: qml/Dash/Previews/PreviewActionCombo.qml:34
117119msgid "More..."
118−msgstr ""
120+msgstr "더 보기..."
119121
120122#: qml/Dash/Previews/PreviewActionCombo.qml:34
121123msgid "Less..."
122−msgstr ""
124+msgstr "간단하게..."
123125
124126#: qml/Dash/Previews/PreviewRatingInput.qml:82
125127msgid "Rate this"
126−msgstr ""
128+msgstr "이 애플리케이션 평가하기"
127129
128130#: qml/Dash/Previews/PreviewRatingInput.qml:128
129131msgid "Add a review"
130−msgstr ""
132+msgstr "평가 제출하기"
131133
132134#: qml/Dash/Previews/PreviewRatingInput.qml:168
133135msgid "Send"
134−msgstr ""
136+msgstr "보내기"
135137
136138#: qml/Greeter/Greeter.qml:157
137139msgid "Swipe to unlock"
138−msgstr ""
140+msgstr "휴대전화를 잠금 해제하려면 움직이세요."
139141
140142#: qml/Hud/HudParametrizedActionsPage.qml:132
141143msgid "Confirm"
142−msgstr ""
144+msgstr "확인"
143145
144146#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
145147msgid "Type or say a command"
146−msgstr ""
148+msgstr "명령을 입력하거나 말하세요."
147149
148150#: qml/Hud/Hud.qml:84
149151msgid "Loading. Please Wait..."
150−msgstr ""
152+msgstr "준비 중.. 잠시만 기다려 주세요..."
151153
152154#: qml/Hud/Hud.qml:89
153155msgid "Speak Now..."
154−msgstr ""
156+msgstr "지금 말하세요..."
155157
156158#: qml/Hud/Hud.qml:94
157159msgid "Speaking..."
158−msgstr ""
160+msgstr "말하는 중..."
159161
160162#: qml/Notifications/NotificationMenuItemFactory.qml:91
161163msgid "Show password"
162−msgstr ""
164+msgstr "비밀 번호 보기"
163165
164166#: qml/Notifications/NotificationMenuItemFactory.qml:103
165167msgid "Please enter SIM PIN"
166−msgstr ""
168+msgstr "심카드의 PIN 번호를 입력하세요."
167169
168170#: qml/Panel/Indicators/MenuItemFactory.qml:583
169171msgid "In queue…"
170−msgstr ""
172+msgstr "재생 중..."
171173
172174#: qml/Panel/Indicators/MenuItemFactory.qml:587
173175msgid "Downloading"
174−msgstr ""
176+msgstr "다운로드 중"
175177
176178#: qml/Panel/Indicators/MenuItemFactory.qml:589
177179msgid "Paused, tap to resume"
178−msgstr ""
180+msgstr "일시 중지 되었습니다. 계속하려면 누르세요."
179181
180182#: qml/Panel/Indicators/MenuItemFactory.qml:591
181183msgid "Canceled"
182−msgstr ""
184+msgstr "취소됨"
183185
184186#: qml/Panel/Indicators/MenuItemFactory.qml:593
185187msgid "Finished"
186−msgstr ""
188+msgstr "완료됨"
187189
188190#: qml/Panel/Indicators/MenuItemFactory.qml:595
189191msgid "Failed, tap to retry"
190−msgstr ""
192+msgstr "실패하였습니다. 재시도하려면 누르세요."
191193
192194#: qml/Panel/SearchIndicator.qml:27
193195msgid "Search"
@@ -196,4 +198,4 @@ msgstr "검색"
196198#: qml/Shell.qml:359
197199#, qt-format
198200msgid "Please enter %1"
199−msgstr ""
201+msgstr "%1 를 입력해주세요."
po/pt_BR.po+8−8
@@ -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: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-05-15 14:31+0000\n"
12−"Last-Translator: Rafael Neri <Unknown>\n"
11+"PO-Revision-Date: 2014-07-17 05:46+0000\n"
12+"Last-Translator: Tiago Hillebrandt <tiagohillebrandt@gmail.com>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
18+"X-Generator: Launchpad (build 17114)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,7 +82,7 @@ msgstr "Chamada de emergência"
8282
8383#: qml/Components/Lockscreen.qml:231
8484msgid "OK"
85−msgstr ""
85+msgstr "OK"
8686
8787#: qml/Components/PageHeader.qml:366
8888msgid "Recent searches"
@@ -99,7 +99,7 @@ msgstr "Olá"
9999
100100#: qml/Components/PinLockscreen.qml:198
101101msgid "CANCEL"
102−msgstr ""
102+msgstr "CANCELAR"
103103
104104#: qml/Components/PinLockscreen.qml:216
105105msgid "DONE"
@@ -175,7 +175,7 @@ msgstr ""
175175
176176#: qml/Panel/Indicators/MenuItemFactory.qml:587
177177msgid "Downloading"
178−msgstr ""
178+msgstr "Baixando"
179179
180180#: qml/Panel/Indicators/MenuItemFactory.qml:589
181181msgid "Paused, tap to resume"
@@ -183,7 +183,7 @@ msgstr ""
183183
184184#: qml/Panel/Indicators/MenuItemFactory.qml:591
185185msgid "Canceled"
186−msgstr ""
186+msgstr "Cancelado"
187187
188188#: qml/Panel/Indicators/MenuItemFactory.qml:593
189189msgid "Finished"
po/tr.po+14−14
@@ -8,23 +8,23 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-05-19 12:52+0000\n"
11+"PO-Revision-Date: 2014-07-16 17:58+0000\n"
1212"Last-Translator: Volkan Gezer <Unknown>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
18+"X-Generator: Launchpad (build 17114)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Kısayolu iğnele"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Kısayol iğnesini kaldır"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -81,7 +81,7 @@ msgstr "Acil Arama"
8181
8282#: qml/Components/Lockscreen.qml:231
8383msgid "OK"
84−msgstr ""
84+msgstr "Tamam"
8585
8686#: qml/Components/PageHeader.qml:366
8787msgid "Recent searches"
@@ -98,11 +98,11 @@ msgstr "Merhaba"
9898
9999#: qml/Components/PinLockscreen.qml:198
100100msgid "CANCEL"
101−msgstr ""
101+msgstr "İPTAL"
102102
103103#: qml/Components/PinLockscreen.qml:216
104104msgid "DONE"
105−msgstr ""
105+msgstr "BİTTİ"
106106
107107#: qml/Components/SeeMore.qml:35
108108msgid "See more"
@@ -170,27 +170,27 @@ msgstr "Lütfen SIM PIN'inizi girin"
170170
171171#: qml/Panel/Indicators/MenuItemFactory.qml:583
172172msgid "In queue…"
173−msgstr ""
173+msgstr "Beklemede..."
174174
175175#: qml/Panel/Indicators/MenuItemFactory.qml:587
176176msgid "Downloading"
177−msgstr ""
177+msgstr "İndiriliyor"
178178
179179#: qml/Panel/Indicators/MenuItemFactory.qml:589
180180msgid "Paused, tap to resume"
181−msgstr ""
181+msgstr "Duraklatıldı, devam etmek için dokunun"
182182
183183#: qml/Panel/Indicators/MenuItemFactory.qml:591
184184msgid "Canceled"
185−msgstr ""
185+msgstr "İptal edildi"
186186
187187#: qml/Panel/Indicators/MenuItemFactory.qml:593
188188msgid "Finished"
189−msgstr ""
189+msgstr "Bitti"
190190
191191#: qml/Panel/Indicators/MenuItemFactory.qml:595
192192msgid "Failed, tap to retry"
193−msgstr ""
193+msgstr "Başarısız, yeniden denemek için dokunun"
194194
195195#: qml/Panel/SearchIndicator.qml:27
196196msgid "Search"
qml/Notifications/Notification.qml+21−7
@@ -36,7 +36,7 @@ Item {
3636 property var hints
3737 property var notification
3838 property color color
39− property bool fullscreen
39+ property bool fullscreen: false
4040 property int maxHeight
4141 property int margins
4242 property Gradient greenGradient : Gradient {
@@ -48,7 +48,6 @@ Item {
4848 GradientStop { position: 1.0; color: "#4d4745" }
4949 }
5050
51− fullscreen: false
5251 objectName: "background"
5352 implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : contentColumn.height + contentColumn.spacing * 2) : 0
5453
@@ -80,7 +79,7 @@ Item {
8079 Audio {
8180 id: sound
8281 objectName: "sound"
83− source: hints["suppress-sound"] != "" ? hints["sound-file"] : undefined
82+ source: hints["suppress-sound"] != "true" && hints["sound-file"] != undefined ? hints["sound-file"] : ""
8483 }
8584
8685 onOpacityChanged: {
@@ -159,9 +158,17 @@ Item {
159158 UnityMenuModel {
160159 id: unityMenuModel
161160
161+ property string lastNameOwner: ""
162+
162163 busName: paths.busName
163164 actions: paths.actions
164165 menuObjectPath: paths.menuObjectPath
166+ onNameOwnerChanged: {
167+ if (lastNameOwner != "" && nameOwner == "" && notification.notification != undefined) {
168+ notification.notification.close()
169+ }
170+ lastNameOwner = nameOwner
171+ }
165172 }
166173
167174 Behavior on implicitHeight {
@@ -272,14 +279,18 @@ Item {
272279 }
273280
274281 Column {
282+ id: dialogColumn
275283 objectName: "dialogListView"
276284 spacing: units.gu(2)
277285
278286 visible: count > 0
279287
280− anchors.left: parent.left; anchors.right: parent.right
281− anchors.top: fullscreen ? parent.top : undefined
282− anchors.bottom: fullscreen ? parent.bottom : undefined
288+ anchors {
289+ left: parent.left
290+ right: parent.right
291+ top: fullscreen ? parent.top : undefined
292+ bottom: fullscreen ? parent.bottom : undefined
293+ }
283294
284295 Repeater {
285296 model: unityMenuModel
@@ -287,7 +298,10 @@ Item {
287298 NotificationMenuItemFactory {
288299 id: menuItemFactory
289300
290− anchors.left: parent.left; anchors.right: parent.right
301+ anchors {
302+ left: dialogColumn.left
303+ right: dialogColumn.right
304+ }
291305
292306 menuModel: unityMenuModel
293307 menuData: model
qml/Notifications/NotificationMenuItemFactory.qml+12−3
@@ -50,7 +50,10 @@ Loader {
5050 Column {
5151 spacing: units.gu(2)
5252
53− anchors.left: parent.left; anchors.right: parent.right
53+ anchors {
54+ left: parent.left
55+ right: parent.right
56+ }
5457
5558 Component.onCompleted: {
5659 menuModel.loadExtendedAttributes(menuIndex, {"x-echo-mode-password": "bool"});
@@ -67,7 +70,10 @@ Loader {
6770
6871 // TODO using Qt.ImhNoPredictiveText here until lp #1291575 is fixed for ubuntu-ui-toolkit
6972 inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText
70− anchors.left: parent.left; anchors.right: parent.right
73+ anchors {
74+ left: parent.left
75+ right: parent.right
76+ }
7177 echoMode: checkBox.checked ? TextInput.Normal : TextInput.Password
7278 height: units.gu(5)
7379 onTextChanged: {
@@ -98,7 +104,10 @@ Loader {
98104 id: pinLock
99105
100106 Lockscreen {
101− anchors.left: parent.left; anchors.right: parent.right
107+ anchors {
108+ left: parent.left
109+ right: parent.right
110+ }
102111 height: menuFactory.maxHeight
103112 placeholderText: i18n.tr("Please enter SIM PIN")
104113 background: shell.background
qml/Notifications/Notifications.qml+17−1
@@ -36,8 +36,11 @@ ListView {
3636 filterRole: UnityNotifications.ModelInterface.RoleType
3737 filterRegExp: RegExp(UnityNotifications.Notification.SnapDecision)
3838 }
39− spacing: delegate.fullscreen ? 0 : units.gu(.5)
4039
40+ property bool topmostIsFullscreen: false
41+ spacing: topmostIsFullscreen ? 0 : units.gu(.5)
42+
43+ // FIXME: This doesn't make any sense and results in a binding loop
4144 currentIndex: (currentIndex < 1 && count > 1) ? 1 : -1
4245
4346 delegate: Notification {
@@ -61,6 +64,19 @@ ListView {
6164 // make sure there's no opacity-difference between the several
6265 // elements in a notification
6366 layer.enabled: add.running || remove.running || populate.running
67+
68+ Component.onCompleted: {
69+ if (index == 1) {
70+ notificationList.topmostIsFullscreen = fullscreen
71+ }
72+ }
73+
74+ onFullscreenChanged: {
75+ // index 1 because 0 is the PlaceHolder...
76+ if (index == 1) {
77+ notificationList.topmostIsFullscreen = fullscreen
78+ }
79+ }
6480 }
6581
6682 populate: Transition {
qml/Shell.qml+200−2
@@ -19,6 +19,7 @@ import AccountsService 0.1
1919import GSettings 1.0
2020import Unity.Application 0.1
2121import Ubuntu.Components 0.1
22+import Ubuntu.Components.Popups 0.1
2223import Ubuntu.Gestures 0.1
2324import Unity.Launcher 0.1
2425import Utils 0.1
@@ -242,7 +243,128 @@ Item {
242243 }
243244 }
244245
246+ property bool dialogShown: false
247+
248+ Component {
249+ id: logoutDialog
250+ Dialog {
251+ id: dialogueLogout
252+ title: "Logout"
253+ text: "Are you sure that you want to logout?"
254+ Button {
255+ text: "Cancel"
256+ onClicked: {
257+ PopupUtils.close(dialogueLogout);
258+ stages.dialogShown = false;
259+ }
260+ }
261+ Button {
262+ text: "Yes"
263+ onClicked: {
264+ DBusUnitySessionService.Logout();
265+ PopupUtils.close(dialogueLogout);
266+ stages.dialogShown = false;
267+ }
268+ }
269+ }
270+ }
271+
272+ Component {
273+ id: shutdownDialog
274+ Dialog {
275+ id: dialogueShutdown
276+ title: "Shutdown"
277+ text: "Are you sure that you want to shutdown?"
278+ Button {
279+ text: "Cancel"
280+ onClicked: {
281+ PopupUtils.close(dialogueShutdown);
282+ stages.dialogShown = false;
283+ }
284+ }
285+ Button {
286+ text: "Yes"
287+ onClicked: {
288+ dBusUnitySessionServiceConnection.closeAllApps();
289+ DBusUnitySessionService.Shutdown();
290+ PopupUtils.close(dialogueShutdown);
291+ stages.dialogShown = false;
292+ }
293+ }
294+ }
295+ }
296+
297+ Component {
298+ id: rebootDialog
299+ Dialog {
300+ id: dialogueReboot
301+ title: "Reboot"
302+ text: "Are you sure that you want to reboot?"
303+ Button {
304+ text: "Cancel"
305+ onClicked: {
306+ PopupUtils.close(dialogueReboot)
307+ stages.dialogShown = false;
308+ }
309+ }
310+ Button {
311+ text: "Yes"
312+ onClicked: {
313+ dBusUnitySessionServiceConnection.closeAllApps();
314+ DBusUnitySessionService.Reboot();
315+ PopupUtils.close(dialogueReboot);
316+ stages.dialogShown = false;
317+ }
318+ }
319+ }
320+ }
321+
322+ Component {
323+ id: powerDialog
324+ Dialog {
325+ id: dialoguePower
326+ title: "Power"
327+ text: i18n.tr("Are you sure you would like to turn power off?")
328+ Button {
329+ text: i18n.tr("Power off")
330+ onClicked: {
331+ dBusUnitySessionServiceConnection.closeAllApps();
332+ PopupUtils.close(dialoguePower);
333+ stages.dialogShown = false;
334+ shutdownFadeOutRectangle.enabled = true;
335+ shutdownFadeOutRectangle.visible = true;
336+ shutdownFadeOut.start();
337+ }
338+ }
339+ Button {
340+ text: i18n.tr("Restart")
341+ onClicked: {
342+ dBusUnitySessionServiceConnection.closeAllApps();
343+ DBusUnitySessionService.Reboot();
344+ PopupUtils.close(dialoguePower);
345+ stages.dialogShown = false;
346+ }
347+ }
348+ Button {
349+ text: i18n.tr("Cancel")
350+ onClicked: {
351+ PopupUtils.close(dialoguePower);
352+ stages.dialogShown = false;
353+ }
354+ }
355+ }
356+ }
357+
358+ function showPowerDialog() {
359+ if (!stages.dialogShown) {
360+ stages.dialogShown = true;
361+ PopupUtils.open(powerDialog);
362+ }
363+ }
364+
245365 Connections {
366+ id: dBusUnitySessionServiceConnection
367+ objectName: "dBusUnitySessionServiceConnection"
246368 target: DBusUnitySessionService
247369
248370 function closeAllApps() {
@@ -256,8 +378,27 @@ Item {
256378 }
257379
258380 onLogoutRequested: {
259− // TODO: Display a dialog to ask the user to confirm.
260− DBusUnitySessionService.Logout();
381+ // Display a dialog to ask the user to confirm.
382+ if (!stages.dialogShown) {
383+ stages.dialogShown = true;
384+ PopupUtils.open(logoutDialog);
385+ }
386+ }
387+
388+ onShutdownRequested: {
389+ // Display a dialog to ask the user to confirm.
390+ if (!stages.dialogShown) {
391+ stages.dialogShown = true;
392+ PopupUtils.open(shutdownDialog);
393+ }
394+ }
395+
396+ onRebootRequested: {
397+ // Display a dialog to ask the user to confirm.
398+ if (!stages.dialogShown) {
399+ stages.dialogShown = true;
400+ PopupUtils.open(rebootDialog);
401+ }
261402 }
262403
263404 onLogoutReady: {
@@ -349,6 +490,8 @@ Item {
349490 Connections {
350491 target: LightDM.Greeter
351492
493+ onShowGreeter: greeter.show()
494+
352495 onShowPrompt: {
353496 if (LightDM.Users.count == 1) {
354497 // TODO: There's no better way for now to determine if its a PIN or a passphrase.
@@ -374,6 +517,12 @@ Item {
374517 }
375518 }
376519
520+ Binding {
521+ target: LightDM.Greeter
522+ property: "active"
523+ value: greeter.shown || lockscreen.shown
524+ }
525+
377526 Rectangle {
378527 anchors.fill: parent
379528 color: "black"
@@ -413,6 +562,9 @@ Item {
413562 onShownChanged: {
414563 if (shown) {
415564 lockscreen.reset();
565+ if (!LightDM.Greeter.promptless) {
566+ lockscreen.show();
567+ }
416568 // If there is only one user, we start authenticating with that one here.
417569 // If there are more users, the Greeter will handle that
418570 if (LightDM.Users.count == 1) {
@@ -613,4 +765,50 @@ Item {
613765 target: SessionBroadcast
614766 onShowHome: showHome()
615767 }
768+
769+ Keys.onPressed: {
770+ if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
771+ if (!powerKeyTimer.running) {
772+ powerKeyTimer.start();
773+ }
774+ event.accepted = true;
775+ }
776+ }
777+
778+ Keys.onReleased: {
779+ if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
780+ powerKeyTimer.stop();
781+ event.accepted = true;
782+ }
783+ }
784+
785+ Timer {
786+ id: powerKeyTimer
787+ interval: 2000
788+ repeat: false
789+ triggeredOnStart: false
790+
791+ onTriggered: {
792+ stages.showPowerDialog();
793+ }
794+ }
795+
796+ Rectangle {
797+ id: shutdownFadeOutRectangle
798+ enabled: false
799+ visible: false
800+ color: "black"
801+ anchors.fill: parent
802+ opacity: 0.0
803+ NumberAnimation on opacity {
804+ id: shutdownFadeOut
805+ from: 0.0
806+ to: 1.0
807+ onStopped: {
808+ if (shutdownFadeOutRectangle.enabled && shutdownFadeOutRectangle.visible) {
809+ DBusUnitySessionService.Shutdown();
810+ }
811+ }
812+ }
813+ }
616814}
tests/mocks/LightDM/CMakeLists.txt+1
@@ -18,6 +18,7 @@ include_directories(
1818)
1919
2020set(QMLPLUGIN_SRC
21+ ${CMAKE_SOURCE_DIR}/plugins/LightDM/DBusGreeter.cpp
2122 ${CMAKE_SOURCE_DIR}/plugins/LightDM/DBusGreeterList.cpp
2223 ${CMAKE_SOURCE_DIR}/plugins/LightDM/Greeter.cpp
2324 ${CMAKE_SOURCE_DIR}/plugins/LightDM/plugin.cpp
tests/mocks/Powerd/Powerd.qmltypes+6−13
@@ -15,19 +15,12 @@ Module {
1515 isSingleton: true
1616 exportMetaObjectRevisions: [0]
1717 Enum {
18− name: "DisplayFlag"
18+ name: "DisplayStateChangeReason"
1919 values: {
20− "UseProximity": 1,
21− "DisableAutoBrightness": 2,
22− "Bright": 4
23− }
24− }
25− Enum {
26− name: "DisplayFlags"
27− values: {
28− "UseProximity": 1,
29− "DisableAutoBrightness": 2,
30− "Bright": 4
20+ "Unknown": 0,
21+ "Inactivity": 1,
22+ "PowerKey": 2,
23+ "Proximity": 3
3124 }
3225 }
3326 Enum {
@@ -40,7 +33,7 @@ Module {
4033 Signal {
4134 name: "displayPowerStateChange"
4235 Parameter { name: "status"; type: "int" }
43− Parameter { name: "flags"; type: "uint" }
36+ Parameter { name: "reason"; type: "int" }
4437 }
4538 }
4639}
tests/mocks/Unity/Unity.qmltypes+10−2
@@ -89,6 +89,10 @@ Module {
8989 name: "loadDepartment"
9090 Parameter { name: "id"; type: "string" }
9191 }
92+ Method {
93+ name: "performQuery"
94+ Parameter { name: "query"; type: "string" }
95+ }
9296 }
9397 Component {
9498 name: "Scopes"
@@ -133,8 +137,8 @@ Module {
133137 "RoleRawRendererTemplate": 3,
134138 "RoleRenderer": 4,
135139 "RoleComponents": 5,
136− "RoleResults": 6,
137− "RoleCount": 7
140+ "RoleResults": 7,
141+ "RoleCount": 8
138142 }
139143 }
140144 Method {
@@ -179,6 +183,9 @@ Module {
179183 Component {
180184 name: "unity::shell::scopes::PreviewModelInterface"
181185 prototype: "QAbstractListModel"
186+ exports: ["Unity/PreviewModel 0.2"]
187+ isCreatable: false
188+ exportMetaObjectRevisions: [0]
182189 Enum {
183190 name: "Roles"
184191 values: {
@@ -272,6 +279,7 @@ Module {
272279 Property { name: "isActive"; type: "bool" }
273280 Property { name: "currentDepartmentId"; type: "string"; isReadonly: true }
274281 Property { name: "hasDepartments"; type: "bool"; isReadonly: true }
282+ Property { name: "customizations"; type: "QVariantMap"; isReadonly: true }
275283 Signal { name: "showDash" }
276284 Signal { name: "hideDash" }
277285 Signal {
tests/plugins/Dash/cardcreator/6.res+1
@@ -5,6 +5,7 @@ AbstractButton {
55 property var cardData;
66 property var artShapeBorderSource: undefined;
77 property real fontScale: 1.0;
8+ property var scopeStyle: null;
89 property int headerAlignment: Text.AlignLeft;
910 property int fixedHeaderHeight: -1;
1011 property size fixedArtShapeSize: Qt.size(-1, -1);
tests/plugins/LightDM/CMakeLists.txt+1−1
@@ -19,7 +19,7 @@ target_link_libraries(test-lightdm-dbus
1919
2020add_definitions(-DCURRENT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
2121
22−add_custom_target(testLightDMDBus dbus-launch env QML2_IMPORT_PATH=${CMAKE_BINARY_DIR}/tests/mocks LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full ${CMAKE_CURRENT_BINARY_DIR}/test-lightdm-dbus)
22+add_custom_target(testLightDMDBus xvfb-run --server-args "-screen 0 1024x768x24" --auto-servernum dbus-launch env QML2_IMPORT_PATH=${CMAKE_BINARY_DIR}/tests/mocks LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/full ${CMAKE_CURRENT_BINARY_DIR}/test-lightdm-dbus)
2323add_dependencies(testLightDMDBus test-lightdm-dbus)
2424
2525add_dependencies(qmluitests testLightDMDBus)
tests/plugins/LightDM/dbus.cpp+40
@@ -38,6 +38,13 @@ private Q_SLOTS:
3838 // SIGNAL method, because QtDBus doesn't know about PropertiesChanged.
3939 // So we connect the hard way for the benefit of any tests that want
4040 // to watch.
41+ QDBusConnection::sessionBus().connect(
42+ "com.canonical.UnityGreeter",
43+ "/",
44+ "org.freedesktop.DBus.Properties",
45+ "PropertiesChanged",
46+ this,
47+ SIGNAL(PropertiesChangedRelay(const QString&, const QVariantMap&, const QStringList&)));
4148 QDBusConnection::sessionBus().connect(
4249 "com.canonical.UnityGreeter",
4350 "/list",
@@ -57,6 +64,12 @@ private Q_SLOTS:
5764 view->show();
5865 QTest::qWaitForWindowExposed(view);
5966
67+ dbusMain = new QDBusInterface("com.canonical.UnityGreeter",
68+ "/",
69+ "com.canonical.UnityGreeter",
70+ QDBusConnection::sessionBus(), view);
71+ QVERIFY(dbusMain->isValid());
72+
6073 dbusList = new QDBusInterface("com.canonical.UnityGreeter",
6174 "/list",
6275 "com.canonical.UnityGreeter.List",
@@ -155,9 +168,36 @@ private Q_SLOTS:
155168 QVERIFY(arguments.at(1).toMap()["EntryIsLocked"] == false);
156169 }
157170
171+ void testIsActive()
172+ {
173+ QVERIFY(!greeter->isActive());
174+ QVERIFY(!dbusMain->property("IsActive").toBool());
175+
176+ QSignalSpy spy(this, SIGNAL(PropertiesChangedRelay(QString, QVariantMap, QStringList)));
177+ greeter->setIsActive(true);
178+ spy.wait();
179+
180+ QVERIFY(greeter->isActive());
181+ QVERIFY(dbusMain->property("IsActive").toBool());
182+
183+ QCOMPARE(spy.count(), 1);
184+ QList<QVariant> arguments = spy.takeFirst();
185+ QCOMPARE(arguments.at(0).toString(), QString("com.canonical.UnityGreeter"));
186+ QVERIFY(arguments.at(1).toMap().contains("IsActive"));
187+ QVERIFY(arguments.at(1).toMap()["IsActive"].toBool());
188+ }
189+
190+ void testShowGreeter()
191+ {
192+ // Just confirm the call exists and doesn't fail
193+ QDBusReply<void> reply = dbusMain->call("ShowGreeter");
194+ QVERIFY(reply.isValid());
195+ }
196+
158197private:
159198 QQuickView *view;
160199 Greeter *greeter;
200+ QDBusInterface *dbusMain;
161201 QDBusInterface *dbusList;
162202};
163203
tests/qmltests/Dash/tst_DashContent.qml+1
@@ -312,6 +312,7 @@ Item {
312312 compare(allButton.visible, true);
313313 compare(backButton.visible, true);
314314
315+ tryCompare(departmentListView, "contentX", departmentList1.x);
315316 waitForRendering(departmentListView);
316317 mouseClick(allButton, 0, 0);
317318 compare(dashDepartments.showList, false);
tests/qmltests/tst_Shell.qml+8
@@ -20,6 +20,7 @@
2020import QtQuick 2.0
2121import QtTest 1.0
2222import GSettings 1.0
23+import LightDM 0.1 as LightDM
2324import Unity.Application 0.1
2425import Unity.Test 0.1 as UT
2526import Powerd 0.1
@@ -520,5 +521,12 @@ Item {
520521 tryCompare(greeter, "showProgress", 0)
521522 waitUntilApplicationWindowIsFullyVisible()
522523 }
524+
525+ function test_showGreeterDBusCall() {
526+ var greeter = findChild(shell, "greeter")
527+ tryCompare(greeter, "showProgress", 0)
528+ LightDM.Greeter.showGreeter()
529+ tryCompare(greeter, "showProgress", 1)
530+ }
523531 }
524532}