Merge lp:~nick-dedekind/qtmir/miral-DisplayConfigurationStorage into lp:~unity-team/qtmir/miral-qt-integration

Proposed by Nick Dedekind
Status: Superseded
Proposed branch: lp:~nick-dedekind/qtmir/miral-DisplayConfigurationStorage
Merge into: lp:~unity-team/qtmir/miral-qt-integration
Prerequisite: lp:~nick-dedekind/qtmir/edid
Diff against target: 329 lines (+169/-19)
7 files modified
CMakeLists.txt (+2/-2)
debian/control (+3/-3)
src/platforms/mirserver/miral/CMakeLists.txt (+1/-0)
src/platforms/mirserver/miral/display_configuration_storage.h (+52/-0)
src/platforms/mirserver/miral/persist_display_config.cpp (+91/-11)
src/platforms/mirserver/miral/persist_display_config.h (+7/-2)
src/platforms/mirserver/qmirserver_p.cpp (+13/-1)
To merge this branch: bzr merge lp:~nick-dedekind/qtmir/miral-DisplayConfigurationStorage
Reviewer Review Type Date Requested Status
Alan Griffiths Needs Resubmitting
Review via email: mp+312693@code.launchpad.net

This proposal has been superseded by a proposal from 2017-01-25.

Commit message

Added interface for saving/loading display configuration output options.

Description of the change

Pass responsibility for display configuration storage to an overridable interface.

To post a comment you must log in.
595. By Nick Dedekind

better storage options

596. By Nick Dedekind

cleanup

597. By Nick Dedekind

clone_of->clone_of_output_index

598. By Nick Dedekind

clone_of_output_index->clone_output_index

599. By Nick Dedekind

merged edid

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

+ conf.for_each_output([this, &conf](mg::UserDisplayConfigurationOutput& output) {
...
default_policy.apply_to(conf);

First apply any saved configuration and then overwrite that with the default policy. Is this the right behaviour?

review: Needs Information
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

- miral::Application applicationFor(qtmir::PromptSession const &promptSession) const;
+ ::miral::Application applicationFor(qtmir::PromptSession const &promptSession) const;

This (and similar changes elsewhere) shouldn't be needed now.

600. By Nick Dedekind

merged parent

601. By Nick Dedekind

moved default apply before load

602. By Nick Dedekind

removed ::miral

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

The target branch has landed, the pre-requisite has been rebased.

review: Needs Resubmitting
603. By Nick Dedekind

merged pre-req

604. By Nick Dedekind

merged with pre-req

605. By Nick Dedekind

merged with prereq

606. By Nick Dedekind

merged with prereq

607. By Nick Dedekind

review comments

608. By Nick Dedekind

removed mir 0.26 version check

609. By Nick Dedekind

merged parent

610. By Nick Dedekind

added check for ouput.connected to load/save config

611. By Nick Dedekind

print error on failed EDID parse

612. By Nick Dedekind

more info for identifying a display

613. By Nick Dedekind

merged with trunk

614. By Nick Dedekind

merged trunk

615. By Nick Dedekind

miral 1.3.1 compat

616. By Nick Dedekind

merged trunk

617. By Nick Dedekind

merged trunk

618. By Nick Dedekind

merged with trunk

Unmerged revisions

618. By Nick Dedekind

merged with trunk

617. By Nick Dedekind

merged trunk

616. By Nick Dedekind

merged trunk

615. By Nick Dedekind

miral 1.3.1 compat

614. By Nick Dedekind

merged trunk

613. By Nick Dedekind

merged with trunk

612. By Nick Dedekind

more info for identifying a display

611. By Nick Dedekind

print error on failed EDID parse

610. By Nick Dedekind

added check for ouput.connected to load/save config

609. By Nick Dedekind

merged parent

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2017-01-06 12:00:57 +0000
3+++ CMakeLists.txt 2017-01-06 12:00:58 +0000
4@@ -71,8 +71,8 @@
5
6 find_package(Threads REQUIRED)
7
8-pkg_check_modules(MIRSERVER mirserver>=0.25 REQUIRED)
9-pkg_check_modules(MIRCLIENT mirclient>=0.25 REQUIRED)
10+pkg_check_modules(MIRSERVER mirserver>=0.26 REQUIRED)
11+pkg_check_modules(MIRCLIENT mirclient>=0.26 REQUIRED)
12 pkg_check_modules(MIRRENDERERGLDEV mir-renderer-gl-dev>=0.24 REQUIRED)
13 pkg_check_modules(MIRAL miral>=0.4 REQUIRED)
14
15
16=== modified file 'debian/control'
17--- debian/control 2016-12-13 15:51:14 +0000
18+++ debian/control 2017-01-06 12:00:58 +0000
19@@ -14,9 +14,9 @@
20 libgsettings-qt-dev,
21 liblttng-ust-dev,
22 libmiral-dev (>= 0.4),
23- libmirclient-dev (>= 0.25.0),
24- libmircommon-dev (>= 0.25.0),
25- libmirserver-dev (>= 0.25.0),
26+ libmirclient-dev (>= 0.26.0),
27+ libmircommon-dev (>= 0.26.0),
28+ libmirserver-dev (>= 0.26.0),
29 libmtdev-dev,
30 libprocess-cpp-dev,
31 libqt5sensors5-dev,
32
33=== modified file 'src/platforms/mirserver/miral/CMakeLists.txt'
34--- src/platforms/mirserver/miral/CMakeLists.txt 2017-01-06 12:00:57 +0000
35+++ src/platforms/mirserver/miral/CMakeLists.txt 2017-01-06 12:00:58 +0000
36@@ -2,5 +2,6 @@
37
38 add_library(miral-prototypes OBJECT
39 edid.cpp edid.h
40+ display_configuration_storage.h
41 persist_display_config.cpp persist_display_config.h
42 )
43
44=== added file 'src/platforms/mirserver/miral/display_configuration_storage.h'
45--- src/platforms/mirserver/miral/display_configuration_storage.h 1970-01-01 00:00:00 +0000
46+++ src/platforms/mirserver/miral/display_configuration_storage.h 2017-01-06 12:00:58 +0000
47@@ -0,0 +1,52 @@
48+/*
49+ * Copyright © 2016 Canonical Ltd.
50+ *
51+ * This program is free software: you can redistribute it and/or modify it
52+ * under the terms of the GNU General Public License version 3,
53+ * as published by the Free Software Foundation.
54+ *
55+ * This program is distributed in the hope that it will be useful,
56+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
57+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
58+ * GNU General Public License for more details.
59+ *
60+ * You should have received a copy of the GNU General Public License
61+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
62+ *
63+ * Authored by: Nick Dedekind <nick.dedekind@canonical.com>
64+ */
65+
66+#ifndef MIRAL_DISPLAY_CONFIGURATION_STORAGE_H
67+#define MIRAL_DISPLAY_CONFIGURATION_STORAGE_H
68+
69+#include "mir/geometry/rectangle.h"
70+#include "mir/optional_value.h"
71+#include "mir_toolkit/common.h"
72+
73+// Prototyping namespace for later incorporation in MirAL
74+namespace miral
75+{
76+class Edid;
77+
78+struct DisplayOutputOptions
79+{
80+ mir::optional_value<bool> used;
81+ mir::optional_value<uint> clone_output_index;
82+ mir::optional_value<mir::geometry::Size> size;
83+ mir::optional_value<MirOrientation> orientation;
84+ mir::optional_value<MirFormFactor> form_factor;
85+ mir::optional_value<float> scale;
86+};
87+
88+class DisplayConfigurationStorage
89+{
90+public:
91+ virtual ~DisplayConfigurationStorage() = default;
92+
93+ virtual void save(const Edid&, const DisplayOutputOptions&) = 0;
94+ virtual bool load(const Edid&, DisplayOutputOptions&) const = 0;
95+};
96+
97+}
98+
99+#endif // MIRAL_DISPLAY_CONFIGURATION_STORAGE_H
100
101=== modified file 'src/platforms/mirserver/miral/persist_display_config.cpp'
102--- src/platforms/mirserver/miral/persist_display_config.cpp 2017-01-06 12:00:57 +0000
103+++ src/platforms/mirserver/miral/persist_display_config.cpp 2017-01-06 12:00:58 +0000
104@@ -17,8 +17,11 @@
105 */
106
107 #include "persist_display_config.h"
108+#include "display_configuration_storage.h"
109+#include "edid.h"
110
111 #include <mir/graphics/display_configuration_policy.h>
112+#include <mir/graphics/display_configuration.h>
113 #include <mir/server.h>
114 #include <mir/version.h>
115
116@@ -33,13 +36,16 @@
117 {
118 struct PersistDisplayConfigPolicy
119 {
120- PersistDisplayConfigPolicy() = default;
121+ PersistDisplayConfigPolicy(std::shared_ptr<miral::DisplayConfigurationStorage> const& storage) :
122+ storage(storage) {}
123 virtual ~PersistDisplayConfigPolicy() = default;
124 PersistDisplayConfigPolicy(PersistDisplayConfigPolicy const&) = delete;
125 auto operator=(PersistDisplayConfigPolicy const&) -> PersistDisplayConfigPolicy& = delete;
126
127 void apply_to(mg::DisplayConfiguration& conf, mg::DisplayConfigurationPolicy& default_policy);
128 void save_config(mg::DisplayConfiguration const& base_conf);
129+
130+ std::shared_ptr<miral::DisplayConfigurationStorage> storage;
131 };
132
133 struct DisplayConfigurationPolicyAdapter : mg::DisplayConfigurationPolicy
134@@ -81,8 +87,11 @@
135
136 struct miral::PersistDisplayConfig::Self : PersistDisplayConfigPolicy, DisplayConfigurationObserver
137 {
138- Self() = default;
139- Self(DisplayConfigurationPolicyWrapper const& custom_wrapper) :
140+ Self(std::shared_ptr<DisplayConfigurationStorage> const& storage) :
141+ PersistDisplayConfigPolicy(storage) {}
142+ Self(std::shared_ptr<DisplayConfigurationStorage> const& storage,
143+ DisplayConfigurationPolicyWrapper const& custom_wrapper) :
144+ PersistDisplayConfigPolicy(storage),
145 custom_wrapper{custom_wrapper} {}
146
147 DisplayConfigurationPolicyWrapper const custom_wrapper =
148@@ -96,13 +105,14 @@
149 #endif
150 };
151
152-miral::PersistDisplayConfig::PersistDisplayConfig() :
153- self{std::make_shared<Self>()}
154+miral::PersistDisplayConfig::PersistDisplayConfig(std::shared_ptr<DisplayConfigurationStorage> const& storage) :
155+ self{std::make_shared<Self>(storage)}
156 {
157 }
158
159-miral::PersistDisplayConfig::PersistDisplayConfig(DisplayConfigurationPolicyWrapper const& custom_wrapper) :
160- self{std::make_shared<Self>(custom_wrapper)}
161+miral::PersistDisplayConfig::PersistDisplayConfig(std::shared_ptr<DisplayConfigurationStorage> const& storage,
162+ DisplayConfigurationPolicyWrapper const& custom_wrapper) :
163+ self{std::make_shared<Self>(storage, custom_wrapper)}
164 {
165 }
166
167@@ -136,12 +146,82 @@
168 mg::DisplayConfiguration& conf,
169 mg::DisplayConfigurationPolicy& default_policy)
170 {
171- // TODO if the h/w profile (by some definition) has changed, then apply corresponding saved config (if any).
172- // TODO Otherwise...
173 default_policy.apply_to(conf);
174+
175+ if (!storage) return;
176+
177+ conf.for_each_output([this, &conf](mg::UserDisplayConfigurationOutput& output) {
178+
179+ try {
180+ miral::Edid edid;
181+ edid.parse_data(reinterpret_cast<std::vector<uint8_t> const&>(output.edid));
182+
183+ // TODO if the h/w profile (by some definition) has changed, then apply corresponding saved config (if any).
184+ // TODO Otherwise...
185+
186+ miral::DisplayOutputOptions config;
187+ if (storage->load(edid, config)) {
188+
189+ if (config.size.is_set()) {
190+ int mode_index = output.current_mode_index;
191+ int i = 0;
192+ // Find the mode index which supports the saved size.
193+ for(auto iter = output.modes.cbegin(); iter != output.modes.cend(); ++iter, i++) {
194+ if ((*iter).size == config.size.value()) {
195+ mode_index = i;
196+ }
197+ }
198+ output.current_mode_index = mode_index;
199+ }
200+
201+ uint output_index = 0;
202+ conf.for_each_output([this, &output, config, &output_index](mg::DisplayConfigurationOutput const& find_output) {
203+ if (output_index == config.clone_output_index.value()) {
204+ output.top_left = find_output.top_left;
205+ }
206+ output_index++;
207+ });
208+
209+ if (config.orientation.is_set()) {output.orientation = config.orientation.value(); }
210+ if (config.used.is_set()) {output.used = config.used.value(); }
211+ if (config.form_factor.is_set()) {output.form_factor = config.form_factor.value(); }
212+ if (config.scale.is_set()) {output.scale = config.scale.value(); }
213+ }
214+ } catch (std::runtime_error const&) {
215+ }
216+ });
217 }
218
219-void PersistDisplayConfigPolicy::save_config(mg::DisplayConfiguration const& /*base_conf*/)
220+void PersistDisplayConfigPolicy::save_config(mg::DisplayConfiguration const& conf)
221 {
222- // TODO save display config options against the h/w profile
223+ if (!storage) return;
224+
225+ conf.for_each_output([this, &conf](mg::DisplayConfigurationOutput const& output) {
226+
227+ try {
228+ miral::Edid edid;
229+ // FIXME - output.edid should be std::vector<uint8_t>, not std::vector<uint8_t const>
230+ edid.parse_data(reinterpret_cast<std::vector<uint8_t> const&>(output.edid));
231+
232+ miral::DisplayOutputOptions config;
233+
234+ uint output_index = 0;
235+ conf.for_each_output([this, output, &config, &output_index](mg::DisplayConfigurationOutput const& find_output) {
236+ if (!config.clone_output_index.is_set() && output.top_left == find_output.top_left) {
237+ config.clone_output_index = output_index;
238+ }
239+ output_index++;
240+ });
241+
242+ config.size = output.extents().size;
243+ config.form_factor = output.form_factor;
244+ config.orientation = output.orientation;
245+ config.scale = output.scale;
246+ config.used = output.used;
247+
248+ storage->save(edid, config);
249+ } catch (std::runtime_error const&) {
250+
251+ }
252+ });
253 }
254
255=== modified file 'src/platforms/mirserver/miral/persist_display_config.h'
256--- src/platforms/mirserver/miral/persist_display_config.h 2017-01-06 12:00:57 +0000
257+++ src/platforms/mirserver/miral/persist_display_config.h 2017-01-06 12:00:58 +0000
258@@ -27,11 +27,13 @@
259 // Prototyping namespace for later incorporation in MirAL
260 namespace miral
261 {
262+class DisplayConfigurationStorage;
263+
264 /// Restores the saved display configuration and saves changes to the base configuration
265 class PersistDisplayConfig
266 {
267 public:
268- PersistDisplayConfig();
269+ PersistDisplayConfig(std::shared_ptr<DisplayConfigurationStorage> const& storage);
270 ~PersistDisplayConfig();
271 PersistDisplayConfig(PersistDisplayConfig const&);
272 auto operator=(PersistDisplayConfig const&) -> PersistDisplayConfig&;
273@@ -39,7 +41,9 @@
274 // TODO factor this out better
275 using DisplayConfigurationPolicyWrapper =
276 std::function<std::shared_ptr<mir::graphics::DisplayConfigurationPolicy>(const std::shared_ptr<mir::graphics::DisplayConfigurationPolicy> &wrapped)>;
277- PersistDisplayConfig(DisplayConfigurationPolicyWrapper const& custom_wrapper);
278+
279+ PersistDisplayConfig(std::shared_ptr<DisplayConfigurationStorage> const& storage,
280+ DisplayConfigurationPolicyWrapper const& custom_wrapper);
281
282 void operator()(mir::Server& server);
283
284@@ -47,6 +51,7 @@
285 struct Self;
286 std::shared_ptr<Self> self;
287 };
288+
289 }
290
291 #endif //MIRAL_PERSIST_DISPLAY_CONFIG_H
292
293=== modified file 'src/platforms/mirserver/qmirserver_p.cpp'
294--- src/platforms/mirserver/qmirserver_p.cpp 2017-01-06 12:00:57 +0000
295+++ src/platforms/mirserver/qmirserver_p.cpp 2017-01-06 12:00:58 +0000
296@@ -15,6 +15,7 @@
297 */
298
299 #include "qmirserver_p.h"
300+#include "miral/display_configuration_storage.h"
301
302 // local
303 #include "logging.h"
304@@ -37,6 +38,16 @@
305 #include <QCoreApplication>
306 #include <QOpenGLContext>
307
308+namespace
309+{
310+struct DefaultDisplayConfigurationStorage : miral::DisplayConfigurationStorage
311+{
312+ void save(const miral::Edid&, const miral::DisplayOutputOptions&) override {}
313+
314+ bool load(const miral::Edid&, miral::DisplayOutputOptions&) const override { return false; }
315+};
316+}
317+
318 void MirServerThread::run()
319 {
320 auto start_callback = [this]
321@@ -141,7 +152,8 @@
322 addInitCallback,
323 qtmir::SetQtCompositor{screensModel},
324 setTerminator,
325- miral::PersistDisplayConfig{&qtmir::wrapDisplayConfigurationPolicy}
326+ miral::PersistDisplayConfig{std::make_shared<DefaultDisplayConfigurationStorage>(),
327+ &qtmir::wrapDisplayConfigurationPolicy}
328 });
329 }
330

Subscribers

People subscribed via source and target branches