17 #include "windowstatestorage.h"
19 #include <QtConcurrent>
21 #include <QFutureSynchronizer>
27 QMutex WindowStateStorage::s_mutex;
29 WindowStateStorage::WindowStateStorage(QObject *parent):
32 QString dbPath = QDir::homePath() +
"/.cache/unity8/";
33 m_db = QSqlDatabase::addDatabase(
"QSQLITE");
36 m_db.setDatabaseName(dbPath +
"windowstatestorage.sqlite");
40 WindowStateStorage::~WindowStateStorage()
42 QFutureSynchronizer<void> futureSync;
43 for (
int i = 0; i < m_asyncQueries.count(); ++i) {
44 futureSync.addFuture(m_asyncQueries[i]);
46 futureSync.waitForFinished();
50 void WindowStateStorage::saveGeometry(
const QString &windowId,
const QRect &rect)
52 QMutexLocker mutexLocker(&s_mutex);
54 QString queryString = QString(
"INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values ('%1', '%2', '%3', '%4', '%5');")
61 QFuture<void> future = QtConcurrent::run(executeAsyncQuery, queryString);
62 m_asyncQueries.append(future);
64 QFutureWatcher<void> *futureWatcher =
new QFutureWatcher<void>();
65 futureWatcher->setFuture(future);
66 connect(futureWatcher, &QFutureWatcher<void>::finished,
68 [=](){ m_asyncQueries.removeAll(futureWatcher->future());
69 futureWatcher->deleteLater(); });
72 void WindowStateStorage::executeAsyncQuery(
const QString &queryString)
74 QMutexLocker l(&s_mutex);
77 bool ok = query.exec(queryString);
79 qWarning() <<
"Error executing query" << queryString
80 <<
"Driver error:" << query.lastError().driverText()
81 <<
"Database error:" << query.lastError().databaseText();
85 QRect WindowStateStorage::getGeometry(
const QString &windowId,
const QRect &defaultValue)
87 QMutexLocker l(&s_mutex);
88 QString queryString = QString(
"SELECT * FROM geometry WHERE windowId = '%1';")
92 bool ok = query.exec(queryString);
94 qWarning() <<
"Error retrieving window state for" << windowId
95 <<
"Driver error:" << query.lastError().driverText()
96 <<
"Database error:" << query.lastError().databaseText();
102 return QRect(query.value(
"x").toInt(), query.value(
"y").toInt(), query.value(
"width").toInt(), query.value(
"height").toInt());
105 void WindowStateStorage::initdb()
109 qWarning() <<
"Error opening state database:" << m_db.lastError().driverText() << m_db.lastError().databaseText();
113 if (!m_db.tables().contains(
"geometry")) {
115 query.exec(
"CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);");