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