on xenial help sign in
display config storage
commitea49134400c0e2b61f674c2773c0d375dd8c27a5 authorNick Dedekind <nick.dedekind@canonical.com> dateMon 3 Apr 2017, 19:31 (10 years ago) parent27430d5
5 files changed+113−2
src/CMakeLists.txt+1 src/DisplayConfigurationStorage.cpp+90 src/DisplayConfigurationStorage.h+15 src/UnityApplication.cpp+6−1 tests/mocks/WindowManager/WindowManagerPlugin.cpp+1−1
src/CMakeLists.txt+1
@@ -30,6 +30,7 @@ set(SOURCE_FILES
3030 ApplicationArguments.cpp
3131 main.cpp
3232 CachingNetworkManagerFactory.cpp
33+ DisplayConfigurationStorage.cpp
3334 UnityApplication.cpp
3435 UnityCommandLineParser.cpp
3536 UnixSignalHandler.cpp
src/DisplayConfigurationStorage.cppnew file+90
@@ -0,0 +1,90 @@
1+#include "DisplayConfigurationStorage.h"
2+
3+#include <QFile>
4+#include <QStandardPaths>
5+#include <QJsonObject>
6+#include <QJsonDocument>
7+
8+namespace {
9+
10+inline QString stringFromEdid(const miral::Edid& edid)
11+{
12+ QString str;
13+ str += QString::fromStdString(edid.vendor);
14+ str += QString("%1%2").arg(edid.product_code).arg(edid.serial_number);
15+
16+ for (int i = 0; i < 4; i++) {
17+ str += QString::fromStdString(edid.descriptors[i].string_value());
18+ }
19+ return str;
20+}
21+
22+}
23+
24+DisplayConfigurationStorage::DisplayConfigurationStorage()
25+{
26+}
27+
28+void DisplayConfigurationStorage::save(const miral::DisplayId &displayId, const miral::DisplayConfigurationOptions &options)
29+{
30+ const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral("/unity8/");
31+ QFile f(dbPath + stringFromEdid(displayId.edid) + ".edid");
32+
33+ QJsonObject json;
34+ if (options.used.is_set()) json.insert("used", options.used.value());
35+ if (options.clone_output_index.is_set()) json.insert("clone_output_index", static_cast<int>(options.clone_output_index.value()));
36+ if (options.mode.is_set()) {
37+ auto const& mode = options.mode.value();
38+
39+ QString sz(QString("%1x%2").arg(mode.size.width.as_int()).arg(mode.size.height.as_int()));
40+ QJsonObject jsonMode({
41+ {"size", sz},
42+ {"refresh_rate", mode.refresh_rate }
43+ });
44+ json.insert("mode", jsonMode);
45+ }
46+ if (options.orientation.is_set()) json.insert("orientation", static_cast<int>(options.orientation.value()));
47+ if (options.form_factor.is_set()) json.insert("form_factor", static_cast<int>(options.form_factor.value()));
48+ if (options.scale.is_set()) json.insert("scale", options.scale.value());
49+
50+ if (f.open(QIODevice::WriteOnly)) {
51+ QJsonDocument saveDoc(json);
52+ f.write(saveDoc.toJson());
53+ }
54+}
55+
56+bool DisplayConfigurationStorage::load(const miral::DisplayId &displayId, miral::DisplayConfigurationOptions &options) const
57+{
58+ const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral("/unity8/");
59+ QFile f(dbPath + stringFromEdid(displayId.edid) + ".edid");
60+
61+ if (f.open(QIODevice::ReadOnly)) {
62+ QByteArray saveData = f.readAll();
63+ QJsonDocument loadDoc(QJsonDocument::fromJson(saveData));
64+
65+ QJsonObject json(loadDoc.object());
66+ if (json.contains("used")) options.used = json["used"].toBool();
67+ if (json.contains("clone_output_index")) options.clone_output_index = json["clone_output_index"].toInt();
68+ if (json.contains("mode")) {
69+ QJsonObject jsonMode = json["mode"].toObject();
70+
71+ if (jsonMode.contains("size") && jsonMode.contains("refresh_rate")) {
72+ QString sz(jsonMode["size"].toString());
73+ QStringList geo = sz.split("x", QString::SkipEmptyParts);
74+ if (geo.count() == 2) {
75+ miral::DisplayConfigurationOptions::DisplayMode mode;
76+ mode.size = mir::geometry::Size(geo[0].toInt(), geo[1].toInt());
77+ mode.refresh_rate = jsonMode["refresh_rate"].toDouble();
78+ options.mode = mode;
79+ }
80+ }
81+ }
82+ if (json.contains("orientation")) options.orientation = static_cast<MirOrientation>(json["orientation"].toInt());
83+ if (json.contains("form_factor")) options.form_factor = static_cast<MirFormFactor>(json["form_factor"].toInt());
84+ if (json.contains("scale")) options.scale = json["form_factor"].toDouble();
85+
86+ return true;
87+ }
88+
89+ return false;
90+}
src/DisplayConfigurationStorage.hnew file+15
@@ -0,0 +1,15 @@
1+#ifndef UNITY_DISPLAYCONFIGURATIONSTORAGE_H
2+#define UNITY_DISPLAYCONFIGURATIONSTORAGE_H
3+
4+#include <qtmir/miral/display_configuration_storage.h>
5+
6+class DisplayConfigurationStorage : public miral::DisplayConfigurationStorage
7+{
8+public:
9+ DisplayConfigurationStorage();
10+
11+ void save(const miral::DisplayId& displayId, const miral::DisplayConfigurationOptions& options) override;
12+ bool load(const miral::DisplayId& displayId, miral::DisplayConfigurationOptions& options) const override;
13+};
14+
15+#endif // UNITY_DISPLAYCONFIGURATIONSTORAGE_H
src/UnityApplication.cpp+6−1
@@ -30,19 +30,24 @@
3030// libandroid-properties
3131#include <hybris/properties/properties.h>
3232
33+// qtmir
34+#include <qtmir/displayconfigurationstorage.h>
35+
3336// local
3437#include <paths.h>
3538#include "CachingNetworkManagerFactory.h"
3639#include "UnityCommandLineParser.h"
3740#include "DebuggingController.h"
3841#include "WindowManagementPolicy.h"
42+#include "DisplayConfigurationStorage.h"
3943
4044#include <QDebug>
4145
4246
4347
4448UnityApplication::UnityApplication(int & argc, char ** argv)
45− : qtmir::MirServerApplication(argc, argv, { qtmir::SetWindowManagementPolicy<WindowManagementPolicy>() })
49+ : qtmir::MirServerApplication(argc, argv, { qtmir::SetWindowManagementPolicy<WindowManagementPolicy>(),
50+ qtmir::SetDisplayConfigurationStorage<DisplayConfigurationStorage>() })
4651 , m_qmlArgs(this)
4752{
4853 setApplicationName(QStringLiteral("unity8"));
tests/mocks/WindowManager/WindowManagerPlugin.cpp+1−1
@@ -72,7 +72,7 @@ void WindowManagerPlugin::registerTypes(const char *uri)
7272 qRegisterMetaType<Window*>("Window*");
7373 qRegisterMetaType<QAbstractListModel*>("QAbstractListModel*");
7474
75− qmlRegisterType<ScreenWindow>(uri, 1, 0, "ScreenWindow");
75+ qmlRegisterType<MockScreenWindow>(uri, 1, 0, "ScreenWindow");
7676 qmlRegisterRevision<QWindow,1>(uri, 1, 0);
7777
7878 qmlRegisterUncreatableType<WMScreen>(uri, 1, 0, "WMScreen", notInstantiatable);