24
24
#include "mir/compositor/compositor.h"
25
25
#include "mir/graphics/display_configuration_policy.h"
26
26
#include "mir/graphics/display_configuration.h"
27
#include "mir/graphics/display_configuration_report.h"
27
28
#include "mir/server_action_queue.h"
31
30
namespace mf = mir::frontend;
32
31
namespace ms = mir::scene;
58
57
std::function<void()> const revert;
61
void log_configuration(mg::DisplayConfiguration const& conf)
63
conf.for_each_output([](mg::DisplayConfigurationOutput const& out)
65
static const char* const type_str[] =
66
{"Unknown", "VGA", "DVI-I", "DVI-D", "DVI-A", "Composite",
67
"S-Video", "LVDS", "Component", "9-pin-DIN", "DisplayPort",
68
"HDMI-A", "HDMI-B", "TV", "eDP"};
69
auto type = type_str[static_cast<int>(out.type)];
70
int out_id = out.id.as_value();
71
int card_id = out.card_id.as_value();
72
const char prefix[] = " ";
76
int width_mm = out.physical_size_mm.width.as_int();
77
int height_mm = out.physical_size_mm.height.as_int();
79
sqrtf(width_mm * width_mm + height_mm * height_mm) / 25.4;
81
mir::log_info("%s%d.%d: %n%s %.1f\" %dx%dmm",
82
prefix, card_id, out_id, &indent, type,
83
inches, width_mm, height_mm);
86
if (out.current_mode_index < out.modes.size())
88
auto const& mode = out.modes[out.current_mode_index];
89
mir::log_info("%*cCurrent mode %dx%d %.2fHz",
91
mode.size.width.as_int(),
92
mode.size.height.as_int(),
95
if (out.preferred_mode_index < out.modes.size())
97
auto const& mode = out.modes[out.preferred_mode_index];
98
mir::log_info("%*cPreferred mode %dx%d %.2fHz",
100
mode.size.width.as_int(),
101
mode.size.height.as_int(),
104
mir::log_info("%*cLogical position %+d%+d",
106
out.top_left.x.as_int(),
107
out.top_left.y.as_int());
111
mir::log_info("%*cDisabled", indent, ' ');
116
mir::log_info("%s%d.%d: unused %s", prefix, card_id, out_id, type);
123
61
ms::MediatingDisplayChanger::MediatingDisplayChanger(
126
64
std::shared_ptr<mg::DisplayConfigurationPolicy> const& display_configuration_policy,
127
65
std::shared_ptr<SessionContainer> const& session_container,
128
66
std::shared_ptr<SessionEventHandlerRegister> const& session_event_handler_register,
129
std::shared_ptr<ServerActionQueue> const& server_action_queue)
67
std::shared_ptr<ServerActionQueue> const& server_action_queue,
68
std::shared_ptr<mg::DisplayConfigurationReport> const& report)
130
69
: display{display},
131
70
compositor{compositor},
132
71
display_configuration_policy{display_configuration_policy},
133
72
session_container{session_container},
134
73
session_event_handler_register{session_event_handler_register},
135
74
server_action_queue{server_action_queue},
136
76
base_configuration{display->configuration()},
137
77
base_configuration_applied{true}
241
181
std::shared_ptr<graphics::DisplayConfiguration> const& conf,
242
182
SystemStateHandling pause_resume_system)
244
mir::log_info("New display configuration:");
245
log_configuration(*conf);
184
report->new_configuration(*conf);
246
185
if (pause_resume_system)
248
187
ApplyNowAndRevertOnScopeExit comp{