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)