libdisplaydevice master
C++ library to modify display devices.
settings_state_utils.h
Go to the documentation of this file.
1
5#pragma once
6
7// system includes
8#include <algorithm>
9#include <iterator>
10#include <optional>
11#include <string>
12#include <string_view>
13#include <vector>
14
15// local includes
16#include "display_device/json.h"
19
20namespace display_device::detail {
25 std::string_view m_missing_topology;
26 std::string_view m_missing_primary;
27 std::string_view m_adapted_state;
28 };
29
37 template<typename Topology>
38 [[nodiscard]] Topology stripUnavailableTopology(const Topology &topology, const StringSet &available_device_ids) {
39 Topology stripped_topology;
40 for (const auto &group : topology) {
41 std::vector<std::string> stripped_group;
42 for (const auto &device_id : group) {
43 if (available_device_ids.contains(device_id)) {
44 stripped_group.push_back(device_id);
45 }
46 }
47
48 if (!stripped_group.empty()) {
49 stripped_topology.push_back(stripped_group);
50 }
51 }
52
53 return stripped_topology;
54 }
55
67 template<typename Initial, typename FormatTopologyFn>
68 [[nodiscard]] std::optional<Initial> stripInitialState(
69 const Initial &initial_state,
70 const StringSet &available_device_ids,
71 const StringSet &primary_device_ids,
72 const InitialStateStripMessages &messages,
73 const FormatTopologyFn &format_topology
74 ) {
75 const auto stripped_initial_topology {stripUnavailableTopology(initial_state.m_topology, available_device_ids)};
76
77 StringSet initial_primary_devices;
78 std::ranges::set_intersection(
79 initial_state.m_primary_devices,
80 available_device_ids,
81 std::inserter(initial_primary_devices, std::begin(initial_primary_devices))
82 );
83
84 if (stripped_initial_topology.empty()) {
85 DD_LOG(error) << messages.m_missing_topology;
86 return std::nullopt;
87 }
88
89 if (initial_primary_devices.empty()) {
90 initial_primary_devices = primary_device_ids;
91 if (initial_primary_devices.empty()) {
92 DD_LOG(error) << messages.m_missing_primary;
93 return std::nullopt;
94 }
95 }
96
97 if (initial_state.m_topology != stripped_initial_topology || initial_state.m_primary_devices != initial_primary_devices) {
98 DD_LOG(warning) << messages.m_adapted_state << "\n"
99 << " - topology: " << format_topology(initial_state.m_topology) << " -> " << format_topology(stripped_initial_topology) << "\n"
100 << " - primary devices: " << toJson(initial_state.m_primary_devices, JSON_COMPACT) << " -> " << toJson(initial_primary_devices, JSON_COMPACT);
101 }
102
103 return Initial {
104 stripped_initial_topology,
105 initial_primary_devices
106 };
107 }
108} // namespace display_device::detail
Declarations for JSON conversion functions.
const std::optional< unsigned int > JSON_COMPACT
Indentation value for compact JSON output.
Definition json.cpp:16
std::string toJson(const EdidData &obj, const std::optional< unsigned int > &indent=2u, bool *success=nullptr)
Serialize EDID data to JSON.
Definition json.cpp:18
Declarations for common display device types.
std::set< std::string, std::less<> > StringSet
Ordered set keyed by strings with transparent comparisons.
Definition types.h:46
Declarations for the logging utility.
#define DD_LOG(level)
Helper MACRO that disables output string computation if log level is not enabled.
Definition logging.h:153
std::optional< Initial > stripInitialState(const Initial &initial_state, const StringSet &available_device_ids, const StringSet &primary_device_ids, const InitialStateStripMessages &messages, const FormatTopologyFn &format_topology)
Strip unavailable devices from an initial settings state.
Definition settings_state_utils.h:68
Topology stripUnavailableTopology(const Topology &topology, const StringSet &available_device_ids)
Strip unavailable device ids from a topology.
Definition settings_state_utils.h:38
Log messages used while stripping unavailable devices from initial state.
Definition settings_state_utils.h:24
std::string_view m_adapted_state
Warning prefix logged when the initial state is adapted.
Definition settings_state_utils.h:27
std::string_view m_missing_primary
Error logged when no usable primary devices remain.
Definition settings_state_utils.h:26
std::string_view m_missing_topology
Error logged when no initial topology devices remain.
Definition settings_state_utils.h:25