display_controller.h revision 1e9bf3e0803691d0a228da41fc608347b6db4340
19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// Copyright (c) 2012 The Chromium Authors. All rights reserved.
29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// Use of this source code is governed by a BSD-style license that can be
39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// found in the LICENSE file.
49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#ifndef ASH_DISPLAY_DISPLAY_CONTROLLER_H_
69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#define ASH_DISPLAY_DISPLAY_CONTROLLER_H_
79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <map>
99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include <vector>
109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "ash/ash_export.h"
129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "ash/display/display_manager.h"
139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "base/basictypes.h"
149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "base/compiler_specific.h"
159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "base/gtest_prod_util.h"
169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "base/memory/scoped_ptr.h"
179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "base/observer_list.h"
189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "base/time/time.h"
19993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "ui/aura/root_window_observer.h"
20993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "ui/gfx/display_observer.h"
21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek#include "ui/gfx/point.h"
2222ab7a4d900ed53285fd0b6720e7b43af84724d8Zhongxing Xu
23a693d4fa7a6dc31b23837cf38cba7aa2af8f00f3Ted Kremeneknamespace aura {
249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass Display;
259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass RootWindow;
26dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu}
27dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu
289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace base {
299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass Value;
309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenektemplate <typename T> class JSONValueConverter;
319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace gfx {
349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass Display;
359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass Insets;
369e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}
379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace ash {
399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace internal {
409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass DisplayInfo;
41026c66395b88a09437319139a43b090093f7e1ddZhongxing Xuclass DisplayManager;
42e8e86482da4c1872673bbb9c237649229d19793bTed Kremenekclass FocusActivationStore;
4382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenekclass MirrorWindowController;
449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass RootWindowController;
459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass VirtualKeyboardWindowController;
46369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu}
4777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu
48329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek// DisplayController owns and maintains RootWindows for each attached
490312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenek// display, keeping them in sync with display configuration changes.
50329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenekclass ASH_EXPORT DisplayController : public gfx::DisplayObserver,
51329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                                     public aura::RootWindowObserver,
52329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek                                     public internal::DisplayManager::Delegate {
53329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek public:
54329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek  class ASH_EXPORT Observer {
559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek   public:
569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    // Invoked when the display configuration change is requested,
579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    // but before the change is applied to aura/ash.
589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    virtual void OnDisplayConfigurationChanging() {}
599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    // Invoked when the all display configuration changes
619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    // have been applied.
62a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek    virtual void OnDisplayConfigurationChanged() {};
639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek   protected:
659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    virtual ~Observer() {}
669e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  };
67a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
68a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  DisplayController();
69a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  virtual ~DisplayController();
709e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
71b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu  void Start();
729e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void Shutdown();
739e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
749e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // Returns primary display. This is safe to use after ash::Shell is
7541168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek  // deleted.
76ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek  static const gfx::Display& GetPrimaryDisplay();
77ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek
78a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  // Returns the number of display. This is safe to use after
79b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu  // ash::Shell is deleted.
809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  static int GetNumDisplays();
819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
829e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  internal::MirrorWindowController* mirror_window_controller() {
839e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    return mirror_window_controller_.get();
849e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  }
859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // Initializes primary display.
87a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  void InitPrimaryDisplay();
88a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
89a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  // Initialize secondary displays.
90a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  void InitSecondaryDisplays();
91a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
92a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  // Add/Remove observers.
939e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void AddObserver(Observer* observer);
94a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  void RemoveObserver(Observer* observer);
95a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
96a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  // Returns the root window for primary display.
97a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  aura::Window* GetPrimaryRootWindow();
989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
999e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // Returns the root window for |display_id|.
1009e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  aura::Window* GetRootWindowForDisplayId(int64 id);
1019e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1029e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // Toggle mirror mode.
103a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  void ToggleMirrorMode();
10441168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek
1059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // Swap primary and secondary display.
1069e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void SwapPrimaryDisplay();
1079e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // Sets the ID of the primary display.  If the display is not connected, it
1099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // will switch the primary display when connected.
110993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  void SetPrimaryDisplayId(int64 id);
111993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
112993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  // Sets primary display. This re-assigns the current root
1139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // window to given |display|.
114993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  void SetPrimaryDisplay(const gfx::Display& display);
115993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
1169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // Closes all child windows in the all root windows.
1179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  void CloseChildWindows();
1189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1199e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  // Returns all root windows. In non extended desktop mode, this
120a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  // returns the primary root window only.
121a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  std::vector<aura::RootWindow*> GetAllRootWindows();
1224193eca10ce0cc8b2dae887e935a43b26f492b5bZhongxing Xu
1237e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  // Returns all oot window controllers. In non extended desktop
1247e5d6ed47dcedce35043de59ee00464b681bc786Zhongxing Xu  // mode, this return a RootWindowController for the primary root window only.
1259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek  std::vector<internal::RootWindowController*> GetAllRootWindowControllers();
126026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu
127993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  // Gets/Sets/Clears the overscan insets for the specified |display_id|. See
128993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  // display_manager.h for the details.
129ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  gfx::Insets GetOverscanInsets(int64 display_id) const;
13082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void SetOverscanInsets(int64 display_id, const gfx::Insets& insets_in_dip);
13182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
13282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  // Checks if the mouse pointer is on one of displays, and moves to
13382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  // the center of the nearest display if it's outside of all displays.
13482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  void EnsurePointerInDisplays();
13582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
13682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  // Sets the work area's |insets| to the display assigned to |window|.
13782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  bool UpdateWorkAreaOfDisplayNearestWindow(const aura::Window* window,
13882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek                                            const gfx::Insets& insets);
1397ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek
14082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  // Returns the display object nearest given |point|.
14182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const gfx::Display& GetDisplayNearestPoint(
14282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek      const gfx::Point& point) const;
14382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
14482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  // Returns the display object nearest given |window|.
14582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  const gfx::Display& GetDisplayNearestWindow(
14682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek      const aura::Window* window) const;
14782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
14882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  // Returns the display that most closely intersects |match_rect|.
1497ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek  const gfx::Display& GetDisplayMatching(
15082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek      const gfx::Rect& match_rect)const;
15182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
15282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  // aura::DisplayObserver overrides:
15382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  virtual void OnDisplayBoundsChanged(
15482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek      const gfx::Display& display) OVERRIDE;
15582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  virtual void OnDisplayAdded(const gfx::Display& display) OVERRIDE;
15682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek  virtual void OnDisplayRemoved(const gfx::Display& display) OVERRIDE;
15782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek
158993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  // RootWindowObserver overrides:
159993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  virtual void OnRootWindowHostResized(const aura::RootWindow* root) OVERRIDE;
160993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek
161993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  // aura::DisplayManager::Delegate overrides:
162993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek  virtual void CreateOrUpdateNonDesktopDisplay(
163993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek      const internal::DisplayInfo& info) OVERRIDE;
164a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  virtual void CloseNonDesktopDisplay() OVERRIDE;
1656eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  virtual void PreDisplayConfigurationChange(bool dispay_removed) OVERRIDE;
166ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  virtual void PostDisplayConfigurationChange() OVERRIDE;
1676eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek
168a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu private:
1696eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek  FRIEND_TEST_ALL_PREFIXES(DisplayControllerTest, BoundsUpdated);
17014553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  FRIEND_TEST_ALL_PREFIXES(DisplayControllerTest, SecondaryDisplayLayout);
171a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  friend class internal::DisplayManager;
172a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  friend class internal::MirrorWindowController;
1731b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek
17414553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  // Creates a root window for |display| and stores it in the |root_windows_|
17514553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  // map.
176ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu  aura::RootWindow* AddRootWindowForDisplay(const gfx::Display& display);
177ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu
17814553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek  void OnFadeOutForSwapDisplayFinished();
1791b9b883a95215e38e153d253a46a2a2fcac25896Ted Kremenek
180a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek  void UpdateHostWindowNames();
181a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek
18241168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek  class DisplayChangeLimiter {
1836eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek   public:
184993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek    DisplayChangeLimiter();
1859e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1869e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    // Sets how long the throttling should last.
1879e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    void SetThrottleTimeout(int64 throttle_ms);
1889e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek
1899e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek    bool IsThrottled() const;
190ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
191ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu   private:
192ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    // The time when the throttling ends.
193ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    base::Time throttle_timeout_;
194ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
195ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu    DISALLOW_COPY_AND_ASSIGN(DisplayChangeLimiter);
196ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  };
197ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
198ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // The limiter to throttle how fast a user can
199ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // change the display configuration.
200ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  scoped_ptr<DisplayChangeLimiter> limiter_;
201ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
202ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // The mapping from display ID to its root window.
203ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  std::map<int64, aura::RootWindow*> root_windows_;
204ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
205ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  ObserverList<Observer> observers_;
206ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
207ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // Store the primary root window temporarily while replacing
208ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // display.
209ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  aura::RootWindow* primary_root_window_for_replace_;
210ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
211ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  scoped_ptr<internal::FocusActivationStore> focus_activation_store_;
212ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
213ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  scoped_ptr<internal::MirrorWindowController> mirror_window_controller_;
214ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  scoped_ptr<internal::VirtualKeyboardWindowController>
215ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu      virtual_keyboard_window_controller_;
216ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
217ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // Stores the curent cursor location (in native coordinates) used to
218ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // restore the cursor location when display configuration
219ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  // changed.
220ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu  gfx::Point cursor_location_in_native_coords_for_restore_;
221ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
222a82d8aa5b3b3d24998b4d98b9f45a43cc84cac6fZhongxing Xu  DISALLOW_COPY_AND_ASSIGN(DisplayController);
223ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu};
224ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
225ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu}  // namespace ash
226ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu
227ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu#endif  // ASH_DISPLAY_DISPLAY_CONTROLLER_H_
228ff6978263439e21d795b0602fabcb38488ef8441Zhongxing Xu