17#include "DisplayConfigurationStorage.h"
20#include <QStandardPaths>
22#include <QJsonDocument>
27namespace miroil = miral;
30inline QString stringFromEdid(
const miroil::Edid& edid)
33 str += QString::fromStdString(edid.vendor);
34 str += QString(
"%1%2").arg(edid.product_code).arg(edid.serial_number);
36 for (
int i = 0; i < 4; i++) {
37 str += QString::fromStdString(edid.descriptors[i].string_value());
44DisplayConfigurationStorage::DisplayConfigurationStorage()
48void DisplayConfigurationStorage::save(
const miroil::DisplayId &displayId,
const miroil::DisplayConfigurationOptions &options)
50 const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral(
"/lomiri/");
51 QFile f(dbPath + stringFromEdid(displayId.edid) +
".edid");
54 if (options.used.is_set()) json.insert(
"used", options.used.value());
55 if (options.clone_output_index.is_set()) json.insert(
"clone_output_index",
static_cast<int>(options.clone_output_index.value()));
56 if (options.mode.is_set()) {
57 auto const& mode = options.mode.value();
59 QString sz(QString(
"%1x%2").arg(mode.size.width.as_int()).arg(mode.size.height.as_int()));
60 QJsonObject jsonMode({
62 {
"refresh_rate", mode.refresh_rate }
64 json.insert(
"mode", jsonMode);
66 if (options.orientation.is_set()) json.insert(
"orientation",
static_cast<int>(options.orientation.value()));
67 if (options.form_factor.is_set()) json.insert(
"form_factor",
static_cast<int>(options.form_factor.value()));
68 if (options.scale.is_set()) json.insert(
"scale", options.scale.value());
70 if (f.open(QIODevice::WriteOnly)) {
71 QJsonDocument saveDoc(json);
72 f.write(saveDoc.toJson());
76bool DisplayConfigurationStorage::load(
const miroil::DisplayId &displayId, miroil::DisplayConfigurationOptions &options)
const
78 const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral(
"/lomiri/");
79 QFile f(dbPath + stringFromEdid(displayId.edid) +
".edid");
81 if (f.open(QIODevice::ReadOnly)) {
82 QByteArray saveData = f.readAll();
83 QJsonDocument loadDoc(QJsonDocument::fromJson(saveData));
85 QJsonObject json(loadDoc.object());
86 if (json.contains(
"used")) options.used = json[
"used"].toBool();
87 if (json.contains(
"clone_output_index")) options.clone_output_index = json[
"clone_output_index"].toInt();
88 if (json.contains(
"mode")) {
89 QJsonObject jsonMode = json[
"mode"].toObject();
91 if (jsonMode.contains(
"size") && jsonMode.contains(
"refresh_rate")) {
92 QString sz(jsonMode[
"size"].toString());
93#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
94 QStringList geo = sz.split(
"x", Qt::SkipEmptyParts);
96 QStringList geo = sz.split(
"x", QString::SkipEmptyParts);
98 if (geo.count() == 2) {
99 miroil::DisplayConfigurationOptions::DisplayMode mode;
100 mode.size = mir::geometry::Size(geo[0].toInt(), geo[1].toInt());
101 mode.refresh_rate = jsonMode[
"refresh_rate"].toDouble();
106 if (json.contains(
"orientation")) options.orientation =
static_cast<MirOrientation
>(json[
"orientation"].toInt());
107 if (json.contains(
"form_factor")) options.form_factor =
static_cast<MirFormFactor
>(json[
"form_factor"].toInt());
108 if (json.contains(
"scale")) options.scale = json[
"form_factor"].toDouble();