12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef ASH_DISPLAY_DISPLAY_MANAGER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ASH_DISPLAY_DISPLAY_MANAGER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/ash_export.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_info.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/display/display_layout.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/gtest_prod_util.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/scoped_ptr.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/gfx/display.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_CHROMEOS)
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/display/chromeos/display_configurator.h"
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Display;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Insets;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Rect;
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Screen;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AcceleratorControllerTest;
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DisplayController;
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass DisplayLayoutStore;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ScreenAsh;
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DisplayManagerTestApi;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SystemGestureEventFilterTest;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DisplayManager maintains the current display configurations,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and notifies observers when configuration changes.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(oshima): Make this non internal.
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass ASH_EXPORT DisplayManager
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_CHROMEOS)
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : public ui::DisplayConfigurator::SoftwareMirroringController
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  class ASH_EXPORT Delegate {
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   public:
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    virtual ~Delegate() {}
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Create or updates the non desktop window with |display_info|.
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    virtual void CreateOrUpdateNonDesktopDisplay(
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        const DisplayInfo& display_info) = 0;
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Closes the mirror window if exists.
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    virtual void CloseNonDesktopDisplay() = 0;
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Called before and after the display configuration changes.
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // When |clear_focus| is true, the implementation should
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // deactivate the active window and set the focus window to NULL.
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void PreDisplayConfigurationChange(bool clear_focus) = 0;
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    virtual void PostDisplayConfigurationChange() = 0;
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // How the second display will be used.
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // 1) EXTENDED mode extends the desktop to the second dislpay.
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // 2) MIRRORING mode copies the content of the primary display to
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  //    the 2nd display. (Software Mirroring).
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  enum SecondDisplayMode {
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXTENDED,
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MIRRORING
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Returns the list of possible UI scales for the display.
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static std::vector<float> GetScalesForDisplay(const DisplayInfo& info);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns next valid UI scale.
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static float GetNextUIScale(const DisplayInfo& info, bool up);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Updates the bounds of the display given by |secondary_display_id|
85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // according to |layout|.
86ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  static void UpdateDisplayBoundsForLayoutById(
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const DisplayLayout& layout,
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const gfx::Display& primary_display,
89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      int64 secondary_display_id);
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DisplayManager();
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual ~DisplayManager();
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DisplayLayoutStore* layout_store() {
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return layout_store_.get();
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Screen* screen() {
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return screen_;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void set_delegate(Delegate* delegate) { delegate_ = delegate; }
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // When set to true, the MonitorManager calls OnDisplayMetricsChanged
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // even if the display's bounds didn't change. Used to swap primary
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // display.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_force_bounds_changed(bool force_bounds_changed) {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    force_bounds_changed_ = force_bounds_changed;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the display id of the first display in the outupt list.
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 first_display_id() const { return first_display_id_; }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Initializes displays using command line flag. Returns false
1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // if no command line flag was provided.
1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  bool InitFromCommandLine();
1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Initialize default display.
1190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void InitDefaultDisplay();
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Initializes font related params that depends on display
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // configuration.
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void InitFontParams();
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if the given |display| is currently connected.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsActiveDisplay(const gfx::Display& display) const;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if there is an internal display.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool HasInternalDisplay() const;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsInternalDisplayId(int64 id) const;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Returns the display layout used for current displays.
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DisplayLayout GetCurrentDisplayLayout();
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Returns the current display pair.
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DisplayIdPair GetCurrentDisplayIdPair() const;
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Sets the layout for the current display pair. The |layout| specifies
1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // the locaion of the secondary display relative to the primary.
1418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void SetLayoutForCurrentDisplays(
1428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      const DisplayLayout& layout_relative_to_primary);
1438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns display for given |id|;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Display& GetDisplayForId(int64 id) const;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Finds the display that contains |point| in screeen coordinates.
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns invalid display if there is no display that can satisfy
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the condition.
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Display& FindDisplayContainingPoint(
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Point& point_in_screen) const;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Sets the work area's |insets| to the display given by |display_id|.
154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool UpdateWorkAreaOfDisplay(int64 display_id, const gfx::Insets& insets);
155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Registers the overscan insets for the display of the specified ID. Note
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that the insets size should be specified in DIP size. It also triggers the
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // display's bounds change.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetOverscanInsets(int64 display_id, const gfx::Insets& insets_in_dip);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the display's rotation.
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDisplayRotation(int64 display_id, gfx::Display::Rotation rotation);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the display's ui scale.
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TODO(mukai): remove this and merge into SetDisplayMode.
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDisplayUIScale(int64 display_id, float ui_scale);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Sets the display's resolution.
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TODO(mukai): remove this and merge into SetDisplayMode.
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void SetDisplayResolution(int64 display_id, const gfx::Size& resolution);
171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Sets the external display's configuration, including resolution change,
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // ui-scale change, and device scale factor change. Returns true if it changes
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // the display resolution so that the caller needs to show a notification in
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // case the new resolution actually doesn't work.
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool SetDisplayMode(int64 display_id, const DisplayMode& display_mode);
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Register per display properties. |overscan_insets| is NULL if
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the display has no custom overscan insets.
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RegisterDisplayProperty(int64 display_id,
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               gfx::Display::Rotation rotation,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               float ui_scale,
183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                               const gfx::Insets* overscan_insets,
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                               const gfx::Size& resolution_in_pixels,
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               float device_scale_factor,
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                               ui::ColorCalibrationProfile color_profile);
187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Register stored rotation properties for the internal display.
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void RegisterDisplayRotationProperties(bool rotation_lock,
19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                         gfx::Display::Rotation rotation);
19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Returns the stored rotation lock preference if it has been loaded,
19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // otherwise false.
19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool registered_internal_display_rotation_lock() const {
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return registered_internal_display_rotation_lock_;
19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Returns the stored rotation preference for the internal display if it has
19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // been loaded, otherwise |gfx::Display::Rotate_0|.
20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::Display::Rotation registered_internal_display_rotation() const {
20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return registered_internal_display_rotation_;
20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Returns the display mode of |display_id| which is currently used.
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayMode GetActiveModeForDisplayId(int64 display_id) const;
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Returns the display's selected mode. This returns false and doesn't
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // set |mode_out| if the display mode is in default.
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool GetSelectedModeForDisplayId(int64 display_id,
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   DisplayMode* mode_out) const;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Tells if the virtual resolution feature is enabled.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsDisplayUIScalingEnabled() const;
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the current overscan insets for the specified |display_id|.
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns an empty insets (0, 0, 0, 0) if no insets are specified for
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the display.
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Insets GetOverscanInsets(int64 display_id) const;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Sets the color calibration of the display to |profile|.
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void SetColorCalibrationProfile(int64 display_id,
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  ui::ColorCalibrationProfile profile);
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when display configuration has changed. The new display
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // configurations is passed as a vector of Display object, which
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // contains each display's new infomration.
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnNativeDisplaysChanged(
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<DisplayInfo>& display_info_list);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates the internal display data and notifies observers about the changes.
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateDisplays(const std::vector<DisplayInfo>& display_info_list);
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates current displays using current |display_info_|.
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateDisplays();
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the display at |index|. The display at 0 is
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // no longer considered "primary".
238ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const gfx::Display& GetDisplayAt(size_t index) const;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const gfx::Display& GetPrimaryDisplayCandidate() const;
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the logical number of displays. This returns 1
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when displays are mirrored.
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t GetNumDisplays() const;
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const std::vector<gfx::Display>& displays() const { return displays_; }
247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the number of connected displays. This returns 2
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when displays are mirrored.
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t num_connected_displays() const { return num_connected_displays_; }
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the mirroring status.
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsMirrored() const;
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int64 mirrored_display_id() const { return mirrored_display_id_; }
2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Returns the display object that is not a part of desktop.
2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const gfx::Display& non_desktop_display() const {
2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return non_desktop_display_;
2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retuns the display info associated with |display_id|.
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayInfo& GetDisplayInfo(int64 display_id) const;
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the human-readable name for the display |id|.
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetDisplayNameForId(int64 id);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns the display id that is capable of UI scaling. On device,
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // this returns internal display's ID if its device scale factor is 2,
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // or invalid ID if such internal display doesn't exist. On linux
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // desktop, this returns the first display ID.
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int64 GetDisplayIdForUIScaling() const;
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Change the mirror mode.
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetMirrorMode(bool mirrored);
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Used to emulate display change when run in a desktop environment instead
27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // of on a device.
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddRemoveDisplay();
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ToggleDisplayScaleFactor();
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // SoftwareMirroringController override:
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_CHROMEOS)
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void SetSoftwareMirroring(bool enabled) OVERRIDE;
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool SoftwareMirroringEnabled() const OVERRIDE;
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool software_mirroring_enabled() const {
2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return second_display_mode_ == MIRRORING;
28868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  };
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Sets/gets second display mode.
2911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void SetSecondDisplayMode(SecondDisplayMode mode);
2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SecondDisplayMode second_display_mode() const {
2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return second_display_mode_;
2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
296ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Update the bounds of the display given by |display_id|.
297ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool UpdateDisplayBounds(int64 display_id,
298ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                           const gfx::Rect& new_bounds);
29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Creates mirror window if the software mirror mode is enabled.
30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // This is used only for bootstrap.
30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void CreateMirrorWindowIfAny();
30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Create a screen instance to be used during shutdown.
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void CreateScreenForShutdown() const;
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochprivate:
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtendedDesktopTest, ConvertPoint);
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DisplayManagerTest, TestNativeDisplaysChanged);
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DisplayManagerTest,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           NativeDisplaysChangedAfterPrimaryChange);
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DisplayManagerTest, AutomaticOverscanInsets);
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ash::AcceleratorControllerTest;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class test::DisplayManagerTestApi;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class test::SystemGestureEventFilterTest;
3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  friend class DisplayManagerTest;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::vector<gfx::Display> DisplayList;
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_change_display_upon_host_resize(bool value) {
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    change_display_upon_host_resize_ = value;
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
324ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  gfx::Display* FindDisplayForId(int64 id);
3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Add the mirror display's display info if the software based
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // mirroring is in use.
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void AddMirrorDisplayInfoIfAny(std::vector<DisplayInfo>* display_info_list);
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Inserts and update the DisplayInfo according to the overscan
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // state. Note that The DisplayInfo stored in the |internal_display_info_|
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // can be different from |new_info| (due to overscan state), so
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // you must use |GetDisplayInfo| to get the correct DisplayInfo for
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // a display.
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InsertAndUpdateDisplayInfo(const DisplayInfo& new_info);
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Called when the display info is updated through InsertAndUpdateDisplayInfo.
338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void OnDisplayInfoUpdated(const DisplayInfo& display_info);
339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a display object from the DisplayInfo for |display_id|.
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Display CreateDisplayFromDisplayInfoById(int64 display_id);
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Updates the bounds of the secondary display in |display_list|
344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // using the layout registered for the display pair and set the
345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // index of display updated to |updated_index|. Returns true
346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // if the secondary display's bounds has been changed from current
347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // value, or false otherwise.
348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool UpdateSecondaryDisplayBoundsForLayout(DisplayList* display_list,
349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             size_t* updated_index) const;
350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
351ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  static void UpdateDisplayBoundsForLayout(
352ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const DisplayLayout& layout,
353ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const gfx::Display& primary_display,
354ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      gfx::Display* secondary_display);
3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Delegate* delegate_;  // not owned.
3577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<ScreenAsh> screen_ash_;
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This is to have an accessor without ScreenAsh definition.
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Screen* screen_;
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<DisplayLayoutStore> layout_store_;
3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 first_display_id_;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // List of current active displays.
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayList displays_;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_connected_displays_;
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool force_bounds_changed_;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The mapping from the display ID to its internal data.
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<int64, DisplayInfo> display_info_;
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Selected display modes for displays. Key is the displays' ID.
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::map<int64, DisplayMode> display_modes_;
378a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When set to true, the host window's resize event updates
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the display's size. This is set to true when running on
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // desktop environment (for debugging) so that resizing the host
382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // window will update the display properly. This is set to false
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // on device as well as during the unit tests.
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool change_display_upon_host_resize_;
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SecondDisplayMode second_display_mode_;
3871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int64 mirrored_display_id_;
3881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::Display non_desktop_display_;
38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
39003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // User preference for rotation lock of the internal display.
39103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool registered_internal_display_rotation_lock_;
39203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
39303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // User preference for the rotation of the internal display.
39403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::Display::Rotation registered_internal_display_rotation_;
39503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DisplayManager);
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ash
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // ASH_DISPLAY_DISPLAY_MANAGER_H_
402