on 2ef973e help sign in
12 files changed+43−67
since splitsnapshots
unifiedsplit
debian/control+1 plugins/Utils/windowstatestorage.cpp+13−31 plugins/Utils/windowstatestorage.h+1−7 qml/ApplicationMenus/ApplicationMenuItemFactory.qml+6−6 qml/Launcher/LauncherPanel.qml+1−1 qml/Stage/Stage.qml+2−2 qml/Stage/WindowDecoration.qml+5−6 tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.cpp+2−2 tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.h+1−1 tests/plugins/Utils/WindowStateStorageTest.cpp+1−1 tests/qmltests/Launcher/tst_Launcher.qml+4−4 tests/qmltests/Stage/ApplicationCheckBox.qml+6−6
debian/control+1
@@ -32,6 +32,7 @@ Build-Depends: cmake,
3232 libqmenumodel-dev (>= 0.2.12),
3333 libqtdbusmock1-dev (>= 0.7),
3434 libqtdbustest1-dev,
35+ libqt5sql5-sqlite,
3536 libqt5svg5-dev,
3637 libqt5xmlpatterns5-dev,
3738 libsystemsettings-dev,
plugins/Utils/windowstatestorage.cpp+13−31
@@ -18,7 +18,6 @@
1818
1919#include <QtConcurrent>
2020#include <QDebug>
21−#include <QFutureSynchronizer>
2221#include <QSqlQuery>
2322#include <QSqlError>
2423#include <QSqlResult>
@@ -33,24 +32,23 @@ inline QString sanitiseString(QString string) {
3332 .remove(QLatin1Char('\\'));
3433}
3534
36−WindowStateStorage::WindowStateStorage(QObject *parent):
35+WindowStateStorage::WindowStateStorage(const QString& dbName, QObject *parent):
3736 QObject(parent)
3837{
3938 const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral("/unity8/");
4039 m_db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"));
4140 QDir dir;
4241 dir.mkpath(dbPath);
43− m_db.setDatabaseName(dbPath + "windowstatestorage.sqlite");
42+ if (dbName != nullptr) {
43+ m_db.setDatabaseName(dbName);
44+ } else {
45+ m_db.setDatabaseName(dbPath + "windowstatestorage.sqlite");
46+ }
4447 initdb();
4548}
4649
4750WindowStateStorage::~WindowStateStorage()
4851{
49− QFutureSynchronizer<void> futureSync;
50− for (int i = 0; i < m_asyncQueries.count(); ++i) {
51− futureSync.addFuture(m_asyncQueries[i]);
52− }
53− futureSync.waitForFinished();
5452 m_db.close();
5553}
5654
@@ -110,19 +108,6 @@ int WindowStateStorage::getStage(const QString &appId, int defaultValue) const
110108 return query.value("stage").toInt();
111109}
112110
113−void WindowStateStorage::executeAsyncQuery(const QString &queryString)
114−{
115− QMutexLocker l(&s_mutex);
116− QSqlQuery query;
117−
118− bool ok = query.exec(queryString);
119− if (!ok) {
120− qWarning() << "Error executing query" << queryString
121− << "Driver error:" << query.lastError().driverText()
122− << "Database error:" << query.lastError().databaseText();
123− }
124−}
125−
126111QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue) const
127112{
128113 QString queryString = QStringLiteral("SELECT * FROM geometry WHERE windowId = '%1';")
@@ -171,16 +156,13 @@ void WindowStateStorage::initdb()
171156void WindowStateStorage::saveValue(const QString &queryString)
172157{
173158 QMutexLocker mutexLocker(&s_mutex);
174−
175− QFuture<void> future = QtConcurrent::run(&m_threadPool, executeAsyncQuery, queryString);
176− m_asyncQueries.append(future);
177−
178− QFutureWatcher<void> *futureWatcher = new QFutureWatcher<void>();
179− futureWatcher->setFuture(future);
180− connect(futureWatcher, &QFutureWatcher<void>::finished,
181− this,
182− [=](){ m_asyncQueries.removeAll(futureWatcher->future());
183− futureWatcher->deleteLater(); });
159+ QSqlQuery query;
160+ auto ok = query.exec(queryString);
161+ if (!ok) {
162+ qWarning() << "Error executing query" << queryString
163+ << "Driver error:" << query.lastError().driverText()
164+ << "Database error:" << query.lastError().databaseText();
165+ }
184166}
185167
186168QSqlQuery WindowStateStorage::getValue(const QString &queryString) const
plugins/Utils/windowstatestorage.h+1−7
@@ -17,8 +17,6 @@
1717#include <QObject>
1818#include <QSqlDatabase>
1919#include <QMutex>
20−#include <QFuture>
21−#include <QThreadPool>
2220
2321// unity-api
2422#include <unity/shell/application/Mir.h>
@@ -46,7 +44,7 @@ public:
4644 Q_DECLARE_FLAGS(WindowStates, WindowState)
4745 Q_FLAG(WindowStates)
4846
49− WindowStateStorage(QObject *parent = nullptr);
47+ WindowStateStorage(const QString& dbName = nullptr, QObject *parent = nullptr);
5048 virtual ~WindowStateStorage();
5149
5250 Q_INVOKABLE void saveState(const QString &windowId, WindowState state);
@@ -66,12 +64,8 @@ private:
6664 void saveValue(const QString &queryString);
6765 QSqlQuery getValue(const QString &queryString) const;
6866
69− static void executeAsyncQuery(const QString &queryString);
7067 static QMutex s_mutex;
7168
7269 // NB: This is accessed from threads. Make sure to mutex it.
7370 QSqlDatabase m_db;
74−
75− QList<QFuture<void>> m_asyncQueries;
76− QThreadPool m_threadPool;
7771};
qml/ApplicationMenus/ApplicationMenuItemFactory.qml+6−6
@@ -45,7 +45,7 @@ Object {
4545
4646 Action {
4747 id: action
48− text: menuData.label.replace("_", "&")
48+ text: menuData ? menuData.label.replace("_", "&") : ""
4949 }
5050
5151 ListItemLayout {
@@ -53,14 +53,14 @@ Object {
5353 title.text: action.text
5454
5555 Icon {
56− source: menuData && menuData.icon || ""
56+ source: menuData ? menuData.icon : ""
5757 SlotsLayout.position: SlotsLayout.Leading
5858 height: units.gu(3)
5959 }
6060
6161 Label {
62− text: menuData.shortcut
63− visible: menuData.shortcut && QuickUtils.keyboardAttached
62+ text: menuData ? menuData.shortcut : ""
63+ visible: menuData && menuData.shortcut && QuickUtils.keyboardAttached
6464 SlotsLayout.position: SlotsLayout.Trailing
6565 color: enabled ? theme.palette.normal.backgroundSecondaryText :
6666 theme.palette.disabled.backgroundSecondaryText
@@ -86,7 +86,7 @@ Object {
8686
8787 Action {
8888 id: action
89− text: menuData.label.replace("_", "&")
89+ text: menuData ? menuData.label.replace("_", "&") : ""
9090 }
9191
9292 ListItemLayout {
@@ -94,7 +94,7 @@ Object {
9494 title.text: action.text
9595
9696 Icon {
97− source: menuData && menuData.icon || ""
97+ source: menuData ? menuData.icon : ""
9898 SlotsLayout.position: SlotsLayout.Leading
9999 height: units.gu(3)
100100 }
qml/Launcher/LauncherPanel.qml+1−1
@@ -556,7 +556,7 @@ Rectangle {
556556
557557 function processPositionChanged(mouse) {
558558 if (draggedIndex >= 0) {
559− if (!selectedItem.dragging) {
559+ if (selectedItem && !selectedItem.dragging) {
560560 var distance = Math.max(Math.abs(mouse.x - startX), Math.abs(mouse.y - startY))
561561 if (!preDragging && distance > units.gu(1.5)) {
562562 preDragging = true;
qml/Stage/Stage.qml+2−2
@@ -2207,8 +2207,8 @@ FocusScope {
22072207 consumesInput: false
22082208 interactive: false
22092209 focus: false
2210− requestedWidth: appDelegate.requestedWidth
2211− requestedHeight: appDelegate.requestedHeight
2210+ requestedWidth: appDelegate ? appDelegate.requestedWidth : 0
2211+ requestedHeight: appDelegate ? appDelegate.requestedHeight : 0
22122212
22132213 width: units.gu(40)
22142214 height: units.gu(40)
qml/Stage/WindowDecoration.qml+5−6
@@ -99,13 +99,12 @@ MouseArea {
9999 spacing: units.gu(3)
100100
101101 WindowControlButtons {
102+ Layout.fillHeight: true
103+ Layout.fillWidth: false
104+ Layout.topMargin: units.gu(0.5)
105+ Layout.bottomMargin: units.gu(0.5)
106+
102107 id: buttons
103− anchors {
104− top: parent.top
105− bottom: parent.bottom
106− topMargin: units.gu(0.5)
107− bottomMargin: units.gu(0.5)
108− }
109108 active: root.active
110109 onCloseClicked: root.closeClicked();
111110 onMinimizeClicked: root.minimizeClicked();
tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.cpp+2−2
@@ -41,7 +41,7 @@ void MockApplicationMenuRegistry::RegisterSurfaceMenu(const QString &surface,
4141 service);
4242}
4343
44−void MockApplicationMenuRegistry::UnregisterSurfaceMenu(const QString &surfaceId, const QDBusObjectPath &menuObjectPath)
44+void MockApplicationMenuRegistry::UnregisterSurfaceMenu(const QString &surfaceId, const QString &menuObjectPath)
4545{
46− ApplicationMenuRegistry::UnregisterSurfaceMenu(surfaceId, menuObjectPath);
46+ ApplicationMenuRegistry::UnregisterSurfaceMenu(surfaceId, QDBusObjectPath(menuObjectPath));
4747}
tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.h+1−1
@@ -32,7 +32,7 @@ public:
3232 const QString &service);
3333
3434 Q_INVOKABLE void UnregisterSurfaceMenu(const QString &surfaceId,
35− const QDBusObjectPath &menuObjectPath);
35+ const QString &menuObjectPath);
3636
3737private:
3838 MockApplicationMenuRegistry(QObject *parent = 0);
tests/plugins/Utils/WindowStateStorageTest.cpp+1−1
@@ -30,7 +30,7 @@ private Q_SLOTS:
3030
3131 void init()
3232 {
33− storage = new WindowStateStorage(this);
33+ storage = new WindowStateStorage(":memory:", this);
3434 }
3535
3636 void cleanup()
tests/qmltests/Launcher/tst_Launcher.qml+4−4
@@ -1015,7 +1015,7 @@ Rectangle {
10151015 // Doing longpress
10161016 mousePress(clickedItem)
10171017 tryCompare(clickedItem, "itemOpacity", 0) // Wait for longpress to happen
1018− verify(quickList, "state", "open")
1018+ tryCompare(quickList, "state", "open")
10191019
10201020 launcher.hide();
10211021
@@ -1035,13 +1035,13 @@ Rectangle {
10351035 // Doing RMB click
10361036 mouseClick(clickedItem, clickedItem.width / 2, clickedItem.height / 2, Qt.RightButton)
10371037 tryCompare(quickListShape, "visible", true)
1038− verify(quickList, "state", "open")
1039− verify(dndArea, "dragging", false)
1038+ tryCompare(quickList, "state", "open")
1039+ tryCompare(dndArea, "dragging", false)
10401040
10411041 // Click somewhere in the empty space to dismiss the quicklist
10421042 mouseClick(launcher, launcher.width - units.gu(1), units.gu(1));
10431043 tryCompare(quickListShape, "visible", false);
1044− verify(quickList, "state", "")
1044+ tryCompare(quickList, "state", "")
10451045 }
10461046
10471047 function test_revealByEdgePush() {
tests/qmltests/Stage/ApplicationCheckBox.qml+6−6
@@ -95,11 +95,12 @@ Column {
9595 }
9696 }
9797 Label {
98+ Layout.alignment: Qt.AlignVCenter
9899 id: appIdLabel
99100 text: root.appId
100− anchors.verticalCenter: parent.verticalCenter
101101 }
102102 Rectangle {
103+ Layout.alignment: Qt.AlignVCenter
103104 color: {
104105 if (d.application) {
105106 if (d.application.state === ApplicationInfoInterface.Starting) {
@@ -117,13 +118,12 @@ Column {
117118 }
118119 width: height
119120 height: appIdLabel.height * 0.7
120− anchors.verticalCenter: parent.verticalCenter
121121 }
122122
123123 MouseArea {
124+ Layout.alignment: Qt.AlignVCenter
124125 width: height
125126 height: appIdLabel.height * 0.7
126− anchors.verticalCenter: parent.verticalCenter
127127 onClicked: root.createSurface()
128128 enabled: d.application && d.application.state === ApplicationInfoInterface.Running
129129 visible: enabled
@@ -146,16 +146,16 @@ Column {
146146 text: promptCount + " prompts"
147147 }
148148 MouseArea {
149+ Layout.alignment: Qt.AlignVCenter
149150 width: height
150151 height: promptsLabel.height * 0.7
151− anchors.verticalCenter: parent.verticalCenter
152152 onClicked: d.application.createPromptSurface()
153153 Label { text: "➕"; anchors.centerIn: parent }
154154 }
155155 MouseArea {
156+ Layout.alignment: Qt.AlignVCenter
156157 width: height
157158 height: promptsLabel.height * 0.7
158− anchors.verticalCenter: parent.verticalCenter
159159 onClicked: d.application.promptSurfaceList.get(0).close()
160160 enabled: d.application && d.application.promptSurfaceList.count > 0
161161 Label { text: "➖"; anchors.centerIn: parent; enabled: parent.enabled }
@@ -173,9 +173,9 @@ Column {
173173 text: "- " + model.surface.name
174174 }
175175 MouseArea {
176+ Layout.alignment: Qt.AlignVCenter
176177 width: height
177178 height: appIdLabel.height * 0.7
178− anchors.verticalCenter: parent.verticalCenter
179179 enabled: model.surface.live
180180 visible: enabled
181181 onClicked: model.surface.setLive(false);