| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ASH_DISPLAY_DISPLAY_CONFIGURATION_CONTROLLER_H_ |
| #define ASH_DISPLAY_DISPLAY_CONFIGURATION_CONTROLLER_H_ |
| |
| #include <memory> |
| |
| #include "ash/ash_export.h" |
| #include "ash/display/window_tree_host_manager.h" |
| #include "base/macros.h" |
| #include "base/memory/weak_ptr.h" |
| #include "ui/display/display.h" |
| |
| namespace display { |
| class DisplayLayout; |
| } |
| |
| namespace ash { |
| |
| namespace test { |
| class ShellTestApi; |
| } // namespace test |
| |
| class DisplayAnimator; |
| class DisplayManager; |
| |
| // This class controls Display related configuration. Specifically it: |
| // * Handles animated transitions where appropriate. |
| // * Limits the frequency of certain operations. |
| // * Provides a single interface for UI and API classes. |
| // * TODO: Forwards display configuration changed events to UI and API classes. |
| class ASH_EXPORT DisplayConfigurationController |
| : public WindowTreeHostManager::Observer { |
| public: |
| DisplayConfigurationController( |
| DisplayManager* display_manager, |
| WindowTreeHostManager* window_tree_host_manager); |
| ~DisplayConfigurationController() override; |
| |
| // Sets the layout for the current displays with a fade in/out |
| // animation. Currently |display_id| is assumed to be the secondary |
| // display. TODO(oshima/stevenjb): Support 3+ displays. |
| void SetDisplayLayout(std::unique_ptr<display::DisplayLayout> layout, |
| bool user_action); |
| |
| // Sets the mirror mode with a fade-in/fade-out animation. Affects all |
| // displays. |
| void SetMirrorMode(bool mirror, bool user_action); |
| |
| // Sets the display's rotation with animation if available. |
| void SetDisplayRotation(int64_t display_id, |
| display::Display::Rotation rotation, |
| display::Display::RotationSource source, |
| bool user_action); |
| |
| // Sets the primary display id. |
| void SetPrimaryDisplayId(int64_t display_id, bool user_action); |
| |
| // WindowTreeHostManager::Observer |
| void OnDisplayConfigurationChanged() override; |
| |
| protected: |
| friend class ash::test::ShellTestApi; |
| |
| // Allow tests to skip animations. |
| void ResetAnimatorForTest(); |
| |
| private: |
| class DisplayChangeLimiter; |
| |
| // Sets the timeout for the DisplayChangeLimiter if it exists. Call this |
| // *before* starting any animations. |
| void SetThrottleTimeout(int64_t throttle_ms); |
| bool IsLimited(); |
| void SetDisplayLayoutImpl(std::unique_ptr<display::DisplayLayout> layout); |
| void SetMirrorModeImpl(bool mirror); |
| void SetPrimaryDisplayIdImpl(int64_t display_id); |
| |
| DisplayManager* display_manager_; // weak ptr |
| WindowTreeHostManager* window_tree_host_manager_; // weak ptr |
| std::unique_ptr<DisplayAnimator> display_animator_; |
| std::unique_ptr<DisplayChangeLimiter> limiter_; |
| |
| base::WeakPtrFactory<DisplayConfigurationController> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DisplayConfigurationController); |
| }; |
| |
| } // namespace ash |
| |
| #endif // ASH_DISPLAY_DISPLAY_CONFIGURATION_CONTROLLER_H_ |