#ifndef ASH_WM_MULTI_DISPLAY_PERSISTENT_WINDOW_CONTROLLER_H_
#define ASH_WM_MULTI_DISPLAY_PERSISTENT_WINDOW_CONTROLLER_H_
#include <unordered_map>
#include "ash/ash_export.h"
#include "ash/public/cpp/session/session_observer.h"
#include "base/containers/flat_map.h"
#include "base/functional/callback.h"
#include "base/scoped_observation.h"
#include "ui/aura/window_observer.h"
#include "ui/display/display_observer.h"
#include "ui/display/manager/display_manager.h"
#include "ui/display/manager/display_manager_observer.h"
#include "ui/gfx/geometry/rect.h"
namespace aura {
class Window;
}
namespace ash {
class ASH_EXPORT PersistentWindowController
: public display::DisplayObserver,
public SessionObserver,
public display::DisplayManagerObserver {
public:
class WindowTracker : public aura::WindowObserver {
public:
WindowTracker();
WindowTracker(const WindowTracker&) = delete;
WindowTracker& operator=(const WindowTracker&) = delete;
~WindowTracker() override;
const base::flat_map<aura::Window*, gfx::Rect>& window_restore_bounds_map()
const {
return window_restore_bounds_map_;
}
void Add(aura::Window* window, const gfx::Rect& restore_bounds_in_parent);
void RemoveAll();
void Remove(aura::Window* window);
void OnWindowDestroying(aura::Window* window) override;
private:
base::flat_map<aura::Window*, gfx::Rect> window_restore_bounds_map_;
};
constexpr static char kNumOfWindowsRestoredOnDisplayAdded[] =
"Ash.PersistentWindow.NumOfWindowsRestoredOnDisplayAdded";
constexpr static char kNumOfWindowsRestoredOnScreenRotation[] =
"Ash.PersistentWindow.NumOfWindowsRestoredOnScreenRotation";
PersistentWindowController();
PersistentWindowController(const PersistentWindowController&) = delete;
PersistentWindowController& operator=(const PersistentWindowController&) =
delete;
~PersistentWindowController() override;
private:
void OnDisplayAdded(const display::Display& new_display) override;
void OnWillRemoveDisplays(const display::Displays& removed_displays) override;
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t changed_metrics) override;
void OnWillProcessDisplayChanges() override;
void OnDidProcessDisplayChanges(
const DisplayConfigurationChange& configuration_change) override;
void OnFirstSessionStarted() override;
void MaybeRestorePersistentWindowBoundsOnDisplayAdded();
void MaybeRestorePersistentWindowBoundsOnScreenRotation();
base::OnceClosure display_added_restore_callback_;
base::OnceClosure screen_rotation_restore_callback_;
WindowTracker need_persistent_info_windows_;
std::unordered_map<int64_t, bool> is_landscape_orientation_map_;
display::ScopedDisplayObserver display_observer_{this};
base::ScopedObservation<display::DisplayManager,
display::DisplayManagerObserver>
display_manager_observation_{this};
};
}
#endif