@@ -0,0 +1,93 @@
2+ * Copyright 2015 Canonical Ltd.
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.
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.
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/>.
17+#include "windowstatestorage.h"
19+#include <QtConcurrent>
26+QMutex WindowStateStorage::s_mutex;
28+WindowStateStorage::WindowStateStorage(QObject *parent):
31+ m_db = QSqlDatabase::addDatabase("QSQLITE");
32+ m_db.setDatabaseName(QDir::homePath() + "/.cache/unity8/windowstatestorage.sqlite");
36+void WindowStateStorage::saveGeometry(const QString &windowId, const QRect &rect)
38+ QString queryString = QString("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values ('%1', '%2', '%3', '%4', '%5');")
45+ QtConcurrent::run(executeAsyncQuery, queryString);
48+void WindowStateStorage::executeAsyncQuery(const QString &queryString)
50+ QMutexLocker l(&s_mutex);
53+ bool ok = query.exec(queryString);
55+ qWarning() << "Error saving window state."
56+ << "Driver error:" << query.lastError().driverText()
57+ << "Database error:" << query.lastError().databaseText();
61+QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue)
63+ QMutexLocker l(&s_mutex);
64+ QString queryString = QString("SELECT * FROM geometry WHERE windowId = '%1';")
68+ bool ok = query.exec(queryString);
70+ qWarning() << "Error retrieving window state for" << windowId
71+ << "Driver error:" << query.lastError().driverText()
72+ << "Database error:" << query.lastError().databaseText();
75+ if (!query.first()) {
78+ return QRect(query.value("x").toInt(), query.value("y").toInt(), query.value("width").toInt(), query.value("height").toInt());
81+void WindowStateStorage::initdb()
85+ qWarning() << "Error opening state database:" << m_db.lastError().driverText() << m_db.lastError().databaseText();
89+ if (!m_db.tables().contains("windowproperties")) {
91+ query.exec("CREATE TABLE IF NOT EXISTS geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);");