17 #include "windowstatestorage.h" 19 #include <QtConcurrent> 25 #include <unity/shell/application/ApplicationInfoInterface.h> 27 QMutex WindowStateStorage::s_mutex;
29 inline QString sanitiseString(QString
string) {
30 return string.remove(QLatin1Char(
'\"'))
31 .remove(QLatin1Char(
'\''))
32 .remove(QLatin1Char(
'\\'));
35 WindowStateStorage::WindowStateStorage(
const QString& dbName, QObject *parent):
38 const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral(
"/unity8/");
39 m_db = QSqlDatabase::addDatabase(QStringLiteral(
"QSQLITE"));
42 if (dbName !=
nullptr) {
43 m_db.setDatabaseName(dbName);
45 m_db.setDatabaseName(dbPath +
"windowstatestorage.sqlite");
50 WindowStateStorage::~WindowStateStorage()
55 void WindowStateStorage::saveState(
const QString &windowId, WindowStateStorage::WindowState state)
57 const QString queryString = QStringLiteral(
"INSERT OR REPLACE INTO state (windowId, state) values ('%1', '%2');")
58 .arg(sanitiseString(windowId))
61 saveValue(queryString);
64 WindowStateStorage::WindowState WindowStateStorage::getState(
const QString &windowId, WindowStateStorage::WindowState defaultValue)
const 66 const QString queryString = QStringLiteral(
"SELECT state FROM state WHERE windowId = '%1';")
67 .arg(sanitiseString(windowId));
69 QSqlQuery query = getValue(queryString);
74 return (WindowState)query.value(QStringLiteral(
"state")).toInt();
77 void WindowStateStorage::saveGeometry(
const QString &windowId,
const QRect &rect)
79 const QString queryString = QStringLiteral(
"INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values ('%1', '%2', '%3', '%4', '%5');")
80 .arg(sanitiseString(windowId))
86 saveValue(queryString);
89 void WindowStateStorage::saveStage(
const QString &appId,
int stage)
91 const QString queryString = QStringLiteral(
"INSERT OR REPLACE INTO stage (appId, stage) values ('%1', '%2');")
92 .arg(sanitiseString(appId))
95 saveValue(queryString);
98 int WindowStateStorage::getStage(
const QString &appId,
int defaultValue)
const 100 const QString queryString = QStringLiteral(
"SELECT stage FROM stage WHERE appId = '%1';")
101 .arg(sanitiseString(appId));
103 QSqlQuery query = getValue(queryString);
105 if (!query.first()) {
108 return query.value(
"stage").toInt();
111 QRect WindowStateStorage::getGeometry(
const QString &windowId,
const QRect &defaultValue)
const 113 QString queryString = QStringLiteral(
"SELECT * FROM geometry WHERE windowId = '%1';")
114 .arg(sanitiseString(windowId));
116 QSqlQuery query = getValue(queryString);
118 if (!query.first()) {
122 const QRect result(query.value(QStringLiteral(
"x")).toInt(), query.value(QStringLiteral(
"y")).toInt(),
123 query.value(QStringLiteral(
"width")).toInt(), query.value(QStringLiteral(
"height")).toInt());
125 if (result.isValid()) {
132 void WindowStateStorage::initdb()
136 qWarning() <<
"Error opening state database:" << m_db.lastError().driverText() << m_db.lastError().databaseText();
140 if (!m_db.tables().contains(QStringLiteral(
"geometry"))) {
142 query.exec(QStringLiteral(
"CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);"));
145 if (!m_db.tables().contains(QStringLiteral(
"state"))) {
147 query.exec(QStringLiteral(
"CREATE TABLE state(windowId TEXT UNIQUE, state INTEGER);"));
150 if (!m_db.tables().contains(QStringLiteral(
"stage"))) {
152 query.exec(QStringLiteral(
"CREATE TABLE stage(appId TEXT UNIQUE, stage INTEGER);"));
156 void WindowStateStorage::saveValue(
const QString &queryString)
158 QMutexLocker mutexLocker(&s_mutex);
160 auto ok = query.exec(queryString);
162 qWarning() <<
"Error executing query" << queryString
163 <<
"Driver error:" << query.lastError().driverText()
164 <<
"Database error:" << query.lastError().databaseText();
168 QSqlQuery WindowStateStorage::getValue(
const QString &queryString)
const 170 QMutexLocker l(&s_mutex);
173 bool ok = query.exec(queryString);
175 qWarning() <<
"Error retrieving database query:" << queryString
176 <<
"Driver error:" << query.lastError().driverText()
177 <<
"Database error:" << query.lastError().databaseText();
182 Mir::State WindowStateStorage::toMirState(WindowState state)
const 186 case WindowStateMaximized:
return Mir::MaximizedState;
187 case WindowStateMinimized:
return Mir::MinimizedState;
188 case WindowStateFullscreen:
return Mir::FullscreenState;
189 case WindowStateMaximizedLeft:
return Mir::MaximizedLeftState;
190 case WindowStateMaximizedRight:
return Mir::MaximizedRightState;
191 case WindowStateMaximizedHorizontally:
return Mir::HorizMaximizedState;
192 case WindowStateMaximizedVertically:
return Mir::VertMaximizedState;
193 case WindowStateMaximizedTopLeft:
return Mir::MaximizedTopLeftState;
194 case WindowStateMaximizedTopRight:
return Mir::MaximizedTopRightState;
195 case WindowStateMaximizedBottomLeft:
return Mir::MaximizedBottomLeftState;
196 case WindowStateMaximizedBottomRight:
return Mir::MaximizedBottomRightState;
198 case WindowStateNormal:
199 case WindowStateRestored:
201 return Mir::RestoredState;