display_manager.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef ASH_DISPLAY_DISPLAY_MANAGER_H_ 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define ASH_DISPLAY_DISPLAY_MANAGER_H_ 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <string> 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <vector> 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ash/ash_export.h" 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ash/display/display_info.h" 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ash/display/display_layout.h" 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/compiler_specific.h" 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/gtest_prod_util.h" 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ui/gfx/display.h" 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if defined(OS_CHROMEOS) 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ui/display/chromeos/display_configurator.h" 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace gfx { 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Display; 2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class Insets; 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class Rect; 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Screen; 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)namespace ash { 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class AcceleratorControllerTest; 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class DisplayController; 33e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)class DisplayLayoutStore; 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class ScreenAsh; 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)namespace test { 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class DisplayManagerTestApi; 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class SystemGestureEventFilterTest; 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// DisplayManager maintains the current display configurations, 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// and notifies observers when configuration changes. 4381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// TODO(oshima): Make this non internal. 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class ASH_EXPORT DisplayManager 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if defined(OS_CHROMEOS) 4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) : public ui::DisplayConfigurator::SoftwareMirroringController 4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#endif 4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) public: 5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class ASH_EXPORT Delegate { 5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) public: 5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual ~Delegate() {} 5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Create or updates the non desktop window with |display_info|. 5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void CreateOrUpdateNonDesktopDisplay( 5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const DisplayInfo& display_info) = 0; 5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Closes the mirror window if exists. 6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void CloseNonDesktopDisplay() = 0; 6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Called before and after the display configuration changes. 6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // When |clear_focus| is true, the implementation should 6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // deactivate the active window and set the focus window to NULL. 6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void PreDisplayConfigurationChange(bool clear_focus) = 0; 6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void PostDisplayConfigurationChange() = 0; 6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) }; 6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // How the second display will be used. 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1) EXTENDED mode extends the desktop to the second dislpay. 71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // 2) MIRRORING mode copies the content of the primary display to 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // the 2nd display. (Software Mirroring). 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // 3) In VIRTUAL_KEYBOARD mode, the 2nd display is used as a 74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // dedicated display for virtual keyboard, and it is not 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // recognized as a part of desktop. 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum SecondDisplayMode { 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXTENDED, 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MIRRORING, 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) VIRTUAL_KEYBOARD 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the list of possible UI scales for the display. 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static std::vector<float> GetScalesForDisplay(const DisplayInfo& info); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns next valid UI scale. 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static float GetNextUIScale(const DisplayInfo& info, bool up); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Updates the bounds of the display given by |secondary_display_id| 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // according to |layout|. 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static void UpdateDisplayBoundsForLayoutById( 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const DisplayLayout& layout, 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const gfx::Display& primary_display, 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int64 secondary_display_id); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DisplayManager(); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~DisplayManager(); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DisplayLayoutStore* layout_store() { 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return layout_store_.get(); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gfx::Screen* screen() { 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return screen_; 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void set_delegate(Delegate* delegate) { delegate_ = delegate; } 107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When set to true, the MonitorManager calls OnDisplayMetricsChanged 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // even if the display's bounds didn't change. Used to swap primary 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // display. 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void set_force_bounds_changed(bool force_bounds_changed) { 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) force_bounds_changed_ = force_bounds_changed; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the display id of the first display in the outupt list. 116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) int64 first_display_id() const { return first_display_id_; } 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Initializes displays using command line flag. Returns false 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if no command line flag was provided. 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool InitFromCommandLine(); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Initialize default display. 123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void InitDefaultDisplay(); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // True if the given |display| is currently connected. 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool IsActiveDisplay(const gfx::Display& display) const; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // True if there is an internal display. 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool HasInternalDisplay() const; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool IsInternalDisplayId(int64 id) const; 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the display layout used for current displays. 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DisplayLayout GetCurrentDisplayLayout(); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the current display pair. 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DisplayIdPair GetCurrentDisplayIdPair() const; 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sets the layout for the current display pair. The |layout| specifies 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the locaion of the secondary display relative to the primary. 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void SetLayoutForCurrentDisplays( 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const DisplayLayout& layout_relative_to_primary); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns display for given |id|; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const gfx::Display& GetDisplayForId(int64 id) const; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Finds the display that contains |point| in screeen coordinates. 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns invalid display if there is no display that can satisfy 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the condition. 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const gfx::Display& FindDisplayContainingPoint( 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const gfx::Point& point_in_screen) const; 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sets the work area's |insets| to the display given by |display_id|. 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool UpdateWorkAreaOfDisplay(int64 display_id, const gfx::Insets& insets); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Registers the overscan insets for the display of the specified ID. Note 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // that the insets size should be specified in DIP size. It also triggers the 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // display's bounds change. 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void SetOverscanInsets(int64 display_id, const gfx::Insets& insets_in_dip); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sets the display's rotation. 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void SetDisplayRotation(int64 display_id, gfx::Display::Rotation rotation); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sets the display's ui scale. 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void SetDisplayUIScale(int64 display_id, float ui_scale); 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sets the display's resolution. 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void SetDisplayResolution(int64 display_id, const gfx::Size& resolution); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Register per display properties. |overscan_insets| is NULL if 171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // the display has no custom overscan insets. 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void RegisterDisplayProperty(int64 display_id, 173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) gfx::Display::Rotation rotation, 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float ui_scale, 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const gfx::Insets* overscan_insets, 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const gfx::Size& resolution_in_pixels, 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ui::ColorCalibrationProfile color_profile); 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Returns the display's selected mode. 180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool GetSelectedModeForDisplayId(int64 display_id, 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DisplayMode* mode_out) const; 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Tells if the virtual resolution feature is enabled. 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool IsDisplayUIScalingEnabled() const; 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the current overscan insets for the specified |display_id|. 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns an empty insets (0, 0, 0, 0) if no insets are specified for 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the display. 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gfx::Insets GetOverscanInsets(int64 display_id) const; 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Sets the color calibration of the display to |profile|. 192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void SetColorCalibrationProfile(int64 display_id, 193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ui::ColorCalibrationProfile profile); 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Called when display configuration has changed. The new display 196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // configurations is passed as a vector of Display object, which 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // contains each display's new infomration. 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void OnNativeDisplaysChanged( 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const std::vector<DisplayInfo>& display_info_list); 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Updates the internal display data and notifies observers about the changes. 202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void UpdateDisplays(const std::vector<DisplayInfo>& display_info_list); 203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Updates current displays using current |display_info_|. 205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void UpdateDisplays(); 206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Returns the display at |index|. The display at 0 is 208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // no longer considered "primary". 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const gfx::Display& GetDisplayAt(size_t index) const; 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const gfx::Display& GetPrimaryDisplayCandidate() const; 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the logical number of displays. This returns 1 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // when displays are mirrored. 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t GetNumDisplays() const; 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const std::vector<gfx::Display>& displays() const { return displays_; } 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the number of connected displays. This returns 2 220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // when displays are mirrored. 221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) size_t num_connected_displays() const { return num_connected_displays_; } 222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the mirroring status. 224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool IsMirrored() const; 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int64 mirrored_display_id() const { return mirrored_display_id_; } 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Returns the display object that is not a part of desktop. 228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const gfx::Display& non_desktop_display() const { 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return non_desktop_display_; 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Retuns the display info associated with |display_id|. 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const DisplayInfo& GetDisplayInfo(int64 display_id) const; 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the human-readable name for the display |id|. 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::string GetDisplayNameForId(int64 id); 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the display id that is capable of UI scaling. On device, 239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // this returns internal display's ID if its device scale factor is 2, 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or invalid ID if such internal display doesn't exist. On linux 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // desktop, this returns the first display ID. 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int64 GetDisplayIdForUIScaling() const; 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Change the mirror mode. 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void SetMirrorMode(bool mirrored); 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Used to emulate display change when run in a desktop environment instead 248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // of on a device. 249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void AddRemoveDisplay(); 250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void ToggleDisplayScaleFactor(); 251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // SoftwareMirroringController override: 253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if defined(OS_CHROMEOS) 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void SetSoftwareMirroring(bool enabled) OVERRIDE; 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool SoftwareMirroringEnabled() const OVERRIDE; 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool software_mirroring_enabled() const { 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return second_display_mode_ == MIRRORING; 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool virtual_keyboard_root_window_enabled() const { 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return second_display_mode_ == VIRTUAL_KEYBOARD; 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Sets/gets second display mode. 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void SetSecondDisplayMode(SecondDisplayMode mode); 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SecondDisplayMode second_display_mode() const { 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return second_display_mode_; 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Update the bounds of the display given by |display_id|. 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool UpdateDisplayBounds(int64 display_id, 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const gfx::Rect& new_bounds); 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Creates mirror window if the software mirror mode is enabled. 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This is used only for bootstrap. 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void CreateMirrorWindowIfAny(); 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create a screen instance to be used during shutdown. 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void CreateScreenForShutdown() const; 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtendedDesktopTest, ConvertPoint); 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(DisplayManagerTest, TestNativeDisplaysChanged); 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(DisplayManagerTest, 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NativeDisplaysChangedAfterPrimaryChange); 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(DisplayManagerTest, AutomaticOverscanInsets); 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class ash::AcceleratorControllerTest; 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class test::DisplayManagerTestApi; 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class test::SystemGestureEventFilterTest; 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class DisplayManagerTest; 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) typedef std::vector<gfx::Display> DisplayList; 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void set_change_display_upon_host_resize(bool value) { 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) change_display_upon_host_resize_ = value; 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gfx::Display* FindDisplayForId(int64 id); 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Add the mirror display's display info if the software based 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // mirroring is in use. 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void AddMirrorDisplayInfoIfAny(std::vector<DisplayInfo>* display_info_list); 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Inserts and update the DisplayInfo according to the overscan 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // state. Note that The DisplayInfo stored in the |internal_display_info_| 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be different from |new_info| (due to overscan state), so 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // you must use |GetDisplayInfo| to get the correct DisplayInfo for 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // a display. 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void InsertAndUpdateDisplayInfo(const DisplayInfo& new_info); 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Called when the display info is updated through InsertAndUpdateDisplayInfo. 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void OnDisplayInfoUpdated(const DisplayInfo& display_info); 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Creates a display object from the DisplayInfo for |display_id|. 316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) gfx::Display CreateDisplayFromDisplayInfoById(int64 display_id); 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Updates the bounds of the secondary display in |display_list| 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // using the layout registered for the display pair and set the 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // index of display updated to |updated_index|. Returns true 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if the secondary display's bounds has been changed from current 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // value, or false otherwise. 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool UpdateSecondaryDisplayBoundsForLayout(DisplayList* display_list, 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t* updated_index) const; 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static void UpdateDisplayBoundsForLayout( 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const DisplayLayout& layout, 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const gfx::Display& primary_display, 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gfx::Display* secondary_display); 330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Delegate* delegate_; // not owned. 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scoped_ptr<ScreenAsh> screen_ash_; 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This is to have an accessor without ScreenAsh definition. 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gfx::Screen* screen_; 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scoped_ptr<DisplayLayoutStore> layout_store_; 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int64 first_display_id_; 340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // List of current active displays. 342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) DisplayList displays_; 343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) int num_connected_displays_; 345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool force_bounds_changed_; 347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // The mapping from the display ID to its internal data. 349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) std::map<int64, DisplayInfo> display_info_; 350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Selected display modes for displays. Key is the displays' ID. 352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) std::map<int64, DisplayMode> display_modes_; 353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When set to true, the host window's resize event updates 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the display's size. This is set to true when running on 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // desktop environment (for debugging) so that resizing the host 357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // window will update the display properly. This is set to false 358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // on device as well as during the unit tests. 35953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) bool change_display_upon_host_resize_; 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SecondDisplayMode second_display_mode_; 362926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) int64 mirrored_display_id_; 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gfx::Display non_desktop_display_; 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DisplayManager); 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace ash 369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // ASH_DISPLAY_DISPLAY_MANAGER_H_ 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)