#ifndef UI_DISPLAY_MANAGER_UPDATE_DISPLAY_CONFIGURATION_TASK_H_
#define UI_DISPLAY_MANAGER_UPDATE_DISPLAY_CONFIGURATION_TASK_H_
#include <stdint.h>
#include <memory>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "third_party/abseil-cpp/absl/types/optional.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<DisplaySnapshot*>&,
const std::vector<DisplaySnapshot*>&,
MultipleDisplayState,
chromeos::DisplayPowerState,
bool)>;
UpdateDisplayConfigurationTask(
NativeDisplayDelegate* delegate,
DisplayLayoutManager* layout_manager,
MultipleDisplayState new_display_state,
chromeos::DisplayPowerState new_power_state,
int power_flags,
RefreshRateThrottleState refresh_rate_throttle_state,
bool new_vrr_state,
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<DisplaySnapshot*>& 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;
raw_ptr<NativeDisplayDelegate, ExperimentalAsh> delegate_;
raw_ptr<DisplayLayoutManager, ExperimentalAsh> layout_manager_;
MultipleDisplayState new_display_state_;
chromeos::DisplayPowerState new_power_state_;
int power_flags_;
RefreshRateThrottleState refresh_rate_throttle_state_;
bool new_vrr_state_;
bool force_configure_;
const ConfigurationType configuration_type_;
ResponseCallback callback_;
bool requesting_displays_;
std::vector<DisplaySnapshot*> cached_displays_;
std::vector<DisplaySnapshot*> cached_unassociated_displays_;
std::unique_ptr<ConfigureDisplaysTask> configure_task_;
absl::optional<base::TimeTicks> start_timestamp_;
base::WeakPtrFactory<UpdateDisplayConfigurationTask> weak_ptr_factory_{this};
};
}
#endif