#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(
bool,
const std::vector<raw_ptr<DisplaySnapshot, VectorExperimental>>&,
const std::vector<raw_ptr<DisplaySnapshot, VectorExperimental>>&,
MultipleDisplayState,
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();
void OnConfigurationChanged() override;
void OnDisplaySnapshotsInvalidated() override;
private:
void OnDisplaysUpdated(
const std::vector<raw_ptr<DisplaySnapshot, VectorExperimental>>&
displays);
void OnStateEntered(ConfigureDisplaysTask::Status status);
void OnEnableSoftwareMirroring(ConfigureDisplaysTask::Status status);
void EnterState(ConfigureDisplaysTask::ResponseCallback callback);
void FinishConfiguration(bool success);
bool ShouldForceDpms() const;
bool ShouldConfigure() const;
MultipleDisplayState ChooseDisplayState() const;
bool ShouldConfigureVrr() const;
bool ShouldConfigureRefreshRate() const;
raw_ptr<NativeDisplayDelegate> delegate_;
raw_ptr<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_;
const ConfigurationType configuration_type_;
ResponseCallback callback_;
bool requesting_displays_;
std::vector<raw_ptr<DisplaySnapshot, VectorExperimental>> cached_displays_;
std::vector<raw_ptr<DisplaySnapshot, VectorExperimental>>
cached_unassociated_displays_;
std::unique_ptr<ConfigureDisplaysTask> configure_task_;
base::WeakPtrFactory<UpdateDisplayConfigurationTask> weak_ptr_factory_{this};
};
}
#endif