1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_DISPLAY_MANAGER_UPDATE_DISPLAY_CONFIGURATION_TASK_H_
#define UI_DISPLAY_MANAGER_UPDATE_DISPLAY_CONFIGURATION_TASK_H_
#include <stdint.h>
#include <memory>
#include <optional>
#include <unordered_map>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/display/manager/configure_displays_task.h"
#include "ui/display/manager/display_configurator.h"
#include "ui/display/types/native_display_observer.h"
namespace display {
class DisplaySnapshot;
class DisplayLayoutManager;
class NativeDisplayDelegate;
class DISPLAY_MANAGER_EXPORT UpdateDisplayConfigurationTask
: public NativeDisplayObserver {
public:
using ResponseCallback = base::OnceCallback<void(
/*success=*/bool,
/*displays=*/
const std::vector<raw_ptr<DisplaySnapshot, VectorExperimental>>&,
/*unassociated_displays=*/
const std::vector<raw_ptr<DisplaySnapshot, VectorExperimental>>&,
/*new_display_state=*/MultipleDisplayState,
/*new_power_state=*/chromeos::DisplayPowerState)>;
UpdateDisplayConfigurationTask(
NativeDisplayDelegate* delegate,
DisplayLayoutManager* layout_manager,
MultipleDisplayState new_display_state,
chromeos::DisplayPowerState new_power_state,
int power_flags,
const base::flat_set<int64_t>& new_vrr_state,
const DisplayConfigurator::RefreshRateOverrideMap& refresh_rate_overrides,
bool force_configure,
ConfigurationType configuration_type,
ResponseCallback callback);
UpdateDisplayConfigurationTask(const UpdateDisplayConfigurationTask&) =
delete;
UpdateDisplayConfigurationTask& operator=(
const UpdateDisplayConfigurationTask&) = delete;
~UpdateDisplayConfigurationTask() override;
void Run();
// display::NativeDisplayObserver:
void OnConfigurationChanged() override;
void OnDisplaySnapshotsInvalidated() override;
private:
// Callback to NativeDisplayDelegate::GetDisplays().
void OnDisplaysUpdated(
const std::vector<raw_ptr<DisplaySnapshot, VectorExperimental>>&
displays);
// Callback to ConfigureDisplaysTask used to process the result of a display
// configuration run.
void OnStateEntered(ConfigureDisplaysTask::Status status);
// If the initial display configuration run failed due to errors entering
// mirror more, another configuration run is executed to enter software
// mirroring. This is the callback used to process the result of that
// configuration.
void OnEnableSoftwareMirroring(ConfigureDisplaysTask::Status status);
// Starts the configuration process. |callback| is used to continue the task
// after |configure_task_| finishes executing.
void EnterState(ConfigureDisplaysTask::ResponseCallback callback);
// Finishes display configuration and runs |callback_|.
void FinishConfiguration(bool success);
// Returns true if the DPMS state should be force to on.
bool ShouldForceDpms() const;
// Returns true if a display configuration is required.
bool ShouldConfigure() const;
// Returns a display state based on the power state.
MultipleDisplayState ChooseDisplayState() const;
// Returns whether a display configuration is required to meet the desired
// variable refresh rate setting.
bool ShouldConfigureVrr() const;
// Returns whether a display configuration is required to apply or remove
// the requested refresh rate overrides.
bool ShouldConfigureRefreshRate() const;
raw_ptr<NativeDisplayDelegate> delegate_; // Not owned.
raw_ptr<DisplayLayoutManager> layout_manager_; // Not owned.
// Requested display state.
MultipleDisplayState new_display_state_;
// Requested power state.
chromeos::DisplayPowerState new_power_state_;
// Bitwise-or-ed values for the kSetDisplayPower* values defined in
// DisplayConfigurator.
int power_flags_;
// The requested VRR state which lists the set of display ids that should have
// VRR enabled, while all omitted displays should have VRR disabled.
const base::flat_set<int64_t> new_vrr_state_;
const DisplayConfigurator::RefreshRateOverrideMap refresh_rate_overrides_;
bool force_configure_;
// Whether the configuration task should be done without blanking the
// displays.
const ConfigurationType configuration_type_;
// Used to signal that the task has finished.
ResponseCallback callback_;
bool requesting_displays_;
// List of updated displays.
std::vector<raw_ptr<DisplaySnapshot, VectorExperimental>> cached_displays_;
// List of updated displays which have no associated crtc. It can happen
// when the device is connected with so many displays that has no available
// crtc to assign.
std::vector<raw_ptr<DisplaySnapshot, VectorExperimental>>
cached_unassociated_displays_;
std::unique_ptr<ConfigureDisplaysTask> configure_task_;
base::WeakPtrFactory<UpdateDisplayConfigurationTask> weak_ptr_factory_{this};
};
} // namespace display
#endif // UI_DISPLAY_MANAGER_UPDATE_DISPLAY_CONFIGURATION_TASK_H_
|