23
23
#include <mir/graphics/display_configuration.h>
24
24
#include <mir/server.h>
26
#if MIR_SERVER_VERSION < MIR_VERSION_NUMBER(0, 26, 0)
27
#include <mir/graphics/display_configuration_report.h>
29
26
#include <mir/graphics/display_configuration_observer.h>
30
27
#include <mir/observer_registrar.h>
33
29
#include <algorithm>
40
36
void miral::ActiveOutputsListener::advise_output_update(Output const& /*updated*/, Output const& /*original*/) {}
41
37
void miral::ActiveOutputsListener::advise_output_delete(Output const& /*output*/) {}
43
#if MIR_SERVER_VERSION < MIR_VERSION_NUMBER(0, 26, 0)
44
struct miral::ActiveOutputsMonitor::Self : mir::graphics::DisplayConfigurationReport
46
virtual void initial_configuration(mir::graphics::DisplayConfiguration const& configuration) override;
47
virtual void new_configuration(mir::graphics::DisplayConfiguration const& configuration) override;
50
std::vector<ActiveOutputsListener*> listeners;
51
std::vector<Output> outputs;
54
39
struct miral::ActiveOutputsMonitor::Self : mir::graphics::DisplayConfigurationObserver
56
41
void initial_configuration(std::shared_ptr<mir::graphics::DisplayConfiguration const> const& configuration) override;
110
94
std::lock_guard<decltype(self->mutex)> lock{self->mutex};
112
#if MIR_SERVER_VERSION < MIR_VERSION_NUMBER(0, 26, 0)
113
server.override_the_display_configuration_report([this]{ return self; });
115
96
server.add_pre_init_callback([this, &server]
116
97
{ server.the_display_configuration_observer_registrar()->register_interest(self); });
120
100
void miral::ActiveOutputsMonitor::process_outputs(
128
#if MIR_SERVER_VERSION < MIR_VERSION_NUMBER(0, 26, 0)
129
void miral::ActiveOutputsMonitor::Self::initial_configuration(mir::graphics::DisplayConfiguration const& configuration)
131
new_configuration(configuration);
134
108
void miral::ActiveOutputsMonitor::Self::initial_configuration(std::shared_ptr<mir::graphics::DisplayConfiguration const> const& configuration)
136
110
configuration_applied(configuration);
140
#if MIR_SERVER_VERSION < MIR_VERSION_NUMBER(0, 26, 0)
141
void miral::ActiveOutputsMonitor::Self::new_configuration(mir::graphics::DisplayConfiguration const& configuration)
143
std::lock_guard<decltype(mutex)> lock{mutex};
145
decltype(outputs) current_outputs;
147
for (auto const l : listeners)
148
l->advise_output_begin();
150
configuration.for_each_output([¤t_outputs, this](mir::graphics::DisplayConfigurationOutput const& output)
154
if (!o.connected() || !o.valid()) return;
156
auto op = find_if(begin(outputs), end(outputs), [&](Output const& oo) { return oo.is_same_output(o); });
158
if (op == end(outputs))
160
for (auto const l : listeners)
161
l->advise_output_create(o);
163
else if (!equivalent_display_area(o, *op))
165
for (auto const l : listeners)
166
l->advise_output_update(o, *op);
169
current_outputs.push_back(o);
172
for (auto const& o : outputs)
174
auto op = find_if(begin(current_outputs), end(current_outputs), [&](Output const& oo)
175
{ return oo.is_same_output(o); });
177
if (op == end(current_outputs))
178
for (auto const l : listeners)
179
l->advise_output_delete(o);
182
current_outputs.swap(outputs);
183
for (auto const l : listeners)
184
l->advise_output_end();
187
113
void miral::ActiveOutputsMonitor::Self::configuration_applied(std::shared_ptr<mir::graphics::DisplayConfiguration const> const& config)
189
115
std::lock_guard<decltype(mutex)> lock{mutex};