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