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