15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screen_ash.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/display_controller.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/property_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/coordinate_conversion.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/screen_position_client.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)internal::DisplayManager* GetDisplayManager() {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Shell::GetInstance()->display_manager();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDisplayController* GetDisplayController() {
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return Shell::GetInstance()->display_controller();
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScreenAsh::ScreenAsh() {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScreenAsh::~ScreenAsh() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display ScreenAsh::FindDisplayContainingPoint(const gfx::Point& point) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetDisplayManager()->FindDisplayContainingPoint(point);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ScreenAsh::GetMaximizedWindowBoundsInParent(aura::Window* window) {
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (GetRootWindowController(window->GetRootWindow())->shelf())
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetDisplayWorkAreaBoundsInParent(window);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetDisplayBoundsInParent(window);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ScreenAsh::GetDisplayBoundsInParent(aura::Window* window) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertRectFromScreen(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window->parent(),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetScreen()->GetDisplayNearestWindow(window).bounds());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ScreenAsh::GetDisplayWorkAreaBoundsInParent(aura::Window* window) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertRectFromScreen(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window->parent(),
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetScreen()->GetDisplayNearestWindow(window).work_area());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ScreenAsh::ConvertRectToScreen(aura::Window* window,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const gfx::Rect& rect) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point point = rect.origin();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::GetScreenPositionClient(window->GetRootWindow())->
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertPointToScreen(window, &point);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Rect(point, rect.size());
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ScreenAsh::ConvertRectFromScreen(aura::Window* window,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const gfx::Rect& rect) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point point = rect.origin();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::GetScreenPositionClient(window->GetRootWindow())->
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertPointFromScreen(window, &point);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Rect(point, rect.size());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::Display& ScreenAsh::GetSecondaryDisplay() {
87ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  internal::DisplayManager* display_manager = GetDisplayManager();
88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CHECK_EQ(2U, display_manager->GetNumDisplays());
89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return display_manager->GetDisplayAt(0).id() ==
90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      DisplayController::GetPrimaryDisplay().id() ?
91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      display_manager->GetDisplayAt(1) : display_manager->GetDisplayAt(0);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::Display& ScreenAsh::GetDisplayForId(int64 display_id) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetDisplayManager()->GetDisplayForId(display_id);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScreenAsh::NotifyBoundsChanged(const gfx::Display& display) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(gfx::DisplayObserver, observers_,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    OnDisplayBoundsChanged(display));
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScreenAsh::NotifyDisplayAdded(const gfx::Display& display) {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(gfx::DisplayObserver, observers_, OnDisplayAdded(display));
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScreenAsh::NotifyDisplayRemoved(const gfx::Display& display) {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::DisplayObserver, observers_, OnDisplayRemoved(display));
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ScreenAsh::IsDIPEnabled() {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point ScreenAsh::GetCursorScreenPoint() {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return aura::Env::GetInstance()->last_mouse_location();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow ScreenAsh::GetWindowAtCursorScreenPoint() {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point point = Shell::GetScreen()->GetCursorScreenPoint();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return wm::GetRootWindowAt(point)->GetTopWindowContainingPoint(point);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ScreenAsh::GetNumDisplays() {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return DisplayController::GetNumDisplays();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display ScreenAsh::GetDisplayNearestWindow(gfx::NativeView window) const {
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return GetDisplayController()->GetDisplayNearestWindow(window);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display ScreenAsh::GetDisplayNearestPoint(const gfx::Point& point) const {
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return GetDisplayController()->GetDisplayNearestPoint(point);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display ScreenAsh::GetDisplayMatching(const gfx::Rect& match_rect) const {
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return GetDisplayController()->GetDisplayMatching(match_rect);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display ScreenAsh::GetPrimaryDisplay() const {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DisplayController::GetPrimaryDisplay();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScreenAsh::AddObserver(gfx::DisplayObserver* observer) {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observers_.AddObserver(observer);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScreenAsh::RemoveObserver(gfx::DisplayObserver* observer) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observers_.RemoveObserver(observer);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
155