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) 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/display/output_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; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AcceleratorControllerTest; 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DisplayController; 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DisplayManagerTestApi; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SystemGestureEventFilterTest; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace internal { 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DisplayLayoutStore; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DisplayManager maintains the current display configurations, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and notifies observers when configuration changes. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(oshima): Make this non internal. 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass ASH_EXPORT DisplayManager 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_CHROMEOS) 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public chromeos::OutputConfigurator::SoftwareMirroringController 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch class ASH_EXPORT Delegate { 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~Delegate() {} 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Create or updates the mirror window with |display_info|. 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void CreateOrUpdateMirrorWindow( 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const DisplayInfo& display_info) = 0; 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Closes the mirror window if exists. 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void CloseMirrorWindow() = 0; 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Called before and after the display configuration changes. 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void PreDisplayConfigurationChange() = 0; 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void PostDisplayConfigurationChange() = 0; 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Returns the list of possible UI scales for the display. 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static std::vector<float> GetScalesForDisplay(const DisplayInfo& info); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns next valid UI scale. 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static float GetNextUIScale(const DisplayInfo& info, bool up); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Updates the bounds of the display given by |secondary_display_id| 73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // according to |layout|. 74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch static void UpdateDisplayBoundsForLayoutById( 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const DisplayLayout& layout, 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Display& primary_display, 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int64 secondary_display_id); 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DisplayManager(); 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~DisplayManager(); 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DisplayLayoutStore* layout_store() { 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return layout_store_.get(); 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void set_delegate(Delegate* delegate) { delegate_ = delegate; } 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When set to true, the MonitorManager calls OnDisplayBoundsChanged 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // even if the display's bounds didn't change. Used to swap primary 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // display. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_force_bounds_changed(bool force_bounds_changed) { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) force_bounds_changed_ = force_bounds_changed; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the display id of the first display in the outupt list. 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 first_display_id() const { return first_display_id_; } 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Initializes displays using command line flag, or uses 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // defualt if no options are specified. 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void InitFromCommandLine(); 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // True if the given |display| is currently connected. 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsActiveDisplay(const gfx::Display& display) const; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // True if there is an internal display. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasInternalDisplay() const; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsInternalDisplayId(int64 id) const; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns display for given |id|; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Display& GetDisplayForId(int64 id) const; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Finds the display that contains |point| in screeen coordinates. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns invalid display if there is no display that can satisfy 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the condition. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Display& FindDisplayContainingPoint( 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Point& point_in_screen) const; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Sets the work area's |insets| to the display given by |display_id|. 120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool UpdateWorkAreaOfDisplay(int64 display_id, const gfx::Insets& insets); 121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Registers the overscan insets for the display of the specified ID. Note 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that the insets size should be specified in DIP size. It also triggers the 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // display's bounds change. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetOverscanInsets(int64 display_id, const gfx::Insets& insets_in_dip); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the display's rotation. 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetDisplayRotation(int64 display_id, gfx::Display::Rotation rotation); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the display's ui scale. 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetDisplayUIScale(int64 display_id, float ui_scale); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sets the display's resolution. 134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void SetDisplayResolution(int64 display_id, const gfx::Size& resolution); 135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Register per display properties. |overscan_insets| is NULL if 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the display has no custom overscan insets. 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RegisterDisplayProperty(int64 display_id, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display::Rotation rotation, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float ui_scale, 141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const gfx::Insets* overscan_insets, 142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const gfx::Size& resolution_in_pixels); 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Returns the display's selected resolution. 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool GetSelectedResolutionForDisplayId(int64 display_id, 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gfx::Size* resolution_out) const; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Tells if display rotation/ui scaling features are enabled. 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsDisplayRotationEnabled() const; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsDisplayUIScalingEnabled() const; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the current overscan insets for the specified |display_id|. 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns an empty insets (0, 0, 0, 0) if no insets are specified for 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the display. 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Insets GetOverscanInsets(int64 display_id) const; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when display configuration has changed. The new display 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // configurations is passed as a vector of Display object, which 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // contains each display's new infomration. 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnNativeDisplaysChanged( 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<DisplayInfo>& display_info_list); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Updates the internal display data and notifies observers about the changes. 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateDisplays(const std::vector<DisplayInfo>& display_info_list); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Updates current displays using current |display_info_|. 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateDisplays(); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the display at |index|. The display at 0 is 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // no longer considered "primary". 171ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const gfx::Display& GetDisplayAt(size_t index) const; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Display* GetPrimaryDisplayCandidate() const; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the logical number of displays. This returns 1 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when displays are mirrored. 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t GetNumDisplays() const; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the number of connected displays. This returns 2 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when displays are mirrored. 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t num_connected_displays() const { return num_connected_displays_; } 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the mirroring status. 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsMirrored() const; 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::Display& mirrored_display() const { return mirrored_display_; } 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Retuns the display info associated with |display_id|. 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DisplayInfo& GetDisplayInfo(int64 display_id) const; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the human-readable name for the display |id|. 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string GetDisplayNameForId(int64 id); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns the display id that is capable of UI scaling. On device, 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // this returns internal display's ID if its device scale factor is 2, 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // or invalid ID if such internal display doesn't exist. On linux 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // desktop, this returns the first display ID. 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 GetDisplayIdForUIScaling() const; 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Change the mirror mode. 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetMirrorMode(bool mirrored); 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Used to emulate display change when run in a desktop environment instead 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // of on a device. 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void AddRemoveDisplay(); 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void ToggleDisplayScaleFactor(); 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // SoftwareMirroringController override: 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_CHROMEOS) 20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void SetSoftwareMirroring(bool enabled) OVERRIDE; 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetSoftwareMirroring(bool enabled); 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Update the bounds of the display given by |display_id|. 215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool UpdateDisplayBounds(int64 display_id, 216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const gfx::Rect& new_bounds); 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochprivate: 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtendedDesktopTest, ConvertPoint); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(DisplayManagerTest, TestNativeDisplaysChanged); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(DisplayManagerTest, 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NativeDisplaysChangedAfterPrimaryChange); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(DisplayManagerTest, AutomaticOverscanInsets); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class ash::AcceleratorControllerTest; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class test::DisplayManagerTestApi; 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class test::SystemGestureEventFilterTest; 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch friend class DisplayManagerTest; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::vector<gfx::Display> DisplayList; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_change_display_upon_host_resize(bool value) { 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) change_display_upon_host_resize_ = value; 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 234ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch gfx::Display* FindDisplayForId(int64 id); 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Add the mirror display's display info if the software based 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // mirroring is in use. 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void AddMirrorDisplayInfoIfAny(std::vector<DisplayInfo>* display_info_list); 239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Inserts and update the DisplayInfo according to the overscan 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // state. Note that The DisplayInfo stored in the |internal_display_info_| 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // can be different from |new_info| (due to overscan state), so 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // you must use |GetDisplayInfo| to get the correct DisplayInfo for 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a display. 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InsertAndUpdateDisplayInfo(const DisplayInfo& new_info); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates a display object from the DisplayInfo for |display_id|. 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display CreateDisplayFromDisplayInfoById(int64 display_id); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Updates the bounds of the secondary display in |display_list| 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // using the layout registered for the display pair and set the 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // index of display updated to |updated_index|. Returns true 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // if the secondary display's bounds has been changed from current 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // value, or false otherwise. 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool UpdateSecondaryDisplayBoundsForLayout(DisplayList* display_list, 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t* updated_index) const; 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 258ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch static void UpdateDisplayBoundsForLayout( 259ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const DisplayLayout& layout, 260ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const gfx::Display& primary_display, 261ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch gfx::Display* secondary_display); 2627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Delegate* delegate_; // not owned. 2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<DisplayLayoutStore> layout_store_; 2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 first_display_id_; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Display mirrored_display_; 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // List of current active dispays. 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DisplayList displays_; 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_connected_displays_; 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool force_bounds_changed_; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The mapping from the display ID to its internal data. 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<int64, DisplayInfo> display_info_; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Selected resolutions for displays. Key is the displays' ID. 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::map<int64, gfx::Size> resolutions_; 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When set to true, the host window's resize event updates 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the display's size. This is set to true when running on 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // desktop environment (for debugging) so that resizing the host 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // window wil update the display properly. This is set to false 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on device as well as during the unit tests. 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool change_display_upon_host_resize_; 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool software_mirroring_enabled_; 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DisplayManager); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace internal 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ash 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // ASH_DISPLAY_DISPLAY_MANAGER_H_ 300