• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef ASH_DISPLAY_DISPLAY_CONTROLLER_H_
6 #define ASH_DISPLAY_DISPLAY_CONTROLLER_H_
7 
8 #include <map>
9 #include <vector>
10 
11 #include "ash/ash_export.h"
12 #include "ash/display/display_manager.h"
13 #include "base/basictypes.h"
14 #include "base/compiler_specific.h"
15 #include "base/gtest_prod_util.h"
16 #include "base/memory/scoped_ptr.h"
17 #include "base/memory/weak_ptr.h"
18 #include "base/observer_list.h"
19 #include "base/time/time.h"
20 #include "ui/aura/window.h"
21 #include "ui/aura/window_tree_host_observer.h"
22 #include "ui/gfx/display_observer.h"
23 #include "ui/gfx/point.h"
24 
25 namespace aura {
26 class Display;
27 class WindowTreeHost;
28 }
29 
30 namespace base {
31 class Value;
32 template <typename T> class JSONValueConverter;
33 }
34 
35 namespace gfx {
36 class Display;
37 class Insets;
38 }
39 
40 namespace ash {
41 class AshWindowTreeHost;
42 struct AshWindowTreeHostInitParams;
43 class CursorWindowController;
44 class DisplayInfo;
45 class DisplayManager;
46 class FocusActivationStore;
47 class MirrorWindowController;
48 class RootWindowController;
49 
50 // DisplayController owns and maintains RootWindows for each attached
51 // display, keeping them in sync with display configuration changes.
52 class ASH_EXPORT DisplayController : public gfx::DisplayObserver,
53                                      public aura::WindowTreeHostObserver,
54                                      public DisplayManager::Delegate {
55  public:
56   class ASH_EXPORT Observer {
57    public:
58     // Invoked only once after all displays are initialized
59     // after startup.
OnDisplaysInitialized()60     virtual void OnDisplaysInitialized() {}
61 
62     // Invoked when the display configuration change is requested,
63     // but before the change is applied to aura/ash.
OnDisplayConfigurationChanging()64     virtual void OnDisplayConfigurationChanging() {}
65 
66     // Invoked when the all display configuration changes
67     // have been applied.
OnDisplayConfigurationChanged()68     virtual void OnDisplayConfigurationChanged() {};
69 
70    protected:
~Observer()71     virtual ~Observer() {}
72   };
73 
74   DisplayController();
75   virtual ~DisplayController();
76 
77   void Start();
78   void Shutdown();
79 
80   // Returns primary display's ID.
81   // TODO(oshima): Move this out from DisplayController;
82   static int64 GetPrimaryDisplayId();
83 
cursor_window_controller()84   CursorWindowController* cursor_window_controller() {
85     return cursor_window_controller_.get();
86   }
87 
mirror_window_controller()88   MirrorWindowController* mirror_window_controller() {
89     return mirror_window_controller_.get();
90   }
91 
92   // Create a WindowTreeHost for the primary display. This replaces
93   // |initial_bounds| in |init_params|.
94   void CreatePrimaryHost(const AshWindowTreeHostInitParams& init_params);
95 
96   // Initializes all displays.
97   void InitDisplays();
98 
99   // Add/Remove observers.
100   void AddObserver(Observer* observer);
101   void RemoveObserver(Observer* observer);
102 
103   // Returns the root window for primary display.
104   aura::Window* GetPrimaryRootWindow();
105 
106   // Returns the root window for |display_id|.
107   aura::Window* GetRootWindowForDisplayId(int64 id);
108 
109   // Toggle mirror mode.
110   void ToggleMirrorMode();
111 
112   // Swap primary and secondary display.
113   void SwapPrimaryDisplay();
114 
115   // Sets the ID of the primary display.  If the display is not connected, it
116   // will switch the primary display when connected.
117   void SetPrimaryDisplayId(int64 id);
118 
119   // Sets primary display. This re-assigns the current root
120   // window to given |display|.
121   void SetPrimaryDisplay(const gfx::Display& display);
122 
123   // Closes all child windows in the all root windows.
124   void CloseChildWindows();
125 
126   // Returns all root windows. In non extended desktop mode, this
127   // returns the primary root window only.
128   aura::Window::Windows GetAllRootWindows();
129 
130   // Returns all oot window controllers. In non extended desktop
131   // mode, this return a RootWindowController for the primary root window only.
132   std::vector<RootWindowController*> GetAllRootWindowControllers();
133 
134   // Gets/Sets/Clears the overscan insets for the specified |display_id|. See
135   // display_manager.h for the details.
136   gfx::Insets GetOverscanInsets(int64 display_id) const;
137   void SetOverscanInsets(int64 display_id, const gfx::Insets& insets_in_dip);
138 
139   // Checks if the mouse pointer is on one of displays, and moves to
140   // the center of the nearest display if it's outside of all displays.
141   void EnsurePointerInDisplays();
142 
143   // Sets the work area's |insets| to the display assigned to |window|.
144   bool UpdateWorkAreaOfDisplayNearestWindow(const aura::Window* window,
145                                             const gfx::Insets& insets);
146   // gfx::DisplayObserver overrides:
147   virtual void OnDisplayAdded(const gfx::Display& display) OVERRIDE;
148   virtual void OnDisplayRemoved(const gfx::Display& display) OVERRIDE;
149   virtual void OnDisplayMetricsChanged(const gfx::Display& display,
150                                        uint32_t metrics) OVERRIDE;
151 
152   // aura::WindowTreeHostObserver overrides:
153   virtual void OnHostResized(const aura::WindowTreeHost* host) OVERRIDE;
154 
155   // aura::DisplayManager::Delegate overrides:
156   virtual void CreateOrUpdateNonDesktopDisplay(const DisplayInfo& info)
157       OVERRIDE;
158   virtual void CloseNonDesktopDisplay() OVERRIDE;
159   virtual void PreDisplayConfigurationChange(bool clear_focus) OVERRIDE;
160   virtual void PostDisplayConfigurationChange() OVERRIDE;
161 
162  private:
163   FRIEND_TEST_ALL_PREFIXES(DisplayControllerTest, BoundsUpdated);
164   FRIEND_TEST_ALL_PREFIXES(DisplayControllerTest, SecondaryDisplayLayout);
165   friend class DisplayManager;
166   friend class MirrorWindowController;
167 
168   // Creates a WindowTreeHost for |display| and stores it in the
169   // |window_tree_hosts_| map.
170   AshWindowTreeHost* AddWindowTreeHostForDisplay(
171       const gfx::Display& display,
172       const AshWindowTreeHostInitParams& params);
173 
174   void OnFadeOutForSwapDisplayFinished();
175 
176   void SetMirrorModeAfterAnimation(bool mirror);
177 
178   void UpdateHostWindowNames();
179 
180   class DisplayChangeLimiter {
181    public:
182     DisplayChangeLimiter();
183 
184     // Sets how long the throttling should last.
185     void SetThrottleTimeout(int64 throttle_ms);
186 
187     bool IsThrottled() const;
188 
189    private:
190     // The time when the throttling ends.
191     base::Time throttle_timeout_;
192 
193     DISALLOW_COPY_AND_ASSIGN(DisplayChangeLimiter);
194   };
195 
196   // The limiter to throttle how fast a user can
197   // change the display configuration.
198   scoped_ptr<DisplayChangeLimiter> limiter_;
199 
200   typedef std::map<int64, AshWindowTreeHost*> WindowTreeHostMap;
201   // The mapping from display ID to its window tree host.
202   WindowTreeHostMap window_tree_hosts_;
203 
204   ObserverList<Observer> observers_;
205 
206   // Store the primary window tree host temporarily while replacing
207   // display.
208   AshWindowTreeHost* primary_tree_host_for_replace_;
209 
210   scoped_ptr<FocusActivationStore> focus_activation_store_;
211 
212   scoped_ptr<CursorWindowController> cursor_window_controller_;
213   scoped_ptr<MirrorWindowController> mirror_window_controller_;
214 
215   // Stores the curent cursor location (in native coordinates) used to
216   // restore the cursor location when display configuration
217   // changed.
218   gfx::Point cursor_location_in_native_coords_for_restore_;
219 
220   base::WeakPtrFactory<DisplayController> weak_ptr_factory_;
221 
222   DISALLOW_COPY_AND_ASSIGN(DisplayController);
223 };
224 
225 }  // namespace ash
226 
227 #endif  // ASH_DISPLAY_DISPLAY_CONTROLLER_H_
228